Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / net / ethernet / intel / ice / ice_main.c
index 60d55d0..0d6c143 100644 (file)
@@ -5122,6 +5122,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
        struct ice_hw *hw = &pf->hw;
        struct sockaddr *addr = pi;
        enum ice_status status;
+       u8 old_mac[ETH_ALEN];
        u8 flags = 0;
        int err = 0;
        u8 *mac;
@@ -5144,8 +5145,13 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
        }
 
        netif_addr_lock_bh(netdev);
+       ether_addr_copy(old_mac, netdev->dev_addr);
+       /* change the netdev's MAC address */
+       memcpy(netdev->dev_addr, mac, netdev->addr_len);
+       netif_addr_unlock_bh(netdev);
+
        /* Clean up old MAC filter. Not an error if old filter doesn't exist */
-       status = ice_fltr_remove_mac(vsi, netdev->dev_addr, ICE_FWD_TO_VSI);
+       status = ice_fltr_remove_mac(vsi, old_mac, ICE_FWD_TO_VSI);
        if (status && status != ICE_ERR_DOES_NOT_EXIST) {
                err = -EADDRNOTAVAIL;
                goto err_update_filters;
@@ -5168,13 +5174,12 @@ err_update_filters:
        if (err) {
                netdev_err(netdev, "can't set MAC %pM. filter update failed\n",
                           mac);
+               netif_addr_lock_bh(netdev);
+               ether_addr_copy(netdev->dev_addr, old_mac);
                netif_addr_unlock_bh(netdev);
                return err;
        }
 
-       /* change the netdev's MAC address */
-       memcpy(netdev->dev_addr, mac, netdev->addr_len);
-       netif_addr_unlock_bh(netdev);
        netdev_dbg(vsi->netdev, "updated MAC address to %pM\n",
                   netdev->dev_addr);