Re: [PATCH/RESEND] ehea: fix for dlpar and sysfs entries
On Monday 23 April 2007, Jan-Bernd Themann wrote: > - dlpar fix: > certain resources may only be allocated when first > logical port is available, and must be removed when > last logical port has been removed > > - sysfs entries: > create symbolic link from each logical port to ehea driver > I can't see anything wrong with the patch contents, but if you know that there are two changes, you really should make it two separate patches. Arnd <>< - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH/RESEND] ehea: fix for dlpar and sysfs entries
This patch includes: - dlpar fix: certain resources may only be allocated when first logical port is available, and must be removed when last logical port has been removed - sysfs entries: create symbolic link from each logical port to ehea driver Signed-off-by: Jan-Bernd Themann <[EMAIL PROTECTED]> --- This patch applies on top of the netdev upstream branch for 2.6.22 diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 1405d0b..173994d 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h @@ -39,7 +39,7 @@ #include #include #define DRV_NAME "ehea" -#define DRV_VERSION"EHEA_0055" +#define DRV_VERSION"EHEA_0056" #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index a36a023..f9f3133 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c @@ -78,6 +78,28 @@ MODULE_PARM_DESC(sq_entries, " Number of __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; @@ -2108,6 +2130,28 @@ static int ehea_clean_all_portres(struct return ret; } +static void ehea_remove_adapter_mr (struct ehea_adapter *adapter) +{ + int i; + + for (i=0; i < EHEA_MAX_PORTS; i++) + if (adapter->port[i]) + return; + + ehea_rem_mr(>mr); +} + +static int ehea_add_adapter_mr (struct ehea_adapter *adapter) +{ + int i; + + for (i=0; i < EHEA_MAX_PORTS; i++) + if (adapter->port[i]) + return 0; + + return ehea_reg_kernel_mr(adapter, >mr); +} + static int ehea_up(struct net_device *dev) { int ret, i; @@ -2361,6 +2405,34 @@ static void __devinit logical_port_relea 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(>kobj, >kobj, + kobject_name(>kobj)); + if (ret == 0) { + ret = sysfs_create_link(>kobj, >kobj, + "driver"); + if (ret) + sysfs_remove_link(>kobj, + kobject_name(>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(>kobj, kobject_name(>kobj)); + sysfs_remove_link(>kobj, "driver"); + } +} + static struct device *ehea_register_port(struct ehea_port *port, struct device_node *dn) { @@ -2368,8 +2440,9 @@ static struct device *ehea_register_port port->ofdev.node = of_node_get(dn); port->ofdev.dev.parent = >adapter->ebus_dev->ofdev.dev; + port->ofdev.dev.bus = _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(>ofdev); @@ -2384,8 +2457,16 @@ static struct device *ehea_register_port goto out_unreg_of_dev; } + ret = ehea_driver_sysfs_add(>ofdev.dev, _driver.driver); + if (ret) { + ehea_error("failed to register sysfs driver link"); + goto out_rem_dev_file; + } + return >ofdev.dev; +out_rem_dev_file: + device_remove_file(>ofdev.dev, _attr_log_port_id); out_unreg_of_dev: of_device_unregister(>ofdev); out: @@ -2394,6 +2475,7 @@ out: static void ehea_unregister_port(struct ehea_port *port) { + ehea_driver_sysfs_remove(>ofdev.dev, _driver.driver); device_remove_file(>ofdev.dev, _attr_log_port_id); of_device_unregister(>ofdev); } @@ -2520,7 +2602,6 @@ static int ehea_setup_ports(struct ehea_ struct device_node *eth_dn = NULL; u32 *dn_log_port_id; - int port_setup_ok = 0;
[PATCH/RESEND] ehea: fix for dlpar and sysfs entries
This patch includes: - dlpar fix: certain resources may only be allocated when first logical port is available, and must be removed when last logical port has been removed - sysfs entries: create symbolic link from each logical port to ehea driver Signed-off-by: Jan-Bernd Themann [EMAIL PROTECTED] --- This patch applies on top of the netdev upstream branch for 2.6.22 diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 1405d0b..173994d 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h @@ -39,7 +39,7 @@ #include asm/abs_addr.h #include asm/io.h #define DRV_NAME ehea -#define DRV_VERSIONEHEA_0055 +#define DRV_VERSIONEHEA_0056 #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index a36a023..f9f3133 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c @@ -78,6 +78,28 @@ MODULE_PARM_DESC(sq_entries, Number of __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; @@ -2108,6 +2130,28 @@ static int ehea_clean_all_portres(struct return ret; } +static void ehea_remove_adapter_mr (struct ehea_adapter *adapter) +{ + int i; + + for (i=0; i EHEA_MAX_PORTS; i++) + if (adapter-port[i]) + return; + + ehea_rem_mr(adapter-mr); +} + +static int ehea_add_adapter_mr (struct ehea_adapter *adapter) +{ + int i; + + for (i=0; i EHEA_MAX_PORTS; i++) + if (adapter-port[i]) + return 0; + + return ehea_reg_kernel_mr(adapter, adapter-mr); +} + static int ehea_up(struct net_device *dev) { int ret, i; @@ -2361,6 +2405,34 @@ static void __devinit logical_port_relea 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) { @@ -2368,8 +2440,9 @@ static struct device *ehea_register_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); @@ -2384,8 +2457,16 @@ static struct device *ehea_register_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: @@ -2394,6 +2475,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); } @@ -2520,7 +2602,6 @@ static int ehea_setup_ports(struct ehea_ struct
Re: [PATCH/RESEND] ehea: fix for dlpar and sysfs entries
On Monday 23 April 2007, Jan-Bernd Themann wrote: - dlpar fix: certain resources may only be allocated when first logical port is available, and must be removed when last logical port has been removed - sysfs entries: create symbolic link from each logical port to ehea driver I can't see anything wrong with the patch contents, but if you know that there are two changes, you really should make it two separate patches. Arnd - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/