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 fe2ded7..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);
 
@@ -6570,12 +6575,12 @@ event_after:
 }
 
 /**
- * ice_do_ioctl - Access the hwtstamp interface
+ * ice_eth_ioctl - Access the hwtstamp interface
  * @netdev: network interface device structure
  * @ifr: interface request data
  * @cmd: ioctl command
  */
-static int ice_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
+static int ice_eth_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
 {
        struct ice_netdev_priv *np = netdev_priv(netdev);
        struct ice_pf *pf = np->vsi->back;
@@ -7241,7 +7246,7 @@ static const struct net_device_ops ice_netdev_ops = {
        .ndo_change_mtu = ice_change_mtu,
        .ndo_get_stats64 = ice_get_stats64,
        .ndo_set_tx_maxrate = ice_set_tx_maxrate,
-       .ndo_do_ioctl = ice_do_ioctl,
+       .ndo_eth_ioctl = ice_eth_ioctl,
        .ndo_set_vf_spoofchk = ice_set_vf_spoofchk,
        .ndo_set_vf_mac = ice_set_vf_mac,
        .ndo_get_vf_config = ice_get_vf_cfg,