diff options
Diffstat (limited to 'drivers/net/usb')
| -rw-r--r-- | drivers/net/usb/cdc_eem.c | 3 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_ether.c | 41 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_ncm.c | 22 | ||||
| -rw-r--r-- | drivers/net/usb/ipheth.c | 5 | ||||
| -rw-r--r-- | drivers/net/usb/qmi_wwan.c | 55 | ||||
| -rw-r--r-- | drivers/net/usb/smsc95xx.c | 5 | ||||
| -rw-r--r-- | drivers/net/usb/usbnet.c | 11 | 
7 files changed, 117 insertions, 25 deletions
diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c index c81e278629f..08d55b6bf27 100644 --- a/drivers/net/usb/cdc_eem.c +++ b/drivers/net/usb/cdc_eem.c @@ -31,6 +31,7 @@  #include <linux/usb/cdc.h>  #include <linux/usb/usbnet.h>  #include <linux/gfp.h> +#include <linux/if_vlan.h>  /* @@ -92,7 +93,7 @@ static int eem_bind(struct usbnet *dev, struct usb_interface *intf)  	/* no jumbogram (16K) support for now */ -	dev->net->hard_header_len += EEM_HEAD + ETH_FCS_LEN; +	dev->net->hard_header_len += EEM_HEAD + ETH_FCS_LEN + VLAN_HLEN;  	dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;  	return 0; diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index a03de719704..d0129827602 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -592,6 +592,32 @@ static const struct usb_device_id	products [] = {  	.driver_info		= 0,  }, +/* Novatel USB551L and MC551 - handled by qmi_wwan */ +{ +	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR +		 | USB_DEVICE_ID_MATCH_PRODUCT +		 | USB_DEVICE_ID_MATCH_INT_INFO, +	.idVendor               = NOVATEL_VENDOR_ID, +	.idProduct		= 0xB001, +	.bInterfaceClass	= USB_CLASS_COMM, +	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, +	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, +	.driver_info = 0, +}, + +/* Novatel E362 - handled by qmi_wwan */ +{ +	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR +		 | USB_DEVICE_ID_MATCH_PRODUCT +		 | USB_DEVICE_ID_MATCH_INT_INFO, +	.idVendor               = NOVATEL_VENDOR_ID, +	.idProduct		= 0x9010, +	.bInterfaceClass	= USB_CLASS_COMM, +	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, +	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, +	.driver_info = 0, +}, +  /*   * WHITELIST!!!   * @@ -604,21 +630,6 @@ static const struct usb_device_id	products [] = {   * because of bugs/quirks in a given product (like Zaurus, above).   */  { -	/* Novatel USB551L */ -	/* This match must come *before* the generic CDC-ETHER match so that -	 * we get FLAG_WWAN set on the device, since it's descriptors are -	 * generic CDC-ETHER. -	 */ -	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR -		 | USB_DEVICE_ID_MATCH_PRODUCT -		 | USB_DEVICE_ID_MATCH_INT_INFO, -	.idVendor               = NOVATEL_VENDOR_ID, -	.idProduct		= 0xB001, -	.bInterfaceClass	= USB_CLASS_COMM, -	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, -	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, -	.driver_info = (unsigned long)&wwan_info, -}, {  	/* ZTE (Vodafone) K3805-Z */  	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR  		 | USB_DEVICE_ID_MATCH_PRODUCT diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 4cd582a4f62..74fab1a4015 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -540,10 +540,12 @@ advance:  	    (ctx->ether_desc == NULL) || (ctx->control != intf))  		goto error; -	/* claim interfaces, if any */ -	temp = usb_driver_claim_interface(driver, ctx->data, dev); -	if (temp) -		goto error; +	/* claim data interface, if different from control */ +	if (ctx->data != ctx->control) { +		temp = usb_driver_claim_interface(driver, ctx->data, dev); +		if (temp) +			goto error; +	}  	iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; @@ -623,6 +625,10 @@ static void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf)  	tasklet_kill(&ctx->bh); +	/* handle devices with combined control and data interface */ +	if (ctx->control == ctx->data) +		ctx->data = NULL; +  	/* disconnect master --> disconnect slave */  	if (intf == ctx->control && ctx->data) {  		usb_set_intfdata(ctx->data, NULL); @@ -1245,6 +1251,14 @@ static const struct usb_device_id cdc_devs[] = {  	  .driver_info = (unsigned long) &wwan_info,  	}, +	/* Huawei NCM devices disguised as vendor specific */ +	{ USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x16), +	  .driver_info = (unsigned long)&wwan_info, +	}, +	{ USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x46), +	  .driver_info = (unsigned long)&wwan_info, +	}, +  	/* Generic CDC-NCM devices */  	{ USB_INTERFACE_INFO(USB_CLASS_COMM,  		USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index a28a983d465..534d8becbbd 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c @@ -62,6 +62,7 @@  #define USB_PRODUCT_IPAD 0x129a  #define USB_PRODUCT_IPHONE_4_VZW 0x129c  #define USB_PRODUCT_IPHONE_4S	0x12a0 +#define USB_PRODUCT_IPHONE_5	0x12a8  #define IPHETH_USBINTF_CLASS    255  #define IPHETH_USBINTF_SUBCLASS 253 @@ -113,6 +114,10 @@ static struct usb_device_id ipheth_table[] = {  		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S,  		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,  		IPHETH_USBINTF_PROTO) }, +	{ USB_DEVICE_AND_INTERFACE_INFO( +		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_5, +		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, +		IPHETH_USBINTF_PROTO) },  	{ }  };  MODULE_DEVICE_TABLE(usb, ipheth_table); diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 6883c371c59..3b566fa0f8e 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -369,18 +369,73 @@ static const struct usb_device_id products[] = {  		USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff),  		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, +	{	/* Novatel USB551L and MC551 */ +		USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0xb001, +		                              USB_CLASS_COMM, +		                              USB_CDC_SUBCLASS_ETHERNET, +		                              USB_CDC_PROTO_NONE), +		.driver_info        = (unsigned long)&qmi_wwan_info, +	}, +	{	/* Novatel E362 */ +		USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0x9010, +		                              USB_CLASS_COMM, +		                              USB_CDC_SUBCLASS_ETHERNET, +		                              USB_CDC_PROTO_NONE), +		.driver_info        = (unsigned long)&qmi_wwan_info, +	},  	/* 3. Combined interface devices matching on interface number */ +	{QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0021, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0025, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0031, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0042, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0049, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0052, 4)},  	{QMI_FIXED_INTF(0x19d2, 0x0055, 1)},	/* ZTE (Vodafone) K3520-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0058, 4)},  	{QMI_FIXED_INTF(0x19d2, 0x0063, 4)},	/* ZTE (Vodafone) K3565-Z */  	{QMI_FIXED_INTF(0x19d2, 0x0104, 4)},	/* ZTE (Vodafone) K4505-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0113, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0118, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0121, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0123, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0124, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0125, 6)}, +	{QMI_FIXED_INTF(0x19d2, 0x0126, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0130, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0133, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0141, 5)},  	{QMI_FIXED_INTF(0x19d2, 0x0157, 5)},	/* ZTE MF683 */ +	{QMI_FIXED_INTF(0x19d2, 0x0158, 3)},  	{QMI_FIXED_INTF(0x19d2, 0x0167, 4)},	/* ZTE MF820D */ +	{QMI_FIXED_INTF(0x19d2, 0x0168, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0176, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0178, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0191, 4)},	/* ZTE EuFi890 */ +	{QMI_FIXED_INTF(0x19d2, 0x0199, 1)},	/* ZTE MF820S */ +	{QMI_FIXED_INTF(0x19d2, 0x0200, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0257, 3)},	/* ZTE MF821 */  	{QMI_FIXED_INTF(0x19d2, 0x0326, 4)},	/* ZTE MF821D */  	{QMI_FIXED_INTF(0x19d2, 0x1008, 4)},	/* ZTE (Vodafone) K3570-Z */  	{QMI_FIXED_INTF(0x19d2, 0x1010, 4)},	/* ZTE (Vodafone) K3571-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1012, 4)},  	{QMI_FIXED_INTF(0x19d2, 0x1018, 3)},	/* ZTE (Vodafone) K5006-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1021, 2)}, +	{QMI_FIXED_INTF(0x19d2, 0x1245, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1247, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1252, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1254, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1255, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x1255, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1256, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1401, 2)},  	{QMI_FIXED_INTF(0x19d2, 0x1402, 2)},	/* ZTE MF60 */ +	{QMI_FIXED_INTF(0x19d2, 0x1424, 2)}, +	{QMI_FIXED_INTF(0x19d2, 0x1425, 2)}, +	{QMI_FIXED_INTF(0x19d2, 0x1426, 2)},	/* ZTE MF91 */  	{QMI_FIXED_INTF(0x19d2, 0x2002, 4)},	/* ZTE (Vodafone) K3765-Z */  	{QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)},    /* Sierra Wireless MC7700 */  	{QMI_FIXED_INTF(0x114f, 0x68a2, 8)},    /* Sierra Wireless MC7750 */ diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 7479a5761d0..362cb8cfeb9 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -184,7 +184,7 @@ static int smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx)  	/* set the address, index & direction (read from PHY) */  	phy_id &= dev->mii.phy_id_mask;  	idx &= dev->mii.reg_num_mask; -	addr = (phy_id << 11) | (idx << 6) | MII_READ_; +	addr = (phy_id << 11) | (idx << 6) | MII_READ_ | MII_BUSY_;  	ret = smsc95xx_write_reg(dev, MII_ADDR, addr);  	check_warn_goto_done(ret, "Error writing MII_ADDR"); @@ -221,7 +221,7 @@ static void smsc95xx_mdio_write(struct net_device *netdev, int phy_id, int idx,  	/* set the address, index & direction (write to PHY) */  	phy_id &= dev->mii.phy_id_mask;  	idx &= dev->mii.reg_num_mask; -	addr = (phy_id << 11) | (idx << 6) | MII_WRITE_; +	addr = (phy_id << 11) | (idx << 6) | MII_WRITE_ | MII_BUSY_;  	ret = smsc95xx_write_reg(dev, MII_ADDR, addr);  	check_warn_goto_done(ret, "Error writing MII_ADDR"); @@ -1344,6 +1344,7 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev,  		} else {  			u32 csum_preamble = smsc95xx_calc_csum_preamble(skb);  			skb_push(skb, 4); +			cpu_to_le32s(&csum_preamble);  			memcpy(skb->data, &csum_preamble, 4);  		}  	} diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f9819d10b1f..edb81ed0695 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -359,10 +359,12 @@ static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb,  void usbnet_defer_kevent (struct usbnet *dev, int work)  {  	set_bit (work, &dev->flags); -	if (!schedule_work (&dev->kevent)) -		netdev_err(dev->net, "kevent %d may have been dropped\n", work); -	else +	if (!schedule_work (&dev->kevent)) { +		if (net_ratelimit()) +			netdev_err(dev->net, "kevent %d may have been dropped\n", work); +	} else {  		netdev_dbg(dev->net, "kevent %d scheduled\n", work); +	}  }  EXPORT_SYMBOL_GPL(usbnet_defer_kevent); @@ -1158,6 +1160,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,  		usb_anchor_urb(urb, &dev->deferred);  		/* no use to process more packets */  		netif_stop_queue(net); +		usb_put_urb(urb);  		spin_unlock_irqrestore(&dev->txq.lock, flags);  		netdev_dbg(dev->net, "Delaying transmission for resumption\n");  		goto deferred; @@ -1310,6 +1313,8 @@ void usbnet_disconnect (struct usb_interface *intf)  	cancel_work_sync(&dev->kevent); +	usb_scuttle_anchored_urbs(&dev->deferred); +  	if (dev->driver_info->unbind)  		dev->driver_info->unbind (dev, intf);  |