diff options
Diffstat (limited to 'drivers/net/usb')
| -rw-r--r-- | drivers/net/usb/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/net/usb/asix.c | 24 | ||||
| -rw-r--r-- | drivers/net/usb/catc.c | 4 | ||||
| -rw-r--r-- | drivers/net/usb/cdc-phonet.c | 8 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_eem.c | 4 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_ether.c | 105 | ||||
| -rw-r--r-- | drivers/net/usb/dm9601.c | 6 | ||||
| -rw-r--r-- | drivers/net/usb/hso.c | 42 | ||||
| -rw-r--r-- | drivers/net/usb/kaweth.c | 11 | ||||
| -rw-r--r-- | drivers/net/usb/mcs7830.c | 4 | ||||
| -rw-r--r-- | drivers/net/usb/pegasus.c | 13 | ||||
| -rw-r--r-- | drivers/net/usb/pegasus.h | 6 | ||||
| -rw-r--r-- | drivers/net/usb/rndis_host.c | 16 | ||||
| -rw-r--r-- | drivers/net/usb/usbnet.c | 218 | ||||
| -rw-r--r-- | drivers/net/usb/zaurus.c | 4 | 
15 files changed, 328 insertions, 139 deletions
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index c47237c2d63..32d93564a74 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -174,7 +174,7 @@ config USB_NET_CDCETHER  	    * Ericsson Mobile Broadband Module (all variants)   	    * Motorola (DM100 and SB4100)   	    * Broadcom Cable Modem (reference design) -	    * Toshiba (PCX1100U and F3507g) +	    * Toshiba (PCX1100U and F3507g/F3607gw)  	    * ...  	  This driver creates an interface named "ethX", where X depends on diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 6ce7f775bb7..a516185cbc9 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c @@ -365,8 +365,8 @@ static struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,  	padlen = ((skb->len + 4) % 512) ? 0 : 4; -	if ((!skb_cloned(skb)) -	    && ((headroom + tailroom) >= (4 + padlen))) { +	if ((!skb_cloned(skb)) && +	    ((headroom + tailroom) >= (4 + padlen))) {  		if ((headroom < 4) || (tailroom < padlen)) {  			skb->data = memmove(skb->head + 4, skb->data, skb->len);  			skb_set_tail_pointer(skb, skb->len); @@ -541,8 +541,8 @@ static void asix_set_multicast(struct net_device *net)  	if (net->flags & IFF_PROMISC) {  		rx_ctl |= AX_RX_CTL_PRO; -	} else if (net->flags & IFF_ALLMULTI -		   || net->mc_count > AX_MAX_MCAST) { +	} else if (net->flags & IFF_ALLMULTI || +		   net->mc_count > AX_MAX_MCAST) {  		rx_ctl |= AX_RX_CTL_AMALL;  	} else if (net->mc_count == 0) {  		/* just broadcast and directed */ @@ -753,8 +753,8 @@ static void ax88172_set_multicast(struct net_device *net)  	if (net->flags & IFF_PROMISC) {  		rx_ctl |= 0x01; -	} else if (net->flags & IFF_ALLMULTI -		   || net->mc_count > AX_MAX_MCAST) { +	} else if (net->flags & IFF_ALLMULTI || +		   net->mc_count > AX_MAX_MCAST) {  		rx_ctl |= 0x02;  	} else if (net->mc_count == 0) {  		/* just broadcast and directed */ @@ -1327,7 +1327,7 @@ static const struct driver_info ax8817x_info = {  	.status = asix_status,  	.link_reset = ax88172_link_reset,  	.reset = ax88172_link_reset, -	.flags =  FLAG_ETHER, +	.flags =  FLAG_ETHER | FLAG_LINK_INTR,  	.data = 0x00130103,  }; @@ -1337,7 +1337,7 @@ static const struct driver_info dlink_dub_e100_info = {  	.status = asix_status,  	.link_reset = ax88172_link_reset,  	.reset = ax88172_link_reset, -	.flags =  FLAG_ETHER, +	.flags =  FLAG_ETHER | FLAG_LINK_INTR,  	.data = 0x009f9d9f,  }; @@ -1347,7 +1347,7 @@ static const struct driver_info netgear_fa120_info = {  	.status = asix_status,  	.link_reset = ax88172_link_reset,  	.reset = ax88172_link_reset, -	.flags =  FLAG_ETHER, +	.flags =  FLAG_ETHER | FLAG_LINK_INTR,  	.data = 0x00130103,  }; @@ -1357,7 +1357,7 @@ static const struct driver_info hawking_uf200_info = {  	.status = asix_status,  	.link_reset = ax88172_link_reset,  	.reset = ax88172_link_reset, -	.flags =  FLAG_ETHER, +	.flags =  FLAG_ETHER | FLAG_LINK_INTR,  	.data = 0x001f1d1f,  }; @@ -1367,7 +1367,7 @@ static const struct driver_info ax88772_info = {  	.status = asix_status,  	.link_reset = ax88772_link_reset,  	.reset = ax88772_link_reset, -	.flags = FLAG_ETHER | FLAG_FRAMING_AX, +	.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,  	.rx_fixup = asix_rx_fixup,  	.tx_fixup = asix_tx_fixup,  }; @@ -1378,7 +1378,7 @@ static const struct driver_info ax88178_info = {  	.status = asix_status,  	.link_reset = ax88178_link_reset,  	.reset = ax88178_link_reset, -	.flags = FLAG_ETHER | FLAG_FRAMING_AX, +	.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,  	.rx_fixup = asix_rx_fixup,  	.tx_fixup = asix_tx_fixup,  }; diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c index 2bed6b087d1..22b87e64a81 100644 --- a/drivers/net/usb/catc.c +++ b/drivers/net/usb/catc.c @@ -436,8 +436,8 @@ static netdev_tx_t catc_start_xmit(struct sk_buff *skb,  			clear_bit(TX_RUNNING, &catc->flags);  	} -	if ((catc->is_f5u011 && catc->tx_ptr) -	     || (catc->tx_ptr >= ((TX_MAX_BURST - 1) * (PKT_SZ + 2)))) +	if ((catc->is_f5u011 && catc->tx_ptr) || +	    (catc->tx_ptr >= ((TX_MAX_BURST - 1) * (PKT_SZ + 2))))  		netif_stop_queue(netdev);  	spin_unlock_irqrestore(&catc->tx_lock, flags); diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c index 33d5c579c5a..6491c9c00c8 100644 --- a/drivers/net/usb/cdc-phonet.c +++ b/drivers/net/usb/cdc-phonet.c @@ -372,12 +372,12 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)  	/* Data interface has one inactive and one active setting */  	if (data_intf->num_altsetting != 2)  		return -EINVAL; -	if (data_intf->altsetting[0].desc.bNumEndpoints == 0 -	 && data_intf->altsetting[1].desc.bNumEndpoints == 2) +	if (data_intf->altsetting[0].desc.bNumEndpoints == 0 && +	    data_intf->altsetting[1].desc.bNumEndpoints == 2)  		data_desc = data_intf->altsetting + 1;  	else -	if (data_intf->altsetting[0].desc.bNumEndpoints == 2 -	 && data_intf->altsetting[1].desc.bNumEndpoints == 0) +	if (data_intf->altsetting[0].desc.bNumEndpoints == 2 && +	    data_intf->altsetting[1].desc.bNumEndpoints == 0)  		data_desc = data_intf->altsetting;  	else  		return -EINVAL; diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c index 23300656c26..c337ffc3304 100644 --- a/drivers/net/usb/cdc_eem.c +++ b/drivers/net/usb/cdc_eem.c @@ -121,8 +121,8 @@ static struct sk_buff *eem_tx_fixup(struct usbnet *dev, struct sk_buff *skb,  		int	headroom = skb_headroom(skb);  		int	tailroom = skb_tailroom(skb); -		if ((tailroom >= ETH_FCS_LEN + padlen) -				&& (headroom >= EEM_HEAD)) +		if ((tailroom >= ETH_FCS_LEN + padlen) && +		    (headroom >= EEM_HEAD))  			goto done;  		if ((headroom + tailroom) diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 4a6aff57940..21e183a83b9 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -37,23 +37,23 @@  static int is_rndis(struct usb_interface_descriptor *desc)  { -	return desc->bInterfaceClass == USB_CLASS_COMM -		&& desc->bInterfaceSubClass == 2 -		&& desc->bInterfaceProtocol == 0xff; +	return (desc->bInterfaceClass == USB_CLASS_COMM && +		desc->bInterfaceSubClass == 2 && +		desc->bInterfaceProtocol == 0xff);  }  static int is_activesync(struct usb_interface_descriptor *desc)  { -	return desc->bInterfaceClass == USB_CLASS_MISC -		&& desc->bInterfaceSubClass == 1 -		&& desc->bInterfaceProtocol == 1; +	return (desc->bInterfaceClass == USB_CLASS_MISC && +		desc->bInterfaceSubClass == 1 && +		desc->bInterfaceProtocol == 1);  }  static int is_wireless_rndis(struct usb_interface_descriptor *desc)  { -	return desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER -		&& desc->bInterfaceSubClass == 1 -		&& desc->bInterfaceProtocol == 3; +	return (desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER && +		desc->bInterfaceSubClass == 1 && +		desc->bInterfaceProtocol == 3);  }  #else @@ -116,9 +116,9 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)  	/* this assumes that if there's a non-RNDIS vendor variant  	 * of cdc-acm, it'll fail RNDIS requests cleanly.  	 */ -	rndis = is_rndis(&intf->cur_altsetting->desc) -		|| is_activesync(&intf->cur_altsetting->desc) -		|| is_wireless_rndis(&intf->cur_altsetting->desc); +	rndis = (is_rndis(&intf->cur_altsetting->desc) || +		 is_activesync(&intf->cur_altsetting->desc) || +		 is_wireless_rndis(&intf->cur_altsetting->desc));  	memset(info, 0, sizeof *info);  	info->control = intf; @@ -279,10 +279,10 @@ next_desc:  		dev->status = &info->control->cur_altsetting->endpoint [0];  		desc = &dev->status->desc; -		if (!usb_endpoint_is_int_in(desc) -				|| (le16_to_cpu(desc->wMaxPacketSize) -					< sizeof(struct usb_cdc_notification)) -				|| !desc->bInterval) { +		if (!usb_endpoint_is_int_in(desc) || +		    (le16_to_cpu(desc->wMaxPacketSize) +		     < sizeof(struct usb_cdc_notification)) || +		    !desc->bInterval) {  			dev_dbg(&intf->dev, "bad notification endpoint\n");  			dev->status = NULL;  		} @@ -411,13 +411,28 @@ static int cdc_bind(struct usbnet *dev, struct usb_interface *intf)  	return 0;  } +static int cdc_manage_power(struct usbnet *dev, int on) +{ +	dev->intf->needs_remote_wakeup = on; +	return 0; +} +  static const struct driver_info	cdc_info = {  	.description =	"CDC Ethernet Device", -	.flags =	FLAG_ETHER, +	.flags =	FLAG_ETHER | FLAG_LINK_INTR,  	// .check_connect = cdc_check_connect,  	.bind =		cdc_bind,  	.unbind =	usbnet_cdc_unbind,  	.status =	cdc_status, +	.manage_power =	cdc_manage_power, +}; + +static const struct driver_info mbm_info = { +	.description =	"Mobile Broadband Network Device", +	.flags =	FLAG_WWAN, +	.bind = 	cdc_bind, +	.unbind =	usbnet_cdc_unbind, +	.status =	cdc_status,  };  /*-------------------------------------------------------------------------*/ @@ -532,32 +547,72 @@ static const struct usb_device_id	products [] = {  	/* Ericsson F3507g */  	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), -	.driver_info = (unsigned long) &cdc_info, +	.driver_info = (unsigned long) &mbm_info,  }, {  	/* Ericsson F3507g ver. 2 */  	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1902, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), -	.driver_info = (unsigned long) &cdc_info, +	.driver_info = (unsigned long) &mbm_info,  }, {  	/* Ericsson F3607gw */  	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1904, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), -	.driver_info = (unsigned long) &cdc_info, +	.driver_info = (unsigned long) &mbm_info,  }, { -	/* Ericsson F3307 */ +	/* Ericsson F3607gw ver 2 */ +	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Ericsson F3607gw ver 3 */  	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), -	.driver_info = (unsigned long) &cdc_info, +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Ericsson F3307 */ +	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Ericsson F3307 ver 2 */ +	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Ericsson C3607w */ +	USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info,  }, {  	/* Toshiba F3507g */  	USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), -	.driver_info = (unsigned long) &cdc_info, +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Toshiba F3607gw */ +	USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Toshiba F3607gw ver 2 */ +	USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info,  }, {  	/* Dell F3507g */  	USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), -	.driver_info = (unsigned long) &cdc_info, +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Dell F3607gw */ +	USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info, +}, { +	/* Dell F3607gw ver 2 */ +	USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &mbm_info,  },  	{ },		// END  }; @@ -570,6 +625,8 @@ static struct usb_driver cdc_driver = {  	.disconnect =	usbnet_disconnect,  	.suspend =	usbnet_suspend,  	.resume =	usbnet_resume, +	.reset_resume =	usbnet_resume, +	.supports_autosuspend = 1,  }; diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 72470f77f55..3d406f9b2f2 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c @@ -611,7 +611,7 @@ static int dm9601_link_reset(struct usbnet *dev)  static const struct driver_info dm9601_info = {  	.description	= "Davicom DM9601 USB Ethernet", -	.flags		= FLAG_ETHER, +	.flags		= FLAG_ETHER | FLAG_LINK_INTR,  	.bind		= dm9601_bind,  	.rx_fixup	= dm9601_rx_fixup,  	.tx_fixup	= dm9601_tx_fixup, @@ -649,6 +649,10 @@ static const struct usb_device_id products[] = {  	USB_DEVICE(0x0fe6, 0x8101),	/* DM9601 USB to Fast Ethernet Adapter */  	.driver_info = (unsigned long)&dm9601_info,  	 }, +	{ +	 USB_DEVICE(0x0a46, 0x9000),	/* DM9000E */ +	 .driver_info = (unsigned long)&dm9601_info, +	 },  	{},			// END  }; diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index fa4e58196c2..f78f0903b07 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c @@ -378,7 +378,7 @@ static void dbg_dump(int line_count, const char *func_name, unsigned char *buf,  }  #define DUMP(buf_, len_)	\ -	dbg_dump(__LINE__, __func__, buf_, len_) +	dbg_dump(__LINE__, __func__, (unsigned char *)buf_, len_)  #define DUMP1(buf_, len_)			\  	do {					\ @@ -602,9 +602,9 @@ static struct hso_serial *get_serial_by_shared_int_and_type(  	port = hso_mux_to_port(mux);  	for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) { -		if (serial_table[i] -		    && (dev2ser(serial_table[i])->shared_int == shared_int) -		    && ((serial_table[i]->port_spec & HSO_PORT_MASK) == port)) { +		if (serial_table[i] && +		    (dev2ser(serial_table[i])->shared_int == shared_int) && +		    ((serial_table[i]->port_spec & HSO_PORT_MASK) == port)) {  			return dev2ser(serial_table[i]);  		}  	} @@ -846,8 +846,8 @@ static void hso_net_tx_timeout(struct net_device *net)  	dev_warn(&net->dev, "Tx timed out.\n");  	/* Tear the waiting frame off the list */ -	if (odev->mux_bulk_tx_urb -	    && (odev->mux_bulk_tx_urb->status == -EINPROGRESS)) +	if (odev->mux_bulk_tx_urb && +	    (odev->mux_bulk_tx_urb->status == -EINPROGRESS))  		usb_unlink_urb(odev->mux_bulk_tx_urb);  	/* Update statistics */ @@ -1020,9 +1020,9 @@ static void read_bulk_callback(struct urb *urb)  		u32 rest;  		u8 crc_check[4] = { 0xDE, 0xAD, 0xBE, 0xEF };  		rest = urb->actual_length % odev->in_endp->wMaxPacketSize; -		if (((rest == 5) || (rest == 6)) -		    && !memcmp(((u8 *) urb->transfer_buffer) + -			       urb->actual_length - 4, crc_check, 4)) { +		if (((rest == 5) || (rest == 6)) && +		    !memcmp(((u8 *) urb->transfer_buffer) + +			    urb->actual_length - 4, crc_check, 4)) {  			urb->actual_length -= 4;  		}  	} @@ -1226,9 +1226,9 @@ static void hso_std_serial_read_bulk_callback(struct urb *urb)  			rest =  			    urb->actual_length %  			    serial->in_endp->wMaxPacketSize; -			if (((rest == 5) || (rest == 6)) -			    && !memcmp(((u8 *) urb->transfer_buffer) + -				       urb->actual_length - 4, crc_check, 4)) { +			if (((rest == 5) || (rest == 6)) && +			    !memcmp(((u8 *) urb->transfer_buffer) + +				    urb->actual_length - 4, crc_check, 4)) {  				urb->actual_length -= 4;  			}  		} @@ -1363,7 +1363,7 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp)  	/* reset the rts and dtr */  	/* do the actual close */  	serial->open_count--; -	kref_put(&serial->parent->ref, hso_serial_ref_free); +  	if (serial->open_count <= 0) {  		serial->open_count = 0;  		spin_lock_irq(&serial->serial_lock); @@ -1383,6 +1383,8 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp)  		usb_autopm_put_interface(serial->parent->interface);  	mutex_unlock(&serial->parent->mutex); + +	kref_put(&serial->parent->ref, hso_serial_ref_free);  }  /* close the requested serial port */ @@ -1527,7 +1529,7 @@ static void tiocmget_intr_callback(struct urb *urb)  		dev_warn(&usb->dev,  			 "hso received invalid serial state notification\n");  		DUMP(serial_state_notification, -		     sizeof(hso_serial_state_notifation)) +		     sizeof(struct hso_serial_state_notification));  	} else {  		UART_state_bitmap = le16_to_cpu(serial_state_notification-> @@ -2980,8 +2982,8 @@ static int hso_probe(struct usb_interface *interface,  	case HSO_INTF_BULK:  		/* It's a regular bulk interface */ -		if (((port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) -		    && !disable_net) +		if (((port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) && +		    !disable_net)  			hso_dev = hso_create_net_device(interface, port_spec);  		else  			hso_dev = @@ -3144,8 +3146,8 @@ static void hso_free_interface(struct usb_interface *interface)  	int i;  	for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) { -		if (serial_table[i] -		    && (serial_table[i]->interface == interface)) { +		if (serial_table[i] && +		    (serial_table[i]->interface == interface)) {  			hso_dev = dev2ser(serial_table[i]);  			spin_lock_irq(&hso_dev->serial_lock);  			tty = tty_kref_get(hso_dev->tty); @@ -3161,8 +3163,8 @@ static void hso_free_interface(struct usb_interface *interface)  	}  	for (i = 0; i < HSO_MAX_NET_DEVICES; i++) { -		if (network_table[i] -		    && (network_table[i]->interface == interface)) { +		if (network_table[i] && +		    (network_table[i]->interface == interface)) {  			struct rfkill *rfk = dev2net(network_table[i])->rfkill;  			/* hso_stop_net_device doesn't stop the net queue since  			 * traffic needs to start it again when suspended */ diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index e391ef969c2..3b80e8d2d62 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c @@ -471,16 +471,7 @@ static int kaweth_reset(struct kaweth_device *kaweth)  	int result;  	dbg("kaweth_reset(%p)", kaweth); -	result = kaweth_control(kaweth, -				usb_sndctrlpipe(kaweth->dev, 0), -				USB_REQ_SET_CONFIGURATION, -				0, -				kaweth->dev->config[0].desc.bConfigurationValue, -				0, -				NULL, -				0, -				KAWETH_CONTROL_TIMEOUT); - +	result = usb_reset_configuration(kaweth->dev);  	mdelay(10);  	dbg("kaweth_reset() returns %d.",result); diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index 10873d96b2d..87374317f48 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c @@ -391,8 +391,8 @@ static void mcs7830_set_multicast(struct net_device *net)  	if (net->flags & IFF_PROMISC) {  		data->config |= HIF_REG_CONFIG_PROMISCIOUS; -	} else if (net->flags & IFF_ALLMULTI -		   || net->mc_count > MCS7830_MAX_MCAST) { +	} else if (net->flags & IFF_ALLMULTI || +		   net->mc_count > MCS7830_MAX_MCAST) {  		data->config |= HIF_REG_CONFIG_ALLMULTICAST;  	} else if (net->mc_count == 0) {  		/* just broadcast and directed */ diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index 6fdaba8674b..ed4a508ef26 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c @@ -62,8 +62,11 @@ static char *devid=NULL;  static struct usb_eth_dev usb_dev_id[] = {  #define	PEGASUS_DEV(pn, vid, pid, flags)	\  	{.name = pn, .vendor = vid, .device = pid, .private = flags}, +#define PEGASUS_DEV_CLASS(pn, vid, pid, dclass, flags) \ +	PEGASUS_DEV(pn, vid, pid, flags)  #include "pegasus.h"  #undef	PEGASUS_DEV +#undef	PEGASUS_DEV_CLASS  	{NULL, 0, 0, 0},  	{NULL, 0, 0, 0}  }; @@ -71,8 +74,18 @@ static struct usb_eth_dev usb_dev_id[] = {  static struct usb_device_id pegasus_ids[] = {  #define	PEGASUS_DEV(pn, vid, pid, flags) \  	{.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = vid, .idProduct = pid}, +/* + * The Belkin F8T012xx1 bluetooth adaptor has the same vendor and product + * IDs as the Belkin F5D5050, so we need to teach the pegasus driver to + * ignore adaptors belonging to the "Wireless" class 0xE0. For this one + * case anyway, seeing as the pegasus is for "Wired" adaptors. + */ +#define PEGASUS_DEV_CLASS(pn, vid, pid, dclass, flags) \ +	{.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_CLASS), \ +	.idVendor = vid, .idProduct = pid, .bDeviceClass = dclass},  #include "pegasus.h"  #undef	PEGASUS_DEV +#undef	PEGASUS_DEV_CLASS  	{},  	{}  }; diff --git a/drivers/net/usb/pegasus.h b/drivers/net/usb/pegasus.h index f968c834ff6..5d02f020073 100644 --- a/drivers/net/usb/pegasus.h +++ b/drivers/net/usb/pegasus.h @@ -202,7 +202,11 @@ PEGASUS_DEV( "AEI USB Fast Ethernet Adapter", VENDOR_AEILAB, 0x1701,  		DEFAULT_GPIO_RESET | PEGASUS_II )  PEGASUS_DEV( "Allied Telesyn Int. AT-USB100", VENDOR_ALLIEDTEL, 0xb100,  		DEFAULT_GPIO_RESET | PEGASUS_II ) -PEGASUS_DEV( "Belkin F5D5050 USB Ethernet", VENDOR_BELKIN, 0x0121, +/* + * Distinguish between this Belkin adaptor and the Belkin bluetooth adaptors + * with the same product IDs by checking the device class too. + */ +PEGASUS_DEV_CLASS( "Belkin F5D5050 USB Ethernet", VENDOR_BELKIN, 0x0121, 0x00,  		DEFAULT_GPIO_RESET | PEGASUS_II )  PEGASUS_DEV( "Billionton USB-100", VENDOR_BILLIONTON, 0x0986,  		DEFAULT_GPIO_RESET ) diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 0caa8008c51..490fa8f5542 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c @@ -114,8 +114,8 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)  	 */  	/* Issue the request; xid is unique, don't bother byteswapping it */ -	if (likely(buf->msg_type != RNDIS_MSG_HALT -			&& buf->msg_type != RNDIS_MSG_RESET)) { +	if (likely(buf->msg_type != RNDIS_MSG_HALT && +		   buf->msg_type != RNDIS_MSG_RESET)) {  		xid = dev->xid++;  		if (!xid)  			xid = dev->xid++; @@ -362,12 +362,12 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)  			retval = -EINVAL;  			goto halt_fail_and_release;  		} -		dev->hard_mtu = tmp; -		net->mtu = dev->hard_mtu - net->hard_header_len;  		dev_warn(&intf->dev,  			 "dev can't take %u byte packets (max %u), "  			 "adjusting MTU to %u\n", -			 dev->hard_mtu, tmp, net->mtu); +			 dev->hard_mtu, tmp, tmp - net->hard_header_len); +		dev->hard_mtu = tmp; +		net->mtu = dev->hard_mtu - net->hard_header_len;  	}  	/* REVISIT:  peripheral "alignment" request is ignored ... */ @@ -493,9 +493,9 @@ int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb)  		data_len = le32_to_cpu(hdr->data_len);  		/* don't choke if we see oob, per-packet data, etc */ -		if (unlikely(hdr->msg_type != RNDIS_MSG_PACKET -				|| skb->len < msg_len -				|| (data_offset + data_len + 8) > msg_len)) { +		if (unlikely(hdr->msg_type != RNDIS_MSG_PACKET || +			     skb->len < msg_len || +			     (data_offset + data_len + 8) > msg_len)) {  			dev->net->stats.rx_frame_errors++;  			devdbg(dev, "bad rndis message %d/%d/%d/%d, len %d",  				le32_to_cpu(hdr->msg_type), diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index ca5ca5ae061..035fab04c0a 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -140,8 +140,8 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf)  	if (!alt || !in || !out)  		return -EINVAL; -	if (alt->desc.bAlternateSetting != 0 -			|| !(dev->driver_info->flags & FLAG_NO_SETINT)) { +	if (alt->desc.bAlternateSetting != 0 || +	    !(dev->driver_info->flags & FLAG_NO_SETINT)) {  		tmp = usb_set_interface (dev->udev, alt->desc.bInterfaceNumber,  				alt->desc.bAlternateSetting);  		if (tmp < 0) @@ -351,9 +351,10 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)  	spin_lock_irqsave (&dev->rxq.lock, lockflags); -	if (netif_running (dev->net) -			&& netif_device_present (dev->net) -			&& !test_bit (EVENT_RX_HALT, &dev->flags)) { +	if (netif_running (dev->net) && +	    netif_device_present (dev->net) && +	    !test_bit (EVENT_RX_HALT, &dev->flags) && +	    !test_bit (EVENT_DEV_ASLEEP, &dev->flags)) {  		switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) {  		case -EPIPE:  			usbnet_defer_kevent (dev, EVENT_RX_HALT); @@ -391,8 +392,8 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)  static inline void rx_process (struct usbnet *dev, struct sk_buff *skb)  { -	if (dev->driver_info->rx_fixup -			&& !dev->driver_info->rx_fixup (dev, skb)) +	if (dev->driver_info->rx_fixup && +	    !dev->driver_info->rx_fixup (dev, skb))  		goto error;  	// else network stack removes extra byte if we forced a short packet @@ -484,8 +485,8 @@ block:  	defer_bh(dev, skb, &dev->rxq);  	if (urb) { -		if (netif_running (dev->net) -				&& !test_bit (EVENT_RX_HALT, &dev->flags)) { +		if (netif_running (dev->net) && +		    !test_bit (EVENT_RX_HALT, &dev->flags)) {  			rx_submit (dev, urb, GFP_ATOMIC);  			return;  		} @@ -611,15 +612,39 @@ EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs);  /*-------------------------------------------------------------------------*/  // precondition: never called in_interrupt +static void usbnet_terminate_urbs(struct usbnet *dev) +{ +	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(unlink_wakeup); +	DECLARE_WAITQUEUE(wait, current); +	int temp; + +	/* ensure there are no more active urbs */ +	add_wait_queue(&unlink_wakeup, &wait); +	set_current_state(TASK_UNINTERRUPTIBLE); +	dev->wait = &unlink_wakeup; +	temp = unlink_urbs(dev, &dev->txq) + +		unlink_urbs(dev, &dev->rxq); + +	/* maybe wait for deletions to finish. */ +	while (!skb_queue_empty(&dev->rxq) +		&& !skb_queue_empty(&dev->txq) +		&& !skb_queue_empty(&dev->done)) { +			schedule_timeout(UNLINK_TIMEOUT_MS); +			set_current_state(TASK_UNINTERRUPTIBLE); +			if (netif_msg_ifdown(dev)) +				devdbg(dev, "waited for %d urb completions", +					temp); +	} +	set_current_state(TASK_RUNNING); +	dev->wait = NULL; +	remove_wait_queue(&unlink_wakeup, &wait); +}  int usbnet_stop (struct net_device *net)  {  	struct usbnet		*dev = netdev_priv(net);  	struct driver_info	*info = dev->driver_info; -	int			temp;  	int			retval; -	DECLARE_WAIT_QUEUE_HEAD_ONSTACK (unlink_wakeup); -	DECLARE_WAITQUEUE (wait, current);  	netif_stop_queue (net); @@ -641,25 +666,8 @@ int usbnet_stop (struct net_device *net)  				info->description);  	} -	if (!(info->flags & FLAG_AVOID_UNLINK_URBS)) { -		/* ensure there are no more active urbs */ -		add_wait_queue(&unlink_wakeup, &wait); -		dev->wait = &unlink_wakeup; -		temp = unlink_urbs(dev, &dev->txq) + -			unlink_urbs(dev, &dev->rxq); - -		/* maybe wait for deletions to finish. */ -		while (!skb_queue_empty(&dev->rxq) -				&& !skb_queue_empty(&dev->txq) -				&& !skb_queue_empty(&dev->done)) { -			msleep(UNLINK_TIMEOUT_MS); -			if (netif_msg_ifdown(dev)) -				devdbg(dev, "waited for %d urb completions", -					temp); -		} -		dev->wait = NULL; -		remove_wait_queue(&unlink_wakeup, &wait); -	} +	if (!(info->flags & FLAG_AVOID_UNLINK_URBS)) +		usbnet_terminate_urbs(dev);  	usb_kill_urb(dev->interrupt); @@ -672,7 +680,10 @@ int usbnet_stop (struct net_device *net)  	dev->flags = 0;  	del_timer_sync (&dev->delay);  	tasklet_kill (&dev->bh); -	usb_autopm_put_interface(dev->intf); +	if (info->manage_power) +		info->manage_power(dev, 0); +	else +		usb_autopm_put_interface(dev->intf);  	return 0;  } @@ -753,6 +764,12 @@ int usbnet_open (struct net_device *net)  	// delay posting reads until we're fully open  	tasklet_schedule (&dev->bh); +	if (info->manage_power) { +		retval = info->manage_power(dev, 1); +		if (retval < 0) +			goto done; +		usb_autopm_put_interface(dev->intf); +	}  	return retval;  done:  	usb_autopm_put_interface(dev->intf); @@ -881,11 +898,16 @@ kevent (struct work_struct *work)  	/* usb_clear_halt() needs a thread context */  	if (test_bit (EVENT_TX_HALT, &dev->flags)) {  		unlink_urbs (dev, &dev->txq); +		status = usb_autopm_get_interface(dev->intf); +		if (status < 0) +			goto fail_pipe;  		status = usb_clear_halt (dev->udev, dev->out); -		if (status < 0 -				&& status != -EPIPE -				&& status != -ESHUTDOWN) { +		usb_autopm_put_interface(dev->intf); +		if (status < 0 && +		    status != -EPIPE && +		    status != -ESHUTDOWN) {  			if (netif_msg_tx_err (dev)) +fail_pipe:  				deverr (dev, "can't clear tx halt, status %d",  					status);  		} else { @@ -896,11 +918,16 @@ kevent (struct work_struct *work)  	}  	if (test_bit (EVENT_RX_HALT, &dev->flags)) {  		unlink_urbs (dev, &dev->rxq); +		status = usb_autopm_get_interface(dev->intf); +		if (status < 0) +			goto fail_halt;  		status = usb_clear_halt (dev->udev, dev->in); -		if (status < 0 -				&& status != -EPIPE -				&& status != -ESHUTDOWN) { +		usb_autopm_put_interface(dev->intf); +		if (status < 0 && +		    status != -EPIPE && +		    status != -ESHUTDOWN) {  			if (netif_msg_rx_err (dev)) +fail_halt:  				deverr (dev, "can't clear rx halt, status %d",  					status);  		} else { @@ -919,7 +946,12 @@ kevent (struct work_struct *work)  			clear_bit (EVENT_RX_MEMORY, &dev->flags);  		if (urb != NULL) {  			clear_bit (EVENT_RX_MEMORY, &dev->flags); +			status = usb_autopm_get_interface(dev->intf); +			if (status < 0) +				goto fail_lowmem;  			rx_submit (dev, urb, GFP_KERNEL); +			usb_autopm_put_interface(dev->intf); +fail_lowmem:  			tasklet_schedule (&dev->bh);  		}  	} @@ -929,11 +961,18 @@ kevent (struct work_struct *work)  		int			retval = 0;  		clear_bit (EVENT_LINK_RESET, &dev->flags); +		status = usb_autopm_get_interface(dev->intf); +		if (status < 0) +			goto skip_reset;  		if(info->link_reset && (retval = info->link_reset(dev)) < 0) { +			usb_autopm_put_interface(dev->intf); +skip_reset:  			devinfo(dev, "link reset failed (%d) usbnet usb-%s-%s, %s",  				retval,  				dev->udev->bus->bus_name, dev->udev->devpath,  				info->description); +		} else { +			usb_autopm_put_interface(dev->intf);  		}  	} @@ -971,6 +1010,7 @@ static void tx_complete (struct urb *urb)  		case -EPROTO:  		case -ETIME:  		case -EILSEQ: +			usb_mark_last_busy(dev->udev);  			if (!timer_pending (&dev->delay)) {  				mod_timer (&dev->delay,  					jiffies + THROTTLE_JIFFIES); @@ -987,6 +1027,7 @@ static void tx_complete (struct urb *urb)  		}  	} +	usb_autopm_put_interface_async(dev->intf);  	urb->dev = NULL;  	entry->state = tx_done;  	defer_bh(dev, skb, &dev->txq); @@ -1057,14 +1098,34 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,  		}  	} -	spin_lock_irqsave (&dev->txq.lock, flags); +	spin_lock_irqsave(&dev->txq.lock, flags); +	retval = usb_autopm_get_interface_async(dev->intf); +	if (retval < 0) { +		spin_unlock_irqrestore(&dev->txq.lock, flags); +		goto drop; +	} + +#ifdef CONFIG_PM +	/* if this triggers the device is still a sleep */ +	if (test_bit(EVENT_DEV_ASLEEP, &dev->flags)) { +		/* transmission will be done in resume */ +		usb_anchor_urb(urb, &dev->deferred); +		/* no use to process more packets */ +		netif_stop_queue(net); +		spin_unlock_irqrestore(&dev->txq.lock, flags); +		devdbg(dev, "Delaying transmission for resumption"); +		goto deferred; +	} +#endif  	switch ((retval = usb_submit_urb (urb, GFP_ATOMIC))) {  	case -EPIPE:  		netif_stop_queue (net);  		usbnet_defer_kevent (dev, EVENT_TX_HALT); +		usb_autopm_put_interface_async(dev->intf);  		break;  	default: +		usb_autopm_put_interface_async(dev->intf);  		if (netif_msg_tx_err (dev))  			devdbg (dev, "tx: submit urb err %d", retval);  		break; @@ -1088,6 +1149,9 @@ drop:  		devdbg (dev, "> tx, len %d, type 0x%x",  			length, skb->protocol);  	} +#ifdef CONFIG_PM +deferred: +#endif  	return NETDEV_TX_OK;  }  EXPORT_SYMBOL_GPL(usbnet_start_xmit); @@ -1126,10 +1190,10 @@ static void usbnet_bh (unsigned long param)  		}  	// or are we maybe short a few urbs? -	} else if (netif_running (dev->net) -			&& netif_device_present (dev->net) -			&& !timer_pending (&dev->delay) -			&& !test_bit (EVENT_RX_HALT, &dev->flags)) { +	} else if (netif_running (dev->net) && +		   netif_device_present (dev->net) && +		   !timer_pending (&dev->delay) && +		   !test_bit (EVENT_RX_HALT, &dev->flags)) {  		int	temp = dev->rxq.qlen;  		int	qlen = RX_QLEN (dev); @@ -1210,6 +1274,14 @@ static const struct net_device_ops usbnet_netdev_ops = {  // precondition: never called in_interrupt +static struct device_type wlan_type = { +	.name	= "wlan", +}; + +static struct device_type wwan_type = { +	.name	= "wwan", +}; +  int  usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  { @@ -1255,6 +1327,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  	dev->bh.func = usbnet_bh;  	dev->bh.data = (unsigned long) dev;  	INIT_WORK (&dev->kevent, kevent); +	init_usb_anchor(&dev->deferred);  	dev->delay.function = usbnet_bh;  	dev->delay.data = (unsigned long) dev;  	init_timer (&dev->delay); @@ -1289,12 +1362,15 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  		// heuristic:  "usb%d" for links we know are two-host,  		// else "eth%d" when there's reasonable doubt.  userspace  		// can rename the link if it knows better. -		if ((dev->driver_info->flags & FLAG_ETHER) != 0 -				&& (net->dev_addr [0] & 0x02) == 0) +		if ((dev->driver_info->flags & FLAG_ETHER) != 0 && +		    (net->dev_addr [0] & 0x02) == 0)  			strcpy (net->name, "eth%d");  		/* WLAN devices should always be named "wlan%d" */  		if ((dev->driver_info->flags & FLAG_WLAN) != 0)  			strcpy(net->name, "wlan%d"); +		/* WWAN devices should always be named "wwan%d" */ +		if ((dev->driver_info->flags & FLAG_WWAN) != 0) +			strcpy(net->name, "wwan%d");  		/* maybe the remote can't receive an Ethernet MTU */  		if (net->mtu > (dev->hard_mtu - net->hard_header_len)) @@ -1322,6 +1398,12 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);  	SET_NETDEV_DEV(net, &udev->dev); + +	if ((dev->driver_info->flags & FLAG_WLAN) != 0) +		SET_NETDEV_DEVTYPE(net, &wlan_type); +	if ((dev->driver_info->flags & FLAG_WWAN) != 0) +		SET_NETDEV_DEVTYPE(net, &wwan_type); +  	status = register_netdev (net);  	if (status)  		goto out3; @@ -1335,9 +1417,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  	// ok, it's ready to go.  	usb_set_intfdata (udev, dev); -	// start as if the link is up  	netif_device_attach (net); +	if (dev->driver_info->flags & FLAG_LINK_INTR) +		netif_carrier_off(net); +  	return 0;  out3: @@ -1363,13 +1447,23 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message)  	struct usbnet		*dev = usb_get_intfdata(intf);  	if (!dev->suspend_count++) { +		spin_lock_irq(&dev->txq.lock); +		/* don't autosuspend while transmitting */ +		if (dev->txq.qlen && (message.event & PM_EVENT_AUTO)) { +			spin_unlock_irq(&dev->txq.lock); +			return -EBUSY; +		} else { +			set_bit(EVENT_DEV_ASLEEP, &dev->flags); +			spin_unlock_irq(&dev->txq.lock); +		}  		/*  		 * accelerate emptying of the rx and queues, to avoid  		 * having everything error out.  		 */  		netif_device_detach (dev->net); -		(void) unlink_urbs (dev, &dev->rxq); -		(void) unlink_urbs (dev, &dev->txq); +		usbnet_terminate_urbs(dev); +		usb_kill_urb(dev->interrupt); +  		/*  		 * reattach so runtime management can use and  		 * wake the device @@ -1383,10 +1477,34 @@ EXPORT_SYMBOL_GPL(usbnet_suspend);  int usbnet_resume (struct usb_interface *intf)  {  	struct usbnet		*dev = usb_get_intfdata(intf); +	struct sk_buff          *skb; +	struct urb              *res; +	int                     retval; -	if (!--dev->suspend_count) -		tasklet_schedule (&dev->bh); +	if (!--dev->suspend_count) { +		spin_lock_irq(&dev->txq.lock); +		while ((res = usb_get_from_anchor(&dev->deferred))) { +			printk(KERN_INFO"%s has delayed data\n", __func__); +			skb = (struct sk_buff *)res->context; +			retval = usb_submit_urb(res, GFP_ATOMIC); +			if (retval < 0) { +				dev_kfree_skb_any(skb); +				usb_free_urb(res); +				usb_autopm_put_interface_async(dev->intf); +			} else { +				dev->net->trans_start = jiffies; +				__skb_queue_tail(&dev->txq, skb); +			} +		} + +		smp_mb(); +		clear_bit(EVENT_DEV_ASLEEP, &dev->flags); +		spin_unlock_irq(&dev->txq.lock); +		if (!(dev->txq.qlen >= TX_QLEN(dev))) +			netif_start_queue(dev->net); +		tasklet_schedule (&dev->bh); +	}  	return 0;  }  EXPORT_SYMBOL_GPL(usbnet_resume); diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c index 04882c8f9bf..3eb0b167b5b 100644 --- a/drivers/net/usb/zaurus.c +++ b/drivers/net/usb/zaurus.c @@ -174,8 +174,8 @@ static int blan_mdlm_bind(struct usbnet *dev, struct usb_interface *intf)  				goto bad_desc;  			}  			/* expect bcdVersion 1.0, ignore */ -			if (memcmp(&desc->bGUID, blan_guid, 16) -				    && memcmp(&desc->bGUID, safe_guid, 16) ) { +			if (memcmp(&desc->bGUID, blan_guid, 16) && +			    memcmp(&desc->bGUID, safe_guid, 16)) {  				/* hey, this one might _really_ be MDLM! */  				dev_dbg(&intf->dev, "MDLM guid\n");  				goto bad_desc;  |