]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/usb/serial/option.c
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
[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
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         int status = urb->status;
420
421         dbg("%s: %p", __FUNCTION__, urb);
422
423         endpoint = usb_pipeendpoint(urb->pipe);
424         port = (struct usb_serial_port *) urb->context;
425
426         if (status) {
427                 dbg("%s: nonzero status: %d on endpoint %02x.",
428                     __FUNCTION__, status, endpoint);
429         } else {
430                 tty = port->tty;
431                 if (urb->actual_length) {
432                         tty_buffer_request_room(tty, urb->actual_length);
433                         tty_insert_flip_string(tty, data, urb->actual_length);
434                         tty_flip_buffer_push(tty);
435                 } else {
436                         dbg("%s: empty read urb received", __FUNCTION__);
437                 }
438
439                 /* Resubmit urb so we continue receiving */
440                 if (port->open_count && status != -ESHUTDOWN) {
441                         err = usb_submit_urb(urb, GFP_ATOMIC);
442                         if (err)
443                                 printk(KERN_ERR "%s: resubmit read urb failed. "
444                                         "(%d)", __FUNCTION__, err);
445                 }
446         }
447         return;
448 }
449
450 static void option_outdat_callback(struct urb *urb)
451 {
452         struct usb_serial_port *port;
453         struct option_port_private *portdata;
454         int i;
455
456         dbg("%s", __FUNCTION__);
457
458         port = (struct usb_serial_port *) urb->context;
459
460         usb_serial_port_softint(port);
461
462         portdata = usb_get_serial_port_data(port);
463         for (i = 0; i < N_OUT_URB; ++i) {
464                 if (portdata->out_urbs[i] == urb) {
465                         smp_mb__before_clear_bit();
466                         clear_bit(i, &portdata->out_busy);
467                         break;
468                 }
469         }
470 }
471
472 static void option_instat_callback(struct urb *urb)
473 {
474         int err;
475         int status = urb->status;
476         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
477         struct option_port_private *portdata = usb_get_serial_port_data(port);
478         struct usb_serial *serial = port->serial;
479
480         dbg("%s", __FUNCTION__);
481         dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
482
483         if (status == 0) {
484                 struct usb_ctrlrequest *req_pkt =
485                                 (struct usb_ctrlrequest *)urb->transfer_buffer;
486
487                 if (!req_pkt) {
488                         dbg("%s: NULL req_pkt\n", __FUNCTION__);
489                         return;
490                 }
491                 if ((req_pkt->bRequestType == 0xA1) &&
492                                 (req_pkt->bRequest == 0x20)) {
493                         int old_dcd_state;
494                         unsigned char signals = *((unsigned char *)
495                                         urb->transfer_buffer +
496                                         sizeof(struct usb_ctrlrequest));
497
498                         dbg("%s: signal x%x", __FUNCTION__, signals);
499
500                         old_dcd_state = portdata->dcd_state;
501                         portdata->cts_state = 1;
502                         portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
503                         portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
504                         portdata->ri_state = ((signals & 0x08) ? 1 : 0);
505
506                         if (port->tty && !C_CLOCAL(port->tty) &&
507                                         old_dcd_state && !portdata->dcd_state)
508                                 tty_hangup(port->tty);
509                 } else {
510                         dbg("%s: type %x req %x", __FUNCTION__,
511                                 req_pkt->bRequestType,req_pkt->bRequest);
512                 }
513         } else
514                 dbg("%s: error %d", __FUNCTION__, status);
515
516         /* Resubmit urb so we continue receiving IRQ data */
517         if (status != -ESHUTDOWN) {
518                 urb->dev = serial->dev;
519                 err = usb_submit_urb(urb, GFP_ATOMIC);
520                 if (err)
521                         dbg("%s: resubmit intr urb failed. (%d)",
522                                 __FUNCTION__, err);
523         }
524 }
525
526 static int option_write_room(struct usb_serial_port *port)
527 {
528         struct option_port_private *portdata;
529         int i;
530         int data_len = 0;
531         struct urb *this_urb;
532
533         portdata = usb_get_serial_port_data(port);
534
535         for (i=0; i < N_OUT_URB; i++) {
536                 this_urb = portdata->out_urbs[i];
537                 if (this_urb && !test_bit(i, &portdata->out_busy))
538                         data_len += OUT_BUFLEN;
539         }
540
541         dbg("%s: %d", __FUNCTION__, data_len);
542         return data_len;
543 }
544
545 static int option_chars_in_buffer(struct usb_serial_port *port)
546 {
547         struct option_port_private *portdata;
548         int i;
549         int data_len = 0;
550         struct urb *this_urb;
551
552         portdata = usb_get_serial_port_data(port);
553
554         for (i=0; i < N_OUT_URB; i++) {
555                 this_urb = portdata->out_urbs[i];
556                 if (this_urb && test_bit(i, &portdata->out_busy))
557                         data_len += this_urb->transfer_buffer_length;
558         }
559         dbg("%s: %d", __FUNCTION__, data_len);
560         return data_len;
561 }
562
563 static int option_open(struct usb_serial_port *port, struct file *filp)
564 {
565         struct option_port_private *portdata;
566         struct usb_serial *serial = port->serial;
567         int i, err;
568         struct urb *urb;
569
570         portdata = usb_get_serial_port_data(port);
571
572         dbg("%s", __FUNCTION__);
573
574         /* Set some sane defaults */
575         portdata->rts_state = 1;
576         portdata->dtr_state = 1;
577
578         /* Reset low level data toggle and start reading from endpoints */
579         for (i = 0; i < N_IN_URB; i++) {
580                 urb = portdata->in_urbs[i];
581                 if (! urb)
582                         continue;
583                 if (urb->dev != serial->dev) {
584                         dbg("%s: dev %p != %p", __FUNCTION__,
585                                 urb->dev, serial->dev);
586                         continue;
587                 }
588
589                 /*
590                  * make sure endpoint data toggle is synchronized with the
591                  * device
592                  */
593                 usb_clear_halt(urb->dev, urb->pipe);
594
595                 err = usb_submit_urb(urb, GFP_KERNEL);
596                 if (err) {
597                         dbg("%s: submit urb %d failed (%d) %d",
598                                 __FUNCTION__, i, err,
599                                 urb->transfer_buffer_length);
600                 }
601         }
602
603         /* Reset low level data toggle on out endpoints */
604         for (i = 0; i < N_OUT_URB; i++) {
605                 urb = portdata->out_urbs[i];
606                 if (! urb)
607                         continue;
608                 urb->dev = serial->dev;
609                 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
610                                 usb_pipeout(urb->pipe), 0); */
611         }
612
613         port->tty->low_latency = 1;
614
615         option_send_setup(port);
616
617         return (0);
618 }
619
620 static void option_close(struct usb_serial_port *port, struct file *filp)
621 {
622         int i;
623         struct usb_serial *serial = port->serial;
624         struct option_port_private *portdata;
625
626         dbg("%s", __FUNCTION__);
627         portdata = usb_get_serial_port_data(port);
628
629         portdata->rts_state = 0;
630         portdata->dtr_state = 0;
631
632         if (serial->dev) {
633                 option_send_setup(port);
634
635                 /* Stop reading/writing urbs */
636                 for (i = 0; i < N_IN_URB; i++)
637                         usb_kill_urb(portdata->in_urbs[i]);
638                 for (i = 0; i < N_OUT_URB; i++)
639                         usb_kill_urb(portdata->out_urbs[i]);
640         }
641         port->tty = NULL;
642 }
643
644 /* Helper functions used by option_setup_urbs */
645 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
646                 int dir, void *ctx, char *buf, int len,
647                 void (*callback)(struct urb *))
648 {
649         struct urb *urb;
650
651         if (endpoint == -1)
652                 return NULL;            /* endpoint not needed */
653
654         urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
655         if (urb == NULL) {
656                 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
657                 return NULL;
658         }
659
660                 /* Fill URB using supplied data. */
661         usb_fill_bulk_urb(urb, serial->dev,
662                       usb_sndbulkpipe(serial->dev, endpoint) | dir,
663                       buf, len, callback, ctx);
664
665         return urb;
666 }
667
668 /* Setup urbs */
669 static void option_setup_urbs(struct usb_serial *serial)
670 {
671         int i,j;
672         struct usb_serial_port *port;
673         struct option_port_private *portdata;
674
675         dbg("%s", __FUNCTION__);
676
677         for (i = 0; i < serial->num_ports; i++) {
678                 port = serial->port[i];
679                 portdata = usb_get_serial_port_data(port);
680
681         /* Do indat endpoints first */
682                 for (j = 0; j < N_IN_URB; ++j) {
683                         portdata->in_urbs[j] = option_setup_urb (serial,
684                         port->bulk_in_endpointAddress, USB_DIR_IN, port,
685                         portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
686                 }
687
688                 /* outdat endpoints */
689                 for (j = 0; j < N_OUT_URB; ++j) {
690                         portdata->out_urbs[j] = option_setup_urb (serial,
691                         port->bulk_out_endpointAddress, USB_DIR_OUT, port,
692                         portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
693                 }
694         }
695 }
696
697 static int option_send_setup(struct usb_serial_port *port)
698 {
699         struct usb_serial *serial = port->serial;
700         struct option_port_private *portdata;
701
702         dbg("%s", __FUNCTION__);
703
704         if (port->number != 0)
705                 return 0;
706
707         portdata = usb_get_serial_port_data(port);
708
709         if (port->tty) {
710                 int val = 0;
711                 if (portdata->dtr_state)
712                         val |= 0x01;
713                 if (portdata->rts_state)
714                         val |= 0x02;
715
716                 return usb_control_msg(serial->dev,
717                                 usb_rcvctrlpipe(serial->dev, 0),
718                                 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
719         }
720
721         return 0;
722 }
723
724 static int option_startup(struct usb_serial *serial)
725 {
726         int i, err;
727         struct usb_serial_port *port;
728         struct option_port_private *portdata;
729
730         dbg("%s", __FUNCTION__);
731
732         /* Now setup per port private data */
733         for (i = 0; i < serial->num_ports; i++) {
734                 port = serial->port[i];
735                 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
736                 if (!portdata) {
737                         dbg("%s: kmalloc for option_port_private (%d) failed!.",
738                                         __FUNCTION__, i);
739                         return (1);
740                 }
741
742                 usb_set_serial_port_data(port, portdata);
743
744                 if (! port->interrupt_in_urb)
745                         continue;
746                 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
747                 if (err)
748                         dbg("%s: submit irq_in urb failed %d",
749                                 __FUNCTION__, err);
750         }
751
752         option_setup_urbs(serial);
753
754         return (0);
755 }
756
757 static void option_shutdown(struct usb_serial *serial)
758 {
759         int i, j;
760         struct usb_serial_port *port;
761         struct option_port_private *portdata;
762
763         dbg("%s", __FUNCTION__);
764
765         /* Stop reading/writing urbs */
766         for (i = 0; i < serial->num_ports; ++i) {
767                 port = serial->port[i];
768                 portdata = usb_get_serial_port_data(port);
769                 for (j = 0; j < N_IN_URB; j++)
770                         usb_kill_urb(portdata->in_urbs[j]);
771                 for (j = 0; j < N_OUT_URB; j++)
772                         usb_kill_urb(portdata->out_urbs[j]);
773         }
774
775         /* Now free them */
776         for (i = 0; i < serial->num_ports; ++i) {
777                 port = serial->port[i];
778                 portdata = usb_get_serial_port_data(port);
779
780                 for (j = 0; j < N_IN_URB; j++) {
781                         if (portdata->in_urbs[j]) {
782                                 usb_free_urb(portdata->in_urbs[j]);
783                                 portdata->in_urbs[j] = NULL;
784                         }
785                 }
786                 for (j = 0; j < N_OUT_URB; j++) {
787                         if (portdata->out_urbs[j]) {
788                                 usb_free_urb(portdata->out_urbs[j]);
789                                 portdata->out_urbs[j] = NULL;
790                         }
791                 }
792         }
793
794         /* Now free per port private data */
795         for (i = 0; i < serial->num_ports; i++) {
796                 port = serial->port[i];
797                 kfree(usb_get_serial_port_data(port));
798         }
799 }
800
801 MODULE_AUTHOR(DRIVER_AUTHOR);
802 MODULE_DESCRIPTION(DRIVER_DESC);
803 MODULE_VERSION(DRIVER_VERSION);
804 MODULE_LICENSE("GPL");
805
806 #ifdef CONFIG_USB_DEBUG
807 module_param(debug, bool, S_IRUGO | S_IWUSR);
808 MODULE_PARM_DESC(debug, "Debug messages");
809 #endif
810