Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f65b1f5 authored by Oliver Neukum's avatar Oliver Neukum Committed by David S. Miller
Browse files

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: default avatarOliver Neukum <oneukum@suse.com>
Reported-by: default avatar"Ridgway, Keith" <kridgway@harris.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2f9bfd33
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -310,6 +310,26 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
		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 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
	 */
	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;

+1 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ struct cdc_state {
};

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 void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *);
extern void usbnet_cdc_status(struct usbnet *, struct urb *);