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