/**
  * iavf_up_complete - Finish the last steps of bringing up a connection
  * @adapter: board private structure
- *
- * Expects to be called while holding crit_lock.
- **/
+ */
 static void iavf_up_complete(struct iavf_adapter *adapter)
 {
        netdev_assert_locked(adapter->netdev);
 /**
  * iavf_down - Shutdown the connection processing
  * @adapter: board private structure
- *
- * Expects to be called while holding crit_lock.
- **/
+ */
 void iavf_down(struct iavf_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
  * iavf_finish_config - do all netdev work that needs RTNL
  * @work: our work_struct
  *
- * Do work that needs both RTNL and crit_lock.
- **/
+ * Do work that needs RTNL.
+ */
 static void iavf_finish_config(struct work_struct *work)
 {
        struct iavf_adapter *adapter;
-       bool locks_released = false;
+       bool netdev_released = false;
        int pairs, err;
 
        adapter = container_of(work, struct iavf_adapter, finish_config);
 
        /* Always take RTNL first to prevent circular lock dependency;
-        * The dev->lock is needed to update the queue number
+        * the dev->lock (== netdev lock) is needed to update the queue number.
         */
        rtnl_lock();
        netdev_lock(adapter->netdev);
-       mutex_lock(&adapter->crit_lock);
 
        if ((adapter->flags & IAVF_FLAG_SETUP_NETDEV_FEATURES) &&
            adapter->netdev->reg_state == NETREG_REGISTERED &&
                netif_set_real_num_tx_queues(adapter->netdev, pairs);
 
                if (adapter->netdev->reg_state != NETREG_REGISTERED) {
-                       mutex_unlock(&adapter->crit_lock);
                        netdev_unlock(adapter->netdev);
-                       locks_released = true;
+                       netdev_released = true;
                        err = register_netdevice(adapter->netdev);
                        if (err) {
                                dev_err(&adapter->pdev->dev, "Unable to register netdev (%d)\n",
                                        err);
 
                                /* go back and try again.*/
-                               mutex_lock(&adapter->crit_lock);
+                               netdev_lock(adapter->netdev);
                                iavf_free_rss(adapter);
                                iavf_free_misc_irq(adapter);
                                iavf_reset_interrupt_capability(adapter);
                                iavf_change_state(adapter,
                                                  __IAVF_INIT_CONFIG_ADAPTER);
-                               mutex_unlock(&adapter->crit_lock);
+                               netdev_unlock(adapter->netdev);
                                goto out;
                        }
                }
        }
 
 out:
-       if (!locks_released) {
-               mutex_unlock(&adapter->crit_lock);
+       if (!netdev_released)
                netdev_unlock(adapter->netdev);
-       }
        rtnl_unlock();
 }
 
        u32 reg_val;
 
        netdev_assert_locked(adapter->netdev);
-       lockdep_assert_held(&adapter->crit_lock);
 
        if (adapter->flags & IAVF_FLAG_PF_COMMS_FAILED)
                iavf_change_state(adapter, __IAVF_COMM_FAILED);
        int msec_delay;
 
        netdev_lock(netdev);
-       if (!mutex_trylock(&adapter->crit_lock)) {
-               if (adapter->state == __IAVF_REMOVE) {
-                       netdev_unlock(netdev);
-                       return;
-               }
-
-               msec_delay = 20;
-               goto restart_watchdog;
-       }
-
        msec_delay = iavf_watchdog_step(adapter);
-
-       mutex_unlock(&adapter->crit_lock);
-restart_watchdog:
-       netdev_unlock(netdev);
-
        /* note that we schedule a different task */
        if (adapter->state >= __IAVF_DOWN)
                queue_work(adapter->wq, &adapter->adminq_task);
        if (msec_delay != IAVF_NO_RESCHED)
                queue_delayed_work(adapter->wq, &adapter->watchdog_task,
                                   msecs_to_jiffies(msec_delay));
+       netdev_unlock(netdev);
 }
 
 /**
  * @adapter: board private structure
  *
  * Set communication failed flag and free all resources.
- * NOTE: This function is expected to be called with crit_lock being held.
- **/
+ */
 static void iavf_disable_vf(struct iavf_adapter *adapter)
 {
        struct iavf_mac_filter *f, *ftmp;
        int i = 0, err;
        bool running;
 
-       /* When device is being removed it doesn't make sense to run the reset
-        * task, just return in such a case.
-        */
        netdev_lock(netdev);
-       if (!mutex_trylock(&adapter->crit_lock)) {
-               if (adapter->state != __IAVF_REMOVE)
-                       queue_work(adapter->wq, &adapter->reset_task);
-
-               netdev_unlock(netdev);
-               return;
-       }
 
        iavf_misc_irq_disable(adapter);
        if (adapter->flags & IAVF_FLAG_RESET_NEEDED) {
                dev_err(&adapter->pdev->dev, "Reset never finished (%x)\n",
                        reg_val);
                iavf_disable_vf(adapter);
-               mutex_unlock(&adapter->crit_lock);
                netdev_unlock(netdev);
                return; /* Do not attempt to reinit. It's dead, Jim. */
        }
        adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
 
        wake_up(&adapter->reset_waitqueue);
-       mutex_unlock(&adapter->crit_lock);
        netdev_unlock(netdev);
 
        return;
        }
        iavf_disable_vf(adapter);
 
-       mutex_unlock(&adapter->crit_lock);
        netdev_unlock(netdev);
        dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
 }
 {
        struct iavf_adapter *adapter =
                container_of(work, struct iavf_adapter, adminq_task);
+       struct net_device *netdev = adapter->netdev;
        struct iavf_hw *hw = &adapter->hw;
        struct iavf_arq_event_info event;
        enum virtchnl_ops v_op;
        u32 val, oldval;
        u16 pending;
 
-       if (!mutex_trylock(&adapter->crit_lock)) {
-               if (adapter->state == __IAVF_REMOVE)
-                       return;
-
-               queue_work(adapter->wq, &adapter->adminq_task);
-               goto out;
-       }
+       netdev_lock(netdev);
 
        if (adapter->flags & IAVF_FLAG_PF_COMMS_FAILED)
                goto unlock;
 freedom:
        kfree(event.msg_buf);
 unlock:
-       mutex_unlock(&adapter->crit_lock);
-out:
+       netdev_unlock(netdev);
        /* re-enable Admin queue interrupt cause */
        iavf_misc_irq_enable(adapter);
 }
                                    struct flow_cls_offload *cls_flower)
 {
        int tc = tc_classid_to_hwtc(adapter->netdev, cls_flower->classid);
-       struct iavf_cloud_filter *filter = NULL;
-       int err = -EINVAL, count = 50;
+       struct iavf_cloud_filter *filter;
+       int err;
 
        if (tc < 0) {
                dev_err(&adapter->pdev->dev, "Invalid traffic class\n");
        filter = kzalloc(sizeof(*filter), GFP_KERNEL);
        if (!filter)
                return -ENOMEM;
-
-       while (!mutex_trylock(&adapter->crit_lock)) {
-               if (--count == 0) {
-                       kfree(filter);
-                       return err;
-               }
-               udelay(1);
-       }
-
        filter->cookie = cls_flower->cookie;
 
+       netdev_lock(adapter->netdev);
+
        /* bail out here if filter already exists */
        spin_lock_bh(&adapter->cloud_filter_list_lock);
        if (iavf_find_cf(adapter, &cls_flower->cookie)) {
        if (err)
                kfree(filter);
 
-       mutex_unlock(&adapter->crit_lock);
+       netdev_unlock(adapter->netdev);
        return err;
 }
 
                return -EIO;
        }
 
-       while (!mutex_trylock(&adapter->crit_lock)) {
-               /* If we are in __IAVF_INIT_CONFIG_ADAPTER state the crit_lock
-                * is already taken and iavf_open is called from an upper
-                * device's notifier reacting on NETDEV_REGISTER event.
-                * We have to leave here to avoid dead lock.
-                */
-               if (adapter->state == __IAVF_INIT_CONFIG_ADAPTER)
-                       return -EBUSY;
-
-               usleep_range(500, 1000);
-       }
-
-       if (adapter->state != __IAVF_DOWN) {
-               err = -EBUSY;
-               goto err_unlock;
-       }
+       if (adapter->state != __IAVF_DOWN)
+               return -EBUSY;
 
        if (adapter->state == __IAVF_RUNNING &&
            !test_bit(__IAVF_VSI_DOWN, adapter->vsi.state)) {
                dev_dbg(&adapter->pdev->dev, "VF is already open.\n");
-               err = 0;
-               goto err_unlock;
+               return 0;
        }
 
        /* allocate transmit descriptors */
                goto err_req_irq;
 
        spin_lock_bh(&adapter->mac_vlan_list_lock);
-
        iavf_add_filter(adapter, adapter->hw.mac.addr);
-
        spin_unlock_bh(&adapter->mac_vlan_list_lock);
 
        /* Restore filters that were removed with IFF_DOWN */
 
        iavf_irq_enable(adapter, true);
 
-       mutex_unlock(&adapter->crit_lock);
-
        return 0;
 
 err_req_irq:
        iavf_free_all_rx_resources(adapter);
 err_setup_tx:
        iavf_free_all_tx_resources(adapter);
-err_unlock:
-       mutex_unlock(&adapter->crit_lock);
 
        return err;
 }
 
        netdev_assert_locked(netdev);
 
