linux/drivers/usb/serial/option.c

// SPDX-License-Identifier: GPL-2.0
/*
  USB Driver for GSM modems

  Copyright (C) 2005  Matthias Urlichs <[email protected]>

  Portions copied from the Keyspan driver by Hugh Blemings <[email protected]>

  History: see the git log.

  Work sponsored by: Sigos GmbH, Germany <[email protected]>

  This driver exists because the "normal" serial driver doesn't work too well
  with GSM modems. Issues:
  - data loss -- one single Receive URB is not nearly enough
  - nonstandard flow (Option devices) control
  - controlling the baud rate doesn't make sense

  This driver is named "option" because the most common device it's
  used for is a PC-Card (with an internal OHCI-USB interface, behind
  which the GSM interface sits), made by Option Inc.

  Some of the "one port" devices actually exhibit multiple USB instances
  on the USB bus. This is not a bug, these ports are used for different
  device features.
*/

#define DRIVER_AUTHOR
#define DRIVER_DESC

#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/errno.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/bitops.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
#include "usb-wwan.h"

/* Function prototypes */
static int  option_probe(struct usb_serial *serial,
			const struct usb_device_id *id);
static int option_attach(struct usb_serial *serial);
static void option_release(struct usb_serial *serial);
static void option_instat_callback(struct urb *urb);

/* Vendor and product IDs */
#define OPTION_VENDOR_ID
#define OPTION_PRODUCT_COLT
#define OPTION_PRODUCT_RICOLA
#define OPTION_PRODUCT_RICOLA_LIGHT
#define OPTION_PRODUCT_RICOLA_QUAD
#define OPTION_PRODUCT_RICOLA_QUAD_LIGHT
#define OPTION_PRODUCT_RICOLA_NDIS
#define OPTION_PRODUCT_RICOLA_NDIS_LIGHT
#define OPTION_PRODUCT_RICOLA_NDIS_QUAD
#define OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT
#define OPTION_PRODUCT_COBRA
#define OPTION_PRODUCT_COBRA_BUS
#define OPTION_PRODUCT_VIPER
#define OPTION_PRODUCT_VIPER_BUS
#define OPTION_PRODUCT_GT_MAX_READY
#define OPTION_PRODUCT_FUJI_MODEM_LIGHT
#define OPTION_PRODUCT_FUJI_MODEM_GT
#define OPTION_PRODUCT_FUJI_MODEM_EX
#define OPTION_PRODUCT_KOI_MODEM
#define OPTION_PRODUCT_SCORPION_MODEM
#define OPTION_PRODUCT_ETNA_MODEM
#define OPTION_PRODUCT_ETNA_MODEM_LITE
#define OPTION_PRODUCT_ETNA_MODEM_GT
#define OPTION_PRODUCT_ETNA_MODEM_EX
#define OPTION_PRODUCT_ETNA_KOI_MODEM
#define OPTION_PRODUCT_GTM380_MODEM

#define HUAWEI_VENDOR_ID
#define HUAWEI_PRODUCT_E173
#define HUAWEI_PRODUCT_E1750
#define HUAWEI_PRODUCT_K4505
#define HUAWEI_PRODUCT_K3765
#define HUAWEI_PRODUCT_K4605
#define HUAWEI_PRODUCT_E173S6

#define QUANTA_VENDOR_ID
#define QUANTA_PRODUCT_Q101
#define QUANTA_PRODUCT_Q111
#define QUANTA_PRODUCT_GLX
#define QUANTA_PRODUCT_GKE
#define QUANTA_PRODUCT_GLE

#define NOVATELWIRELESS_VENDOR_ID

/* YISO PRODUCTS */

#define YISO_VENDOR_ID
#define YISO_PRODUCT_U893

/*
 * NOVATEL WIRELESS PRODUCTS
 *
 * Note from Novatel Wireless:
 * If your Novatel modem does not work on linux, don't
 * change the option module, but check our website. If
 * that does not help, contact [email protected]
*/
/* MERLIN EVDO PRODUCTS */
#define NOVATELWIRELESS_PRODUCT_V640
#define NOVATELWIRELESS_PRODUCT_V620
#define NOVATELWIRELESS_PRODUCT_V740
#define NOVATELWIRELESS_PRODUCT_V720

