ehea: fix for sysfs entries
[powerpc.git] / drivers / net / ehea / ehea_main.c
index e6fe2cf..368f8e3 100644 (file)
@@ -78,6 +78,28 @@ MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue  "
                 __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
 MODULE_PARM_DESC(use_mcs, " 0:NAPI, 1:Multiple receive queues, Default = 1 ");
 
+static int port_name_cnt = 0;
+
+static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
+                                        const struct of_device_id *id);
+
+static int __devexit ehea_remove(struct ibmebus_dev *dev);
+
+static struct of_device_id ehea_device_table[] = {
+       {
+               .name = "lhea",
+               .compatible = "IBM,lhea",
+       },
+       {},
+};
+
+static struct ibmebus_driver ehea_driver = {
+       .name = "ehea",
+       .id_table = ehea_device_table,
+       .probe = ehea_probe_adapter,
+       .remove = ehea_remove,
+};
+
 void ehea_dump(void *adr, int len, char *msg) {
        int x;
        unsigned char *deb = adr;
@@ -2364,6 +2386,34 @@ static void __devinit logical_port_release(struct device *dev)
        of_node_put(port->ofdev.node);
 }
 
+static int ehea_driver_sysfs_add(struct device *dev,
+                                 struct device_driver *driver)
+{
+       int ret;
+
+       ret = sysfs_create_link(&driver->kobj, &dev->kobj,
+                               kobject_name(&dev->kobj));
+       if (ret == 0) {
+               ret = sysfs_create_link(&dev->kobj, &driver->kobj,
+                                       "driver");
+               if (ret)
+                       sysfs_remove_link(&driver->kobj,
+                                         kobject_name(&dev->kobj));
+       }
+       return ret;
+}
+
+static void ehea_driver_sysfs_remove(struct device *dev,
+                                     struct device_driver *driver)
+{
+       struct device_driver *drv = driver;
+
+       if (drv) {
+               sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj));
+               sysfs_remove_link(&dev->kobj, "driver");
+       }
+}
+
 static struct device *ehea_register_port(struct ehea_port *port,
                                         struct device_node *dn)
 {
@@ -2371,8 +2421,9 @@ static struct device *ehea_register_port(struct ehea_port *port,
 
        port->ofdev.node = of_node_get(dn);
        port->ofdev.dev.parent = &port->adapter->ebus_dev->ofdev.dev;
+       port->ofdev.dev.bus = &ibmebus_bus_type;
 
-       sprintf(port->ofdev.dev.bus_id, "port%d", port->logical_port_id);
+       sprintf(port->ofdev.dev.bus_id, "port%d", port_name_cnt++);
        port->ofdev.dev.release = logical_port_release;
 
        ret = of_device_register(&port->ofdev);
@@ -2387,8 +2438,16 @@ static struct device *ehea_register_port(struct ehea_port *port,
                goto out_unreg_of_dev;
        }
 
+       ret = ehea_driver_sysfs_add(&port->ofdev.dev, &ehea_driver.driver);
+       if (ret) {
+               ehea_error("failed to register sysfs driver link");
+               goto out_rem_dev_file;
+       }
+
        return &port->ofdev.dev;
 
+out_rem_dev_file:
+       device_remove_file(&port->ofdev.dev, &dev_attr_log_port_id);
 out_unreg_of_dev:
        of_device_unregister(&port->ofdev);
 out:
@@ -2397,6 +2456,7 @@ out:
 
 static void ehea_unregister_port(struct ehea_port *port)
 {
+       ehea_driver_sysfs_remove(&port->ofdev.dev, &ehea_driver.driver);
        device_remove_file(&port->ofdev.dev, &dev_attr_log_port_id);
        of_device_unregister(&port->ofdev);
 }
@@ -2841,21 +2901,6 @@ static int check_module_parm(void)
        return ret;
 }
 
-static struct of_device_id ehea_device_table[] = {
-       {
-               .name = "lhea",
-               .compatible = "IBM,lhea",
-       },
-       {},
-};
-
-static struct ibmebus_driver ehea_driver = {
-       .name = "ehea",
-       .id_table = ehea_device_table,
-       .probe = ehea_probe_adapter,
-       .remove = ehea_remove,
-};
-
 int __init ehea_module_init(void)
 {
        int ret;