-       mutex_lock(&adapter->crit_lock);
-
-       if (adapter->state <= __IAVF_DOWN_PENDING) {
-               mutex_unlock(&adapter->crit_lock);
+       if (adapter->state <= __IAVF_DOWN_PENDING)
                return 0;
-       }
 
        set_bit(__IAVF_VSI_DOWN, adapter->vsi.state);
        /* We cannot send IAVF_FLAG_AQ_GET_OFFLOAD_VLAN_V2_CAPS before
        iavf_change_state(adapter, __IAVF_DOWN_PENDING);
        iavf_free_traffic_irqs(adapter);
 
-       mutex_unlock(&adapter->crit_lock);
        netdev_unlock(netdev);
 
        /* We explicitly don't free resources here because the hardware is
                                    msecs_to_jiffies(500));
        if (!status)
                netdev_warn(netdev, "Device resources not yet released\n");
-
        netdev_lock(netdev);
-       mutex_lock(&adapter->crit_lock);
+
        adapter->aq_required |= aq_to_restore;
-       mutex_unlock(&adapter->crit_lock);
+
        return 0;
 }
 
        struct iavf_adapter *adapter = netdev_priv(binding->netdev);
        const struct net_shaper_handle *handle = &shaper->handle;
        struct iavf_ring *tx_ring;
-       int ret = 0;
+       int ret;
 
        netdev_assert_locked(adapter->netdev);
 
-       mutex_lock(&adapter->crit_lock);
        if (handle->id >= adapter->num_active_queues)
-               goto unlock;
+               return 0;
 
        ret = iavf_verify_shaper(binding, shaper, extack);
        if (ret)
-               goto unlock;
+               return ret;
 
        tx_ring = &adapter->tx_rings[handle->id];
 
 
        adapter->aq_required |= IAVF_FLAG_AQ_CONFIGURE_QUEUES_BW;
 
-unlock:
-       mutex_unlock(&adapter->crit_lock);
-       return ret;
+       return 0;
 }
 
 static int iavf_shaper_del(struct net_shaper_binding *binding,
 
        netdev_assert_locked(adapter->netdev);
 
-       mutex_lock(&adapter->crit_lock);
        if (handle->id >= adapter->num_active_queues)
-               goto unlock;
+               return 0;
 
        tx_ring = &adapter->tx_rings[handle->id];
        tx_ring->q_shaper.bw_min = 0;
 
        adapter->aq_required |= IAVF_FLAG_AQ_CONFIGURE_QUEUES_BW;
 
-unlock:
-       mutex_unlock(&adapter->crit_lock);
        return 0;
 }
 
                goto err_alloc_qos_cap;
        }
 
-       /* set up the locks for the AQ, do this only once in probe
-        * and destroy them only once in remove
-        */
-       mutex_init(&adapter->crit_lock);
        mutex_init(&hw->aq.asq_mutex);
        mutex_init(&hw->aq.arq_mutex);
 
        running = netif_running(netdev);
        if (running)
                rtnl_lock();
