]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/usb/serial/option.c
USB: option: Add Kyocera KPC680 ids
[linux-2.6-omap-h63xx.git] / drivers / usb / serial / option.c
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.1"
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 */
46 static int  option_open(struct usb_serial_port *port, struct file *filp);
47 static void option_close(struct usb_serial_port *port, struct file *filp);
48 static int  option_startup(struct usb_serial *serial);
49 static void option_shutdown(struct usb_serial *serial);
50 static void option_rx_throttle(struct usb_serial_port *port);
51 static void option_rx_unthrottle(struct usb_serial_port *port);
52 static int  option_write_room(struct usb_serial_port *port);
53
54 static void option_instat_callback(struct urb *urb);
55
56 static int option_write(struct usb_serial_port *port,
57                         const unsigned char *buf, int count);
58
59 static int  option_chars_in_buffer(struct usb_serial_port *port);
60 static int  option_ioctl(struct usb_serial_port *port, struct file *file,
61                         unsigned int cmd, unsigned long arg);
62 static void option_set_termios(struct usb_serial_port *port,
63                                 struct ktermios *old);
64 static void option_break_ctl(struct usb_serial_port *port, int break_state);
65 static int  option_tiocmget(struct usb_serial_port *port, struct file *file);
66 static int  option_tiocmset(struct usb_serial_port *port, struct file *file,
67                                 unsigned int set, unsigned int clear);
68 static int  option_send_setup(struct usb_serial_port *port);
69
70 /* Vendor and product IDs */
71 #define OPTION_VENDOR_ID                        0x0AF0
72 #define OPTION_PRODUCT_COLT                     0x5000
73 #define OPTION_PRODUCT_RICOLA                   0x6000
74 #define OPTION_PRODUCT_RICOLA_LIGHT             0x6100
75 #define OPTION_PRODUCT_RICOLA_QUAD              0x6200
76 #define OPTION_PRODUCT_RICOLA_QUAD_LIGHT        0x6300
77 #define OPTION_PRODUCT_RICOLA_NDIS              0x6050
78 #define OPTION_PRODUCT_RICOLA_NDIS_LIGHT        0x6150
79 #define OPTION_PRODUCT_RICOLA_NDIS_QUAD         0x6250
80 #define OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT   0x6350
81 #define OPTION_PRODUCT_COBRA                    0x6500
82 #define OPTION_PRODUCT_COBRA_BUS                0x6501
83 #define OPTION_PRODUCT_VIPER                    0x6600
84 #define OPTION_PRODUCT_VIPER_BUS                0x6601
85 #define OPTION_PRODUCT_GT_MAX_READY             0x6701
86 #define OPTION_PRODUCT_GT_MAX                   0x6711
87 #define OPTION_PRODUCT_FUJI_MODEM_LIGHT         0x6721
88 #define OPTION_PRODUCT_FUJI_MODEM_GT            0x6741
89 #define OPTION_PRODUCT_FUJI_MODEM_EX            0x6761
90 #define OPTION_PRODUCT_FUJI_NETWORK_LIGHT       0x6731
91 #define OPTION_PRODUCT_FUJI_NETWORK_GT          0x6751
92 #define OPTION_PRODUCT_FUJI_NETWORK_EX          0x6771
93 #define OPTION_PRODUCT_KOI_MODEM                0x6800
94 #define OPTION_PRODUCT_KOI_NETWORK              0x6811
95 #define OPTION_PRODUCT_SCORPION_MODEM           0x6901
96 #define OPTION_PRODUCT_SCORPION_NETWORK         0x6911
97 #define OPTION_PRODUCT_ETNA_MODEM               0x7001
98 #define OPTION_PRODUCT_ETNA_NETWORK             0x7011
99 #define OPTION_PRODUCT_ETNA_MODEM_LITE          0x7021
100 #define OPTION_PRODUCT_ETNA_MODEM_GT            0x7041
101 #define OPTION_PRODUCT_ETNA_MODEM_EX            0x7061
102 #define OPTION_PRODUCT_ETNA_NETWORK_LITE        0x7031
103 #define OPTION_PRODUCT_ETNA_NETWORK_GT          0x7051
104 #define OPTION_PRODUCT_ETNA_NETWORK_EX          0x7071
105 #define OPTION_PRODUCT_ETNA_KOI_MODEM           0x7100
106 #define OPTION_PRODUCT_ETNA_KOI_NETWORK         0x7111
107
108 #define HUAWEI_VENDOR_ID                        0x12D1
109 #define HUAWEI_PRODUCT_E600                     0x1001
110 #define HUAWEI_PRODUCT_E220                     0x1003
111 #define HUAWEI_PRODUCT_E220BIS                  0x1004
112
113 #define NOVATELWIRELESS_VENDOR_ID               0x1410
114 #define DELL_VENDOR_ID                          0x413C
115
116 #define KYOCERA_VENDOR_ID                       0x0c88
117 #define KYOCERA_PRODUCT_KPC680                  0x180a
118
119 #define ANYDATA_VENDOR_ID                       0x16d5
120 #define ANYDATA_PRODUCT_ADU_E100A               0x6501
121 #define ANYDATA_PRODUCT_ADU_500A                0x6502
122
123 #define BANDRICH_VENDOR_ID                      0x1A8D
124 #define BANDRICH_PRODUCT_C100_1                 0x1002
125 #define BANDRICH_PRODUCT_C100_2                 0x1003
126
127 static struct usb_device_id option_ids[] = {
128         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
129         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
130         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
131         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
132         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },
133         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS) },
134         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_LIGHT) },
135         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD) },
136         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT) },
137         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
138         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA_BUS) },
139         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
140         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
141         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
142         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX) },
143         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
144         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
145         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
146         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_LIGHT) },
147         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_GT) },
148         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_EX) },
149         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
150         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_NETWORK) },
151         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
152         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_NETWORK) },
153         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
154         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK) },
155         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
156         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
157         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
158         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_LITE) },
159         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_GT) },
160         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) },
161         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
162         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) },
163         { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
164         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
165         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
166         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1100) }, /* Novatel Merlin XS620/S640 */
167         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1110) }, /* Novatel Merlin S620 */
168         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1120) }, /* Novatel Merlin EX720 */
169         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1130) }, /* Novatel Merlin S720 */
170         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1400) }, /* Novatel U730 */
171         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1410) }, /* Novatel U740 */
172         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1420) }, /* Novatel EU870 */
173         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */
174         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2100) }, /* Novatel EV620 CDMA/EV-DO */
175         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */
176         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */
177         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2410) }, /* Novatel EU740 */
178         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x4100) }, /* Novatel U727 */
179         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x4400) }, /* Novatel MC950 */
180         { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
181         { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
182         { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
183         { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
184         { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
185         { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
186         { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
187         { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
188         { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
189         { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
190         { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
191         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
192         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
193         { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
194         { } /* Terminating entry */
195 };
196 MODULE_DEVICE_TABLE(usb, option_ids);
197
198 static struct usb_driver option_driver = {
199         .name       = "option",
200         .probe      = usb_serial_probe,
201         .disconnect = usb_serial_disconnect,
202         .id_table   = option_ids,
203         .no_dynamic_id =        1,
204 };
205
206 /* The card has three separate interfaces, which the serial driver
207  * recognizes separately, thus num_port=1.
208  */
209
210 static struct usb_serial_driver option_1port_device = {
211         .driver = {
212                 .owner =        THIS_MODULE,
213                 .name =         "option1",
214         },
215         .description       = "GSM modem (1-port)",
216         .usb_driver        = &option_driver,
217         .id_table          = option_ids,
218         .num_interrupt_in  = NUM_DONT_CARE,
219         .num_bulk_in       = NUM_DONT_CARE,
220         .num_bulk_out      = NUM_DONT_CARE,
221         .num_ports         = 1,
222         .open              = option_open,
223         .close             = option_close,
224         .write             = option_write,
225         .write_room        = option_write_room,
226         .chars_in_buffer   = option_chars_in_buffer,
227         .throttle          = option_rx_throttle,
228         .unthrottle        = option_rx_unthrottle,
229         .ioctl             = option_ioctl,
230         .set_termios       = option_set_termios,
231         .break_ctl         = option_break_ctl,
232         .tiocmget          = option_tiocmget,
233         .tiocmset          = option_tiocmset,
234         .attach            = option_startup,
235         .shutdown          = option_shutdown,
236         .read_int_callback = option_instat_callback,
237 };
238
239 #ifdef CONFIG_USB_DEBUG
240 static int debug;
241 #else
242 #define debug 0
243 #endif
244
245 /* per port private data */
246
247 #define N_IN_URB 4
248 #define N_OUT_URB 1
249 #define IN_BUFLEN 4096
250 #define OUT_BUFLEN 128
251
252 struct option_port_private {
253         /* Input endpoints and buffer for this port */
254         struct urb *in_urbs[N_IN_URB];
255         u8 *in_buffer[N_IN_URB];
256         /* Output endpoints and buffer for this port */
257         struct urb *out_urbs[N_OUT_URB];
258         u8 *out_buffer[N_OUT_URB];
259         unsigned long out_busy;         /* Bit vector of URBs in use */
260
261         /* Settings for the port */
262         int rts_state;  /* Handshaking pins (outputs) */
263         int dtr_state;
264         int cts_state;  /* Handshaking pins (inputs) */
265         int dsr_state;
266         int dcd_state;
267         int ri_state;
268
269         unsigned long tx_start_time[N_OUT_URB];
270 };
271
272 /* Functions used by new usb-serial code. */
273 static int __init option_init(void)
274 {
275         int retval;
276         retval = usb_serial_register(&option_1port_device);
277         if (retval)
278                 goto failed_1port_device_register;
279         retval = usb_register(&option_driver);
280         if (retval)
281                 goto failed_driver_register;
282
283         info(DRIVER_DESC ": " DRIVER_VERSION);
284
285         return 0;
286
287 failed_driver_register:
288         usb_serial_deregister (&option_1port_device);
289 failed_1port_device_register:
290         return retval;
291 }
292
293 static void __exit option_exit(void)
294 {
295         usb_deregister (&option_driver);
296         usb_serial_deregister (&option_1port_device);
297 }
298
299 module_init(option_init);
300 module_exit(option_exit);
301
302 static void option_rx_throttle(struct usb_serial_port *port)
303 {
304         dbg("%s", __FUNCTION__);
305 }
306
307 static void option_rx_unthrottle(struct usb_serial_port *port)
308 {
309         dbg("%s", __FUNCTION__);
310 }
311
312 static void option_break_ctl(struct usb_serial_port *port, int break_state)
313 {
314         /* Unfortunately, I don't know how to send a break */
315         dbg("%s", __FUNCTION__);
316 }
317
318 static void option_set_termios(struct usb_serial_port *port,
319                         struct ktermios *old_termios)
320 {
321         dbg("%s", __FUNCTION__);
322         /* Doesn't support option setting */
323         tty_termios_copy_hw(port->tty->termios, old_termios);
324         option_send_setup(port);
325 }
326
327 static int option_tiocmget(struct usb_serial_port *port, struct file *file)
328 {
329         unsigned int value;
330         struct option_port_private *portdata;
331
332         portdata = usb_get_serial_port_data(port);
333
334         value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
335                 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
336                 ((portdata->cts_state) ? TIOCM_CTS : 0) |
337                 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
338                 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
339                 ((portdata->ri_state) ? TIOCM_RNG : 0);
340
341         return value;
342 }
343
344 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
345                         unsigned int set, unsigned int clear)
346 {
347         struct option_port_private *portdata;
348
349         portdata = usb_get_serial_port_data(port);
350
351         if (set & TIOCM_RTS)
352                 portdata->rts_state = 1;
353         if (set & TIOCM_DTR)
354                 portdata->dtr_state = 1;
355
356         if (clear & TIOCM_RTS)
357                 portdata->rts_state = 0;
358         if (clear & TIOCM_DTR)
359                 portdata->dtr_state = 0;
360         return option_send_setup(port);
361 }
362
363 static int option_ioctl(struct usb_serial_port *port, struct file *file,
364                         unsigned int cmd, unsigned long arg)
365 {
366         return -ENOIOCTLCMD;
367 }
368
369 /* Write */
370 static int option_write(struct usb_serial_port *port,
371                         const unsigned char *buf, int count)
372 {
373         struct option_port_private *portdata;
374         int i;
375         int left, todo;
376         struct urb *this_urb = NULL; /* spurious */
377         int err;
378
379         portdata = usb_get_serial_port_data(port);
380
381         dbg("%s: write (%d chars)", __FUNCTION__, count);
382
383         i = 0;
384         left = count;
385         for (i=0; left > 0 && i < N_OUT_URB; i++) {
386                 todo = left;
387                 if (todo > OUT_BUFLEN)
388                         todo = OUT_BUFLEN;
389
390                 this_urb = portdata->out_urbs[i];
391                 if (test_and_set_bit(i, &portdata->out_busy)) {
392                         if (time_before(jiffies,
393                                         portdata->tx_start_time[i] + 10 * HZ))
394                                 continue;
395                         usb_unlink_urb(this_urb);
396                         continue;
397                 }
398                 if (this_urb->status != 0)
399                         dbg("usb_write %p failed (err=%d)",
400                                 this_urb, this_urb->status);
401
402                 dbg("%s: endpoint %d buf %d", __FUNCTION__,
403                         usb_pipeendpoint(this_urb->pipe), i);
404
405                 /* send the data */
406                 memcpy (this_urb->transfer_buffer, buf, todo);
407                 this_urb->transfer_buffer_length = todo;
408
409                 this_urb->dev = port->serial->dev;
410                 err = usb_submit_urb(this_urb, GFP_ATOMIC);
411                 if (err) {
412                         dbg("usb_submit_urb %p (write bulk) failed "
413                                 "(%d, has %d)", this_urb,
414                                 err, this_urb->status);
415                         clear_bit(i, &portdata->out_busy);
416                         continue;
417                 }
418                 portdata->tx_start_time[i] = jiffies;
419                 buf += todo;
420                 left -= todo;
421         }
422
423         count -= left;
424         dbg("%s: wrote (did %d)", __FUNCTION__, count);
425         return count;
426 }
427
428 static void option_indat_callback(struct urb *urb)
429 {
430         int err;
431         int endpoint;
432         struct usb_serial_port *port;
433         struct tty_struct *tty;
434         unsigned char *data = urb->transfer_buffer;
435         int status = urb->status;
436
437         dbg("%s: %p", __FUNCTION__, urb);
438
439         endpoint = usb_pipeendpoint(urb->pipe);
440         port = (struct usb_serial_port *) urb->context;
441
442         if (status) {
443                 dbg("%s: nonzero status: %d on endpoint %02x.",
444                     __FUNCTION__, status, endpoint);
445         } else {
446                 tty = port->tty;
447                 if (urb->actual_length) {
448                         tty_buffer_request_room(tty, urb->actual_length);
449                         tty_insert_flip_string(tty, data, urb->actual_length);
450                         tty_flip_buffer_push(tty);
451                 } else {
452                         dbg("%s: empty read urb received", __FUNCTION__);
453                 }
454
455                 /* Resubmit urb so we continue receiving */
456                 if (port->open_count && status != -ESHUTDOWN) {
457                         err = usb_submit_urb(urb, GFP_ATOMIC);
458                         if (err)
459                                 printk(KERN_ERR "%s: resubmit read urb failed. "
460                                         "(%d)", __FUNCTION__, err);
461                 }
462         }
463         return;
464 }
465
466 static void option_outdat_callback(struct urb *urb)
467 {
468         struct usb_serial_port *port;
469         struct option_port_private *portdata;
470         int i;
471
472         dbg("%s", __FUNCTION__);
473
474         port = (struct usb_serial_port *) urb->context;
475
476         usb_serial_port_softint(port);
477
478         portdata = usb_get_serial_port_data(port);
479         for (i = 0; i < N_OUT_URB; ++i) {
480                 if (portdata->out_urbs[i] == urb) {
481                         smp_mb__before_clear_bit();
482                         clear_bit(i, &portdata->out_busy);
483                         break;
484                 }
485         }
486 }
487
488 static void option_instat_callback(struct urb *urb)
489 {
490         int err;
491         int status = urb->status;
492         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
493         struct option_port_private *portdata = usb_get_serial_port_data(port);
494         struct usb_serial *serial = port->serial;
495
496         dbg("%s", __FUNCTION__);
497         dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
498
499         if (status == 0) {
500                 struct usb_ctrlrequest *req_pkt =
501                                 (struct usb_ctrlrequest *)urb->transfer_buffer;
502
503                 if (!req_pkt) {
504                         dbg("%s: NULL req_pkt\n", __FUNCTION__);
505                         return;
506                 }
507                 if ((req_pkt->bRequestType == 0xA1) &&
508                                 (req_pkt->bRequest == 0x20)) {
509                         int old_dcd_state;
510                         unsigned char signals = *((unsigned char *)
511                                         urb->transfer_buffer +
512                                         sizeof(struct usb_ctrlrequest));
513
514                         dbg("%s: signal x%x", __FUNCTION__, signals);
515
516                         old_dcd_state = portdata->dcd_state;
517                         portdata->cts_state = 1;
518                         portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
519                         portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
520                         portdata->ri_state = ((signals & 0x08) ? 1 : 0);
521
522                         if (port->tty && !C_CLOCAL(port->tty) &&
523                                         old_dcd_state && !portdata->dcd_state)
524                                 tty_hangup(port->tty);
525                 } else {
526                         dbg("%s: type %x req %x", __FUNCTION__,
527                                 req_pkt->bRequestType,req_pkt->bRequest);
528                 }
529         } else
530                 dbg("%s: error %d", __FUNCTION__, status);
531
532         /* Resubmit urb so we continue receiving IRQ data */
533         if (status != -ESHUTDOWN) {
534                 urb->dev = serial->dev;
535                 err = usb_submit_urb(urb, GFP_ATOMIC);
536                 if (err)
537                         dbg("%s: resubmit intr urb failed. (%d)",
538                                 __FUNCTION__, err);
539         }
540 }
541
542 static int option_write_room(struct usb_serial_port *port)
543 {
544         struct option_port_private *portdata;
545         int i;
546         int data_len = 0;
547         struct urb *this_urb;
548
549         portdata = usb_get_serial_port_data(port);
550
551         for (i=0; i < N_OUT_URB; i++) {
552                 this_urb = portdata->out_urbs[i];
553                 if (this_urb && !test_bit(i, &portdata->out_busy))
554                         data_len += OUT_BUFLEN;
555         }
556
557         dbg("%s: %d", __FUNCTION__, data_len);
558         return data_len;
559 }
560
561 static int option_chars_in_buffer(struct usb_serial_port *port)
562 {
563         struct option_port_private *portdata;
564         int i;
565         int data_len = 0;
566         struct urb *this_urb;
567
568         portdata = usb_get_serial_port_data(port);
569
570         for (i=0; i < N_OUT_URB; i++) {
571                 this_urb = portdata->out_urbs[i];
572                 if (this_urb && test_bit(i, &portdata->out_busy))
573                         data_len += this_urb->transfer_buffer_length;
574         }
575         dbg("%s: %d", __FUNCTION__, data_len);
576         return data_len;
577 }
578
579 static int option_open(struct usb_serial_port *port, struct file *filp)
580 {
581         struct option_port_private *portdata;
582         struct usb_serial *serial = port->serial;
583         int i, err;
584         struct urb *urb;
585
586         portdata = usb_get_serial_port_data(port);
587
588         dbg("%s", __FUNCTION__);
589
590         /* Set some sane defaults */
591         portdata->rts_state = 1;
592         portdata->dtr_state = 1;
593
594         /* Reset low level data toggle and start reading from endpoints */
595         for (i = 0; i < N_IN_URB; i++) {
596                 urb = portdata->in_urbs[i];
597                 if (! urb)
598                         continue;
599                 if (urb->dev != serial->dev) {
600                         dbg("%s: dev %p != %p", __FUNCTION__,
601                                 urb->dev, serial->dev);
602                         continue;
603                 }
604
605                 /*
606                  * make sure endpoint data toggle is synchronized with the
607                  * device
608                  */
609                 usb_clear_halt(urb->dev, urb->pipe);
610
611                 err = usb_submit_urb(urb, GFP_KERNEL);
612                 if (err) {
613                         dbg("%s: submit urb %d failed (%d) %d",
614                                 __FUNCTION__, i, err,
615                                 urb->transfer_buffer_length);
616                 }
617         }
618
619         /* Reset low level data toggle on out endpoints */
620         for (i = 0; i < N_OUT_URB; i++) {
621                 urb = portdata->out_urbs[i];
622                 if (! urb)
623                         continue;
624                 urb->dev = serial->dev;
625                 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
626                                 usb_pipeout(urb->pipe), 0); */
627         }
628
629         port->tty->low_latency = 1;
630
631         option_send_setup(port);
632
633         return (0);
634 }
635
636 static void option_close(struct usb_serial_port *port, struct file *filp)
637 {
638         int i;
639         struct usb_serial *serial = port->serial;
640         struct option_port_private *portdata;
641
642         dbg("%s", __FUNCTION__);
643         portdata = usb_get_serial_port_data(port);
644
645         portdata->rts_state = 0;
646         portdata->dtr_state = 0;
647
648         if (serial->dev) {
649                 mutex_lock(&serial->disc_mutex);
650                 if (!serial->disconnected)
651                         option_send_setup(port);
652                 mutex_unlock(&serial->disc_mutex);
653
654                 /* Stop reading/writing urbs */
655                 for (i = 0; i < N_IN_URB; i++)
656                         usb_kill_urb(portdata->in_urbs[i]);
657                 for (i = 0; i < N_OUT_URB; i++)
658                         usb_kill_urb(portdata->out_urbs[i]);
659         }
660         port->tty = NULL;
661 }
662
663 /* Helper functions used by option_setup_urbs */
664 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
665                 int dir, void *ctx, char *buf, int len,
666                 void (*callback)(struct urb *))
667 {
668         struct urb *urb;
669
670         if (endpoint == -1)
671                 return NULL;            /* endpoint not needed */
672
673         urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
674         if (urb == NULL) {
675                 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
676                 return NULL;
677         }
678
679                 /* Fill URB using supplied data. */
680         usb_fill_bulk_urb(urb, serial->dev,
681                       usb_sndbulkpipe(serial->dev, endpoint) | dir,
682                       buf, len, callback, ctx);
683
684         return urb;
685 }
686
687 /* Setup urbs */
688 static void option_setup_urbs(struct usb_serial *serial)
689 {
690         int i,j;
691         struct usb_serial_port *port;
692         struct option_port_private *portdata;
693
694         dbg("%s", __FUNCTION__);
695
696         for (i = 0; i < serial->num_ports; i++) {
697                 port = serial->port[i];
698                 portdata = usb_get_serial_port_data(port);
699
700         /* Do indat endpoints first */
701                 for (j = 0; j < N_IN_URB; ++j) {
702                         portdata->in_urbs[j] = option_setup_urb (serial,
703                         port->bulk_in_endpointAddress, USB_DIR_IN, port,
704                         portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
705                 }
706
707                 /* outdat endpoints */
708                 for (j = 0; j < N_OUT_URB; ++j) {
709                         portdata->out_urbs[j] = option_setup_urb (serial,
710                         port->bulk_out_endpointAddress, USB_DIR_OUT, port,
711                         portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
712                 }
713         }
714 }
715
716 static int option_send_setup(struct usb_serial_port *port)
717 {
718         struct usb_serial *serial = port->serial;
719         struct option_port_private *portdata;
720
721         dbg("%s", __FUNCTION__);
722
723         if (port->number != 0)
724                 return 0;
725
726         portdata = usb_get_serial_port_data(port);
727
728         if (port->tty) {
729                 int val = 0;
730                 if (portdata->dtr_state)
731                         val |= 0x01;
732                 if (portdata->rts_state)
733                         val |= 0x02;
734
735                 return usb_control_msg(serial->dev,
736                                 usb_rcvctrlpipe(serial->dev, 0),
737                                 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
738         }
739
740         return 0;
741 }
742
743 static int option_startup(struct usb_serial *serial)
744 {
745         int i, j, err;
746         struct usb_serial_port *port;
747         struct option_port_private *portdata;
748         u8 *buffer;
749
750         dbg("%s", __FUNCTION__);
751
752         /* Now setup per port private data */
753         for (i = 0; i < serial->num_ports; i++) {
754                 port = serial->port[i];
755                 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
756                 if (!portdata) {
757                         dbg("%s: kmalloc for option_port_private (%d) failed!.",
758                                         __FUNCTION__, i);
759                         return (1);
760                 }
761
762                 for (j = 0; j < N_IN_URB; j++) {
763                         buffer = (u8 *)__get_free_page(GFP_KERNEL);
764                         if (!buffer)
765                                 goto bail_out_error;
766                         portdata->in_buffer[j] = buffer;
767                 }
768
769                 for (j = 0; j < N_OUT_URB; j++) {
770                         buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);
771                         if (!buffer)
772                                 goto bail_out_error2;
773                         portdata->out_buffer[j] = buffer;
774                 }
775
776                 usb_set_serial_port_data(port, portdata);
777
778                 if (! port->interrupt_in_urb)
779                         continue;
780                 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
781                 if (err)
782                         dbg("%s: submit irq_in urb failed %d",
783                                 __FUNCTION__, err);
784         }
785
786         option_setup_urbs(serial);
787
788         return (0);
789
790 bail_out_error2:
791         for (j = 0; j < N_OUT_URB; j++)
792                 kfree(portdata->out_buffer[j]);
793 bail_out_error:
794         for (j = 0; j < N_IN_URB; j++)
795                 if (portdata->in_buffer[j])
796                         free_page((unsigned long)portdata->in_buffer[j]);
797         kfree(portdata);
798         return 1;
799 }
800
801 static void option_shutdown(struct usb_serial *serial)
802 {
803         int i, j;
804         struct usb_serial_port *port;
805         struct option_port_private *portdata;
806
807         dbg("%s", __FUNCTION__);
808
809         /* Stop reading/writing urbs */
810         for (i = 0; i < serial->num_ports; ++i) {
811                 port = serial->port[i];
812                 portdata = usb_get_serial_port_data(port);
813                 for (j = 0; j < N_IN_URB; j++)
814                         usb_kill_urb(portdata->in_urbs[j]);
815                 for (j = 0; j < N_OUT_URB; j++)
816                         usb_kill_urb(portdata->out_urbs[j]);
817         }
818
819         /* Now free them */
820         for (i = 0; i < serial->num_ports; ++i) {
821                 port = serial->port[i];
822                 portdata = usb_get_serial_port_data(port);
823
824                 for (j = 0; j < N_IN_URB; j++) {
825                         if (portdata->in_urbs[j]) {
826                                 usb_free_urb(portdata->in_urbs[j]);
827                                 free_page((unsigned long)portdata->in_buffer[j]);
828                                 portdata->in_urbs[j] = NULL;
829                         }
830                 }
831                 for (j = 0; j < N_OUT_URB; j++) {
832                         if (portdata->out_urbs[j]) {
833                                 usb_free_urb(portdata->out_urbs[j]);
834                                 kfree(portdata->out_buffer[j]);
835                                 portdata->out_urbs[j] = NULL;
836                         }
837                 }
838         }
839
840         /* Now free per port private data */
841         for (i = 0; i < serial->num_ports; i++) {
842                 port = serial->port[i];
843                 kfree(usb_get_serial_port_data(port));
844         }
845 }
846
847 MODULE_AUTHOR(DRIVER_AUTHOR);
848 MODULE_DESCRIPTION(DRIVER_DESC);
849 MODULE_VERSION(DRIVER_VERSION);
850 MODULE_LICENSE("GPL");
851
852 #ifdef CONFIG_USB_DEBUG
853 module_param(debug, bool, S_IRUGO | S_IWUSR);
854 MODULE_PARM_DESC(debug, "Debug messages");
855 #endif
856