/* MERLIN HSDPA/HSPA PRODUCTS */
#define NOVATELWIRELESS_PRODUCT_U730
#define NOVATELWIRELESS_PRODUCT_U740
#define NOVATELWIRELESS_PRODUCT_U870
#define NOVATELWIRELESS_PRODUCT_XU870
#define NOVATELWIRELESS_PRODUCT_X950D

/* EXPEDITE PRODUCTS */
#define NOVATELWIRELESS_PRODUCT_EV620
#define NOVATELWIRELESS_PRODUCT_ES720
#define NOVATELWIRELESS_PRODUCT_E725
#define NOVATELWIRELESS_PRODUCT_ES620
#define NOVATELWIRELESS_PRODUCT_EU730
#define NOVATELWIRELESS_PRODUCT_EU740
#define NOVATELWIRELESS_PRODUCT_EU870D
/* OVATION PRODUCTS */
#define NOVATELWIRELESS_PRODUCT_MC727
#define NOVATELWIRELESS_PRODUCT_MC950D
/*
 * Note from Novatel Wireless:
 * All PID in the 5xxx range are currently reserved for
 * auto-install CDROMs, and should not be added to this
 * module.
 *
 * #define NOVATELWIRELESS_PRODUCT_U727		0x5010
 * #define NOVATELWIRELESS_PRODUCT_MC727_NEW	0x5100
*/
#define NOVATELWIRELESS_PRODUCT_OVMC760
#define NOVATELWIRELESS_PRODUCT_MC780
#define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED
#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED
#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED
#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED
#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED3
#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED4
#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED5
#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED6
#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED7
#define NOVATELWIRELESS_PRODUCT_MC996D
#define NOVATELWIRELESS_PRODUCT_MF3470
#define NOVATELWIRELESS_PRODUCT_MC547
#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED
#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED
#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED
#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED
#define NOVATELWIRELESS_PRODUCT_E362
#define NOVATELWIRELESS_PRODUCT_E371
#define NOVATELWIRELESS_PRODUCT_U620L
#define NOVATELWIRELESS_PRODUCT_G2
#define NOVATELWIRELESS_PRODUCT_MC551

#define UBLOX_VENDOR_ID

/* AMOI PRODUCTS */
#define AMOI_VENDOR_ID
#define AMOI_PRODUCT_H01
#define AMOI_PRODUCT_H01A
#define AMOI_PRODUCT_H02
#define AMOI_PRODUCT_SKYPEPHONE_S2

#define DELL_VENDOR_ID

/* Dell modems */
#define DELL_PRODUCT_5700_MINICARD
#define DELL_PRODUCT_5500_MINICARD
#define DELL_PRODUCT_5505_MINICARD
#define DELL_PRODUCT_5700_EXPRESSCARD
#define DELL_PRODUCT_5510_EXPRESSCARD

#define DELL_PRODUCT_5700_MINICARD_SPRINT
#define DELL_PRODUCT_5700_MINICARD_TELUS

#define DELL_PRODUCT_5720_MINICARD_VZW
#define DELL_PRODUCT_5720_MINICARD_SPRINT
#define DELL_PRODUCT_5720_MINICARD_TELUS
#define DELL_PRODUCT_5520_MINICARD_CINGULAR
#define DELL_PRODUCT_5520_MINICARD_GENERIC_L
#define DELL_PRODUCT_5520_MINICARD_GENERIC_I

#define DELL_PRODUCT_5730_MINICARD_SPRINT
#define DELL_PRODUCT_5730_MINICARD_TELUS
#define DELL_PRODUCT_5730_MINICARD_VZW

#define DELL_PRODUCT_5800_MINICARD_VZW
#define DELL_PRODUCT_5800_V2_MINICARD_VZW
#define DELL_PRODUCT_5804_MINICARD_ATT