-
        netdev_lock(netdev);
-       mutex_lock(&adapter->crit_lock);
 
        if (running)
                iavf_down(adapter);
        iavf_free_misc_irq(adapter);
        iavf_reset_interrupt_capability(adapter);
 
-       mutex_unlock(&adapter->crit_lock);
        netdev_unlock(netdev);
        if (running)
                rtnl_unlock();
         * There are flows where register/unregister netdev may race.
         */
        while (1) {
-               mutex_lock(&adapter->crit_lock);
+               netdev_lock(netdev);
                if (adapter->state == __IAVF_RUNNING ||
                    adapter->state == __IAVF_DOWN ||
                    adapter->state == __IAVF_INIT_FAILED) {
-                       mutex_unlock(&adapter->crit_lock);
+                       netdev_unlock(netdev);
                        break;
                }
                /* Simply return if we already went through iavf_shutdown */
                if (adapter->state == __IAVF_REMOVE) {
-                       mutex_unlock(&adapter->crit_lock);
+                       netdev_unlock(netdev);
                        return;
                }
 
-               mutex_unlock(&adapter->crit_lock);
+               netdev_unlock(netdev);
                usleep_range(500, 1000);
        }
        cancel_delayed_work_sync(&adapter->watchdog_task);
                unregister_netdev(netdev);
 
        netdev_lock(netdev);
-       mutex_lock(&adapter->crit_lock);
        dev_info(&adapter->pdev->dev, "Removing device\n");
        iavf_change_state(adapter, __IAVF_REMOVE);
 
 
        iavf_misc_irq_disable(adapter);
        /* Shut down all the garbage mashers on the detention level */
+       netdev_unlock(netdev);
        cancel_work_sync(&adapter->reset_task);
        cancel_delayed_work_sync(&adapter->watchdog_task);
        cancel_work_sync(&adapter->adminq_task);
+       netdev_lock(netdev);
 
        adapter->aq_required = 0;
        adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
        /* destroy the locks only once, here */
        mutex_destroy(&hw->aq.arq_mutex);
        mutex_destroy(&hw->aq.asq_mutex);
-       mutex_unlock(&adapter->crit_lock);
-       mutex_destroy(&adapter->crit_lock);
        netdev_unlock(netdev);
 
        iounmap(hw->hw_addr);