linux/drivers/usb/serial/option.c
<<
>>
Prefs
   1/*
   2  USB Driver for GSM modems
   3
   4  Copyright (C) 2005  Matthias Urlichs <smurf@smurf.noris.de>
   5
   6  This driver is free software; you can redistribute it and/or modify
   7  it under the terms of Version 2 of the GNU General Public License as
   8  published by the Free Software Foundation.
   9
  10  Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
  11
  12  History: see the git log.
  13
  14  Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
  15
  16  This driver exists because the "normal" serial driver doesn't work too well
  17  with GSM modems. Issues:
  18  - data loss -- one single Receive URB is not nearly enough
  19  - nonstandard flow (Option devices) control
  20  - controlling the baud rate doesn't make sense
  21
  22  This driver is named "option" because the most common device it's
  23  used for is a PC-Card (with an internal OHCI-USB interface, behind
  24  which the GSM interface sits), made by Option Inc.
  25
  26  Some of the "one port" devices actually exhibit multiple USB instances
  27  on the USB bus. This is not a bug, these ports are used for different
  28  device features.
  29*/
  30
  31#define DRIVER_VERSION "v0.7.2"
  32#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
  33#define DRIVER_DESC "USB Driver for GSM modems"
  34
  35#include <linux/kernel.h>
  36#include <linux/jiffies.h>
  37#include <linux/errno.h>
  38#include <linux/tty.h>
  39#include <linux/tty_flip.h>
  40#include <linux/module.h>
  41#include <linux/bitops.h>
  42#include <linux/usb.h>
  43#include <linux/usb/serial.h>
  44
  45/* Function prototypes */
  46static int  option_probe(struct usb_serial *serial,
  47                        const struct usb_device_id *id);
  48static int  option_open(struct tty_struct *tty, struct usb_serial_port *port);
  49static void option_close(struct usb_serial_port *port);
  50static void option_dtr_rts(struct usb_serial_port *port, int on);
  51
  52static int  option_startup(struct usb_serial *serial);
  53static void option_disconnect(struct usb_serial *serial);
  54static void option_release(struct usb_serial *serial);
  55static int  option_write_room(struct tty_struct *tty);
  56
  57static void option_instat_callback(struct urb *urb);
  58
  59static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
  60                        const unsigned char *buf, int count);
  61static int  option_chars_in_buffer(struct tty_struct *tty);
  62static void option_set_termios(struct tty_struct *tty,
  63                        struct usb_serial_port *port, struct ktermios *old);
  64static int  option_tiocmget(struct tty_struct *tty, struct file *file);
  65static int  option_tiocmset(struct tty_struct *tty, struct file *file,
  66                                unsigned int set, unsigned int clear);
  67static int  option_send_setup(struct usb_serial_port *port);
  68#ifdef CONFIG_PM
  69static int  option_suspend(struct usb_serial *serial, pm_message_t message);
  70static int  option_resume(struct usb_serial *serial);
  71#endif
  72
  73/* Vendor and product IDs */
  74#define OPTION_VENDOR_ID                        0x0AF0
  75#define OPTION_PRODUCT_COLT                     0x5000
  76#define OPTION_PRODUCT_RICOLA                   0x6000
  77#define OPTION_PRODUCT_RICOLA_LIGHT             0x6100
  78#define OPTION_PRODUCT_RICOLA_QUAD              0x6200
  79#define OPTION_PRODUCT_RICOLA_QUAD_LIGHT        0x6300
  80#define OPTION_PRODUCT_RICOLA_NDIS              0x6050
  81#define OPTION_PRODUCT_RICOLA_NDIS_LIGHT        0x6150
  82#define OPTION_PRODUCT_RICOLA_NDIS_QUAD         0x6250
  83#define OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT   0x6350
  84#define OPTION_PRODUCT_COBRA                    0x6500
  85#define OPTION_PRODUCT_COBRA_BUS                0x6501
  86#define OPTION_PRODUCT_VIPER                    0x6600
  87#define OPTION_PRODUCT_VIPER_BUS                0x6601
  88#define OPTION_PRODUCT_GT_MAX_READY             0x6701
  89#define OPTION_PRODUCT_FUJI_MODEM_LIGHT         0x6721
  90#define OPTION_PRODUCT_FUJI_MODEM_GT            0x6741
  91#define OPTION_PRODUCT_FUJI_MODEM_EX            0x6761
  92#define OPTION_PRODUCT_KOI_MODEM                0x6800
  93#define OPTION_PRODUCT_SCORPION_MODEM           0x6901
  94#define OPTION_PRODUCT_ETNA_MODEM               0x7001
  95#define OPTION_PRODUCT_ETNA_MODEM_LITE          0x7021
  96#define OPTION_PRODUCT_ETNA_MODEM_GT            0x7041
  97#define OPTION_PRODUCT_ETNA_MODEM_EX            0x7061
  98#define OPTION_PRODUCT_ETNA_KOI_MODEM           0x7100
  99#define OPTION_PRODUCT_GTM380_MODEM             0x7201
 100
 101#define HUAWEI_VENDOR_ID                        0x12D1
 102#define HUAWEI_PRODUCT_E600                     0x1001
 103#define HUAWEI_PRODUCT_E220                     0x1003
 104#define HUAWEI_PRODUCT_E220BIS                  0x1004
 105#define HUAWEI_PRODUCT_E1401                    0x1401
 106#define HUAWEI_PRODUCT_E1402                    0x1402
 107#define HUAWEI_PRODUCT_E1403                    0x1403
 108#define HUAWEI_PRODUCT_E1404                    0x1404
 109#define HUAWEI_PRODUCT_E1405                    0x1405
 110#define HUAWEI_PRODUCT_E1406                    0x1406
 111#define HUAWEI_PRODUCT_E1407                    0x1407
 112#define HUAWEI_PRODUCT_E1408                    0x1408
 113#define HUAWEI_PRODUCT_E1409                    0x1409
 114#define HUAWEI_PRODUCT_E140A                    0x140A
 115#define HUAWEI_PRODUCT_E140B                    0x140B
 116#define HUAWEI_PRODUCT_E140C                    0x140C
 117#define HUAWEI_PRODUCT_E140D                    0x140D
 118#define HUAWEI_PRODUCT_E140E                    0x140E
 119#define HUAWEI_PRODUCT_E140F                    0x140F
 120#define HUAWEI_PRODUCT_E1410                    0x1410
 121#define HUAWEI_PRODUCT_E1411                    0x1411
 122#define HUAWEI_PRODUCT_E1412                    0x1412
 123#define HUAWEI_PRODUCT_E1413                    0x1413
 124#define HUAWEI_PRODUCT_E1414                    0x1414
 125#define HUAWEI_PRODUCT_E1415                    0x1415
 126#define HUAWEI_PRODUCT_E1416                    0x1416
 127#define HUAWEI_PRODUCT_E1417                    0x1417
 128#define HUAWEI_PRODUCT_E1418                    0x1418
 129#define HUAWEI_PRODUCT_E1419                    0x1419
 130#define HUAWEI_PRODUCT_E141A                    0x141A
 131#define HUAWEI_PRODUCT_E141B                    0x141B
 132#define HUAWEI_PRODUCT_E141C                    0x141C
 133#define HUAWEI_PRODUCT_E141D                    0x141D
 134#define HUAWEI_PRODUCT_E141E                    0x141E
 135#define HUAWEI_PRODUCT_E141F                    0x141F
 136#define HUAWEI_PRODUCT_E1420                    0x1420
 137#define HUAWEI_PRODUCT_E1421                    0x1421
 138#define HUAWEI_PRODUCT_E1422                    0x1422
 139#define HUAWEI_PRODUCT_E1423                    0x1423
 140#define HUAWEI_PRODUCT_E1424                    0x1424
 141#define HUAWEI_PRODUCT_E1425                    0x1425
 142#define HUAWEI_PRODUCT_E1426                    0x1426
 143#define HUAWEI_PRODUCT_E1427                    0x1427
 144#define HUAWEI_PRODUCT_E1428                    0x1428
 145#define HUAWEI_PRODUCT_E1429                    0x1429
 146#define HUAWEI_PRODUCT_E142A                    0x142A
 147#define HUAWEI_PRODUCT_E142B                    0x142B
 148#define HUAWEI_PRODUCT_E142C                    0x142C
 149#define HUAWEI_PRODUCT_E142D                    0x142D
 150#define HUAWEI_PRODUCT_E142E                    0x142E
 151#define HUAWEI_PRODUCT_E142F                    0x142F
 152#define HUAWEI_PRODUCT_E1430                    0x1430
 153#define HUAWEI_PRODUCT_E1431                    0x1431
 154#define HUAWEI_PRODUCT_E1432                    0x1432
 155#define HUAWEI_PRODUCT_E1433                    0x1433
 156#define HUAWEI_PRODUCT_E1434                    0x1434
 157#define HUAWEI_PRODUCT_E1435                    0x1435
 158#define HUAWEI_PRODUCT_E1436                    0x1436
 159#define HUAWEI_PRODUCT_E1437                    0x1437
 160#define HUAWEI_PRODUCT_E1438                    0x1438
 161#define HUAWEI_PRODUCT_E1439                    0x1439
 162#define HUAWEI_PRODUCT_E143A                    0x143A
 163#define HUAWEI_PRODUCT_E143B                    0x143B
 164#define HUAWEI_PRODUCT_E143C                    0x143C
 165#define HUAWEI_PRODUCT_E143D                    0x143D
 166#define HUAWEI_PRODUCT_E143E                    0x143E
 167#define HUAWEI_PRODUCT_E143F                    0x143F
 168#define HUAWEI_PRODUCT_E14AC                    0x14AC
 169
 170#define QUANTA_VENDOR_ID                        0x0408
 171#define QUANTA_PRODUCT_Q101                     0xEA02
 172#define QUANTA_PRODUCT_Q111                     0xEA03
 173#define QUANTA_PRODUCT_GLX                      0xEA04
 174#define QUANTA_PRODUCT_GKE                      0xEA05
 175#define QUANTA_PRODUCT_GLE                      0xEA06
 176
 177#define NOVATELWIRELESS_VENDOR_ID               0x1410
 178
 179/* YISO PRODUCTS */
 180
 181#define YISO_VENDOR_ID                          0x0EAB
 182#define YISO_PRODUCT_U893                       0xC893
 183
 184/* MERLIN EVDO PRODUCTS */
 185#define NOVATELWIRELESS_PRODUCT_V640            0x1100
 186#define NOVATELWIRELESS_PRODUCT_V620            0x1110
 187#define NOVATELWIRELESS_PRODUCT_V740            0x1120
 188#define NOVATELWIRELESS_PRODUCT_V720            0x1130
 189
 190/* MERLIN HSDPA/HSPA PRODUCTS */
 191#define NOVATELWIRELESS_PRODUCT_U730            0x1400
 192#define NOVATELWIRELESS_PRODUCT_U740            0x1410
 193#define NOVATELWIRELESS_PRODUCT_U870            0x1420
 194#define NOVATELWIRELESS_PRODUCT_XU870           0x1430
 195#define NOVATELWIRELESS_PRODUCT_X950D           0x1450
 196
 197/* EXPEDITE PRODUCTS */
 198#define NOVATELWIRELESS_PRODUCT_EV620           0x2100
 199#define NOVATELWIRELESS_PRODUCT_ES720           0x2110
 200#define NOVATELWIRELESS_PRODUCT_E725            0x2120
 201#define NOVATELWIRELESS_PRODUCT_ES620           0x2130
 202#define NOVATELWIRELESS_PRODUCT_EU730           0x2400
 203#define NOVATELWIRELESS_PRODUCT_EU740           0x2410
 204#define NOVATELWIRELESS_PRODUCT_EU870D          0x2420
 205
 206/* OVATION PRODUCTS */
 207#define NOVATELWIRELESS_PRODUCT_MC727           0x4100
 208#define NOVATELWIRELESS_PRODUCT_MC950D          0x4400
 209#define NOVATELWIRELESS_PRODUCT_U727            0x5010
 210#define NOVATELWIRELESS_PRODUCT_MC727_NEW       0x5100
 211#define NOVATELWIRELESS_PRODUCT_MC760           0x6000
 212#define NOVATELWIRELESS_PRODUCT_OVMC760         0x6002
 213
 214/* FUTURE NOVATEL PRODUCTS */
 215#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED  0X6001
 216#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED  0X7000
 217#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED  0X7001
 218#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED 0X8000
 219#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0X8001
 220#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0X9000
 221#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0X9001
 222#define NOVATELWIRELESS_PRODUCT_GLOBAL          0XA001
 223
 224/* AMOI PRODUCTS */
 225#define AMOI_VENDOR_ID                          0x1614
 226#define AMOI_PRODUCT_H01                        0x0800
 227#define AMOI_PRODUCT_H01A                       0x7002
 228#define AMOI_PRODUCT_H02                        0x0802
 229
 230#define DELL_VENDOR_ID                          0x413C
 231
 232/* Dell modems */
 233#define DELL_PRODUCT_5700_MINICARD              0x8114
 234#define DELL_PRODUCT_5500_MINICARD              0x8115
 235#define DELL_PRODUCT_5505_MINICARD              0x8116
 236#define DELL_PRODUCT_5700_EXPRESSCARD           0x8117
 237#define DELL_PRODUCT_5510_EXPRESSCARD           0x8118
 238
 239#define DELL_PRODUCT_5700_MINICARD_SPRINT       0x8128
 240#define DELL_PRODUCT_5700_MINICARD_TELUS        0x8129
 241
 242#define DELL_PRODUCT_5720_MINICARD_VZW          0x8133
 243#define DELL_PRODUCT_5720_MINICARD_SPRINT       0x8134
 244#define DELL_PRODUCT_5720_MINICARD_TELUS        0x8135
 245#define DELL_PRODUCT_5520_MINICARD_CINGULAR     0x8136
 246#define DELL_PRODUCT_5520_MINICARD_GENERIC_L    0x8137
 247#define DELL_PRODUCT_5520_MINICARD_GENERIC_I    0x8138
 248
 249#define DELL_PRODUCT_5730_MINICARD_SPRINT       0x8180
 250#define DELL_PRODUCT_5730_MINICARD_TELUS        0x8181
 251#define DELL_PRODUCT_5730_MINICARD_VZW          0x8182
 252
 253#define KYOCERA_VENDOR_ID                       0x0c88
 254#define KYOCERA_PRODUCT_KPC650                  0x17da
 255#define KYOCERA_PRODUCT_KPC680                  0x180a
 256
 257#define ANYDATA_VENDOR_ID                       0x16d5
 258#define ANYDATA_PRODUCT_ADU_620UW               0x6202
 259#define ANYDATA_PRODUCT_ADU_E100A               0x6501
 260#define ANYDATA_PRODUCT_ADU_500A                0x6502
 261
 262#define AXESSTEL_VENDOR_ID                      0x1726
 263#define AXESSTEL_PRODUCT_MV110H                 0x1000
 264
 265#define BANDRICH_VENDOR_ID                      0x1A8D
 266#define BANDRICH_PRODUCT_C100_1                 0x1002
 267#define BANDRICH_PRODUCT_C100_2                 0x1003
 268#define BANDRICH_PRODUCT_1004                   0x1004
 269#define BANDRICH_PRODUCT_1005                   0x1005
 270#define BANDRICH_PRODUCT_1006                   0x1006
 271#define BANDRICH_PRODUCT_1007                   0x1007
 272#define BANDRICH_PRODUCT_1008                   0x1008
 273#define BANDRICH_PRODUCT_1009                   0x1009
 274#define BANDRICH_PRODUCT_100A                   0x100a
 275
 276#define BANDRICH_PRODUCT_100B                   0x100b
 277#define BANDRICH_PRODUCT_100C                   0x100c
 278#define BANDRICH_PRODUCT_100D                   0x100d
 279#define BANDRICH_PRODUCT_100E                   0x100e
 280
 281#define BANDRICH_PRODUCT_100F                   0x100f
 282#define BANDRICH_PRODUCT_1010                   0x1010
 283#define BANDRICH_PRODUCT_1011                   0x1011
 284#define BANDRICH_PRODUCT_1012                   0x1012
 285
 286#define AMOI_VENDOR_ID                  0x1614
 287#define AMOI_PRODUCT_9508                       0x0800
 288
 289#define QUALCOMM_VENDOR_ID                      0x05C6
 290
 291#define MAXON_VENDOR_ID                         0x16d8
 292
 293#define TELIT_VENDOR_ID                         0x1bc7
 294#define TELIT_PRODUCT_UC864E                    0x1003
 295#define TELIT_PRODUCT_UC864G                    0x1004
 296
 297/* ZTE PRODUCTS */
 298#define ZTE_VENDOR_ID                           0x19d2
 299#define ZTE_PRODUCT_MF622                       0x0001
 300#define ZTE_PRODUCT_MF628                       0x0015
 301#define ZTE_PRODUCT_MF626                       0x0031
 302#define ZTE_PRODUCT_CDMA_TECH                   0xfffe
 303#define ZTE_PRODUCT_AC8710                      0xfff1
 304#define ZTE_PRODUCT_AC2726                      0xfff5
 305
 306#define BENQ_VENDOR_ID                          0x04a5
 307#define BENQ_PRODUCT_H10                        0x4068
 308
 309#define DLINK_VENDOR_ID                         0x1186
 310#define DLINK_PRODUCT_DWM_652                   0x3e04
 311#define DLINK_PRODUCT_DWM_652_U5                0xce16
 312
 313#define QISDA_VENDOR_ID                         0x1da5
 314#define QISDA_PRODUCT_H21_4512                  0x4512
 315#define QISDA_PRODUCT_H21_4523                  0x4523
 316#define QISDA_PRODUCT_H20_4515                  0x4515
 317#define QISDA_PRODUCT_H20_4519                  0x4519
 318
 319/* TLAYTECH PRODUCTS */
 320#define TLAYTECH_VENDOR_ID                      0x20B9
 321#define TLAYTECH_PRODUCT_TEU800                 0x1682
 322
 323/* TOSHIBA PRODUCTS */
 324#define TOSHIBA_VENDOR_ID                       0x0930
 325#define TOSHIBA_PRODUCT_HSDPA_MINICARD          0x1302
 326#define TOSHIBA_PRODUCT_G450                    0x0d45
 327
 328#define ALINK_VENDOR_ID                         0x1e0e
 329#define ALINK_PRODUCT_3GU                       0x9200
 330
 331/* ALCATEL PRODUCTS */
 332#define ALCATEL_VENDOR_ID                       0x1bbb
 333#define ALCATEL_PRODUCT_X060S                   0x0000
 334
 335/* Airplus products */
 336#define AIRPLUS_VENDOR_ID                       0x1011
 337#define AIRPLUS_PRODUCT_MCD650                  0x3198
 338
 339/* 4G Systems products */
 340#define FOUR_G_SYSTEMS_VENDOR_ID                0x1c9e
 341#define FOUR_G_SYSTEMS_PRODUCT_W14              0x9603
 342
 343static struct usb_device_id option_ids[] = {
 344        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
 345        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
 346        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
 347        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
 348        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },
 349        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS) },
 350        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_LIGHT) },
 351        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD) },
 352        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT) },
 353        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
 354        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA_BUS) },
 355        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
 356        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
 357        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
 358        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
 359        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
 360        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
 361        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
 362        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
 363        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
 364        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
 365        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
 366        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
 367        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
 368        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) },
 369        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q101) },
 370        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q111) },
 371        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) },
 372        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) },
 373        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) },
 374        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
 375        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
 376        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
 377        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
 378        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) },
 379        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
 380        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) },
 381        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
 382        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
 383        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) },
 384        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
 385        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
 386        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) },
 387        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) },
 388        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) },
 389        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) },
 390        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) },
 391        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) },
 392        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
 393        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
 394        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
 395        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413, 0xff, 0xff, 0xff) },
 396        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414, 0xff, 0xff, 0xff) },
 397        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415, 0xff, 0xff, 0xff) },
 398        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416, 0xff, 0xff, 0xff) },
 399        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
 400        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
 401        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
 402        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) },
 403        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) },
 404        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) },
 405        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) },
 406        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) },
 407        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) },
 408        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) },
 409        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) },
 410        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) },
 411        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) },
 412        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) },
 413        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) },
 414        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) },
 415        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) },
 416        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) },
 417        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) },
 418        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) },
 419        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) },
 420        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) },
 421        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) },
 422        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) },
 423        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) },
 424        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) },
 425        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) },
 426        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) },
 427        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) },
 428        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) },
 429        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) },
 430        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) },
 431        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) },
 432        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) },
 433        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) },
 434        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) },
 435        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) },
 436        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) },
 437        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
 438        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
 439        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
 440        { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC) },
 441        { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
 442        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
 443        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
 444        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, /* Novatel Merlin EX720/V740/X720 */
 445        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V720) }, /* Novatel Merlin V720/S720/PC720 */
 446        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U730) }, /* Novatel U730/U740 (VF version) */
 447        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U740) }, /* Novatel U740 */
 448        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U870) }, /* Novatel U870 */
 449        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_XU870) }, /* Novatel Merlin XU870 HSDPA/3G */
 450        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_X950D) }, /* Novatel X950D */
 451        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EV620) }, /* Novatel EV620/ES620 CDMA/EV-DO */
 452        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES720) }, /* Novatel ES620/ES720/U720/USB720 */
 453        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E725) }, /* Novatel E725/E726 */
 454        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES620) }, /* Novatel Merlin ES620 SM Bus */
 455        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU730) }, /* Novatel EU730 and Vodafone EU740 */
 456        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU740) }, /* Novatel non-Vodafone EU740 */
 457        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
 458        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
 459        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
 460        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727_NEW) }, /* Novatel MC727/U727/USB727 refresh */
 461        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */
 462        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC760) }, /* Novatel MC760/U760/USB760 */
 463        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_OVMC760) }, /* Novatel Ovation MC760 */
 464        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
 465        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
 466        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
 467        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
 468        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
 469        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
 470        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
 471        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */
 472
 473        { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
 474        { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
 475        { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
 476
 477        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) },             /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
 478        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) },             /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
 479        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) },             /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
 480        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) },          /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
 481        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) },          /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
 482        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) },      /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
 483        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) },       /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
 484        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) },         /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
 485        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) },      /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
 486        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) },       /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
 487        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) },    /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
 488        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) },   /* Dell Wireless HSDPA 5520 */
 489        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) },   /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
 490        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },      /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
 491        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },       /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
 492        { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) },         /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
 493        { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },   /* ADU-E100, ADU-310 */
 494        { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
 495        { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
 496        { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
 497        { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
 498        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
 499        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
 500        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
 501        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005) },
 502        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006) },
 503        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007) },
 504        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008) },
 505        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009) },
 506        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A) },
 507        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B) },
 508        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C) },
 509        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D) },
 510        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E) },
 511        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F) },
 512        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010) },
 513        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011) },
 514        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012) },
 515        { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
 516        { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
 517        { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
 518        { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
 519        { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
 520        { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
 521        { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) },
 522        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
 523        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff) },
 524        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0003, 0xff, 0xff, 0xff) },
 525        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0004, 0xff, 0xff, 0xff) },
 526        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0005, 0xff, 0xff, 0xff) },
 527        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0006, 0xff, 0xff, 0xff) },
 528        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0007, 0xff, 0xff, 0xff) },
 529        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0008, 0xff, 0xff, 0xff) },
 530        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0009, 0xff, 0xff, 0xff) },
 531        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000a, 0xff, 0xff, 0xff) },
 532        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000b, 0xff, 0xff, 0xff) },
 533        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000c, 0xff, 0xff, 0xff) },
 534        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000d, 0xff, 0xff, 0xff) },
 535        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000e, 0xff, 0xff, 0xff) },
 536        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000f, 0xff, 0xff, 0xff) },
 537        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0010, 0xff, 0xff, 0xff) },
 538        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0011, 0xff, 0xff, 0xff) },
 539        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0012, 0xff, 0xff, 0xff) },
 540        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0013, 0xff, 0xff, 0xff) },
 541        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628, 0xff, 0xff, 0xff) },
 542        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0016, 0xff, 0xff, 0xff) },
 543        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff) },
 544        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0018, 0xff, 0xff, 0xff) },
 545        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0019, 0xff, 0xff, 0xff) },
 546        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0020, 0xff, 0xff, 0xff) },
 547        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0021, 0xff, 0xff, 0xff) },
 548        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0022, 0xff, 0xff, 0xff) },
 549        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0023, 0xff, 0xff, 0xff) },
 550        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0024, 0xff, 0xff, 0xff) },
 551        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0025, 0xff, 0xff, 0xff) },
 552        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0026, 0xff, 0xff, 0xff) },
 553        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0028, 0xff, 0xff, 0xff) },
 554        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0029, 0xff, 0xff, 0xff) },
 555        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0030, 0xff, 0xff, 0xff) },
 556        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626, 0xff, 0xff, 0xff) },
 557        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0032, 0xff, 0xff, 0xff) },
 558        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0033, 0xff, 0xff, 0xff) },
 559        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0037, 0xff, 0xff, 0xff) },
 560        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0039, 0xff, 0xff, 0xff) },
 561        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0042, 0xff, 0xff, 0xff) },
 562        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0043, 0xff, 0xff, 0xff) },
 563        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0048, 0xff, 0xff, 0xff) },
 564        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0049, 0xff, 0xff, 0xff) },
 565        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0051, 0xff, 0xff, 0xff) },
 566        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0052, 0xff, 0xff, 0xff) },
 567        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0054, 0xff, 0xff, 0xff) },
 568        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0055, 0xff, 0xff, 0xff) },
 569        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0057, 0xff, 0xff, 0xff) },
 570        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0058, 0xff, 0xff, 0xff) },
 571        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0061, 0xff, 0xff, 0xff) },
 572        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0062, 0xff, 0xff, 0xff) },
 573        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0063, 0xff, 0xff, 0xff) },
 574        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0064, 0xff, 0xff, 0xff) },
 575        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0066, 0xff, 0xff, 0xff) },
 576        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0069, 0xff, 0xff, 0xff) },
 577        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0076, 0xff, 0xff, 0xff) },
 578        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0078, 0xff, 0xff, 0xff) },
 579        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0082, 0xff, 0xff, 0xff) },
 580        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0086, 0xff, 0xff, 0xff) },
 581        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, 0xff, 0xff) },
 582        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) },
 583        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */
 584        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) },
 585        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) },
 586        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) },
 587        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) },
 588        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) },
 589        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) },
 590        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
 591        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
 592        { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
 593        { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
 594        { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */
 595        { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) },
 596        { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) },
 597        { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) },
 598        { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) },
 599        { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) },
 600        { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */
 601        { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) },
 602        { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) },
 603        { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) },
 604        { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
 605        { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
 606        { USB_DEVICE(FOUR_G_SYSTEMS_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14) },
 607        { } /* Terminating entry */
 608};
 609MODULE_DEVICE_TABLE(usb, option_ids);
 610
 611static struct usb_driver option_driver = {
 612        .name       = "option",
 613        .probe      = usb_serial_probe,
 614        .disconnect = usb_serial_disconnect,
 615#ifdef CONFIG_PM
 616        .suspend    = usb_serial_suspend,
 617        .resume     = usb_serial_resume,
 618        .supports_autosuspend = 1,
 619#endif
 620        .id_table   = option_ids,
 621        .no_dynamic_id =        1,
 622};
 623
 624/* The card has three separate interfaces, which the serial driver
 625 * recognizes separately, thus num_port=1.
 626 */
 627
 628static struct usb_serial_driver option_1port_device = {
 629        .driver = {
 630                .owner =        THIS_MODULE,
 631                .name =         "option1",
 632        },
 633        .description       = "GSM modem (1-port)",
 634        .usb_driver        = &option_driver,
 635        .id_table          = option_ids,
 636        .num_ports         = 1,
 637        .probe             = option_probe,
 638        .open              = option_open,
 639        .close             = option_close,
 640        .dtr_rts           = option_dtr_rts,
 641        .write             = option_write,
 642        .write_room        = option_write_room,
 643        .chars_in_buffer   = option_chars_in_buffer,
 644        .set_termios       = option_set_termios,
 645        .tiocmget          = option_tiocmget,
 646        .tiocmset          = option_tiocmset,
 647        .attach            = option_startup,
 648        .disconnect        = option_disconnect,
 649        .release           = option_release,
 650        .read_int_callback = option_instat_callback,
 651#ifdef CONFIG_PM
 652        .suspend           = option_suspend,
 653        .resume            = option_resume,
 654#endif
 655};
 656
 657static int debug;
 658
 659/* per port private data */
 660
 661#define N_IN_URB 4
 662#define N_OUT_URB 4
 663#define IN_BUFLEN 4096
 664#define OUT_BUFLEN 4096
 665
 666struct option_intf_private {
 667        spinlock_t susp_lock;
 668        unsigned int suspended:1;
 669        int in_flight;
 670};
 671
 672struct option_port_private {
 673        /* Input endpoints and buffer for this port */
 674        struct urb *in_urbs[N_IN_URB];
 675        u8 *in_buffer[N_IN_URB];
 676        /* Output endpoints and buffer for this port */
 677        struct urb *out_urbs[N_OUT_URB];
 678        u8 *out_buffer[N_OUT_URB];
 679        unsigned long out_busy;         /* Bit vector of URBs in use */
 680        int opened;
 681        struct usb_anchor delayed;
 682
 683        /* Settings for the port */
 684        int rts_state;  /* Handshaking pins (outputs) */
 685        int dtr_state;
 686        int cts_state;  /* Handshaking pins (inputs) */
 687        int dsr_state;
 688        int dcd_state;
 689        int ri_state;
 690
 691        unsigned long tx_start_time[N_OUT_URB];
 692};
 693
 694/* Functions used by new usb-serial code. */
 695static int __init option_init(void)
 696{
 697        int retval;
 698        retval = usb_serial_register(&option_1port_device);
 699        if (retval)
 700                goto failed_1port_device_register;
 701        retval = usb_register(&option_driver);
 702        if (retval)
 703                goto failed_driver_register;
 704
 705        printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
 706               DRIVER_DESC "\n");
 707
 708        return 0;
 709
 710failed_driver_register:
 711        usb_serial_deregister(&option_1port_device);
 712failed_1port_device_register:
 713        return retval;
 714}
 715
 716static void __exit option_exit(void)
 717{
 718        usb_deregister(&option_driver);
 719        usb_serial_deregister(&option_1port_device);
 720}
 721
 722module_init(option_init);
 723module_exit(option_exit);
 724
 725static int option_probe(struct usb_serial *serial,
 726                        const struct usb_device_id *id)
 727{
 728        struct option_intf_private *data;
 729        /* D-Link DWM 652 still exposes CD-Rom emulation interface in modem mode */
 730        if (serial->dev->descriptor.idVendor == DLINK_VENDOR_ID &&
 731                serial->dev->descriptor.idProduct == DLINK_PRODUCT_DWM_652 &&
 732                serial->interface->cur_altsetting->desc.bInterfaceClass == 0x8)
 733                return -ENODEV;
 734
 735        data = serial->private = kzalloc(sizeof(struct option_intf_private), GFP_KERNEL);
 736        if (!data)
 737                return -ENOMEM;
 738        spin_lock_init(&data->susp_lock);
 739        return 0;
 740}
 741
 742static void option_set_termios(struct tty_struct *tty,
 743                struct usb_serial_port *port, struct ktermios *old_termios)
 744{
 745        dbg("%s", __func__);
 746        /* Doesn't support option setting */
 747        tty_termios_copy_hw(tty->termios, old_termios);
 748        option_send_setup(port);
 749}
 750
 751static int option_tiocmget(struct tty_struct *tty, struct file *file)
 752{
 753        struct usb_serial_port *port = tty->driver_data;
 754        unsigned int value;
 755        struct option_port_private *portdata;
 756
 757        portdata = usb_get_serial_port_data(port);
 758
 759        value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
 760                ((portdata->dtr_state) ? TIOCM_DTR : 0) |
 761                ((portdata->cts_state) ? TIOCM_CTS : 0) |
 762                ((portdata->dsr_state) ? TIOCM_DSR : 0) |
 763                ((portdata->dcd_state) ? TIOCM_CAR : 0) |
 764                ((portdata->ri_state) ? TIOCM_RNG : 0);
 765
 766        return value;
 767}
 768
 769static int option_tiocmset(struct tty_struct *tty, struct file *file,
 770                        unsigned int set, unsigned int clear)
 771{
 772        struct usb_serial_port *port = tty->driver_data;
 773        struct option_port_private *portdata;
 774
 775        portdata = usb_get_serial_port_data(port);
 776
 777        /* FIXME: what locks portdata fields ? */
 778        if (set & TIOCM_RTS)
 779                portdata->rts_state = 1;
 780        if (set & TIOCM_DTR)
 781                portdata->dtr_state = 1;
 782
 783        if (clear & TIOCM_RTS)
 784                portdata->rts_state = 0;
 785        if (clear & TIOCM_DTR)
 786                portdata->dtr_state = 0;
 787        return option_send_setup(port);
 788}
 789
 790/* Write */
 791static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
 792                        const unsigned char *buf, int count)
 793{
 794        struct option_port_private *portdata;
 795        struct option_intf_private *intfdata;
 796        int i;
 797        int left, todo;
 798        struct urb *this_urb = NULL; /* spurious */
 799        int err;
 800        unsigned long flags;
 801
 802        portdata = usb_get_serial_port_data(port);
 803        intfdata = port->serial->private;
 804
 805        dbg("%s: write (%d chars)", __func__, count);
 806
 807        i = 0;
 808        left = count;
 809        for (i = 0; left > 0 && i < N_OUT_URB; i++) {
 810                todo = left;
 811                if (todo > OUT_BUFLEN)
 812                        todo = OUT_BUFLEN;
 813
 814                this_urb = portdata->out_urbs[i];
 815                if (test_and_set_bit(i, &portdata->out_busy)) {
 816                        if (time_before(jiffies,
 817                                        portdata->tx_start_time[i] + 10 * HZ))
 818                                continue;
 819                        usb_unlink_urb(this_urb);
 820                        continue;
 821                }
 822                dbg("%s: endpoint %d buf %d", __func__,
 823                        usb_pipeendpoint(this_urb->pipe), i);
 824
 825                err = usb_autopm_get_interface_async(port->serial->interface);
 826                if (err < 0)
 827                        break;
 828
 829                /* send the data */
 830                memcpy(this_urb->transfer_buffer, buf, todo);
 831                this_urb->transfer_buffer_length = todo;
 832
 833                spin_lock_irqsave(&intfdata->susp_lock, flags);
 834                if (intfdata->suspended) {
 835                        usb_anchor_urb(this_urb, &portdata->delayed);
 836                        spin_unlock_irqrestore(&intfdata->susp_lock, flags);
 837                } else {
 838                        intfdata->in_flight++;
 839                        spin_unlock_irqrestore(&intfdata->susp_lock, flags);
 840                        err = usb_submit_urb(this_urb, GFP_ATOMIC);
 841                        if (err) {
 842                                dbg("usb_submit_urb %p (write bulk) failed "
 843                                        "(%d)", this_urb, err);
 844                                clear_bit(i, &portdata->out_busy);
 845                                spin_lock_irqsave(&intfdata->susp_lock, flags);
 846                                intfdata->in_flight--;
 847                                spin_unlock_irqrestore(&intfdata->susp_lock, flags);
 848                                continue;
 849                        }
 850                }
 851
 852                portdata->tx_start_time[i] = jiffies;
 853                buf += todo;
 854                left -= todo;
 855        }
 856
 857        count -= left;
 858        dbg("%s: wrote (did %d)", __func__, count);
 859        return count;
 860}
 861
 862static void option_indat_callback(struct urb *urb)
 863{
 864        int err;
 865        int endpoint;
 866        struct usb_serial_port *port;
 867        struct tty_struct *tty;
 868        unsigned char *data = urb->transfer_buffer;
 869        int status = urb->status;
 870
 871        dbg("%s: %p", __func__, urb);
 872
 873        endpoint = usb_pipeendpoint(urb->pipe);
 874        port =  urb->context;
 875
 876        if (status) {
 877                dbg("%s: nonzero status: %d on endpoint %02x.",
 878                    __func__, status, endpoint);
 879        } else {
 880                tty = tty_port_tty_get(&port->port);
 881                if (urb->actual_length) {
 882                        tty_buffer_request_room(tty, urb->actual_length);
 883                        tty_insert_flip_string(tty, data, urb->actual_length);
 884                        tty_flip_buffer_push(tty);
 885                } else 
 886                        dbg("%s: empty read urb received", __func__);
 887                tty_kref_put(tty);
 888
 889                /* Resubmit urb so we continue receiving */
 890                if (port->port.count && status != -ESHUTDOWN) {
 891                        err = usb_submit_urb(urb, GFP_ATOMIC);
 892                        if (err)
 893                                printk(KERN_ERR "%s: resubmit read urb failed. "
 894                                        "(%d)", __func__, err);
 895                        else
 896                                usb_mark_last_busy(port->serial->dev);
 897                }
 898
 899        }
 900        return;
 901}
 902
 903static void option_outdat_callback(struct urb *urb)
 904{
 905        struct usb_serial_port *port;
 906        struct option_port_private *portdata;
 907        struct option_intf_private *intfdata;
 908        int i;
 909
 910        dbg("%s", __func__);
 911
 912        port =  urb->context;
 913        intfdata = port->serial->private;
 914
 915        usb_serial_port_softint(port);
 916        usb_autopm_put_interface_async(port->serial->interface);
 917        portdata = usb_get_serial_port_data(port);
 918        spin_lock(&intfdata->susp_lock);
 919        intfdata->in_flight--;
 920        spin_unlock(&intfdata->susp_lock);
 921
 922        for (i = 0; i < N_OUT_URB; ++i) {
 923                if (portdata->out_urbs[i] == urb) {
 924                        smp_mb__before_clear_bit();
 925                        clear_bit(i, &portdata->out_busy);
 926                        break;
 927                }
 928        }
 929}
 930
 931static void option_instat_callback(struct urb *urb)
 932{
 933        int err;
 934        int status = urb->status;
 935        struct usb_serial_port *port =  urb->context;
 936        struct option_port_private *portdata = usb_get_serial_port_data(port);
 937
 938        dbg("%s", __func__);
 939        dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
 940
 941        if (status == 0) {
 942                struct usb_ctrlrequest *req_pkt =
 943                                (struct usb_ctrlrequest *)urb->transfer_buffer;
 944
 945                if (!req_pkt) {
 946                        dbg("%s: NULL req_pkt\n", __func__);
 947                        return;
 948                }
 949                if ((req_pkt->bRequestType == 0xA1) &&
 950                                (req_pkt->bRequest == 0x20)) {
 951                        int old_dcd_state;
 952                        unsigned char signals = *((unsigned char *)
 953                                        urb->transfer_buffer +
 954                                        sizeof(struct usb_ctrlrequest));
 955
 956                        dbg("%s: signal x%x", __func__, signals);
 957
 958                        old_dcd_state = portdata->dcd_state;
 959                        portdata->cts_state = 1;
 960                        portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
 961                        portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
 962                        portdata->ri_state = ((signals & 0x08) ? 1 : 0);
 963
 964                        if (old_dcd_state && !portdata->dcd_state) {
 965                                struct tty_struct *tty =
 966                                                tty_port_tty_get(&port->port);
 967                                if (tty && !C_CLOCAL(tty))
 968                                        tty_hangup(tty);
 969                                tty_kref_put(tty);
 970                        }
 971                } else {
 972                        dbg("%s: type %x req %x", __func__,
 973                                req_pkt->bRequestType, req_pkt->bRequest);
 974                }
 975        } else
 976                err("%s: error %d", __func__, status);
 977
 978        /* Resubmit urb so we continue receiving IRQ data */
 979        if (status != -ESHUTDOWN && status != -ENOENT) {
 980                err = usb_submit_urb(urb, GFP_ATOMIC);
 981                if (err)
 982                        dbg("%s: resubmit intr urb failed. (%d)",
 983                                __func__, err);
 984        }
 985}
 986
 987static int option_write_room(struct tty_struct *tty)
 988{
 989        struct usb_serial_port *port = tty->driver_data;
 990        struct option_port_private *portdata;
 991        int i;
 992        int data_len = 0;
 993        struct urb *this_urb;
 994
 995        portdata = usb_get_serial_port_data(port);
 996
 997        for (i = 0; i < N_OUT_URB; i++) {
 998                this_urb = portdata->out_urbs[i];
 999                if (this_urb && !test_bit(i, &portdata->out_busy))
1000                        data_len += OUT_BUFLEN;
1001        }
1002
1003        dbg("%s: %d", __func__, data_len);
1004        return data_len;
1005}
1006
1007static int option_chars_in_buffer(struct tty_struct *tty)
1008{
1009        struct usb_serial_port *port = tty->driver_data;
1010        struct option_port_private *portdata;
1011        int i;
1012        int data_len = 0;
1013        struct urb *this_urb;
1014
1015        portdata = usb_get_serial_port_data(port);
1016
1017        for (i = 0; i < N_OUT_URB; i++) {
1018                this_urb = portdata->out_urbs[i];
1019                /* FIXME: This locking is insufficient as this_urb may
1020                   go unused during the test */
1021                if (this_urb && test_bit(i, &portdata->out_busy))
1022                        data_len += this_urb->transfer_buffer_length;
1023        }
1024        dbg("%s: %d", __func__, data_len);
1025        return data_len;
1026}
1027
1028static int option_open(struct tty_struct *tty, struct usb_serial_port *port)
1029{
1030        struct option_port_private *portdata;
1031        struct option_intf_private *intfdata;
1032        struct usb_serial *serial = port->serial;
1033        int i, err;
1034        struct urb *urb;
1035
1036        portdata = usb_get_serial_port_data(port);
1037        intfdata = serial->private;
1038
1039        dbg("%s", __func__);
1040
1041        /* Start reading from the IN endpoint */
1042        for (i = 0; i < N_IN_URB; i++) {
1043                urb = portdata->in_urbs[i];
1044                if (!urb)
1045                        continue;
1046                err = usb_submit_urb(urb, GFP_KERNEL);
1047                if (err) {
1048                        dbg("%s: submit urb %d failed (%d) %d",
1049                                __func__, i, err,
1050                                urb->transfer_buffer_length);
1051                }
1052        }
1053
1054        option_send_setup(port);
1055
1056        serial->interface->needs_remote_wakeup = 1;
1057        spin_lock_irq(&intfdata->susp_lock);
1058        portdata->opened = 1;
1059        spin_unlock_irq(&intfdata->susp_lock);
1060        usb_autopm_put_interface(serial->interface);
1061
1062        return 0;
1063}
1064
1065static void option_dtr_rts(struct usb_serial_port *port, int on)
1066{
1067        struct usb_serial *serial = port->serial;
1068        struct option_port_private *portdata;
1069
1070        dbg("%s", __func__);
1071        portdata = usb_get_serial_port_data(port);
1072        mutex_lock(&serial->disc_mutex);
1073        portdata->rts_state = on;
1074        portdata->dtr_state = on;
1075        if (serial->dev)
1076                option_send_setup(port);
1077        mutex_unlock(&serial->disc_mutex);
1078}
1079
1080
1081static void option_close(struct usb_serial_port *port)
1082{
1083        int i;
1084        struct usb_serial *serial = port->serial;
1085        struct option_port_private *portdata;
1086        struct option_intf_private *intfdata = port->serial->private;
1087
1088        dbg("%s", __func__);
1089        portdata = usb_get_serial_port_data(port);
1090
1091        if (serial->dev) {
1092                /* Stop reading/writing urbs */
1093                spin_lock_irq(&intfdata->susp_lock);
1094                portdata->opened = 0;
1095                spin_unlock_irq(&intfdata->susp_lock);
1096
1097                for (i = 0; i < N_IN_URB; i++)
1098                        usb_kill_urb(portdata->in_urbs[i]);
1099                for (i = 0; i < N_OUT_URB; i++)
1100                        usb_kill_urb(portdata->out_urbs[i]);
1101                usb_autopm_get_interface(serial->interface);
1102                serial->interface->needs_remote_wakeup = 0;
1103        }
1104}
1105
1106/* Helper functions used by option_setup_urbs */
1107static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
1108                int dir, void *ctx, char *buf, int len,
1109                void (*callback)(struct urb *))
1110{
1111        struct urb *urb;
1112
1113        if (endpoint == -1)
1114                return NULL;            /* endpoint not needed */
1115
1116        urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
1117        if (urb == NULL) {
1118                dbg("%s: alloc for endpoint %d failed.", __func__, endpoint);
1119                return NULL;
1120        }
1121
1122                /* Fill URB using supplied data. */
1123        usb_fill_bulk_urb(urb, serial->dev,
1124                      usb_sndbulkpipe(serial->dev, endpoint) | dir,
1125                      buf, len, callback, ctx);
1126
1127        return urb;
1128}
1129
1130/* Setup urbs */
1131static void option_setup_urbs(struct usb_serial *serial)
1132{
1133        int i, j;
1134        struct usb_serial_port *port;
1135        struct option_port_private *portdata;
1136
1137        dbg("%s", __func__);
1138
1139        for (i = 0; i < serial->num_ports; i++) {
1140                port = serial->port[i];
1141                portdata = usb_get_serial_port_data(port);
1142
1143                /* Do indat endpoints first */
1144                for (j = 0; j < N_IN_URB; ++j) {
1145                        portdata->in_urbs[j] = option_setup_urb(serial,
1146                                        port->bulk_in_endpointAddress,
1147                                        USB_DIR_IN, port,
1148                                        portdata->in_buffer[j],
1149                                        IN_BUFLEN, option_indat_callback);
1150                }
1151
1152                /* outdat endpoints */
1153                for (j = 0; j < N_OUT_URB; ++j) {
1154                        portdata->out_urbs[j] = option_setup_urb(serial,
1155                                        port->bulk_out_endpointAddress,
1156                                        USB_DIR_OUT, port,
1157                                        portdata->out_buffer[j],
1158                                        OUT_BUFLEN, option_outdat_callback);
1159                }
1160        }
1161}
1162
1163
1164/** send RTS/DTR state to the port.
1165 *
1166 * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN
1167 * CDC.
1168*/
1169static int option_send_setup(struct usb_serial_port *port)
1170{
1171        struct usb_serial *serial = port->serial;
1172        struct option_port_private *portdata;
1173        int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
1174        int val = 0;
1175        dbg("%s", __func__);
1176
1177        portdata = usb_get_serial_port_data(port);
1178
1179        if (portdata->dtr_state)
1180                val |= 0x01;
1181        if (portdata->rts_state)
1182                val |= 0x02;
1183
1184        return usb_control_msg(serial->dev,
1185                usb_rcvctrlpipe(serial->dev, 0),
1186                0x22, 0x21, val, ifNum, NULL, 0, USB_CTRL_SET_TIMEOUT);
1187}
1188
1189static int option_startup(struct usb_serial *serial)
1190{
1191        int i, j, err;
1192        struct usb_serial_port *port;
1193        struct option_port_private *portdata;
1194        u8 *buffer;
1195
1196        dbg("%s", __func__);
1197
1198        /* Now setup per port private data */
1199        for (i = 0; i < serial->num_ports; i++) {
1200                port = serial->port[i];
1201                portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
1202                if (!portdata) {
1203                        dbg("%s: kmalloc for option_port_private (%d) failed!.",
1204                                        __func__, i);
1205                        return 1;
1206                }
1207                init_usb_anchor(&portdata->delayed);
1208
1209                for (j = 0; j < N_IN_URB; j++) {
1210                        buffer = (u8 *)__get_free_page(GFP_KERNEL);
1211                        if (!buffer)
1212                                goto bail_out_error;
1213                        portdata->in_buffer[j] = buffer;
1214                }
1215
1216                for (j = 0; j < N_OUT_URB; j++) {
1217                        buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);
1218                        if (!buffer)
1219                                goto bail_out_error2;
1220                        portdata->out_buffer[j] = buffer;
1221                }
1222
1223                usb_set_serial_port_data(port, portdata);
1224
1225                if (!port->interrupt_in_urb)
1226                        continue;
1227                err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1228                if (err)
1229                        dbg("%s: submit irq_in urb failed %d",
1230                                __func__, err);
1231        }
1232        option_setup_urbs(serial);
1233        return 0;
1234
1235bail_out_error2:
1236        for (j = 0; j < N_OUT_URB; j++)
1237                kfree(portdata->out_buffer[j]);
1238bail_out_error:
1239        for (j = 0; j < N_IN_URB; j++)
1240                if (portdata->in_buffer[j])
1241                        free_page((unsigned long)portdata->in_buffer[j]);
1242        kfree(portdata);
1243        return 1;
1244}
1245
1246static void stop_read_write_urbs(struct usb_serial *serial)
1247{
1248        int i, j;
1249        struct usb_serial_port *port;
1250        struct option_port_private *portdata;
1251
1252        /* Stop reading/writing urbs */
1253        for (i = 0; i < serial->num_ports; ++i) {
1254                port = serial->port[i];
1255                portdata = usb_get_serial_port_data(port);
1256                for (j = 0; j < N_IN_URB; j++)
1257                        usb_kill_urb(portdata->in_urbs[j]);
1258                for (j = 0; j < N_OUT_URB; j++)
1259                        usb_kill_urb(portdata->out_urbs[j]);
1260        }
1261}
1262
1263static void option_disconnect(struct usb_serial *serial)
1264{
1265        dbg("%s", __func__);
1266
1267        stop_read_write_urbs(serial);
1268}
1269
1270static void option_release(struct usb_serial *serial)
1271{
1272        int i, j;
1273        struct usb_serial_port *port;
1274        struct option_port_private *portdata;
1275
1276        dbg("%s", __func__);
1277
1278        /* Now free them */
1279        for (i = 0; i < serial->num_ports; ++i) {
1280                port = serial->port[i];
1281                portdata = usb_get_serial_port_data(port);
1282
1283                for (j = 0; j < N_IN_URB; j++) {
1284                        if (portdata->in_urbs[j]) {
1285                                usb_free_urb(portdata->in_urbs[j]);
1286                                free_page((unsigned long)
1287                                        portdata->in_buffer[j]);
1288                                portdata->in_urbs[j] = NULL;
1289                        }
1290                }
1291                for (j = 0; j < N_OUT_URB; j++) {
1292                        if (portdata->out_urbs[j]) {
1293                                usb_free_urb(portdata->out_urbs[j]);
1294                                kfree(portdata->out_buffer[j]);
1295                                portdata->out_urbs[j] = NULL;
1296                        }
1297                }
1298        }
1299
1300        /* Now free per port private data */
1301        for (i = 0; i < serial->num_ports; i++) {
1302                port = serial->port[i];
1303                kfree(usb_get_serial_port_data(port));
1304        }
1305}
1306
1307#ifdef CONFIG_PM
1308static int option_suspend(struct usb_serial *serial, pm_message_t message)
1309{
1310        struct option_intf_private *intfdata = serial->private;
1311        int b;
1312
1313        dbg("%s entered", __func__);
1314
1315        if (serial->dev->auto_pm) {
1316                spin_lock_irq(&intfdata->susp_lock);
1317                b = intfdata->in_flight;
1318                spin_unlock_irq(&intfdata->susp_lock);
1319
1320                if (b)
1321                        return -EBUSY;
1322        }
1323
1324        spin_lock_irq(&intfdata->susp_lock);
1325        intfdata->suspended = 1;
1326        spin_unlock_irq(&intfdata->susp_lock);
1327        stop_read_write_urbs(serial);
1328
1329        return 0;
1330}
1331
1332static void play_delayed(struct usb_serial_port *port)
1333{
1334        struct option_intf_private *data;
1335        struct option_port_private *portdata;
1336        struct urb *urb;
1337        int err;
1338
1339        portdata = usb_get_serial_port_data(port);
1340        data = port->serial->private;
1341        while ((urb = usb_get_from_anchor(&portdata->delayed))) {
1342                err = usb_submit_urb(urb, GFP_ATOMIC);
1343                if (!err)
1344                        data->in_flight++;
1345        }
1346}
1347
1348static int option_resume(struct usb_serial *serial)
1349{
1350        int i, j;
1351        struct usb_serial_port *port;
1352        struct option_intf_private *intfdata = serial->private;
1353        struct option_port_private *portdata;
1354        struct urb *urb;
1355        int err = 0;
1356
1357        dbg("%s entered", __func__);
1358        /* get the interrupt URBs resubmitted unconditionally */
1359        for (i = 0; i < serial->num_ports; i++) {
1360                port = serial->port[i];
1361                if (!port->interrupt_in_urb) {
1362                        dbg("%s: No interrupt URB for port %d\n", __func__, i);
1363                        continue;
1364                }
1365                err = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
1366                dbg("Submitted interrupt URB for port %d (result %d)", i, err);
1367                if (err < 0) {
1368                        err("%s: Error %d for interrupt URB of port%d",
1369                                 __func__, err, i);
1370                        goto err_out;
1371                }
1372        }
1373
1374        for (i = 0; i < serial->num_ports; i++) {
1375                /* walk all ports */
1376                port = serial->port[i];
1377                portdata = usb_get_serial_port_data(port);
1378
1379                /* skip closed ports */
1380                spin_lock_irq(&intfdata->susp_lock);
1381                if (!portdata->opened) {
1382                        spin_unlock_irq(&intfdata->susp_lock);
1383                        continue;
1384                }
1385
1386                for (j = 0; j < N_IN_URB; j++) {
1387                        urb = portdata->in_urbs[j];
1388                        err = usb_submit_urb(urb, GFP_ATOMIC);
1389                        if (err < 0) {
1390                                err("%s: Error %d for bulk URB %d",
1391                                         __func__, err, i);
1392                                spin_unlock_irq(&intfdata->susp_lock);
1393                                goto err_out;
1394                        }
1395                }
1396                play_delayed(port);
1397                spin_unlock_irq(&intfdata->susp_lock);
1398        }
1399        spin_lock_irq(&intfdata->susp_lock);
1400        intfdata->suspended = 0;
1401        spin_unlock_irq(&intfdata->susp_lock);
1402err_out:
1403        return err;
1404}
1405#endif
1406
1407MODULE_AUTHOR(DRIVER_AUTHOR);
1408MODULE_DESCRIPTION(DRIVER_DESC);
1409MODULE_VERSION(DRIVER_VERSION);
1410MODULE_LICENSE("GPL");
1411
1412module_param(debug, bool, S_IRUGO | S_IWUSR);
1413MODULE_PARM_DESC(debug, "Debug messages");
1414