summaryrefslogtreecommitdiffstats
path: root/drivers/net/ehea/ehea_main.c
diff options
context:
space:
mode:
authorJan-Bernd Themann <ossthema@de.ibm.com>2007-03-22 17:49:42 +0100
committerJeff Garzik <jeff@garzik.org>2007-04-28 11:01:01 -0400
commit1eef4e04c95fb52a1a3885c8f53a822206fc9aa5 (patch)
tree3040eda40a0f5ab5a51be4ffff82ae5703c9c6ed /drivers/net/ehea/ehea_main.c
parentd68300182828596016d7a6c0f23a912f07d9d0df (diff)
ehea: fix for dynamic lpar support
The patch fixes bugs related to the probe / remove adapter functionality (handling of OFDT nodes) Signed-off-by: Jan-Bernd Themann <themann@de.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/ehea/ehea_main.c')
-rw-r--r--drivers/net/ehea/ehea_main.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
index 8d65eb772b2..db0d79ebae8 100644
--- a/drivers/net/ehea/ehea_main.c
+++ b/drivers/net/ehea/ehea_main.c
@@ -2559,11 +2559,8 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
int i = 0;
lhea_dn = adapter->ebus_dev->ofdev.node;
- do {
- eth_dn = of_get_next_child(lhea_dn, eth_dn);
- if (!eth_dn)
- break;
-
+ while ((eth_dn = of_get_next_child(lhea_dn, eth_dn))) {
+
dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no",
NULL);
if (!dn_log_port_id) {
@@ -2580,9 +2577,7 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
adapter->port[i]->netdev->name,
*dn_log_port_id);
i++;
- } while (eth_dn);
-
- of_node_put(lhea_dn);
+ };
/* Check for succesfully set up ports */
for (i = 0; i < EHEA_MAX_PORTS; i++)
@@ -2603,21 +2598,14 @@ static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter,
u32 *dn_log_port_id;
lhea_dn = adapter->ebus_dev->ofdev.node;
- do {
- eth_dn = of_get_next_child(lhea_dn, eth_dn);
- if (!eth_dn)
- break;
-
+ while ((eth_dn = of_get_next_child(lhea_dn, eth_dn))) {
+
dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no",
NULL);
-
if (dn_log_port_id)
if (*dn_log_port_id == logical_port_id)
return eth_dn;
-
- } while (eth_dn);
-
- of_node_put(lhea_dn);
+ };
return NULL;
}
@@ -2653,6 +2641,8 @@ static ssize_t ehea_probe_port(struct device *dev,
port = ehea_setup_single_port(adapter, logical_port_id, eth_dn);
+ of_node_put(eth_dn);
+
if (port) {
for (i=0; i < EHEA_MAX_PORTS; i++)
if (!adapter->port[i]) {
@@ -2728,6 +2718,11 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
u64 *adapter_handle;
int ret;
+ if (!dev || !dev->ofdev.node) {
+ ehea_error("Invalid ibmebus device probed");
+ return -EINVAL;
+ }
+
adapter = kzalloc(sizeof(*adapter), GFP_KERNEL);
if (!adapter) {
ret = -ENOMEM;
@@ -2770,6 +2765,7 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
adapter->neq = ehea_create_eq(adapter,
EHEA_NEQ, EHEA_MAX_ENTRIES_EQ, 1);
if (!adapter->neq) {
+ ret = -EIO;
dev_err(&dev->ofdev.dev, "NEQ creation failed");
goto out_free_res;
}
@@ -2786,10 +2782,13 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
}
adapter->ehea_wq = create_workqueue("ehea_wq");
- if (!adapter->ehea_wq)
+ if (!adapter->ehea_wq) {
+ ret = -EIO;
goto out_free_irq;
+ }
- if (ehea_create_device_sysfs(dev))
+ ret = ehea_create_device_sysfs(dev);
+ if (ret)
goto out_kill_wq;
ret = ehea_setup_ports(adapter);