[SPARC64]: Add domain-services nodes to VIO device tree.
authorDavid S. Miller <davem@sunset.davemloft.net>
Thu, 12 Jul 2007 01:15:59 +0000 (18:15 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 16 Jul 2007 11:04:13 +0000 (04:04 -0700)
They sit under the root of the MD tree unlike the rest of
the LDC channel based virtual devices.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/vio.c

index 21c015e8365bfa508555e6d3ca842059b2aaa5ba..7eccc91cd59d7b3b7bee3358c2dc97131af0c30c 100644 (file)
@@ -104,18 +104,24 @@ static ssize_t devspec_show(struct device *dev,
        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
 };
 
@@ -201,8 +207,11 @@ static struct vio_dev *vio_create_one(struct mdesc_node *mp,
        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);
@@ -279,6 +288,8 @@ static void walk_tree(struct mdesc_node *n, struct vio_dev *parent)
 
 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");
@@ -286,6 +297,17 @@ static void create_devices(struct mdesc_node *root)
        }
 
        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";