]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/net/usb/r8152.c
Merge tag 'vfio-v3.18-rc1' of git://github.com/awilliam/linux-vfio
[linux-beck.git] / drivers / net / usb / r8152.c
index b9a98152815b680ae5c318f893a63d1d5acc864b..5cfd414b9a3ea5cc59224cffe0dd675bef490930 100644 (file)
@@ -980,9 +980,14 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
 {
        struct r8152 *tp = netdev_priv(netdev);
        struct sockaddr *addr = p;
+       int ret = -EADDRNOTAVAIL;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EADDRNOTAVAIL;
+               goto out1;
+
+       ret = usb_autopm_get_interface(tp->intf);
+       if (ret < 0)
+               goto out1;
 
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
 
@@ -990,7 +995,9 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
        pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data);
        ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
 
-       return 0;
+       usb_autopm_put_interface(tp->intf);
+out1:
+       return ret;
 }
 
 static int set_ethernet_addr(struct r8152 *tp)
@@ -3471,6 +3478,8 @@ rtl_ethtool_set_eee(struct net_device *net, struct ethtool_eee *edata)
                goto out;
 
        ret = tp->rtl_ops.eee_set(tp, edata);
+       if (!ret)
+               ret = mii_nway_restart(&tp->mii);
 
        usb_autopm_put_interface(tp->intf);