#define DELL_PRODUCT_5821E
#define DELL_PRODUCT_5821E_ESIM
#define DELL_PRODUCT_5829E_ESIM
#define DELL_PRODUCT_5829E

#define DELL_PRODUCT_FM101R_ESIM
#define DELL_PRODUCT_FM101R

#define KYOCERA_VENDOR_ID
#define KYOCERA_PRODUCT_KPC650
#define KYOCERA_PRODUCT_KPC680

#define ANYDATA_VENDOR_ID
#define ANYDATA_PRODUCT_ADU_620UW
#define ANYDATA_PRODUCT_ADU_E100A
#define ANYDATA_PRODUCT_ADU_500A

#define AXESSTEL_VENDOR_ID
#define AXESSTEL_PRODUCT_MV110H

#define BANDRICH_VENDOR_ID
#define BANDRICH_PRODUCT_C100_1
#define BANDRICH_PRODUCT_C100_2
#define BANDRICH_PRODUCT_1004
#define BANDRICH_PRODUCT_1005
#define BANDRICH_PRODUCT_1006
#define BANDRICH_PRODUCT_1007
#define BANDRICH_PRODUCT_1008
#define BANDRICH_PRODUCT_1009
#define BANDRICH_PRODUCT_100A

#define BANDRICH_PRODUCT_100B
#define BANDRICH_PRODUCT_100C
#define BANDRICH_PRODUCT_100D
#define BANDRICH_PRODUCT_100E

#define BANDRICH_PRODUCT_100F
#define BANDRICH_PRODUCT_1010
#define BANDRICH_PRODUCT_1011
#define BANDRICH_PRODUCT_1012

#define QUALCOMM_VENDOR_ID
/* These Quectel products use Qualcomm's vendor ID */
#define QUECTEL_PRODUCT_UC20
#define QUECTEL_PRODUCT_UC15
/* These u-blox products use Qualcomm's vendor ID */
#define UBLOX_PRODUCT_R410M
/* These Yuga products use Qualcomm's vendor ID */
#define YUGA_PRODUCT_CLM920_NC5

#define QUECTEL_VENDOR_ID
/* These Quectel products use Quectel's vendor ID */
#define QUECTEL_PRODUCT_EC21
#define QUECTEL_PRODUCT_EM061K_LTA
#define QUECTEL_PRODUCT_EM061K_LMS
#define QUECTEL_PRODUCT_EC25
#define QUECTEL_PRODUCT_EM060K_128
#define QUECTEL_PRODUCT_EM060K_129
#define QUECTEL_PRODUCT_EM060K_12a
#define QUECTEL_PRODUCT_EM060K_12b
#define QUECTEL_PRODUCT_EM060K_12c
#define QUECTEL_PRODUCT_EG91
#define QUECTEL_PRODUCT_EG95
#define QUECTEL_PRODUCT_BG96
#define QUECTEL_PRODUCT_EP06
#define QUECTEL_PRODUCT_EM05G
#define QUECTEL_PRODUCT_EM060K
#define QUECTEL_PRODUCT_EM05G_CS
#define QUECTEL_PRODUCT_EM05GV2
#define QUECTEL_PRODUCT_EM05CN_SG
#define QUECTEL_PRODUCT_EM05G_SG
#define QUECTEL_PRODUCT_EM05CN
#define QUECTEL_PRODUCT_EM05G_GR
#define QUECTEL_PRODUCT_EM05G_RS
#define QUECTEL_PRODUCT_EM12
#define QUECTEL_PRODUCT_RM500Q
#define QUECTEL_PRODUCT_RM520N
#define QUECTEL_PRODUCT_EC200U
#define QUECTEL_PRODUCT_EG912Y
#define QUECTEL_PRODUCT_EC200S_CN
#define QUECTEL_PRODUCT_EC200A
#define QUECTEL_PRODUCT_EM061K_LWW
#define QUECTEL_PRODUCT_EM061K_LCN
#define QUECTEL_PRODUCT_EC200T
#define QUECTEL_PRODUCT_RM500K

