struct vio_dev *vdev = to_vio_dev(dev);
        const char *str = "none";
 
-       if (vdev->type) {
-               if (!strcmp(vdev->type, "network"))
-                       str = "vnet";
-               else if (!strcmp(vdev->type, "block"))
-                       str = "vdisk";
-       }
+       if (!strcmp(vdev->type, "network"))
+               str = "vnet";
+       else if (!strcmp(vdev->type, "block"))
+               str = "vdisk";
 
        return sprintf(buf, "%s\n", str);
 }
 
+static ssize_t type_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct vio_dev *vdev = to_vio_dev(dev);
+       return sprintf(buf, "%s\n", vdev->type);
+}
+
 static struct device_attribute vio_dev_attrs[] = {
        __ATTR_RO(devspec),
+       __ATTR_RO(type),
        __ATTR_NULL
 };
 
        int err, clen;
 
        type = md_get_property(mp, "device-type", NULL);
-       if (!type)
+       if (!type) {
                type = md_get_property(mp, "name", NULL);
+               if (!type)
+                       type = mp->name;
+       }
        compat = md_get_property(mp, "device-type", &clen);
 
        vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
 
 static void create_devices(struct mdesc_node *root)
 {
+       struct mdesc_node *mp;
+
        root_vdev = vio_create_one(root, NULL);
        if (!root_vdev) {
                printk(KERN_ERR "VIO: Coult not create root device.\n");
        }
 
        walk_tree(root, root_vdev);
+
+       /* Domain services is odd as it doesn't sit underneath the
+        * channel-devices node, so we plug it in manually.
+        */
+       mp = md_find_node_by_name(NULL, "domain-services");
+       if (mp) {
+               struct vio_dev *parent = vio_create_one(mp, &root_vdev->dev);
+
+               if (parent)
+                       walk_tree(mp, parent);
+       }
 }
 
 const char *channel_devices_node = "channel-devices";