diff options
author | Dhananjay Phadke <dhananjay@netxen.com> | 2009-09-05 19:43:07 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-07 10:53:01 +0200 |
commit | db4cfd8a6149e778befb2ff6e6f91cdc6394cbe6 (patch) | |
tree | dd1faddbbce164b86e58a7cde54bfbd7b3f528bd /drivers/net | |
parent | net_sched: add classful multiqueue dummy scheduler (diff) | |
download | linux-db4cfd8a6149e778befb2ff6e6f91cdc6394cbe6.tar.xz linux-db4cfd8a6149e778befb2ff6e6f91cdc6394cbe6.zip |
netxen: handle firmware load errors
Unwind allocations and release file firmware when
when firmware load fails.
Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 3 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 1 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 20 |
3 files changed, 20 insertions, 4 deletions
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index db510cee8094..d0ac8fabd423 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c @@ -566,6 +566,9 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter, i = 0; + if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) + return -EIO; + tx_ring = adapter->tx_ring; __netif_tx_lock_bh(tx_ring->txq); diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 04e36f2b1a93..534994dc167f 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c @@ -905,6 +905,7 @@ netxen_release_firmware(struct netxen_adapter *adapter) { if (adapter->fw) release_firmware(adapter->fw); + adapter->fw = NULL; } int netxen_init_dummy_dma(struct netxen_adapter *adapter) diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 41b29671fc9a..47aede622035 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c @@ -757,7 +757,7 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) err = netxen_need_fw_reset(adapter); if (err < 0) - return err; + goto err_out; if (err == 0) goto wait_init; @@ -771,7 +771,9 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) netxen_set_port_mode(adapter); - netxen_load_firmware(adapter); + err = netxen_load_firmware(adapter); + if (err) + goto err_out; if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { @@ -785,7 +787,7 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) err = netxen_init_dummy_dma(adapter); if (err) - return err; + goto err_out; /* * Tell the hardware our version number. @@ -800,7 +802,7 @@ wait_init: err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); if (err) { netxen_free_dummy_dma(adapter); - return err; + goto err_out; } nx_update_dma_mask(adapter); @@ -808,6 +810,10 @@ wait_init: netxen_nic_get_firmware_info(adapter); return 0; + +err_out: + netxen_release_firmware(adapter); + return err; } static int @@ -876,6 +882,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) { int err; + if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) + return -EIO; + err = adapter->init_port(adapter, adapter->physical_port); if (err) { printk(KERN_ERR "%s: Failed to initialize port %d\n", @@ -914,6 +923,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) static void netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) { + if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) + return; + spin_lock(&adapter->tx_clean_lock); netif_carrier_off(netdev); netif_tx_disable(netdev); |