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);
        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))
        }
 
 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;
 
        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)