return ice_status_to_errno(status);
                }
                vf->num_mac++;
+
+               ether_addr_copy(vf->dev_lan_addr.addr, vf->hw_lan_addr.addr);
        }
 
        return 0;
        if (!is_valid_ether_addr(mac_addr))
                return;
 
-       /* only allow legacy VF drivers to set the hardware MAC if it is zero
-        * and allow new VF drivers to set the hardware MAC if the type was
-        * correctly specified over VIRTCHNL
+       /* only allow legacy VF drivers to set the device and hardware MAC if it
+        * is zero and allow new VF drivers to set the hardware MAC if the type
+        * was correctly specified over VIRTCHNL
         */
        if ((ice_is_vc_addr_legacy(vc_ether_addr) &&
             is_zero_ether_addr(vf->hw_lan_addr.addr)) ||
-           ice_is_vc_addr_primary(vc_ether_addr))
+           ice_is_vc_addr_primary(vc_ether_addr)) {
+               ether_addr_copy(vf->dev_lan_addr.addr, mac_addr);
                ether_addr_copy(vf->hw_lan_addr.addr, mac_addr);
+       }
 
-       /* hardware MAC is already set, but its possible that the VF driver sent
-        * the VIRTCHNL_OP_ADD_ETH_ADDR message before the
+       /* hardware and device MACs are already set, but its possible that the
+        * VF driver sent the VIRTCHNL_OP_ADD_ETH_ADDR message before the
         * VIRTCHNL_OP_DEL_ETH_ADDR when trying to update its MAC, so save it
         * away for the legacy VF driver case as it will be updated in the
         * delete flow for this case
        u8 *mac_addr = vc_ether_addr->addr;
        enum ice_status status;
 
-       /* default unicast MAC already added */
-       if (ether_addr_equal(mac_addr, vf->hw_lan_addr.addr))
+       /* device MAC already added */
+       if (ether_addr_equal(mac_addr, vf->dev_lan_addr.addr))
                return 0;
 
        if (is_unicast_ether_addr(mac_addr) && !ice_can_vf_change_mac(vf)) {
        u8 *mac_addr = vc_ether_addr->addr;
 
        if (!is_valid_ether_addr(mac_addr) ||
-           !ether_addr_equal(vf->hw_lan_addr.addr, mac_addr))
+           !ether_addr_equal(vf->dev_lan_addr.addr, mac_addr))
                return;
 
-       /* allow the hardware MAC to be repopulated in the add flow */
-       eth_zero_addr(vf->hw_lan_addr.addr);
+       /* allow the device MAC to be repopulated in the add flow and don't
+        * clear the hardware MAC (i.e. hw_lan_addr.addr) here as that is meant
+        * to be persistent on VM reboot and across driver unload/load, which
+        * won't work if we clear the hardware MAC here
+        */
+       eth_zero_addr(vf->dev_lan_addr.addr);
 
        /* only update cached hardware MAC for legacy VF drivers on delete
         * because we cannot guarantee order/type of MAC from the VF driver
         */
        if (ice_is_vc_addr_legacy(vc_ether_addr) &&
-           !ice_is_legacy_umac_expired(&vf->legacy_last_added_umac))
+           !ice_is_legacy_umac_expired(&vf->legacy_last_added_umac)) {
+               ether_addr_copy(vf->dev_lan_addr.addr,
+                               vf->legacy_last_added_umac.addr);
                ether_addr_copy(vf->hw_lan_addr.addr,
                                vf->legacy_last_added_umac.addr);
+       }
 }
 
 /**
        enum ice_status status;
 
        if (!ice_can_vf_change_mac(vf) &&
-           ether_addr_equal(mac_addr, vf->hw_lan_addr.addr))
+           ether_addr_equal(vf->dev_lan_addr.addr, mac_addr))
                return 0;
 
        status = ice_fltr_remove_mac(vsi, mac_addr, ICE_FWD_TO_VSI);
 
        vf = &pf->vf[vf_id];
        /* nothing left to do, unicast MAC already set */
-       if (ether_addr_equal(vf->hw_lan_addr.addr, mac))
+       if (ether_addr_equal(vf->dev_lan_addr.addr, mac) &&
+           ether_addr_equal(vf->hw_lan_addr.addr, mac))
                return 0;
 
        ret = ice_check_vf_ready_for_cfg(vf);
        /* VF is notified of its new MAC via the PF's response to the
         * VIRTCHNL_OP_GET_VF_RESOURCES message after the VF has been reset
         */
+       ether_addr_copy(vf->dev_lan_addr.addr, mac);
        ether_addr_copy(vf->hw_lan_addr.addr, mac);
        if (is_zero_ether_addr(mac)) {
                /* VF will send VIRTCHNL_OP_ADD_ETH_ADDR message with its MAC */
 
        dev_info(dev, "%d Rx Malicious Driver Detection events detected on PF %d VF %d MAC %pM. mdd-auto-reset-vfs=%s\n",
                 vf->mdd_rx_events.count, pf->hw.pf_id, vf->vf_id,
-                vf->hw_lan_addr.addr,
+                vf->dev_lan_addr.addr,
                 test_bit(ICE_FLAG_MDD_AUTO_RESET_VF, pf->flags)
                          ? "on" : "off");
 }
 
                        dev_info(dev, "%d Tx Malicious Driver Detection events detected on PF %d VF %d MAC %pM.\n",
                                 vf->mdd_tx_events.count, hw->pf_id, i,
-                                vf->hw_lan_addr.addr);
+                                vf->dev_lan_addr.addr);
                }
        }
 }
 
                        if (pf_vsi)
                                dev_warn(dev, "VF MAC %pM on PF MAC %pM is generating asynchronous messages and may be overflowing the PF message queue. Please see the Adapter User Guide for more information\n",
-                                        &vf->hw_lan_addr.addr[0],
+                                        &vf->dev_lan_addr.addr[0],
                                         pf_vsi->netdev->dev_addr);
                }