i40evf: don't go further down
authorMitch Williams <mitch.a.williams@intel.com>
Thu, 22 May 2014 06:31:46 +0000 (06:31 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 11 Jun 2014 15:48:12 +0000 (08:48 -0700)
If the device is down, there's no place to go but up, so don't try to go
down even more. This prevents a CPU soft lock in napi_disable().

Change-ID: I8b058b9ee974dfa01c212fae2597f4f54b333314
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40evf/i40evf_main.c

index d4157857360d7e8f60b96a0c0d7bf75db0cddb38..f454b58cad2ea0cfd58b9ad23157d185037c4c37 100644 (file)
@@ -968,6 +968,9 @@ void i40evf_down(struct i40evf_adapter *adapter)
        struct net_device *netdev = adapter->netdev;
        struct i40evf_mac_filter *f;
 
+       if (adapter->state == __I40EVF_DOWN)
+               return;
+
        /* remove all MAC filters */
        list_for_each_entry(f, &adapter->mac_filter_list, list) {
                f->remove = true;
@@ -1785,12 +1788,11 @@ static int i40evf_close(struct net_device *netdev)
        if (adapter->state <= __I40EVF_DOWN)
                return 0;
 
-       /* signal that we are down to the interrupt handler */
-       adapter->state = __I40EVF_DOWN;
 
        set_bit(__I40E_DOWN, &adapter->vsi.state);
 
        i40evf_down(adapter);
+       adapter->state = __I40EVF_DOWN;
        i40evf_free_traffic_irqs(adapter);
 
        i40evf_free_all_tx_resources(adapter);