提交 7f65b1f5 编写于 作者: O Oliver Neukum 提交者: David S. Miller

cdc-ether: divorce initialisation with a filter reset and a generic method

Some devices need their multicast filter reset but others are crashed by that.
So the methods need to be separated.
Signed-off-by: NOliver Neukum <oneukum@suse.com>
Reported-by: N"Ridgway, Keith" <kridgway@harris.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 2f9bfd33
...@@ -310,6 +310,26 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) ...@@ -310,6 +310,26 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
return -ENODEV; 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 /* Some devices don't initialise properly. In particular
* the packet filter is not reset. There are devices that * the packet filter is not reset. There are devices that
* don't do reset all the way. So the packet filter should * don't do reset all the way. So the packet filter should
...@@ -317,13 +337,10 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) ...@@ -317,13 +337,10 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
*/ */
usbnet_cdc_update_filter(dev); usbnet_cdc_update_filter(dev);
return 0; bail_out:
return rv;
bad_desc:
dev_info(&dev->udev->dev, "bad CDC descriptors\n");
return -ENODEV;
} }
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) 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) ...@@ -417,7 +434,7 @@ int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data)
< sizeof(struct cdc_state))); < sizeof(struct cdc_state)));
status = usbnet_generic_cdc_bind(dev, intf); status = usbnet_ether_cdc_bind(dev, intf);
if (status < 0) if (status < 0)
return status; return status;
......
...@@ -206,6 +206,7 @@ struct cdc_state { ...@@ -206,6 +206,7 @@ struct cdc_state {
}; };
extern int usbnet_generic_cdc_bind(struct usbnet *, struct usb_interface *); extern int usbnet_generic_cdc_bind(struct usbnet *, struct usb_interface *);
extern int usbnet_ether_cdc_bind(struct usbnet *dev, struct usb_interface *intf);
extern int usbnet_cdc_bind(struct usbnet *, struct usb_interface *); extern int usbnet_cdc_bind(struct usbnet *, struct usb_interface *);
extern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *); extern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *);
extern void usbnet_cdc_status(struct usbnet *, struct urb *); extern void usbnet_cdc_status(struct usbnet *, struct urb *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册