#define CMOTECH_VENDOR_ID
#define CMOTECH_PRODUCT_6001
#define CMOTECH_PRODUCT_CMU_300
#define CMOTECH_PRODUCT_6003
#define CMOTECH_PRODUCT_6004
#define CMOTECH_PRODUCT_6005
#define CMOTECH_PRODUCT_CGU_628A
#define CMOTECH_PRODUCT_CHE_628S
#define CMOTECH_PRODUCT_CMU_301
#define CMOTECH_PRODUCT_CHU_628
#define CMOTECH_PRODUCT_CHU_628S
#define CMOTECH_PRODUCT_CDU_680
#define CMOTECH_PRODUCT_CDU_685A
#define CMOTECH_PRODUCT_CHU_720S
#define CMOTECH_PRODUCT_7002
#define CMOTECH_PRODUCT_CHU_629K
#define CMOTECH_PRODUCT_7004
#define CMOTECH_PRODUCT_7005
#define CMOTECH_PRODUCT_CGU_629
#define CMOTECH_PRODUCT_CHU_629S
#define CMOTECH_PRODUCT_CHU_720I
#define CMOTECH_PRODUCT_7212
#define CMOTECH_PRODUCT_7213
#define CMOTECH_PRODUCT_7251
#define CMOTECH_PRODUCT_7252
#define CMOTECH_PRODUCT_7253

#define TELIT_VENDOR_ID
#define TELIT_PRODUCT_UC864E
#define TELIT_PRODUCT_UC864G
#define TELIT_PRODUCT_CC864_DUAL
#define TELIT_PRODUCT_CC864_SINGLE
#define TELIT_PRODUCT_DE910_DUAL
#define TELIT_PRODUCT_UE910_V2
#define TELIT_PRODUCT_LE922_USBCFG1
#define TELIT_PRODUCT_LE922_USBCFG2
#define TELIT_PRODUCT_LE922_USBCFG0
#define TELIT_PRODUCT_LE922_USBCFG3
#define TELIT_PRODUCT_LE922_USBCFG5
#define TELIT_PRODUCT_ME910
#define TELIT_PRODUCT_ME910_DUAL_MODEM
#define TELIT_PRODUCT_LE920
#define TELIT_PRODUCT_LE910
#define TELIT_PRODUCT_LE910_USBCFG4
#define TELIT_PRODUCT_LE920A4_1207
#define TELIT_PRODUCT_LE920A4_1208
#define TELIT_PRODUCT_LE920A4_1211
#define TELIT_PRODUCT_LE920A4_1212
#define TELIT_PRODUCT_LE920A4_1213
#define TELIT_PRODUCT_LE920A4_1214

/* ZTE PRODUCTS */
#define ZTE_VENDOR_ID
#define ZTE_PRODUCT_MF622
#define ZTE_PRODUCT_MF628
#define ZTE_PRODUCT_MF626
#define ZTE_PRODUCT_ZM8620_X
#define ZTE_PRODUCT_ME3620_MBIM
#define ZTE_PRODUCT_ME3620_X
#define ZTE_PRODUCT_ME3620_L
#define ZTE_PRODUCT_AC2726
#define ZTE_PRODUCT_MG880
#define ZTE_PRODUCT_CDMA_TECH
#define ZTE_PRODUCT_AC8710T
#define ZTE_PRODUCT_MC2718
#define ZTE_PRODUCT_AD3812
#define ZTE_PRODUCT_MC2716

#define BENQ_VENDOR_ID
#define BENQ_PRODUCT_H10

#define DLINK_VENDOR_ID
#define DLINK_PRODUCT_DWM_652
#define DLINK_PRODUCT_DWM_652_U5
#define DLINK_PRODUCT_DWM_652_U5A

#define QISDA_VENDOR_ID
#define QISDA_PRODUCT_H21_4512
#define QISDA_PRODUCT_H21_4523
#define QISDA_PRODUCT_H20_4515
#define QISDA_PRODUCT_H20_4518
#define QISDA_PRODUCT_H20_4519

