netxen: fix corner cases of firmware recovery
authorAmit Kumar Salecha <amit.salecha@qlogic.com>
Mon, 29 Mar 2010 02:43:42 +0000 (02:43 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Mar 2010 20:18:36 +0000 (13:18 -0700)
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
o DEV_NEED_RESET state was not handled during fw intialization phase.
o nx_decr_dev_ref_cnt() can return error, if fail to grab pcie seamphore.
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netxen/netxen_nic_main.c

index 08780ef1c1f885d56b38d9c4ff68b4f790711f58..68903bf06cf60990d0c7b3b99ce460a38891c570 100644 (file)
@@ -2294,6 +2294,7 @@ netxen_fwinit_work(struct work_struct *work)
                }
                break;
 
+       case NX_DEV_NEED_RESET:
        case NX_DEV_INITALIZING:
                if (++adapter->fw_wait_cnt < FW_POLL_THRESH) {
                        netxen_schedule_work(adapter,
@@ -2337,6 +2338,9 @@ netxen_detach_work(struct work_struct *work)
 
        ref_cnt = nx_decr_dev_ref_cnt(adapter);
 
+       if (ref_cnt == -EIO)
+               goto err_ret;
+
        delay = (ref_cnt == 0) ? 0 : (2 * FW_POLL_DELAY);
 
        adapter->fw_wait_cnt = 0;