diff options
Diffstat (limited to 'drivers/net/usb/cdc_ether.c')
| -rw-r--r-- | drivers/net/usb/cdc_ether.c | 31 | 
1 files changed, 24 insertions, 7 deletions
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index f3ae88fdf332..8ab281b478f2 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -310,6 +310,26 @@ skip:  		return -ENODEV;  	} +	return 0; + +bad_desc: +	dev_info(&dev->udev->dev, "bad CDC descriptors\n"); +	return -ENODEV; +} +EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind); + + +/* like usbnet_generic_cdc_bind() but handles filter initialization + * correctly + */ +int usbnet_ether_cdc_bind(struct usbnet *dev, struct usb_interface *intf) +{ +	int rv; + +	rv = usbnet_generic_cdc_bind(dev, intf); +	if (rv < 0) +		goto bail_out; +  	/* Some devices don't initialise properly. In particular  	 * the packet filter is not reset. There are devices that  	 * don't do reset all the way. So the packet filter should @@ -317,13 +337,10 @@ skip:  	 */  	usbnet_cdc_update_filter(dev); -	return 0; - -bad_desc: -	dev_info(&dev->udev->dev, "bad CDC descriptors\n"); -	return -ENODEV; +bail_out: +	return rv;  } -EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind); +EXPORT_SYMBOL_GPL(usbnet_ether_cdc_bind);  void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)  { @@ -417,7 +434,7 @@ int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)  	BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data)  			< sizeof(struct cdc_state))); -	status = usbnet_generic_cdc_bind(dev, intf); +	status = usbnet_ether_cdc_bind(dev, intf);  	if (status < 0)  		return status;  |