diff options
Diffstat (limited to 'drivers/net/usb/cdc_ncm.c')
| -rw-r--r-- | drivers/net/usb/cdc_ncm.c | 19 | 
1 files changed, 10 insertions, 9 deletions
| diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 877c9516e781..2d1a6f2e16ab 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -740,10 +740,6 @@ static void cdc_ncm_free(struct cdc_ncm_ctx *ctx)  int cdc_ncm_change_mtu(struct net_device *net, int new_mtu)  {  	struct usbnet *dev = netdev_priv(net); -	int maxmtu = cdc_ncm_max_dgram_size(dev) - cdc_ncm_eth_hlen(dev); - -	if (new_mtu <= 0 || new_mtu > maxmtu) -		return -EINVAL;  	net->mtu = new_mtu;  	cdc_ncm_set_dgram_size(dev, new_mtu + cdc_ncm_eth_hlen(dev)); @@ -839,11 +835,18 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_  	iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; +	/* Device-specific flags */ +	ctx->drvflags = drvflags; +  	/* Reset data interface. Some devices will not reset properly  	 * unless they are configured first.  Toggle the altsetting to -	 * force a reset +	 * force a reset. +	 * Some other devices do not work properly with this procedure +	 * that can be avoided using quirk CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE  	 */ -	usb_set_interface(dev->udev, iface_no, data_altsetting); +	if (!(ctx->drvflags & CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE)) +		usb_set_interface(dev->udev, iface_no, data_altsetting); +  	temp = usb_set_interface(dev->udev, iface_no, 0);  	if (temp) {  		dev_dbg(&intf->dev, "set interface failed\n"); @@ -890,9 +893,6 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_  	/* finish setting up the device specific data */  	cdc_ncm_setup(dev); -	/* Device-specific flags */ -	ctx->drvflags = drvflags; -  	/* Allocate the delayed NDP if needed. */  	if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {  		ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL); @@ -909,6 +909,7 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_  	/* must handle MTU changes */  	dev->net->netdev_ops = &cdc_ncm_netdev_ops; +	dev->net->max_mtu = cdc_ncm_max_dgram_size(dev) - cdc_ncm_eth_hlen(dev);  	return 0; |