netxen: protect tx timeout recovery by rtnl lock
authorAmit Kumar Salecha <amit.salecha@qlogic.com>
Sun, 8 Aug 2010 06:05:23 +0000 (23:05 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 8 Aug 2010 06:05:23 +0000 (23:05 -0700)
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netxen/netxen_nic_main.c

index 6ce6ce1df6d2c16eda31bbd8a48b07c162949e28..fd86e18604e636a5b1ede55a077d56dd2ba06713 100644 (file)
@@ -2001,27 +2001,26 @@ static void netxen_tx_timeout_task(struct work_struct *work)
        if (++adapter->tx_timeo_cnt >= NX_MAX_TX_TIMEOUTS)
                goto request_reset;
 
+       rtnl_lock();
        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
                /* try to scrub interrupt */
                netxen_napi_disable(adapter);
 
-               adapter->netdev->trans_start = jiffies;
-
                netxen_napi_enable(adapter);
 
                netif_wake_queue(adapter->netdev);
 
                clear_bit(__NX_RESETTING, &adapter->state);
-               return;
        } else {
                clear_bit(__NX_RESETTING, &adapter->state);
-               if (!netxen_nic_reset_context(adapter)) {
-                       adapter->netdev->trans_start = jiffies;
-                       return;
+               if (netxen_nic_reset_context(adapter)) {
+                       rtnl_unlock();
+                       goto request_reset;
                }
-
-               /* context reset failed, fall through for fw reset */
        }
+       adapter->netdev->trans_start = jiffies;
+       rtnl_unlock();
+       return;
 
 request_reset:
        adapter->need_fw_reset = 1;