On Sun, Apr 27, 2014 at 04:47:45PM +0200, Bjørn Mork wrote: > From: Bjørn Mork <bjorn@xxxxxxx> > > All the "non Gobi" Qualcomm based devices handled by this > driver share a common standard Sierra Wireless specific > layout. Adding code specifically for this layout allow > us to reduce the number of match entries per device from > three to one. > > This change will result in a penalty wrt stable backports, > but simplifies new Sierra device addtitions in the long > term. > > Signed-off-by: Bjørn Mork <bjorn@xxxxxxx> Signed-off-by: Johan Hovold <jhovold@xxxxxxxxx> > --- > drivers/usb/serial/qcserial.c | 98 +++++++++++++++++++++++-------------------- > 1 file changed, 53 insertions(+), 45 deletions(-) > > diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c > index 217e29ccde52..91e7bb515398 100644 > --- a/drivers/usb/serial/qcserial.c > +++ b/drivers/usb/serial/qcserial.c > @@ -26,10 +26,13 @@ > enum qcserial_layouts { > QCSERIAL_G2K = 0, /* Gobi 2000 */ > QCSERIAL_G1K = 1, /* Gobi 1000 */ > + QCSERIAL_SWI = 2, /* Sierra Wireless */ > }; > > #define DEVICE_G1K(v, p) \ > USB_DEVICE(v, p), .driver_info = QCSERIAL_G1K > +#define DEVICE_SWI(v, p) \ > + USB_DEVICE(v, p), .driver_info = QCSERIAL_SWI > > static const struct usb_device_id id_table[] = { > /* Gobi 1000 devices */ > @@ -132,46 +135,20 @@ static const struct usb_device_id id_table[] = { > {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */ > {USB_DEVICE(0x0AF0, 0x8120)}, /* Option GTM681W */ > > - /* non Gobi Qualcomm serial devices */ > - {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)}, /* Sierra Wireless MC7700 Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 2)}, /* Sierra Wireless MC7700 NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 3)}, /* Sierra Wireless MC7700 Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 0)}, /* Sierra Wireless MC7750 Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 2)}, /* Sierra Wireless MC7750 NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 3)}, /* Sierra Wireless MC7750 Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 0)}, /* Sierra Wireless MC73xx Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 2)}, /* Sierra Wireless MC73xx NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 3)}, /* Sierra Wireless MC73xx Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 0)}, /* Sierra Wireless MC7305/MC7355 Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 2)}, /* Sierra Wireless MC7305/MC7355 NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 3)}, /* Sierra Wireless MC7305/MC7355 Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a2, 0)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a2, 2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a2, 3)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a3, 0)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a3, 2)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a3, 3)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a4, 0)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a4, 2)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a4, 3)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a8, 0)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a8, 2)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a8, 3)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card Modem */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a9, 0)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card Device Management */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a9, 2)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card NMEA */ > - {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a9, 3)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card Modem */ > + /* non-Gobi Sierra Wireless devices */ > + {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ > + {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ > + {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ > + {DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC73xx */ > + {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ > + {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ > + {DEVICE_SWI(0x1199, 0x9041)}, /* Sierra Wireless MC7305/MC7355 */ > + {DEVICE_SWI(0x1199, 0x9051)}, /* Netgear AirCard 340U */ > + {DEVICE_SWI(0x413c, 0x81a2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ > + {DEVICE_SWI(0x413c, 0x81a3)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ > + {DEVICE_SWI(0x413c, 0x81a4)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ > + {DEVICE_SWI(0x413c, 0x81a8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ > + {DEVICE_SWI(0x413c, 0x81a9)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ > > { } /* Terminating entry */ > }; > @@ -220,11 +197,6 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) > goto done; > } > > - if (nintf < 3 || nintf > 4) { > - dev_err(dev, "unknown number of interfaces: %d\n", nintf); > - goto done; > - } > - > /* default to enabling interface */ > altsetting = 0; > > @@ -242,6 +214,12 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) > * 2: AT-capable modem port > * 3: QMI/net > */ > + if (nintf < 3 || nintf > 4) { > + dev_err(dev, "unknown number of interfaces: %d\n", nintf); > + altsetting = -1; > + goto done; > + } > + > if (ifnum == 0) { > dev_dbg(dev, "Gobi 1K DM/DIAG interface found\n"); > altsetting = 1; > @@ -258,6 +236,12 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) > * 2: AT-capable modem port > * 3: NMEA > */ > + if (nintf < 3 || nintf > 4) { > + dev_err(dev, "unknown number of interfaces: %d\n", nintf); > + altsetting = -1; > + goto done; > + } > + > switch (ifnum) { > case 0: > /* Don't claim the QMI/net interface */ > @@ -279,6 +263,30 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) > break; > } > break; > + case QCSERIAL_SWI: > + /* > + * Sierra Wireless layout: > + * 0: DM/DIAG (use libqcdm from ModemManager for communication) > + * 2: NMEA > + * 3: AT-capable modem port > + * 8: QMI/net > + */ > + switch (ifnum) { > + case 0: > + dev_dbg(dev, "DM/DIAG interface found\n"); > + break; > + case 2: > + dev_dbg(dev, "NMEA GPS interface found\n"); > + break; > + case 3: > + dev_dbg(dev, "Modem port found\n"); > + break; > + default: > + /* don't claim any unsupported interface */ > + altsetting = -1; > + break; > + } > + break; > default: > dev_err(dev, "unsupported device layout type: %lu\n", > id->driver_info); -- 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