Re: [PATCH/RESEND] ehea: fix for dlpar and sysfs entries

2007-04-23 Thread Arnd Bergmann
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

2007-04-23 Thread Jan-Bernd Themann
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

2007-04-23 Thread Jan-Bernd Themann
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

2007-04-23 Thread Arnd Bergmann
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/