ixgbevf: Fix ordering of shutdown to correctly disable Rx and Tx
[cascardo/linux.git] / drivers / net / ethernet / intel / ixgbevf / ixgbevf_main.c
index 6d24aa5..a4b3d66 100644 (file)
@@ -1957,6 +1957,10 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter)
        clear_bit(__IXGBEVF_DOWN, &adapter->state);
        ixgbevf_napi_enable_all(adapter);
 
+       /* clear any pending interrupts, may auto mask */
+       IXGBE_READ_REG(hw, IXGBE_VTEICR);
+       ixgbevf_irq_enable(adapter);
+
        /* enable transmits */
        netif_tx_start_all_queues(netdev);
 
@@ -1969,16 +1973,9 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter)
 
 void ixgbevf_up(struct ixgbevf_adapter *adapter)
 {
-       struct ixgbe_hw *hw = &adapter->hw;
-
        ixgbevf_configure(adapter);
 
        ixgbevf_up_complete(adapter);
-
-       /* clear any pending interrupts, may auto mask */
-       IXGBE_READ_REG(hw, IXGBE_VTEICR);
-
-       ixgbevf_irq_enable(adapter);
 }
 
 /**
@@ -2085,17 +2082,20 @@ void ixgbevf_down(struct ixgbevf_adapter *adapter)
        for (i = 0; i < adapter->num_rx_queues; i++)
                ixgbevf_disable_rx_queue(adapter, adapter->rx_ring[i]);
 
-       netif_tx_disable(netdev);
-
-       msleep(10);
+       usleep_range(10000, 20000);
 
        netif_tx_stop_all_queues(netdev);
 
+       /* call carrier off first to avoid false dev_watchdog timeouts */
+       netif_carrier_off(netdev);
+       netif_tx_disable(netdev);
+
        ixgbevf_irq_disable(adapter);
 
        ixgbevf_napi_disable_all(adapter);
 
        del_timer_sync(&adapter->watchdog_timer);
+
        /* can't call flush scheduled work here because it can deadlock
         * if linkwatch_event tries to acquire the rtnl_lock which we are
         * holding */
@@ -2110,8 +2110,6 @@ void ixgbevf_down(struct ixgbevf_adapter *adapter)
                                IXGBE_TXDCTL_SWFLSH);
        }
 
-       netif_carrier_off(netdev);
-
        if (!pci_channel_offline(adapter->pdev))
                ixgbevf_reset(adapter);
 
@@ -2995,10 +2993,6 @@ static int ixgbevf_open(struct net_device *netdev)
        if (!adapter->num_msix_vectors)
                return -ENOMEM;
 
-       /* disallow open during test */
-       if (test_bit(__IXGBEVF_TESTING, &adapter->state))
-               return -EBUSY;
-
        if (hw->adapter_stopped) {
                ixgbevf_reset(adapter);
                /* if adapter is still stopped then PF isn't up and
@@ -3011,6 +3005,12 @@ static int ixgbevf_open(struct net_device *netdev)
                }
        }
 
+       /* disallow open during test */
+       if (test_bit(__IXGBEVF_TESTING, &adapter->state))
+               return -EBUSY;
+
+       netif_carrier_off(netdev);
+
        /* allocate transmit descriptors */
        err = ixgbevf_setup_all_tx_resources(adapter);
        if (err)
@@ -3030,15 +3030,11 @@ static int ixgbevf_open(struct net_device *netdev)
         */
        ixgbevf_map_rings_to_vectors(adapter);
 
-       ixgbevf_up_complete(adapter);
-
-       /* clear any pending interrupts, may auto mask */
-       IXGBE_READ_REG(hw, IXGBE_VTEICR);
        err = ixgbevf_request_irq(adapter);
        if (err)
                goto err_req_irq;
 
-       ixgbevf_irq_enable(adapter);
+       ixgbevf_up_complete(adapter);
 
        return 0;