Procházet zdrojové kódy

[SPARC64]: Add domain-services nodes to VIO device tree.

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>
David S. Miller před 18 roky
rodič
revize
2c4f4ecb7a
1 změnil soubory, kde provedl 29 přidání a 7 odebrání
  1. 29 7
      arch/sparc64/kernel/vio.c

+ 29 - 7
arch/sparc64/kernel/vio.c

@@ -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";