/* TLAYTECH PRODUCTS */
#define TLAYTECH_VENDOR_ID
#define TLAYTECH_PRODUCT_TEU800

/* TOSHIBA PRODUCTS */
#define TOSHIBA_VENDOR_ID
#define TOSHIBA_PRODUCT_HSDPA_MINICARD
#define TOSHIBA_PRODUCT_G450

#define ALINK_VENDOR_ID
#define SIMCOM_PRODUCT_SIM7100E
#define ALINK_PRODUCT_PH300
#define ALINK_PRODUCT_3GU

/* ALCATEL PRODUCTS */
#define ALCATEL_VENDOR_ID
#define ALCATEL_PRODUCT_X060S_X200
#define ALCATEL_PRODUCT_X220_X500D
#define ALCATEL_PRODUCT_L100V
#define ALCATEL_PRODUCT_L800MA

#define PIRELLI_VENDOR_ID
#define PIRELLI_PRODUCT_C100_1
#define PIRELLI_PRODUCT_C100_2
#define PIRELLI_PRODUCT_1004
#define PIRELLI_PRODUCT_1005
#define PIRELLI_PRODUCT_1006
#define PIRELLI_PRODUCT_1007
#define PIRELLI_PRODUCT_1008
#define PIRELLI_PRODUCT_1009
#define PIRELLI_PRODUCT_100A
#define PIRELLI_PRODUCT_100B
#define PIRELLI_PRODUCT_100C
#define PIRELLI_PRODUCT_100D
#define PIRELLI_PRODUCT_100E
#define PIRELLI_PRODUCT_100F
#define PIRELLI_PRODUCT_1011
#define PIRELLI_PRODUCT_1012

/* Airplus products */
#define AIRPLUS_VENDOR_ID
#define AIRPLUS_PRODUCT_MCD650

/* Longcheer/Longsung vendor ID; makes whitelabel devices that
 * many other vendors like 4G Systems, Alcatel, ChinaBird,
 * Mobidata, etc sell under their own brand names.
 */
#define LONGCHEER_VENDOR_ID

/* 4G Systems products */
/* This one was sold as the VW and Skoda "Carstick LTE" */
#define FOUR_G_SYSTEMS_PRODUCT_CARSTICK_LTE
/* This is the 4G XS Stick W14 a.k.a. Mobilcom Debitel Surf-Stick *
 * It seems to contain a Qualcomm QSC6240/6290 chipset            */
#define FOUR_G_SYSTEMS_PRODUCT_W14
#define FOUR_G_SYSTEMS_PRODUCT_W100

/* Fujisoft products */
#define FUJISOFT_PRODUCT_FS040U

/* iBall 3.5G connect wireless modem */
#define IBALL_3_5G_CONNECT

/* Zoom */
#define ZOOM_PRODUCT_4597

/* SpeedUp SU9800 usb 3g modem */
#define SPEEDUP_PRODUCT_SU9800

/* Haier products */
#define HAIER_VENDOR_ID
#define HAIER_PRODUCT_CE81B
#define HAIER_PRODUCT_CE100

/* Gemalto's Cinterion products (formerly Siemens) */
#define SIEMENS_VENDOR_ID
#define CINTERION_VENDOR_ID
#define CINTERION_PRODUCT_HC25_MDMNET
#define CINTERION_PRODUCT_HC25_MDM
#define CINTERION_PRODUCT_HC28_MDMNET
#define CINTERION_PRODUCT_HC28_MDM
#define CINTERION_PRODUCT_EU3_E
#define CINTERION_PRODUCT_EU3_P
#define CINTERION_PRODUCT_PH8
#define CINTERION_PRODUCT_AHXX
#define CINTERION_PRODUCT_PLXX
#define CINTERION_PRODUCT_EXS82
#define CINTERION_PRODUCT_PH8_2RMNET
#define CINTERION_PRODUCT_PH8_AUDIO
#define CINTERION_PRODUCT_AHXX_2RMNET
#define CINTERION_PRODUCT_AHXX_AUDIO
#define CINTERION_PRODUCT_CLS8
#define CINTERION_PRODUCT_MV31_MBIM
#define CINTERION_PRODUCT_MV31_RMNET
#define CINTERION_PRODUCT_MV31_2_MBIM
#define CINTERION_PRODUCT_MV31_2_RMNET
#define CINTERION_PRODUCT_MV32_WA
#define CINTERION_PRODUCT_MV32_WB
#define CINTERION_PRODUCT_MV32_WA_RMNET
#define CINTERION_PRODUCT_MV32_WB_RMNET

