net: cdc_ncm: use IAD provided by the USB core
[~shefty/rdma-dev.git] / drivers / net / usb / cdc_ncm.c
index f94711caa08af2485c08eb56cd0869da3c0c8ca2..9197b2c72ca36dd9e62bbccafbea388d5fc99793 100644 (file)
@@ -344,23 +344,6 @@ static const struct ethtool_ops cdc_ncm_ethtool_ops = {
        .nway_reset = usbnet_nway_reset,
 };
 
-/* return first slave interface if an IAD matches the given master */
-static struct usb_interface *get_iad_slave(struct usb_device *udev,
-                                          struct usb_interface *master) {
-       int i;
-       struct usb_interface_assoc_descriptor *iad;
-       u8 mnum = master->cur_altsetting->desc.bInterfaceNumber;
-
-       for (i = 0; i < USB_MAXIADS; i++) {
-               iad = udev->actconfig->intf_assoc[i];
-               if (!iad)
-                       break;
-               if (iad->bFirstInterface == mnum && iad->bInterfaceCount == 2)
-                       return usb_ifnum_to_if(udev, mnum + 1);
-       }
-       return NULL;
-}
-
 int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting)
 {
        struct cdc_ncm_ctx *ctx;
@@ -453,13 +436,10 @@ advance:
        }
 
        /* some buggy devices have an IAD but no CDC Union */
-       if (!ctx->union_desc) {
-               dev_dbg(&intf->dev, "missing CDC Union descriptor\n");
-               ctx->data = get_iad_slave(dev->udev, intf);
-               if (ctx->data) {
-                       ctx->control = intf;
-                       dev_dbg(&intf->dev, "got slave from IAD\n");
-               }
+       if (!ctx->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);
+               dev_dbg(&intf->dev, "CDC Union missing - got slave from IAD\n");
        }
 
        /* check if we got everything */