14 #include <linux/tty.h>
16 #include <linux/module.h>
19 #include <linux/slab.h>
22 #define DRIVER_AUTHOR "Qualcomm Inc"
23 #define DRIVER_DESC "Qualcomm USB Serial driver"
25 #define DEVICE_G1K(v, p) \
26 USB_DEVICE(v, p), .driver_info = 1
58 {USB_DEVICE(0x1410, 0xa010)},
59 {USB_DEVICE(0x1410, 0xa011)},
60 {USB_DEVICE(0x1410, 0xa012)},
61 {USB_DEVICE(0x1410, 0xa013)},
62 {USB_DEVICE(0x1410, 0xa014)},
63 {USB_DEVICE(0x413c, 0x8185)},
64 {USB_DEVICE(0x413c, 0x8186)},
65 {USB_DEVICE(0x05c6, 0x9208)},
66 {USB_DEVICE(0x05c6, 0x920b)},
67 {USB_DEVICE(0x05c6, 0x9224)},
68 {USB_DEVICE(0x05c6, 0x9225)},
69 {USB_DEVICE(0x05c6, 0x9244)},
70 {USB_DEVICE(0x05c6, 0x9245)},
71 {USB_DEVICE(0x03f0, 0x241d)},
72 {USB_DEVICE(0x03f0, 0x251d)},
73 {USB_DEVICE(0x05c6, 0x9214)},
74 {USB_DEVICE(0x05c6, 0x9215)},
75 {USB_DEVICE(0x05c6, 0x9264)},
76 {USB_DEVICE(0x05c6, 0x9265)},
77 {USB_DEVICE(0x05c6, 0x9234)},
78 {USB_DEVICE(0x05c6, 0x9235)},
79 {USB_DEVICE(0x05c6, 0x9274)},
80 {USB_DEVICE(0x05c6, 0x9275)},
81 {USB_DEVICE(0x1199, 0x9000)},
82 {USB_DEVICE(0x1199, 0x9001)},
83 {USB_DEVICE(0x1199, 0x9002)},
84 {USB_DEVICE(0x1199, 0x9003)},
85 {USB_DEVICE(0x1199, 0x9004)},
86 {USB_DEVICE(0x1199, 0x9005)},
87 {USB_DEVICE(0x1199, 0x9006)},
88 {USB_DEVICE(0x1199, 0x9007)},
89 {USB_DEVICE(0x1199, 0x9008)},
90 {USB_DEVICE(0x1199, 0x9009)},
91 {USB_DEVICE(0x1199, 0x900a)},
92 {USB_DEVICE(0x1199, 0x9011)},
93 {USB_DEVICE(0x16d8, 0x8001)},
94 {USB_DEVICE(0x16d8, 0x8002)},
95 {USB_DEVICE(0x05c6, 0x9204)},
96 {USB_DEVICE(0x05c6, 0x9205)},
99 {USB_DEVICE(0x03f0, 0x371d)},
100 {USB_DEVICE(0x05c6, 0x920c)},
101 {USB_DEVICE(0x05c6, 0x920d)},
102 {USB_DEVICE(0x1410, 0xa020)},
103 {USB_DEVICE(0x1410, 0xa021)},
104 {USB_DEVICE(0x413c, 0x8193)},
105 {USB_DEVICE(0x413c, 0x8194)},
106 {USB_DEVICE(0x1199, 0x68a4)},
107 {USB_DEVICE(0x1199, 0x68a5)},
108 {USB_DEVICE(0x1199, 0x68a8)},
109 {USB_DEVICE(0x1199, 0x68a9)},
110 {USB_DEVICE(0x1199, 0x9010)},
111 {USB_DEVICE(0x1199, 0x9012)},
112 {USB_DEVICE(0x1199, 0x9013)},
113 {USB_DEVICE(0x1199, 0x9014)},
114 {USB_DEVICE(0x1199, 0x9015)},
115 {USB_DEVICE(0x1199, 0x9018)},
116 {USB_DEVICE(0x1199, 0x9019)},
117 {USB_DEVICE(0x1199, 0x901b)},
118 {USB_DEVICE(0x12D1, 0x14F0)},
119 {USB_DEVICE(0x12D1, 0x14F1)},
122 {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)},
123 {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 2)},
124 {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 3)},
125 {USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 0)},
126 {USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 2)},
127 {USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 3)},
128 {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)},
129 {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)},
130 {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)},
131 {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)},
132 {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)},
133 {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)},
141 struct usb_host_interface *
intf = serial->
interface->cur_altsetting;
146 bool is_gobi1k =
id->driver_info ?
true :
false;
149 dev_dbg(dev,
"Is Gobi 1000 = %d\n", is_gobi1k);
151 nintf = serial->
dev->actconfig->desc.bNumInterfaces;
152 dev_dbg(dev,
"Num Interfaces = %d\n", nintf);
153 ifnum = intf->desc.bInterfaceNumber;
154 dev_dbg(dev,
"This Interface = %d\n", ifnum);
159 if (serial->
interface->num_altsetting == 2)
160 intf = &serial->
interface->altsetting[1];
161 else if (serial->
interface->num_altsetting > 2)
164 if (intf->desc.bNumEndpoints == 2 &&
165 usb_endpoint_is_bulk_in(&intf->endpoint[0].desc) &&
166 usb_endpoint_is_bulk_out(&intf->endpoint[1].desc)) {
167 dev_dbg(dev,
"QDL port found\n");
169 if (serial->
interface->num_altsetting == 1)
180 dev_dbg(dev,
"Generic Qualcomm serial interface found\n");
185 if (nintf < 3 || nintf > 4) {
186 dev_err(dev,
"unknown number of interfaces: %d\n", nintf);
205 dev_dbg(dev,
"Modem port found\n");
221 dev_dbg(dev,
"Gobi 2K+ DM/DIAG interface found\n");
224 dev_dbg(dev,
"Modem port found\n");
232 dev_dbg(dev,
"Gobi 2K+ NMEA GPS interface found\n");
238 if (altsetting >= 0) {
242 "Could not set interface, error %d\n",
251 static int qc_attach(
struct usb_serial *serial)
261 usb_set_serial_data(serial, data);
266 static void qc_release(
struct usb_serial *serial)
270 usb_set_serial_data(serial,
NULL);
279 .description =
"Qualcomm USB modem",
289 .release = qc_release,
293 .suspend = usb_wwan_suspend,
294 .resume = usb_wwan_resume,