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