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: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
832922362e
commit
9fe0234c0b
|
@ -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_
|
||||||
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 @@ advance:
|
||||||
|
|
||||||
/* 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 */
|
||||||
|
|
Loading…
Reference in New Issue