/* Olivetti products */
#define OLIVETTI_VENDOR_ID
#define OLIVETTI_PRODUCT_OLICARD100
#define OLIVETTI_PRODUCT_OLICARD120
#define OLIVETTI_PRODUCT_OLICARD140
#define OLIVETTI_PRODUCT_OLICARD145
#define OLIVETTI_PRODUCT_OLICARD155
#define OLIVETTI_PRODUCT_OLICARD200
#define OLIVETTI_PRODUCT_OLICARD160
#define OLIVETTI_PRODUCT_OLICARD500

/* Celot products */
#define CELOT_VENDOR_ID
#define CELOT_PRODUCT_CT680M

/* Samsung products */
#define SAMSUNG_VENDOR_ID
#define SAMSUNG_PRODUCT_GT_B3730

/* YUGA products  www.yuga-info.com [email protected] */
#define YUGA_VENDOR_ID
#define YUGA_PRODUCT_CEM600
#define YUGA_PRODUCT_CEM610
#define YUGA_PRODUCT_CEM500
#define YUGA_PRODUCT_CEM510
#define YUGA_PRODUCT_CEM800
#define YUGA_PRODUCT_CEM900

#define YUGA_PRODUCT_CEU818
#define YUGA_PRODUCT_CEU816
#define YUGA_PRODUCT_CEU828
#define YUGA_PRODUCT_CEU826
#define YUGA_PRODUCT_CEU518
#define YUGA_PRODUCT_CEU516
#define YUGA_PRODUCT_CEU528
#define YUGA_PRODUCT_CEU526
#define YUGA_PRODUCT_CEU881
#define YUGA_PRODUCT_CEU882

#define YUGA_PRODUCT_CWM600
#define YUGA_PRODUCT_CWM610
#define YUGA_PRODUCT_CWM500
#define YUGA_PRODUCT_CWM510
#define YUGA_PRODUCT_CWM800
#define YUGA_PRODUCT_CWM900

#define YUGA_PRODUCT_CWU718
#define YUGA_PRODUCT_CWU716
#define YUGA_PRODUCT_CWU728
#define YUGA_PRODUCT_CWU726
#define YUGA_PRODUCT_CWU518
#define YUGA_PRODUCT_CWU516
#define YUGA_PRODUCT_CWU528
#define YUGA_PRODUCT_CWU581
#define YUGA_PRODUCT_CWU526
#define YUGA_PRODUCT_CWU582
#define YUGA_PRODUCT_CWU583

#define YUGA_PRODUCT_CLM600
#define YUGA_PRODUCT_CLM610
#define YUGA_PRODUCT_CLM500
#define YUGA_PRODUCT_CLM510
#define YUGA_PRODUCT_CLM800
#define YUGA_PRODUCT_CLM900

#define YUGA_PRODUCT_CLU718
#define YUGA_PRODUCT_CLU716
#define YUGA_PRODUCT_CLU728
#define YUGA_PRODUCT_CLU726
#define YUGA_PRODUCT_CLU518
#define YUGA_PRODUCT_CLU516
#define YUGA_PRODUCT_CLU528
#define YUGA_PRODUCT_CLU526

/* Viettel products */
#define VIETTEL_VENDOR_ID
#define VIETTEL_PRODUCT_VT1000

/* ZD Incorporated */
#define ZD_VENDOR_ID
#define ZD_PRODUCT_7000

/* LG products */
#define LG_VENDOR_ID
#define LG_PRODUCT_L02C

