On Friday 23 July 2010, Andrew Bird wrote: > This patch adds the product IDs of Huawei's K3765 and K4505 mobile > broadband usb modems to option.c. It also adds a quirk to the option probe > function so that binding to the device's network interface(class 0xff) is > avoided. This is necessary to allow another driver to bind to that, and to > avoid programs like wvdial opening a nonfunctioning tty during modem > discovery. > > Signed-off-by: Andrew Bird <ajb@xxxxxxxxxxxxxxxxxxx> > --- > drivers/usb/serial/option.c | 11 +++++++++++ > 1 files changed, 11 insertions(+), 0 deletions(-) > > diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c > index e280ad8..ec6c2f6 100644 > --- a/drivers/usb/serial/option.c > +++ b/drivers/usb/serial/option.c > @@ -145,6 +145,8 @@ static void option_instat_callback(struct urb *urb); > #define HUAWEI_PRODUCT_E143D 0x143D > #define HUAWEI_PRODUCT_E143E 0x143E > #define HUAWEI_PRODUCT_E143F 0x143F > +#define HUAWEI_PRODUCT_K4505 0x1464 > +#define HUAWEI_PRODUCT_K3765 0x1465 > #define HUAWEI_PRODUCT_E14AC 0x14AC > > #define QUANTA_VENDOR_ID 0x0408 > @@ -480,6 +482,8 @@ static const struct usb_device_id option_ids[] = { > { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, > 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, > HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, { > USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, > 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, > HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff) }, + { > USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, > 0xff, 0xff, 0xff) }, { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC) > }, > { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) }, > { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, > /* Novatel Merlin V640/XV620 */ @@ -1013,6 +1017,13 @@ static int > option_probe(struct usb_serial *serial, > serial->interface->cur_altsetting->desc.bInterfaceClass != 0xff) return > -ENODEV; > > + /* Don't bind network interfaces on Huawei K3765 & K4505 */ > + if (serial->dev->descriptor.idVendor == HUAWEI_VENDOR_ID && > + (serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K3765 || > + serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K4505) && > + serial->interface->cur_altsetting->desc.bInterfaceNumber == 1) > + return -ENODEV; > + > data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private), > GFP_KERNEL); > > if (!data) Greg I forgot to say this works correctly with K3765, K4505 in both CDC compatible and nondescript network modes. Having the large 'if' and restoring the match on class/subclass/protocol gives the expected interface bind behaviour: nondescript mode ============= 0 - modem - bound to 'option' 1 - network 2 - diagnostics port - bound to 'option' 3 - secondary port - bound to 'option' 4 - CDROM 5 - SDCARD CDC compatible mode ================ 0 - modem - bound to 'option' 1 - network CDC master 2 - network CDC slave 3 - diagnostics port - bound to 'option' 4 - secondary port - bound to 'option' 5 - CDROM 6 - SDCARD Thanks for listening Andrew -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html