On Sun, Apr 27, 2014 at 04:47:45PM +0200, Bjørn Mork wrote:
> From: Bjørn Mork <bj...@mork.no>
> 
> 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 <bj...@mork.no>

Signed-off-by: Johan Hovold <jhov...@gmail.com>

> ---
>  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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to