/* MediaTek products */
#define MEDIATEK_VENDOR_ID
#define MEDIATEK_PRODUCT_DC_1COM
#define MEDIATEK_PRODUCT_DC_4COM
#define MEDIATEK_PRODUCT_DC_4COM2
#define MEDIATEK_PRODUCT_DC_5COM
#define MEDIATEK_PRODUCT_7208_1COM
#define MEDIATEK_PRODUCT_7208_2COM
#define MEDIATEK_PRODUCT_7103_2COM
#define MEDIATEK_PRODUCT_7106_2COM
#define MEDIATEK_PRODUCT_FP_1COM
#define MEDIATEK_PRODUCT_FP_2COM
#define MEDIATEK_PRODUCT_FPDC_1COM
#define MEDIATEK_PRODUCT_FPDC_2COM

/* Cellient products */
#define CELLIENT_VENDOR_ID
#define CELLIENT_PRODUCT_MEN200
#define CELLIENT_PRODUCT_MPL200

/* Hyundai Petatel Inc. products */
#define PETATEL_VENDOR_ID
#define PETATEL_PRODUCT_NP10T_600A
#define PETATEL_PRODUCT_NP10T_600E

/* TP-LINK Incorporated products */
#define TPLINK_VENDOR_ID
#define TPLINK_PRODUCT_LTE
#define TPLINK_PRODUCT_MA180

/* Changhong products */
#define CHANGHONG_VENDOR_ID
#define CHANGHONG_PRODUCT_CH690

/* Inovia */
#define INOVIA_VENDOR_ID
#define INOVIA_SEW858

/* VIA Telecom */
#define VIATELECOM_VENDOR_ID
#define VIATELECOM_PRODUCT_CDS7

/* WeTelecom products */
#define WETELECOM_VENDOR_ID
#define WETELECOM_PRODUCT_WMD200
#define WETELECOM_PRODUCT_6802
#define WETELECOM_PRODUCT_WMD300

/* OPPO products */
#define OPPO_VENDOR_ID
#define OPPO_PRODUCT_R11

/* Sierra Wireless products */
#define SIERRA_VENDOR_ID
#define SIERRA_PRODUCT_EM9191

/* UNISOC (Spreadtrum) products */
#define UNISOC_VENDOR_ID
/* TOZED LT70-C based on UNISOC SL8563 uses UNISOC's vendor ID */
#define TOZED_PRODUCT_LT70C
/* Luat Air72*U series based on UNISOC UIS8910 uses UNISOC's vendor ID */
#define LUAT_PRODUCT_AIR720U

/* MeiG Smart Technology products */
#define MEIGSMART_VENDOR_ID
/* MeiG Smart SLM320 based on UNISOC UIS8910 */
#define MEIGSMART_PRODUCT_SLM320

/* Device flags */

/* Highest interface number which can be used with NCTRL() and RSVD() */
#define FLAG_IFNUM_MAX

/* Interface does not support modem-control requests */
#define NCTRL(ifnum)

/* Interface is reserved */
#define RSVD(ifnum)

/* Interface must have two endpoints */
#define NUMEP2

/* Device needs ZLP */
#define ZLP


static const struct usb_device_id option_ids[] =;
MODULE_DEVICE_TABLE(usb, option_ids);

/* The card has three separate interfaces, which the serial driver
 * recognizes separately, thus num_port=1.
 */

static struct usb_serial_driver option_1port_device =;

static struct usb_serial_driver * const serial_drivers[] =;

module_usb_serial_driver();

static bool iface_is_reserved(unsigned long device_flags, u8 ifnum)
{}

static int option_probe(struct usb_serial *serial,
			const struct usb_device_id *id)
{}

static bool iface_no_modem_control(unsigned long device_flags, u8 ifnum)
{}

static int option_attach(struct usb_serial *serial)
{}

static void option_release(struct usb_serial *serial)
{}

static void option_instat_callback(struct urb *urb)
{}

MODULE_AUTHOR();
MODULE_DESCRIPTION();
MODULE_LICENSE();