Commit 9fe0234c authored by Bjørn Mork's avatar Bjørn Mork Committed by David S. Miller

net: cdc_ncm: only the control intf can be probed

The probed interface must be the master/control interface of the
function.  Make this explicit and simplify redundant tests.

Cc: Alexey Orishko <alexey.orishko@gmail.com>
Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 83292236
...@@ -394,6 +394,9 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ ...@@ -394,6 +394,9 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
/* store ctx pointer in device data field */ /* store ctx pointer in device data field */
dev->data[0] = (unsigned long)ctx; dev->data[0] = (unsigned long)ctx;
/* only the control interface can be successfully probed */
ctx->control = intf;
/* get some pointers */ /* get some pointers */
driver = driver_of(intf); driver = driver_of(intf);
buf = intf->cur_altsetting->extra; buf = intf->cur_altsetting->extra;
...@@ -411,9 +414,10 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ ...@@ -411,9 +414,10 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
break; break;
union_desc = (const struct usb_cdc_union_desc *)buf; union_desc = (const struct usb_cdc_union_desc *)buf;
/* the master must be the interface we are probing */
ctx->control = usb_ifnum_to_if(dev->udev, if (intf->cur_altsetting->desc.bInterfaceNumber !=
union_desc->bMasterInterface0); union_desc->bMasterInterface0)
goto error;
ctx->data = usb_ifnum_to_if(dev->udev, ctx->data = usb_ifnum_to_if(dev->udev,
union_desc->bSlaveInterface0); union_desc->bSlaveInterface0);
break; break;
...@@ -459,14 +463,12 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ ...@@ -459,14 +463,12 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
/* some buggy devices have an IAD but no CDC Union */ /* some buggy devices have an IAD but no CDC Union */
if (!union_desc && intf->intf_assoc && intf->intf_assoc->bInterfaceCount == 2) { if (!union_desc && intf->intf_assoc && intf->intf_assoc->bInterfaceCount == 2) {
ctx->control = intf;
ctx->data = usb_ifnum_to_if(dev->udev, intf->cur_altsetting->desc.bInterfaceNumber + 1); ctx->data = usb_ifnum_to_if(dev->udev, intf->cur_altsetting->desc.bInterfaceNumber + 1);
dev_dbg(&intf->dev, "CDC Union missing - got slave from IAD\n"); dev_dbg(&intf->dev, "CDC Union missing - got slave from IAD\n");
} }
/* check if we got everything */ /* check if we got everything */
if ((ctx->control == NULL) || (ctx->data == NULL) || if (!ctx->data || (!ctx->mbim_desc && !ctx->ether_desc))
((!ctx->mbim_desc) && ((ctx->ether_desc == NULL) || (ctx->control != intf))))
goto error; goto error;
/* claim data interface, if different from control */ /* claim data interface, if different from control */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment