|
@@ -28,8 +28,6 @@
|
|
|
#include "i40e_prototype.h"
|
|
|
static int i40evf_setup_all_tx_resources(struct i40evf_adapter *adapter);
|
|
|
static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter);
|
|
|
-static void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter);
|
|
|
-static void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter);
|
|
|
static int i40evf_close(struct net_device *netdev);
|
|
|
|
|
|
char i40evf_driver_name[] = "i40evf";
|
|
@@ -973,8 +971,10 @@ void i40evf_down(struct i40evf_adapter *adapter)
|
|
|
&adapter->crit_section))
|
|
|
usleep_range(500, 1000);
|
|
|
|
|
|
- i40evf_irq_disable(adapter);
|
|
|
+ netif_carrier_off(netdev);
|
|
|
+ netif_tx_disable(netdev);
|
|
|
i40evf_napi_disable_all(adapter);
|
|
|
+ i40evf_irq_disable(adapter);
|
|
|
|
|
|
/* remove all MAC filters */
|
|
|
list_for_each_entry(f, &adapter->mac_filter_list, list) {
|
|
@@ -997,13 +997,7 @@ void i40evf_down(struct i40evf_adapter *adapter)
|
|
|
adapter->aq_required |= I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
|
|
|
adapter->aq_required |= I40EVF_FLAG_AQ_DISABLE_QUEUES;
|
|
|
}
|
|
|
- netif_tx_disable(netdev);
|
|
|
-
|
|
|
- netif_tx_stop_all_queues(netdev);
|
|
|
|
|
|
- msleep(20);
|
|
|
-
|
|
|
- netif_carrier_off(netdev);
|
|
|
clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section);
|
|
|
}
|
|
|
|
|
@@ -1358,6 +1352,11 @@ static void i40evf_watchdog_task(struct work_struct *work)
|
|
|
goto watchdog_done;
|
|
|
}
|
|
|
|
|
|
+ if (adapter->aq_required & I40EVF_FLAG_AQ_DISABLE_QUEUES) {
|
|
|
+ i40evf_disable_queues(adapter);
|
|
|
+ goto watchdog_done;
|
|
|
+ }
|
|
|
+
|
|
|
if (adapter->aq_required & I40EVF_FLAG_AQ_MAP_VECTORS) {
|
|
|
i40evf_map_queues(adapter);
|
|
|
goto watchdog_done;
|
|
@@ -1383,11 +1382,6 @@ static void i40evf_watchdog_task(struct work_struct *work)
|
|
|
goto watchdog_done;
|
|
|
}
|
|
|
|
|
|
- if (adapter->aq_required & I40EVF_FLAG_AQ_DISABLE_QUEUES) {
|
|
|
- i40evf_disable_queues(adapter);
|
|
|
- goto watchdog_done;
|
|
|
- }
|
|
|
-
|
|
|
if (adapter->aq_required & I40EVF_FLAG_AQ_CONFIGURE_QUEUES) {
|
|
|
i40evf_configure_queues(adapter);
|
|
|
goto watchdog_done;
|
|
@@ -1724,7 +1718,7 @@ out:
|
|
|
*
|
|
|
* Free all transmit software resources
|
|
|
**/
|
|
|
-static void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter)
|
|
|
+void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
@@ -1794,7 +1788,7 @@ static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter)
|
|
|
*
|
|
|
* Free all receive software resources
|
|
|
**/
|
|
|
-static void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter)
|
|
|
+void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
@@ -1824,7 +1818,7 @@ static int i40evf_open(struct net_device *netdev)
|
|
|
dev_err(&adapter->pdev->dev, "Unable to open device due to PF driver failure.\n");
|
|
|
return -EIO;
|
|
|
}
|
|
|
- if (adapter->state != __I40EVF_DOWN)
|
|
|
+ if (adapter->state != __I40EVF_DOWN || adapter->aq_required)
|
|
|
return -EBUSY;
|
|
|
|
|
|
/* allocate transmit descriptors */
|
|
@@ -1888,9 +1882,6 @@ static int i40evf_close(struct net_device *netdev)
|
|
|
adapter->state = __I40EVF_DOWN;
|
|
|
i40evf_free_traffic_irqs(adapter);
|
|
|
|
|
|
- i40evf_free_all_tx_resources(adapter);
|
|
|
- i40evf_free_all_rx_resources(adapter);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2504,6 +2495,8 @@ static void i40evf_remove(struct pci_dev *pdev)
|
|
|
iounmap(hw->hw_addr);
|
|
|
pci_release_regions(pdev);
|
|
|
|
|
|
+ i40evf_free_all_tx_resources(adapter);
|
|
|
+ i40evf_free_all_rx_resources(adapter);
|
|
|
i40evf_free_queues(adapter);
|
|
|
kfree(adapter->vf_res);
|
|
|
/* If we got removed before an up/down sequence, we've got a filter
|