struct e1000_hw *hw = &adapter->hw;
 
        max_frame_size = adapter->max_frame_size + VLAN_TAG_SIZE;
+
+       spin_lock_bh(&hw->mbx_lock);
+
        e1000_rlpml_set_vf(hw, max_frame_size);
+
+       spin_unlock_bh(&hw->mbx_lock);
 }
 
 static int igbvf_vlan_rx_add_vid(struct net_device *netdev,
        struct igbvf_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
 
+       spin_lock_bh(&hw->mbx_lock);
+
        if (hw->mac.ops.set_vfta(hw, vid, true)) {
                dev_err(&adapter->pdev->dev, "Failed to add vlan id %d\n", vid);
+               spin_unlock_bh(&hw->mbx_lock);
                return -EINVAL;
        }
+
+       spin_unlock_bh(&hw->mbx_lock);
+
        set_bit(vid, adapter->active_vlans);
        return 0;
 }
        struct igbvf_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
 
+       spin_lock_bh(&hw->mbx_lock);
+
        if (hw->mac.ops.set_vfta(hw, vid, false)) {
                dev_err(&adapter->pdev->dev,
                        "Failed to remove vlan id %d\n", vid);
+               spin_unlock_bh(&hw->mbx_lock);
                return -EINVAL;
        }
+
+       spin_unlock_bh(&hw->mbx_lock);
+
        clear_bit(vid, adapter->active_vlans);
        return 0;
 }
        netdev_for_each_mc_addr(ha, netdev)
                memcpy(mta_list + (i++ * ETH_ALEN), ha->addr, ETH_ALEN);
 
+       spin_lock_bh(&hw->mbx_lock);
+
        hw->mac.ops.update_mc_addr_list(hw, mta_list, i, 0, 0);
+
+       spin_unlock_bh(&hw->mbx_lock);
        kfree(mta_list);
 }
 
                return -ENOSPC;
        }
 
+       spin_lock_bh(&hw->mbx_lock);
+
        /* Clear all unicast MAC filters */
        hw->mac.ops.set_uc_addr(hw, E1000_VF_MAC_FILTER_CLR, NULL);
 
+       spin_unlock_bh(&hw->mbx_lock);
+
        if (!netdev_uc_empty(netdev)) {
                struct netdev_hw_addr *ha;
 
                /* Add MAC filters one by one */
                netdev_for_each_uc_addr(ha, netdev) {
+                       spin_lock_bh(&hw->mbx_lock);
+
                        hw->mac.ops.set_uc_addr(hw, E1000_VF_MAC_FILTER_ADD,
                                                ha->addr);
+
+                       spin_unlock_bh(&hw->mbx_lock);
                        udelay(200);
                }
        }
        struct net_device *netdev = adapter->netdev;
        struct e1000_hw *hw = &adapter->hw;
 
+       spin_lock_bh(&hw->mbx_lock);
+
        /* Allow time for pending master requests to run */
        if (mac->ops.reset_hw(hw))
                dev_err(&adapter->pdev->dev, "PF still resetting\n");
 
        mac->ops.init_hw(hw);
 
+       spin_unlock_bh(&hw->mbx_lock);
+
        if (is_valid_ether_addr(adapter->hw.mac.addr)) {
                memcpy(netdev->dev_addr, adapter->hw.mac.addr,
                       netdev->addr_len);
        igbvf_irq_disable(adapter);
 
        spin_lock_init(&adapter->stats_lock);
+       spin_lock_init(&adapter->hw.mbx_lock);
 
        set_bit(__IGBVF_DOWN, &adapter->state);
        return 0;
 
        memcpy(hw->mac.addr, addr->sa_data, netdev->addr_len);
 
+       spin_lock_bh(&hw->mbx_lock);
+
        hw->mac.ops.rar_set(hw, hw->mac.addr, 0);
 
+       spin_unlock_bh(&hw->mbx_lock);
+
        if (!ether_addr_equal(addr->sa_data, hw->mac.addr))
                return -EADDRNOTAVAIL;
 
        if (test_bit(__IGBVF_DOWN, &adapter->state))
                return false;
 
+       spin_lock_bh(&hw->mbx_lock);
+
        ret_val = hw->mac.ops.check_for_link(hw);
+
+       spin_unlock_bh(&hw->mbx_lock);
+
        link_active = !hw->mac.get_link_status;
 
        /* if check for link returns error we will need to reset */
        netdev->min_mtu = ETH_MIN_MTU;
        netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
 
+       spin_lock_bh(&hw->mbx_lock);
+
        /*reset the controller to put the device in a known good state */
        err = hw->mac.ops.reset_hw(hw);
        if (err) {
                       netdev->addr_len);
        }
 
+       spin_unlock_bh(&hw->mbx_lock);
+
        if (!is_valid_ether_addr(netdev->dev_addr)) {
                dev_info(&pdev->dev, "Assigning random MAC address.\n");
                eth_hw_addr_random(netdev);