Commit 1eef4e04 authored by Jan-Bernd Themann's avatar Jan-Bernd Themann Committed by Jeff Garzik

ehea: fix for dynamic lpar support

The patch fixes bugs related to the probe / remove adapter
functionality (handling of OFDT nodes)
Signed-off-by: default avatarJan-Bernd Themann <themann@de.ibm.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent d6830018
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ehea" #define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0052" #define DRV_VERSION "EHEA_0053"
#define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
| NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
......
...@@ -2559,11 +2559,8 @@ static int ehea_setup_ports(struct ehea_adapter *adapter) ...@@ -2559,11 +2559,8 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
int i = 0; int i = 0;
lhea_dn = adapter->ebus_dev->ofdev.node; lhea_dn = adapter->ebus_dev->ofdev.node;
do { while ((eth_dn = of_get_next_child(lhea_dn, eth_dn))) {
eth_dn = of_get_next_child(lhea_dn, eth_dn);
if (!eth_dn)
break;
dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no", dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no",
NULL); NULL);
if (!dn_log_port_id) { if (!dn_log_port_id) {
...@@ -2580,9 +2577,7 @@ static int ehea_setup_ports(struct ehea_adapter *adapter) ...@@ -2580,9 +2577,7 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
adapter->port[i]->netdev->name, adapter->port[i]->netdev->name,
*dn_log_port_id); *dn_log_port_id);
i++; i++;
} while (eth_dn); };
of_node_put(lhea_dn);
/* Check for succesfully set up ports */ /* Check for succesfully set up ports */
for (i = 0; i < EHEA_MAX_PORTS; i++) for (i = 0; i < EHEA_MAX_PORTS; i++)
...@@ -2603,21 +2598,14 @@ static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter, ...@@ -2603,21 +2598,14 @@ static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter,
u32 *dn_log_port_id; u32 *dn_log_port_id;
lhea_dn = adapter->ebus_dev->ofdev.node; lhea_dn = adapter->ebus_dev->ofdev.node;
do { while ((eth_dn = of_get_next_child(lhea_dn, eth_dn))) {
eth_dn = of_get_next_child(lhea_dn, eth_dn);
if (!eth_dn)
break;
dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no", dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no",
NULL); NULL);
if (dn_log_port_id) if (dn_log_port_id)
if (*dn_log_port_id == logical_port_id) if (*dn_log_port_id == logical_port_id)
return eth_dn; return eth_dn;
};
} while (eth_dn);
of_node_put(lhea_dn);
return NULL; return NULL;
} }
...@@ -2653,6 +2641,8 @@ static ssize_t ehea_probe_port(struct device *dev, ...@@ -2653,6 +2641,8 @@ static ssize_t ehea_probe_port(struct device *dev,
port = ehea_setup_single_port(adapter, logical_port_id, eth_dn); port = ehea_setup_single_port(adapter, logical_port_id, eth_dn);
of_node_put(eth_dn);
if (port) { if (port) {
for (i=0; i < EHEA_MAX_PORTS; i++) for (i=0; i < EHEA_MAX_PORTS; i++)
if (!adapter->port[i]) { if (!adapter->port[i]) {
...@@ -2728,6 +2718,11 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev, ...@@ -2728,6 +2718,11 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
u64 *adapter_handle; u64 *adapter_handle;
int ret; int ret;
if (!dev || !dev->ofdev.node) {
ehea_error("Invalid ibmebus device probed");
return -EINVAL;
}
adapter = kzalloc(sizeof(*adapter), GFP_KERNEL); adapter = kzalloc(sizeof(*adapter), GFP_KERNEL);
if (!adapter) { if (!adapter) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -2770,6 +2765,7 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev, ...@@ -2770,6 +2765,7 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
adapter->neq = ehea_create_eq(adapter, adapter->neq = ehea_create_eq(adapter,
EHEA_NEQ, EHEA_MAX_ENTRIES_EQ, 1); EHEA_NEQ, EHEA_MAX_ENTRIES_EQ, 1);
if (!adapter->neq) { if (!adapter->neq) {
ret = -EIO;
dev_err(&dev->ofdev.dev, "NEQ creation failed"); dev_err(&dev->ofdev.dev, "NEQ creation failed");
goto out_free_res; goto out_free_res;
} }
...@@ -2786,10 +2782,13 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev, ...@@ -2786,10 +2782,13 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
} }
adapter->ehea_wq = create_workqueue("ehea_wq"); adapter->ehea_wq = create_workqueue("ehea_wq");
if (!adapter->ehea_wq) if (!adapter->ehea_wq) {
ret = -EIO;
goto out_free_irq; goto out_free_irq;
}
if (ehea_create_device_sysfs(dev)) ret = ehea_create_device_sysfs(dev);
if (ret)
goto out_kill_wq; goto out_kill_wq;
ret = ehea_setup_ports(adapter); ret = ehea_setup_ports(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment