|
@@ -1796,7 +1796,11 @@ static void i40evf_disable_vf(struct i40evf_adapter *adapter)
|
|
|
|
|
|
adapter->flags |= I40EVF_FLAG_PF_COMMS_FAILED;
|
|
|
|
|
|
- if (netif_running(adapter->netdev)) {
|
|
|
+ /* We don't use netif_running() because it may be true prior to
|
|
|
+ * ndo_open() returning, so we can't assume it means all our open
|
|
|
+ * tasks have finished, since we're not holding the rtnl_lock here.
|
|
|
+ */
|
|
|
+ if (adapter->state == __I40EVF_RUNNING) {
|
|
|
set_bit(__I40E_VSI_DOWN, adapter->vsi.state);
|
|
|
netif_carrier_off(adapter->netdev);
|
|
|
netif_tx_disable(adapter->netdev);
|
|
@@ -1854,6 +1858,7 @@ static void i40evf_reset_task(struct work_struct *work)
|
|
|
struct i40evf_mac_filter *f;
|
|
|
u32 reg_val;
|
|
|
int i = 0, err;
|
|
|
+ bool running;
|
|
|
|
|
|
while (test_and_set_bit(__I40EVF_IN_CLIENT_TASK,
|
|
|
&adapter->crit_section))
|
|
@@ -1913,7 +1918,13 @@ static void i40evf_reset_task(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
continue_reset:
|
|
|
- if (netif_running(netdev)) {
|
|
|
+ /* We don't use netif_running() because it may be true prior to
|
|
|
+ * ndo_open() returning, so we can't assume it means all our open
|
|
|
+ * tasks have finished, since we're not holding the rtnl_lock here.
|
|
|
+ */
|
|
|
+ running = (adapter->state == __I40EVF_RUNNING);
|
|
|
+
|
|
|
+ if (running) {
|
|
|
netif_carrier_off(netdev);
|
|
|
netif_tx_stop_all_queues(netdev);
|
|
|
adapter->link_up = false;
|
|
@@ -1964,7 +1975,10 @@ continue_reset:
|
|
|
|
|
|
mod_timer(&adapter->watchdog_timer, jiffies + 2);
|
|
|
|
|
|
- if (netif_running(adapter->netdev)) {
|
|
|
+ /* We were running when the reset started, so we need to restore some
|
|
|
+ * state here.
|
|
|
+ */
|
|
|
+ if (running) {
|
|
|
/* allocate transmit descriptors */
|
|
|
err = i40evf_setup_all_tx_resources(adapter);
|
|
|
if (err)
|