u16 link_status;
        bool link_up;
 
-       if (!test_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state) ||
-           test_bit(IONIC_LIF_F_QUEUE_RESET, lif->state))
+       if (!test_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state))
                return;
 
        link_status = le16_to_cpu(lif->info->status.link_status);
                        netif_carrier_on(netdev);
                }
 
-               if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev))
+               if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) {
+                       mutex_lock(&lif->queue_lock);
                        ionic_start_queues(lif);
+                       mutex_unlock(&lif->queue_lock);
+               }
        } else {
                if (netif_carrier_ok(netdev)) {
                        netdev_info(netdev, "Link down\n");
                        netif_carrier_off(netdev);
                }
 
-               if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev))
+               if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) {
+                       mutex_lock(&lif->queue_lock);
                        ionic_stop_queues(lif);
+                       mutex_unlock(&lif->queue_lock);
+               }
        }
 
        clear_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state);
        bool running;
        int err = 0;
 
-       err = ionic_wait_for_bit(lif, IONIC_LIF_F_QUEUE_RESET);
-       if (err)
-               return err;
-
+       mutex_lock(&lif->queue_lock);
        running = netif_running(lif->netdev);
        if (running) {
                netif_device_detach(lif->netdev);
                err = ionic_stop(lif->netdev);
                if (err)
-                       goto reset_out;
+                       return err;
        }
 
        if (cb)
                err = ionic_open(lif->netdev);
                netif_device_attach(lif->netdev);
        }
-
-reset_out:
-       clear_bit(IONIC_LIF_F_QUEUE_RESET, lif->state);
+       mutex_unlock(&lif->queue_lock);
 
        return err;
 }
 
        if (test_bit(IONIC_LIF_F_UP, lif->state)) {
                dev_info(ionic->dev, "Surprise FW stop, stopping queues\n");
+               mutex_lock(&lif->queue_lock);
                ionic_stop_queues(lif);
+               mutex_unlock(&lif->queue_lock);
        }
 
        if (netif_running(lif->netdev)) {
        ionic_lif_qcq_deinit(lif, lif->notifyqcq);
        ionic_lif_qcq_deinit(lif, lif->adminqcq);
 
+       mutex_destroy(&lif->queue_lock);
        ionic_lif_reset(lif);
 }
 
                return err;
 
        lif->hw_index = le16_to_cpu(comp.hw_index);
+       mutex_init(&lif->queue_lock);
 
        /* now that we have the hw_index we can figure out our doorbell page */
        lif->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif);
 
        IONIC_LIF_F_SW_DEBUG_STATS,
        IONIC_LIF_F_UP,
        IONIC_LIF_F_LINK_CHECK_REQUESTED,
-       IONIC_LIF_F_QUEUE_RESET,
        IONIC_LIF_F_FW_RESET,
 
        /* leave this as last */
        unsigned int hw_index;
        unsigned int kern_pid;
        u64 __iomem *kern_dbpage;
+       struct mutex queue_lock;        /* lock for queue structures */
        spinlock_t adminq_lock;         /* lock for AdminQ operations */
        struct ionic_qcq *adminqcq;
        struct ionic_qcq *notifyqcq;
 #define lif_to_txq(lif, i)     (&lif_to_txqcq((lif), i)->q)
 #define lif_to_rxq(lif, i)     (&lif_to_txqcq((lif), i)->q)
 
-/* return 0 if successfully set the bit, else non-zero */
-static inline int ionic_wait_for_bit(struct ionic_lif *lif, int bitname)
-{
-       return wait_on_bit_lock(lif->state, bitname, TASK_INTERRUPTIBLE);
-}
-
 static inline u32 ionic_coal_usec_to_hw(struct ionic *ionic, u32 usecs)
 {
        u32 mult = le32_to_cpu(ionic->ident.dev.intr_coal_mult);