]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/net/usb/smsc95xx.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[mirror_ubuntu-artful-kernel.git] / drivers / net / usb / smsc95xx.c
index 831aa33d078ae7d2dd57fdded5de71d1eb915f99..765400b62168436b278d8a09fa0dd1fd8566bcb7 100644 (file)
@@ -33,7 +33,7 @@
 #include "smsc95xx.h"
 
 #define SMSC_CHIPNAME                  "smsc95xx"
-#define SMSC_DRIVER_VERSION            "1.0.5"
+#define SMSC_DRIVER_VERSION            "1.0.6"
 #define HS_USB_PKT_SIZE                        (512)
 #define FS_USB_PKT_SIZE                        (64)
 #define DEFAULT_HS_BURST_CAP_SIZE      (16 * 1024 + 5 * HS_USB_PKT_SIZE)
@@ -853,32 +853,32 @@ static void set_mdix_status(struct net_device *net, __u8 mdix_ctrl)
        pdata->mdix_ctrl = mdix_ctrl;
 }
 
-static int smsc95xx_get_settings(struct net_device *net,
-                                struct ethtool_cmd *cmd)
+static int smsc95xx_get_link_ksettings(struct net_device *net,
+                                      struct ethtool_link_ksettings *cmd)
 {
        struct usbnet *dev = netdev_priv(net);
        struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
        int retval;
 
-       retval = usbnet_get_settings(net, cmd);
+       retval = usbnet_get_link_ksettings(net, cmd);
 
-       cmd->eth_tp_mdix = pdata->mdix_ctrl;
-       cmd->eth_tp_mdix_ctrl = pdata->mdix_ctrl;
+       cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
+       cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
 
        return retval;
 }
 
-static int smsc95xx_set_settings(struct net_device *net,
-                                struct ethtool_cmd *cmd)
+static int smsc95xx_set_link_ksettings(struct net_device *net,
+                                      const struct ethtool_link_ksettings *cmd)
 {
        struct usbnet *dev = netdev_priv(net);
        struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
        int retval;
 
-       if (pdata->mdix_ctrl != cmd->eth_tp_mdix_ctrl)
-               set_mdix_status(net, cmd->eth_tp_mdix_ctrl);
+       if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl)
+               set_mdix_status(net, cmd->base.eth_tp_mdix_ctrl);
 
-       retval = usbnet_set_settings(net, cmd);
+       retval = usbnet_set_link_ksettings(net, cmd);
 
        return retval;
 }
@@ -889,8 +889,6 @@ static const struct ethtool_ops smsc95xx_ethtool_ops = {
        .get_drvinfo    = usbnet_get_drvinfo,
        .get_msglevel   = usbnet_get_msglevel,
        .set_msglevel   = usbnet_set_msglevel,
-       .get_settings   = smsc95xx_get_settings,
-       .set_settings   = smsc95xx_set_settings,
        .get_eeprom_len = smsc95xx_ethtool_get_eeprom_len,
        .get_eeprom     = smsc95xx_ethtool_get_eeprom,
        .set_eeprom     = smsc95xx_ethtool_set_eeprom,
@@ -898,6 +896,8 @@ static const struct ethtool_ops smsc95xx_ethtool_ops = {
        .get_regs       = smsc95xx_ethtool_getregs,
        .get_wol        = smsc95xx_ethtool_get_wol,
        .set_wol        = smsc95xx_ethtool_set_wol,
+       .get_link_ksettings     = smsc95xx_get_link_ksettings,
+       .set_link_ksettings     = smsc95xx_set_link_ksettings,
 };
 
 static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
@@ -1248,6 +1248,7 @@ static const struct net_device_ops smsc95xx_netdev_ops = {
        .ndo_start_xmit         = usbnet_start_xmit,
        .ndo_tx_timeout         = usbnet_tx_timeout,
        .ndo_change_mtu         = usbnet_change_mtu,
+       .ndo_get_stats64        = usbnet_get_stats64,
        .ndo_set_mac_address    = eth_mac_addr,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_do_ioctl           = smsc95xx_ioctl,
@@ -1498,7 +1499,7 @@ static int smsc95xx_enter_suspend3(struct usbnet *dev)
        if (ret < 0)
                return ret;
 
-       if (val & 0xFFFF) {
+       if (val & RX_FIFO_INF_USED_) {
                netdev_info(dev->net, "rx fifo not empty in autosuspend\n");
                return -EBUSY;
        }
@@ -2001,13 +2002,13 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev,
        /* We do not advertise SG, so skbs should be already linearized */
        BUG_ON(skb_shinfo(skb)->nr_frags);
 
-       if (skb_headroom(skb) < overhead) {
-               struct sk_buff *skb2 = skb_copy_expand(skb,
-                       overhead, 0, flags);
+       /* Make writable and expand header space by overhead if required */
+       if (skb_cow_head(skb, overhead)) {
+               /* Must deallocate here as returning NULL to indicate error
+                * means the skb won't be deallocated in the caller.
+                */
                dev_kfree_skb_any(skb);
-               skb = skb2;
-               if (!skb)
-                       return NULL;
+               return NULL;
        }
 
        if (csum) {