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