diff options
| author | Manish Chopra <manish.chopra@qlogic.com> | 2013-05-09 05:25:14 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-05-11 19:01:15 -0400 |
| commit | 13a82b44fd761fdb6aeceb2ce9930310569efa3b (patch) | |
| tree | c9cfe7c242bb7ef1b28247af1ecb13f99539faa6 | |
| parent | 536faa61825c8e92f520264228388d69783370d3 (diff) | |
qlcnic: Fix bug in diagnostics test reset recovery path
o In order to perform reset recovery during diagnostics tests,
current device status information need to be preserved.
This patch makes the required changes in diagnostics routines
Signed-off-by: Manish Chopra <manish.chopra@qlogic.com>
Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index 642fca0b15d2..7b5cb610e7b6 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -1276,11 +1276,13 @@ out: | |||
| 1276 | return err; | 1276 | return err; |
| 1277 | } | 1277 | } |
| 1278 | 1278 | ||
| 1279 | static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test) | 1279 | static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, |
| 1280 | int num_sds_ring) | ||
| 1280 | { | 1281 | { |
| 1281 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1282 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 1282 | struct qlcnic_host_sds_ring *sds_ring; | 1283 | struct qlcnic_host_sds_ring *sds_ring; |
| 1283 | struct qlcnic_host_rds_ring *rds_ring; | 1284 | struct qlcnic_host_rds_ring *rds_ring; |
| 1285 | u16 adapter_state = adapter->is_up; | ||
| 1284 | u8 ring; | 1286 | u8 ring; |
| 1285 | int ret; | 1287 | int ret; |
| 1286 | 1288 | ||
| @@ -1304,6 +1306,10 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test) | |||
| 1304 | ret = qlcnic_fw_create_ctx(adapter); | 1306 | ret = qlcnic_fw_create_ctx(adapter); |
| 1305 | if (ret) { | 1307 | if (ret) { |
| 1306 | qlcnic_detach(adapter); | 1308 | qlcnic_detach(adapter); |
| 1309 | if (adapter_state == QLCNIC_ADAPTER_UP_MAGIC) { | ||
| 1310 | adapter->max_sds_rings = num_sds_ring; | ||
| 1311 | qlcnic_attach(adapter); | ||
| 1312 | } | ||
| 1307 | netif_device_attach(netdev); | 1313 | netif_device_attach(netdev); |
| 1308 | return ret; | 1314 | return ret; |
| 1309 | } | 1315 | } |
| @@ -1596,7 +1602,8 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) | |||
| 1596 | if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) | 1602 | if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) |
| 1597 | return -EBUSY; | 1603 | return -EBUSY; |
| 1598 | 1604 | ||
| 1599 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST); | 1605 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST, |
| 1606 | max_sds_rings); | ||
| 1600 | if (ret) | 1607 | if (ret) |
| 1601 | goto fail_diag_alloc; | 1608 | goto fail_diag_alloc; |
| 1602 | 1609 | ||
| @@ -3112,7 +3119,8 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev) | |||
| 3112 | if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) | 3119 | if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) |
| 3113 | return -EIO; | 3120 | return -EIO; |
| 3114 | 3121 | ||
| 3115 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST); | 3122 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST, |
| 3123 | max_sds_rings); | ||
| 3116 | if (ret) | 3124 | if (ret) |
| 3117 | goto fail_diag_irq; | 3125 | goto fail_diag_irq; |
| 3118 | 3126 | ||
