kfifo: move struct kfifo in place
[safe/jmp/linux-2.6] / drivers / usb / serial / keyspan.c
1 /*
2   Keyspan USB to Serial Converter driver
3
4   (C) Copyright (C) 2000-2001   Hugh Blemings <hugh@blemings.org>
5   (C) Copyright (C) 2002        Greg Kroah-Hartman <greg@kroah.com>
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2 of the License, or
10   (at your option) any later version.
11
12   See http://misc.nu/hugh/keyspan.html for more information.
13
14   Code in this driver inspired by and in a number of places taken
15   from Brian Warner's original Keyspan-PDA driver.
16
17   This driver has been put together with the support of Innosys, Inc.
18   and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
19   Thanks Guys :)
20
21   Thanks to Paulus for miscellaneous tidy ups, some largish chunks
22   of much nicer and/or completely new code and (perhaps most uniquely)
23   having the patience to sit down and explain why and where he'd changed
24   stuff.
25
26   Tip 'o the hat to IBM (and previously Linuxcare :) for supporting
27   staff in their work on open source projects.
28
29   Change History
30
31     2003sep04   LPM (Keyspan) add support for new single port product USA19HS.
32                                 Improve setup message handling for all devices.
33
34     Wed Feb 19 22:00:00 PST 2003 (Jeffrey S. Laing <keyspan@jsl.com>)
35       Merged the current (1/31/03) Keyspan code with the current (2.4.21-pre4)
36       Linux source tree.  The Linux tree lacked support for the 49WLC and
37       others.  The Keyspan patches didn't work with the current kernel.
38
39     2003jan30   LPM     add support for the 49WLC and MPR
40
41     Wed Apr 25 12:00:00 PST 2002 (Keyspan)
42       Started with Hugh Blemings' code dated Jan 17, 2002.  All adapters
43       now supported (including QI and QW).  Modified port open, port
44       close, and send setup() logic to fix various data and endpoint
45       synchronization bugs and device LED status bugs.  Changed keyspan_
46       write_room() to accurately return transmit buffer availability.
47       Changed forwardingLength from 1 to 16 for all adapters.
48
49     Fri Oct 12 16:45:00 EST 2001
50       Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
51
52     Wed Apr 25 12:00:00 PST 2002 (Keyspan)
53       Started with Hugh Blemings' code dated Jan 17, 2002.  All adapters
54       now supported (including QI and QW).  Modified port open, port
55       close, and send setup() logic to fix various data and endpoint
56       synchronization bugs and device LED status bugs.  Changed keyspan_
57       write_room() to accurately return transmit buffer availability.
58       Changed forwardingLength from 1 to 16 for all adapters.
59
60     Fri Oct 12 16:45:00 EST 2001
61       Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
62
63     Mon Oct  8 14:29:00 EST 2001 hugh
64       Fixed bug that prevented mulitport devices operating correctly
65       if they weren't the first unit attached.
66
67     Sat Oct  6 12:31:21 EST 2001 hugh
68       Added support for USA-28XA and -28XB, misc cleanups, break support
69       for usa26 based models thanks to David Gibson.
70
71     Thu May 31 11:56:42 PDT 2001 gkh
72       switched from using spinlock to a semaphore
73
74     (04/08/2001) gb
75         Identify version on module load.
76
77     (11/01/2000) Adam J. Richter
78         usb_device_id table support.
79
80     Tue Oct 10 23:15:33 EST 2000 Hugh
81       Merged Paul's changes with my USA-49W mods.  Work in progress
82       still...
83
84     Wed Jul 19 14:00:42 EST 2000 gkh
85       Added module_init and module_exit functions to handle the fact that
86       this driver is a loadable module now.
87
88     Tue Jul 18 16:14:52 EST 2000 Hugh
89       Basic character input/output for USA-19 now mostly works,
90       fixed at 9600 baud for the moment.
91
92     Sat Jul  8 11:11:48 EST 2000 Hugh
93       First public release - nothing works except the firmware upload.
94       Tested on PPC and x86 architectures, seems to behave...
95 */
96
97
98 #include <linux/kernel.h>
99 #include <linux/jiffies.h>
100 #include <linux/errno.h>
101 #include <linux/init.h>
102 #include <linux/slab.h>
103 #include <linux/tty.h>
104 #include <linux/tty_driver.h>
105 #include <linux/tty_flip.h>
106 #include <linux/module.h>
107 #include <linux/spinlock.h>
108 #include <linux/firmware.h>
109 #include <linux/ihex.h>
110 #include <linux/uaccess.h>
111 #include <linux/usb.h>
112 #include <linux/usb/serial.h>
113 #include "keyspan.h"
114
115 static int debug;
116
117 /*
118  * Version Information
119  */
120 #define DRIVER_VERSION "v1.1.5"
121 #define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
122 #define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
123
124 #define INSTAT_BUFLEN   32
125 #define GLOCONT_BUFLEN  64
126 #define INDAT49W_BUFLEN 512
127
128         /* Per device and per port private data */
129 struct keyspan_serial_private {
130         const struct keyspan_device_details     *device_details;
131
132         struct urb      *instat_urb;
133         char            instat_buf[INSTAT_BUFLEN];
134
135         /* added to support 49wg, where data from all 4 ports comes in
136            on 1 EP and high-speed supported */
137         struct urb      *indat_urb;
138         char            indat_buf[INDAT49W_BUFLEN];
139
140         /* XXX this one probably will need a lock */
141         struct urb      *glocont_urb;
142         char            glocont_buf[GLOCONT_BUFLEN];
143         char            ctrl_buf[8];    /* for EP0 control message */
144 };
145
146 struct keyspan_port_private {
147         /* Keep track of which input & output endpoints to use */
148         int             in_flip;
149         int             out_flip;
150
151         /* Keep duplicate of device details in each port
152            structure as well - simplifies some of the
153            callback functions etc. */
154         const struct keyspan_device_details     *device_details;
155
156         /* Input endpoints and buffer for this port */
157         struct urb      *in_urbs[2];
158         char            in_buffer[2][64];
159         /* Output endpoints and buffer for this port */
160         struct urb      *out_urbs[2];
161         char            out_buffer[2][64];
162
163         /* Input ack endpoint */
164         struct urb      *inack_urb;
165         char            inack_buffer[1];
166
167         /* Output control endpoint */
168         struct urb      *outcont_urb;
169         char            outcont_buffer[64];
170
171         /* Settings for the port */
172         int             baud;
173         int             old_baud;
174         unsigned int    cflag;
175         unsigned int    old_cflag;
176         enum            {flow_none, flow_cts, flow_xon} flow_control;
177         int             rts_state;      /* Handshaking pins (outputs) */
178         int             dtr_state;
179         int             cts_state;      /* Handshaking pins (inputs) */
180         int             dsr_state;
181         int             dcd_state;
182         int             ri_state;
183         int             break_on;
184
185         unsigned long   tx_start_time[2];
186         int             resend_cont;    /* need to resend control packet */
187 };
188
189 /* Include Keyspan message headers.  All current Keyspan Adapters
190    make use of one of five message formats which are referred
191    to as USA-26, USA-28, USA-49, USA-90, USA-67 by Keyspan and
192    within this driver. */
193 #include "keyspan_usa26msg.h"
194 #include "keyspan_usa28msg.h"
195 #include "keyspan_usa49msg.h"
196 #include "keyspan_usa90msg.h"
197 #include "keyspan_usa67msg.h"
198
199
200 /* Functions used by new usb-serial code. */
201 static int __init keyspan_init(void)
202 {
203         int retval;
204         retval = usb_serial_register(&keyspan_pre_device);
205         if (retval)
206                 goto failed_pre_device_register;
207         retval = usb_serial_register(&keyspan_1port_device);
208         if (retval)
209                 goto failed_1port_device_register;
210         retval = usb_serial_register(&keyspan_2port_device);
211         if (retval)
212                 goto failed_2port_device_register;
213         retval = usb_serial_register(&keyspan_4port_device);
214         if (retval)
215                 goto failed_4port_device_register;
216         retval = usb_register(&keyspan_driver);
217         if (retval)
218                 goto failed_usb_register;
219
220         printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
221                DRIVER_DESC "\n");
222
223         return 0;
224 failed_usb_register:
225         usb_serial_deregister(&keyspan_4port_device);
226 failed_4port_device_register:
227         usb_serial_deregister(&keyspan_2port_device);
228 failed_2port_device_register:
229         usb_serial_deregister(&keyspan_1port_device);
230 failed_1port_device_register:
231         usb_serial_deregister(&keyspan_pre_device);
232 failed_pre_device_register:
233         return retval;
234 }
235
236 static void __exit keyspan_exit(void)
237 {
238         usb_deregister(&keyspan_driver);
239         usb_serial_deregister(&keyspan_pre_device);
240         usb_serial_deregister(&keyspan_1port_device);
241         usb_serial_deregister(&keyspan_2port_device);
242         usb_serial_deregister(&keyspan_4port_device);
243 }
244
245 module_init(keyspan_init);
246 module_exit(keyspan_exit);
247
248 static void keyspan_break_ctl(struct tty_struct *tty, int break_state)
249 {
250         struct usb_serial_port *port = tty->driver_data;
251         struct keyspan_port_private     *p_priv;
252
253         dbg("%s", __func__);
254
255         p_priv = usb_get_serial_port_data(port);
256
257         if (break_state == -1)
258                 p_priv->break_on = 1;
259         else
260                 p_priv->break_on = 0;
261
262         keyspan_send_setup(port, 0);
263 }
264
265
266 static void keyspan_set_termios(struct tty_struct *tty,
267                 struct usb_serial_port *port, struct ktermios *old_termios)
268 {
269         int                             baud_rate, device_port;
270         struct keyspan_port_private     *p_priv;
271         const struct keyspan_device_details     *d_details;
272         unsigned int                    cflag;
273
274         dbg("%s", __func__);
275
276         p_priv = usb_get_serial_port_data(port);
277         d_details = p_priv->device_details;
278         cflag = tty->termios->c_cflag;
279         device_port = port->number - port->serial->minor;
280
281         /* Baud rate calculation takes baud rate as an integer
282            so other rates can be generated if desired. */
283         baud_rate = tty_get_baud_rate(tty);
284         /* If no match or invalid, don't change */
285         if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
286                                 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
287                 /* FIXME - more to do here to ensure rate changes cleanly */
288                 /* FIXME - calcuate exact rate from divisor ? */
289                 p_priv->baud = baud_rate;
290         } else
291                 baud_rate = tty_termios_baud_rate(old_termios);
292
293         tty_encode_baud_rate(tty, baud_rate, baud_rate);
294         /* set CTS/RTS handshake etc. */
295         p_priv->cflag = cflag;
296         p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
297
298         /* Mark/Space not supported */
299         tty->termios->c_cflag &= ~CMSPAR;
300
301         keyspan_send_setup(port, 0);
302 }
303
304 static int keyspan_tiocmget(struct tty_struct *tty, struct file *file)
305 {
306         struct usb_serial_port *port = tty->driver_data;
307         struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
308         unsigned int                    value;
309
310         value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
311                 ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
312                 ((p_priv->cts_state) ? TIOCM_CTS : 0) |
313                 ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
314                 ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
315                 ((p_priv->ri_state) ? TIOCM_RNG : 0);
316
317         return value;
318 }
319
320 static int keyspan_tiocmset(struct tty_struct *tty, struct file *file,
321                             unsigned int set, unsigned int clear)
322 {
323         struct usb_serial_port *port = tty->driver_data;
324         struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
325
326         if (set & TIOCM_RTS)
327                 p_priv->rts_state = 1;
328         if (set & TIOCM_DTR)
329                 p_priv->dtr_state = 1;
330         if (clear & TIOCM_RTS)
331                 p_priv->rts_state = 0;
332         if (clear & TIOCM_DTR)
333                 p_priv->dtr_state = 0;
334         keyspan_send_setup(port, 0);
335         return 0;
336 }
337
338 /* Write function is similar for the four protocols used
339    with only a minor change for usa90 (usa19hs) required */
340 static int keyspan_write(struct tty_struct *tty,
341         struct usb_serial_port *port, const unsigned char *buf, int count)
342 {
343         struct keyspan_port_private     *p_priv;
344         const struct keyspan_device_details     *d_details;
345         int                             flip;
346         int                             left, todo;
347         struct urb                      *this_urb;
348         int                             err, maxDataLen, dataOffset;
349
350         p_priv = usb_get_serial_port_data(port);
351         d_details = p_priv->device_details;
352
353         if (d_details->msg_format == msg_usa90) {
354                 maxDataLen = 64;
355                 dataOffset = 0;
356         } else {
357                 maxDataLen = 63;
358                 dataOffset = 1;
359         }
360
361         dbg("%s - for port %d (%d chars), flip=%d",
362             __func__, port->number, count, p_priv->out_flip);
363
364         for (left = count; left > 0; left -= todo) {
365                 todo = left;
366                 if (todo > maxDataLen)
367                         todo = maxDataLen;
368
369                 flip = p_priv->out_flip;
370
371                 /* Check we have a valid urb/endpoint before we use it... */
372                 this_urb = p_priv->out_urbs[flip];
373                 if (this_urb == NULL) {
374                         /* no bulk out, so return 0 bytes written */
375                         dbg("%s - no output urb :(", __func__);
376                         return count;
377                 }
378
379                 dbg("%s - endpoint %d flip %d",
380                         __func__, usb_pipeendpoint(this_urb->pipe), flip);
381
382                 if (this_urb->status == -EINPROGRESS) {
383                         if (time_before(jiffies,
384                                         p_priv->tx_start_time[flip] + 10 * HZ))
385                                 break;
386                         usb_unlink_urb(this_urb);
387                         break;
388                 }
389
390                 /* First byte in buffer is "last flag" (except for usa19hx)
391                    - unused so for now so set to zero */
392                 ((char *)this_urb->transfer_buffer)[0] = 0;
393
394                 memcpy(this_urb->transfer_buffer + dataOffset, buf, todo);
395                 buf += todo;
396
397                 /* send the data out the bulk port */
398                 this_urb->transfer_buffer_length = todo + dataOffset;
399
400                 this_urb->dev = port->serial->dev;
401                 err = usb_submit_urb(this_urb, GFP_ATOMIC);
402                 if (err != 0)
403                         dbg("usb_submit_urb(write bulk) failed (%d)", err);
404                 p_priv->tx_start_time[flip] = jiffies;
405
406                 /* Flip for next time if usa26 or usa28 interface
407                    (not used on usa49) */
408                 p_priv->out_flip = (flip + 1) & d_details->outdat_endp_flip;
409         }
410
411         return count - left;
412 }
413
414 static void     usa26_indat_callback(struct urb *urb)
415 {
416         int                     i, err;
417         int                     endpoint;
418         struct usb_serial_port  *port;
419         struct tty_struct       *tty;
420         unsigned char           *data = urb->transfer_buffer;
421         int status = urb->status;
422
423         dbg("%s", __func__);
424
425         endpoint = usb_pipeendpoint(urb->pipe);
426
427         if (status) {
428                 dbg("%s - nonzero status: %x on endpoint %d.",
429                     __func__, status, endpoint);
430                 return;
431         }
432
433         port =  urb->context;
434         tty = tty_port_tty_get(&port->port);
435         if (tty && urb->actual_length) {
436                 /* 0x80 bit is error flag */
437                 if ((data[0] & 0x80) == 0) {
438                         /* no errors on individual bytes, only
439                            possible overrun err */
440                         if (data[0] & RXERROR_OVERRUN)
441                                 err = TTY_OVERRUN;
442                         else
443                                 err = 0;
444                         for (i = 1; i < urb->actual_length ; ++i)
445                                 tty_insert_flip_char(tty, data[i], err);
446                 } else {
447                         /* some bytes had errors, every byte has status */
448                         dbg("%s - RX error!!!!", __func__);
449                         for (i = 0; i + 1 < urb->actual_length; i += 2) {
450                                 int stat = data[i], flag = 0;
451                                 if (stat & RXERROR_OVERRUN)
452                                         flag |= TTY_OVERRUN;
453                                 if (stat & RXERROR_FRAMING)
454                                         flag |= TTY_FRAME;
455                                 if (stat & RXERROR_PARITY)
456                                         flag |= TTY_PARITY;
457                                 /* XXX should handle break (0x10) */
458                                 tty_insert_flip_char(tty, data[i+1], flag);
459                         }
460                 }
461                 tty_flip_buffer_push(tty);
462         }
463         tty_kref_put(tty);
464
465         /* Resubmit urb so we continue receiving */
466         urb->dev = port->serial->dev;
467         if (port->port.count) {
468                 err = usb_submit_urb(urb, GFP_ATOMIC);
469                 if (err != 0)
470                         dbg("%s - resubmit read urb failed. (%d)",
471                                         __func__, err);
472         }
473         return;
474 }
475
476 /* Outdat handling is common for all devices */
477 static void     usa2x_outdat_callback(struct urb *urb)
478 {
479         struct usb_serial_port *port;
480         struct keyspan_port_private *p_priv;
481
482         port =  urb->context;
483         p_priv = usb_get_serial_port_data(port);
484         dbg("%s - urb %d", __func__, urb == p_priv->out_urbs[1]);
485
486         if (port->port.count)
487                 usb_serial_port_softint(port);
488 }
489
490 static void     usa26_inack_callback(struct urb *urb)
491 {
492         dbg("%s", __func__);
493
494 }
495
496 static void     usa26_outcont_callback(struct urb *urb)
497 {
498         struct usb_serial_port *port;
499         struct keyspan_port_private *p_priv;
500
501         port =  urb->context;
502         p_priv = usb_get_serial_port_data(port);
503
504         if (p_priv->resend_cont) {
505                 dbg("%s - sending setup", __func__);
506                 keyspan_usa26_send_setup(port->serial, port,
507                                                 p_priv->resend_cont - 1);
508         }
509 }
510
511 static void     usa26_instat_callback(struct urb *urb)
512 {
513         unsigned char                           *data = urb->transfer_buffer;
514         struct keyspan_usa26_portStatusMessage  *msg;
515         struct usb_serial                       *serial;
516         struct usb_serial_port                  *port;
517         struct keyspan_port_private             *p_priv;
518         struct tty_struct                       *tty;
519         int old_dcd_state, err;
520         int status = urb->status;
521
522         serial =  urb->context;
523
524         if (status) {
525                 dbg("%s - nonzero status: %x", __func__, status);
526                 return;
527         }
528         if (urb->actual_length != 9) {
529                 dbg("%s - %d byte report??", __func__, urb->actual_length);
530                 goto exit;
531         }
532
533         msg = (struct keyspan_usa26_portStatusMessage *)data;
534
535 #if 0
536         dbg("%s - port status: port %d cts %d dcd %d dsr %d ri %d toff %d txoff %d rxen %d cr %d",
537             __func__, msg->port, msg->hskia_cts, msg->gpia_dcd, msg->dsr, msg->ri, msg->_txOff,
538             msg->_txXoff, msg->rxEnabled, msg->controlResponse);
539 #endif
540
541         /* Now do something useful with the data */
542
543
544         /* Check port number from message and retrieve private data */
545         if (msg->port >= serial->num_ports) {
546                 dbg("%s - Unexpected port number %d", __func__, msg->port);
547                 goto exit;
548         }
549         port = serial->port[msg->port];
550         p_priv = usb_get_serial_port_data(port);
551
552         /* Update handshaking pin state information */
553         old_dcd_state = p_priv->dcd_state;
554         p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
555         p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
556         p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
557         p_priv->ri_state = ((msg->ri) ? 1 : 0);
558
559         if (old_dcd_state != p_priv->dcd_state) {
560                 tty = tty_port_tty_get(&port->port);
561                 if (tty && !C_CLOCAL(tty))
562                         tty_hangup(tty);
563                 tty_kref_put(tty);
564         }
565
566         /* Resubmit urb so we continue receiving */
567         urb->dev = serial->dev;
568         err = usb_submit_urb(urb, GFP_ATOMIC);
569         if (err != 0)
570                 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
571 exit: ;
572 }
573
574 static void     usa26_glocont_callback(struct urb *urb)
575 {
576         dbg("%s", __func__);
577 }
578
579
580 static void usa28_indat_callback(struct urb *urb)
581 {
582         int                     err;
583         struct usb_serial_port  *port;
584         struct tty_struct       *tty;
585         unsigned char           *data;
586         struct keyspan_port_private             *p_priv;
587         int status = urb->status;
588
589         dbg("%s", __func__);
590
591         port =  urb->context;
592         p_priv = usb_get_serial_port_data(port);
593         data = urb->transfer_buffer;
594
595         if (urb != p_priv->in_urbs[p_priv->in_flip])
596                 return;
597
598         do {
599                 if (status) {
600                         dbg("%s - nonzero status: %x on endpoint %d.",
601                             __func__, status, usb_pipeendpoint(urb->pipe));
602                         return;
603                 }
604
605                 port =  urb->context;
606                 p_priv = usb_get_serial_port_data(port);
607                 data = urb->transfer_buffer;
608
609                 tty =tty_port_tty_get(&port->port);
610                 if (tty && urb->actual_length) {
611                         tty_insert_flip_string(tty, data, urb->actual_length);
612                         tty_flip_buffer_push(tty);
613                 }
614                 tty_kref_put(tty);
615
616                 /* Resubmit urb so we continue receiving */
617                 urb->dev = port->serial->dev;
618                 if (port->port.count) {
619                         err = usb_submit_urb(urb, GFP_ATOMIC);
620                         if (err != 0)
621                                 dbg("%s - resubmit read urb failed. (%d)",
622                                                                 __func__, err);
623                 }
624                 p_priv->in_flip ^= 1;
625
626                 urb = p_priv->in_urbs[p_priv->in_flip];
627         } while (urb->status != -EINPROGRESS);
628 }
629
630 static void     usa28_inack_callback(struct urb *urb)
631 {
632         dbg("%s", __func__);
633 }
634
635 static void     usa28_outcont_callback(struct urb *urb)
636 {
637         struct usb_serial_port *port;
638         struct keyspan_port_private *p_priv;
639
640         port =  urb->context;
641         p_priv = usb_get_serial_port_data(port);
642
643         if (p_priv->resend_cont) {
644                 dbg("%s - sending setup", __func__);
645                 keyspan_usa28_send_setup(port->serial, port,
646                                                 p_priv->resend_cont - 1);
647         }
648 }
649
650 static void     usa28_instat_callback(struct urb *urb)
651 {
652         int                                     err;
653         unsigned char                           *data = urb->transfer_buffer;
654         struct keyspan_usa28_portStatusMessage  *msg;
655         struct usb_serial                       *serial;
656         struct usb_serial_port                  *port;
657         struct keyspan_port_private             *p_priv;
658         struct tty_struct                       *tty;
659         int old_dcd_state;
660         int status = urb->status;
661
662         serial =  urb->context;
663
664         if (status) {
665                 dbg("%s - nonzero status: %x", __func__, status);
666                 return;
667         }
668
669         if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {
670                 dbg("%s - bad length %d", __func__, urb->actual_length);
671                 goto exit;
672         }
673
674         /*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __func__
675             data[0], data[1], data[2], data[3], data[4], data[5],
676             data[6], data[7], data[8], data[9], data[10], data[11]);*/
677
678         /* Now do something useful with the data */
679         msg = (struct keyspan_usa28_portStatusMessage *)data;
680
681         /* Check port number from message and retrieve private data */
682         if (msg->port >= serial->num_ports) {
683                 dbg("%s - Unexpected port number %d", __func__, msg->port);
684                 goto exit;
685         }
686         port = serial->port[msg->port];
687         p_priv = usb_get_serial_port_data(port);
688
689         /* Update handshaking pin state information */
690         old_dcd_state = p_priv->dcd_state;
691         p_priv->cts_state = ((msg->cts) ? 1 : 0);
692         p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
693         p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
694         p_priv->ri_state = ((msg->ri) ? 1 : 0);
695
696         if( old_dcd_state != p_priv->dcd_state && old_dcd_state) {
697                 tty = tty_port_tty_get(&port->port);
698                 if (tty && !C_CLOCAL(tty)) 
699                         tty_hangup(tty);
700                 tty_kref_put(tty);
701         }
702
703                 /* Resubmit urb so we continue receiving */
704         urb->dev = serial->dev;
705         err = usb_submit_urb(urb, GFP_ATOMIC);
706         if (err != 0)
707                 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
708 exit: ;
709 }
710
711 static void     usa28_glocont_callback(struct urb *urb)
712 {
713         dbg("%s", __func__);
714 }
715
716
717 static void     usa49_glocont_callback(struct urb *urb)
718 {
719         struct usb_serial *serial;
720         struct usb_serial_port *port;
721         struct keyspan_port_private *p_priv;
722         int i;
723
724         dbg("%s", __func__);
725
726         serial =  urb->context;
727         for (i = 0; i < serial->num_ports; ++i) {
728                 port = serial->port[i];
729                 p_priv = usb_get_serial_port_data(port);
730
731                 if (p_priv->resend_cont) {
732                         dbg("%s - sending setup", __func__);
733                         keyspan_usa49_send_setup(serial, port,
734                                                 p_priv->resend_cont - 1);
735                         break;
736                 }
737         }
738 }
739
740         /* This is actually called glostat in the Keyspan
741            doco */
742 static void     usa49_instat_callback(struct urb *urb)
743 {
744         int                                     err;
745         unsigned char                           *data = urb->transfer_buffer;
746         struct keyspan_usa49_portStatusMessage  *msg;
747         struct usb_serial                       *serial;
748         struct usb_serial_port                  *port;
749         struct keyspan_port_private             *p_priv;
750         int old_dcd_state;
751         int status = urb->status;
752
753         dbg("%s", __func__);
754
755         serial =  urb->context;
756
757         if (status) {
758                 dbg("%s - nonzero status: %x", __func__, status);
759                 return;
760         }
761
762         if (urb->actual_length !=
763                         sizeof(struct keyspan_usa49_portStatusMessage)) {
764                 dbg("%s - bad length %d", __func__, urb->actual_length);
765                 goto exit;
766         }
767
768         /*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __func__,
769             data[0], data[1], data[2], data[3], data[4], data[5],
770             data[6], data[7], data[8], data[9], data[10]);*/
771
772         /* Now do something useful with the data */
773         msg = (struct keyspan_usa49_portStatusMessage *)data;
774
775         /* Check port number from message and retrieve private data */
776         if (msg->portNumber >= serial->num_ports) {
777                 dbg("%s - Unexpected port number %d",
778                                         __func__, msg->portNumber);
779                 goto exit;
780         }
781         port = serial->port[msg->portNumber];
782         p_priv = usb_get_serial_port_data(port);
783
784         /* Update handshaking pin state information */
785         old_dcd_state = p_priv->dcd_state;
786         p_priv->cts_state = ((msg->cts) ? 1 : 0);
787         p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
788         p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
789         p_priv->ri_state = ((msg->ri) ? 1 : 0);
790
791         if (old_dcd_state != p_priv->dcd_state && old_dcd_state) {
792                 struct tty_struct *tty = tty_port_tty_get(&port->port);
793                 if (tty && !C_CLOCAL(tty))
794                         tty_hangup(tty);
795                 tty_kref_put(tty);
796         }
797
798         /* Resubmit urb so we continue receiving */
799         urb->dev = serial->dev;
800
801         err = usb_submit_urb(urb, GFP_ATOMIC);
802         if (err != 0)
803                 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
804 exit:   ;
805 }
806
807 static void     usa49_inack_callback(struct urb *urb)
808 {
809         dbg("%s", __func__);
810 }
811
812 static void     usa49_indat_callback(struct urb *urb)
813 {
814         int                     i, err;
815         int                     endpoint;
816         struct usb_serial_port  *port;
817         struct tty_struct       *tty;
818         unsigned char           *data = urb->transfer_buffer;
819         int status = urb->status;
820
821         dbg("%s", __func__);
822
823         endpoint = usb_pipeendpoint(urb->pipe);
824
825         if (status) {
826                 dbg("%s - nonzero status: %x on endpoint %d.", __func__,
827                     status, endpoint);
828                 return;
829         }
830
831         port =  urb->context;
832         tty = tty_port_tty_get(&port->port);
833         if (tty && urb->actual_length) {
834                 /* 0x80 bit is error flag */
835                 if ((data[0] & 0x80) == 0) {
836                         /* no error on any byte */
837                         tty_insert_flip_string(tty, data + 1,
838                                                 urb->actual_length - 1);
839                 } else {
840                         /* some bytes had errors, every byte has status */
841                         for (i = 0; i + 1 < urb->actual_length; i += 2) {
842                                 int stat = data[i], flag = 0;
843                                 if (stat & RXERROR_OVERRUN)
844                                         flag |= TTY_OVERRUN;
845                                 if (stat & RXERROR_FRAMING)
846                                         flag |= TTY_FRAME;
847                                 if (stat & RXERROR_PARITY)
848                                         flag |= TTY_PARITY;
849                                 /* XXX should handle break (0x10) */
850                                 tty_insert_flip_char(tty, data[i+1], flag);
851                         }
852                 }
853                 tty_flip_buffer_push(tty);
854         }
855         tty_kref_put(tty);
856
857         /* Resubmit urb so we continue receiving */
858         urb->dev = port->serial->dev;
859         if (port->port.count) {
860                 err = usb_submit_urb(urb, GFP_ATOMIC);
861                 if (err != 0)
862                         dbg("%s - resubmit read urb failed. (%d)",
863                                                         __func__, err);
864         }
865 }
866
867 static void usa49wg_indat_callback(struct urb *urb)
868 {
869         int                     i, len, x, err;
870         struct usb_serial       *serial;
871         struct usb_serial_port  *port;
872         struct tty_struct       *tty;
873         unsigned char           *data = urb->transfer_buffer;
874         int status = urb->status;
875
876         dbg("%s", __func__);
877
878         serial = urb->context;
879
880         if (status) {
881                 dbg("%s - nonzero status: %x", __func__, status);
882                 return;
883         }
884
885         /* inbound data is in the form P#, len, status, data */
886         i = 0;
887         len = 0;
888
889         if (urb->actual_length) {
890                 while (i < urb->actual_length) {
891
892                         /* Check port number from message*/
893                         if (data[i] >= serial->num_ports) {
894                                 dbg("%s - Unexpected port number %d",
895                                         __func__, data[i]);
896                                 return;
897                         }
898                         port = serial->port[data[i++]];
899                         tty = tty_port_tty_get(&port->port);
900                         len = data[i++];
901
902                         /* 0x80 bit is error flag */
903                         if ((data[i] & 0x80) == 0) {
904                                 /* no error on any byte */
905                                 i++;
906                                 for (x = 1; x < len ; ++x)
907                                         if (port->port.count)
908                                                 tty_insert_flip_char(tty,
909                                                                 data[i++], 0);
910                                         else
911                                                 i++;
912                         } else {
913                                 /*
914                                  * some bytes had errors, every byte has status
915                                  */
916                                 for (x = 0; x + 1 < len; x += 2) {
917                                         int stat = data[i], flag = 0;
918                                         if (stat & RXERROR_OVERRUN)
919                                                 flag |= TTY_OVERRUN;
920                                         if (stat & RXERROR_FRAMING)
921                                                 flag |= TTY_FRAME;
922                                         if (stat & RXERROR_PARITY)
923                                                 flag |= TTY_PARITY;
924                                         /* XXX should handle break (0x10) */
925                                         if (port->port.count)
926                                                 tty_insert_flip_char(tty,
927                                                         data[i+1], flag);
928                                         i += 2;
929                                 }
930                         }
931                         if (port->port.count)
932                                 tty_flip_buffer_push(tty);
933                         tty_kref_put(tty);
934                 }
935         }
936
937         /* Resubmit urb so we continue receiving */
938         urb->dev = serial->dev;
939
940         err = usb_submit_urb(urb, GFP_ATOMIC);
941         if (err != 0)
942                 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
943 }
944
945 /* not used, usa-49 doesn't have per-port control endpoints */
946 static void usa49_outcont_callback(struct urb *urb)
947 {
948         dbg("%s", __func__);
949 }
950
951 static void usa90_indat_callback(struct urb *urb)
952 {
953         int                     i, err;
954         int                     endpoint;
955         struct usb_serial_port  *port;
956         struct keyspan_port_private             *p_priv;
957         struct tty_struct       *tty;
958         unsigned char           *data = urb->transfer_buffer;
959         int status = urb->status;
960
961         dbg("%s", __func__);
962
963         endpoint = usb_pipeendpoint(urb->pipe);
964
965         if (status) {
966                 dbg("%s - nonzero status: %x on endpoint %d.",
967                     __func__, status, endpoint);
968                 return;
969         }
970
971         port =  urb->context;
972         p_priv = usb_get_serial_port_data(port);
973
974         if (urb->actual_length) {
975                 tty = tty_port_tty_get(&port->port);
976                 /* if current mode is DMA, looks like usa28 format
977                    otherwise looks like usa26 data format */
978
979                 if (p_priv->baud > 57600)
980                         tty_insert_flip_string(tty, data, urb->actual_length);
981                 else {
982                         /* 0x80 bit is error flag */
983                         if ((data[0] & 0x80) == 0) {
984                                 /* no errors on individual bytes, only
985                                    possible overrun err*/
986                                 if (data[0] & RXERROR_OVERRUN)
987                                         err = TTY_OVERRUN;
988                                 else
989                                         err = 0;
990                                 for (i = 1; i < urb->actual_length ; ++i)
991                                         tty_insert_flip_char(tty, data[i],
992                                                                         err);
993                         }  else {
994                         /* some bytes had errors, every byte has status */
995                                 dbg("%s - RX error!!!!", __func__);
996                                 for (i = 0; i + 1 < urb->actual_length; i += 2) {
997                                         int stat = data[i], flag = 0;
998                                         if (stat & RXERROR_OVERRUN)
999                                                 flag |= TTY_OVERRUN;
1000                                         if (stat & RXERROR_FRAMING)
1001                                                 flag |= TTY_FRAME;
1002                                         if (stat & RXERROR_PARITY)
1003                                                 flag |= TTY_PARITY;
1004                                         /* XXX should handle break (0x10) */
1005                                         tty_insert_flip_char(tty, data[i+1],
1006                                                                         flag);
1007                                 }
1008                         }
1009                 }
1010                 tty_flip_buffer_push(tty);
1011                 tty_kref_put(tty);
1012         }
1013
1014         /* Resubmit urb so we continue receiving */
1015         urb->dev = port->serial->dev;
1016         if (port->port.count) {
1017                 err = usb_submit_urb(urb, GFP_ATOMIC);
1018                 if (err != 0)
1019                         dbg("%s - resubmit read urb failed. (%d)",
1020                                                         __func__, err);
1021         }
1022         return;
1023 }
1024
1025
1026 static void     usa90_instat_callback(struct urb *urb)
1027 {
1028         unsigned char                           *data = urb->transfer_buffer;
1029         struct keyspan_usa90_portStatusMessage  *msg;
1030         struct usb_serial                       *serial;
1031         struct usb_serial_port                  *port;
1032         struct keyspan_port_private             *p_priv;
1033         struct tty_struct                       *tty;
1034         int old_dcd_state, err;
1035         int status = urb->status;
1036
1037         serial =  urb->context;
1038
1039         if (status) {
1040                 dbg("%s - nonzero status: %x", __func__, status);
1041                 return;
1042         }
1043         if (urb->actual_length < 14) {
1044                 dbg("%s - %d byte report??", __func__, urb->actual_length);
1045                 goto exit;
1046         }
1047
1048         msg = (struct keyspan_usa90_portStatusMessage *)data;
1049
1050         /* Now do something useful with the data */
1051
1052         port = serial->port[0];
1053         p_priv = usb_get_serial_port_data(port);
1054
1055         /* Update handshaking pin state information */
1056         old_dcd_state = p_priv->dcd_state;
1057         p_priv->cts_state = ((msg->cts) ? 1 : 0);
1058         p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1059         p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1060         p_priv->ri_state = ((msg->ri) ? 1 : 0);
1061
1062         if (old_dcd_state != p_priv->dcd_state && old_dcd_state) {
1063                 tty = tty_port_tty_get(&port->port);
1064                 if (tty && !C_CLOCAL(tty))
1065                         tty_hangup(tty);
1066                 tty_kref_put(tty);
1067         }
1068
1069         /* Resubmit urb so we continue receiving */
1070         urb->dev = serial->dev;
1071         err = usb_submit_urb(urb, GFP_ATOMIC);
1072         if (err != 0)
1073                 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
1074 exit:
1075         ;
1076 }
1077
1078 static void     usa90_outcont_callback(struct urb *urb)
1079 {
1080         struct usb_serial_port *port;
1081         struct keyspan_port_private *p_priv;
1082
1083         port =  urb->context;
1084         p_priv = usb_get_serial_port_data(port);
1085
1086         if (p_priv->resend_cont) {
1087                 dbg("%s - sending setup", __func__);
1088                 keyspan_usa90_send_setup(port->serial, port,
1089                                                 p_priv->resend_cont - 1);
1090         }
1091 }
1092
1093 /* Status messages from the 28xg */
1094 static void     usa67_instat_callback(struct urb *urb)
1095 {
1096         int                                     err;
1097         unsigned char                           *data = urb->transfer_buffer;
1098         struct keyspan_usa67_portStatusMessage  *msg;
1099         struct usb_serial                       *serial;
1100         struct usb_serial_port                  *port;
1101         struct keyspan_port_private             *p_priv;
1102         int old_dcd_state;
1103         int status = urb->status;
1104
1105         dbg("%s", __func__);
1106
1107         serial = urb->context;
1108
1109         if (status) {
1110                 dbg("%s - nonzero status: %x", __func__, status);
1111                 return;
1112         }
1113
1114         if (urb->actual_length !=
1115                         sizeof(struct keyspan_usa67_portStatusMessage)) {
1116                 dbg("%s - bad length %d", __func__, urb->actual_length);
1117                 return;
1118         }
1119
1120
1121         /* Now do something useful with the data */
1122         msg = (struct keyspan_usa67_portStatusMessage *)data;
1123
1124         /* Check port number from message and retrieve private data */
1125         if (msg->port >= serial->num_ports) {
1126                 dbg("%s - Unexpected port number %d", __func__, msg->port);
1127                 return;
1128         }
1129
1130         port = serial->port[msg->port];
1131         p_priv = usb_get_serial_port_data(port);
1132
1133         /* Update handshaking pin state information */
1134         old_dcd_state = p_priv->dcd_state;
1135         p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
1136         p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
1137
1138         if (old_dcd_state != p_priv->dcd_state && old_dcd_state) {
1139                 struct tty_struct *tty = tty_port_tty_get(&port->port);
1140                 if (tty && !C_CLOCAL(tty))
1141                         tty_hangup(tty);
1142                 tty_kref_put(tty);
1143         }
1144
1145         /* Resubmit urb so we continue receiving */
1146         urb->dev = serial->dev;
1147         err = usb_submit_urb(urb, GFP_ATOMIC);
1148         if (err != 0)
1149                 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
1150 }
1151
1152 static void usa67_glocont_callback(struct urb *urb)
1153 {
1154         struct usb_serial *serial;
1155         struct usb_serial_port *port;
1156         struct keyspan_port_private *p_priv;
1157         int i;
1158
1159         dbg("%s", __func__);
1160
1161         serial = urb->context;
1162         for (i = 0; i < serial->num_ports; ++i) {
1163                 port = serial->port[i];
1164                 p_priv = usb_get_serial_port_data(port);
1165
1166                 if (p_priv->resend_cont) {
1167                         dbg("%s - sending setup", __func__);
1168                         keyspan_usa67_send_setup(serial, port,
1169                                                 p_priv->resend_cont - 1);
1170                         break;
1171                 }
1172         }
1173 }
1174
1175 static int keyspan_write_room(struct tty_struct *tty)
1176 {
1177         struct usb_serial_port *port = tty->driver_data;
1178         struct keyspan_port_private     *p_priv;
1179         const struct keyspan_device_details     *d_details;
1180         int                             flip;
1181         int                             data_len;
1182         struct urb                      *this_urb;
1183
1184         dbg("%s", __func__);
1185         p_priv = usb_get_serial_port_data(port);
1186         d_details = p_priv->device_details;
1187
1188         /* FIXME: locking */
1189         if (d_details->msg_format == msg_usa90)
1190                 data_len = 64;
1191         else
1192                 data_len = 63;
1193
1194         flip = p_priv->out_flip;
1195
1196         /* Check both endpoints to see if any are available. */
1197         this_urb = p_priv->out_urbs[flip];
1198         if (this_urb != NULL) {
1199                 if (this_urb->status != -EINPROGRESS)
1200                         return data_len;
1201                 flip = (flip + 1) & d_details->outdat_endp_flip;
1202                 this_urb = p_priv->out_urbs[flip];
1203                 if (this_urb != NULL) {
1204                         if (this_urb->status != -EINPROGRESS)
1205                                 return data_len;
1206                 }
1207         }
1208         return 0;
1209 }
1210
1211
1212 static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
1213 {
1214         struct keyspan_port_private     *p_priv;
1215         struct keyspan_serial_private   *s_priv;
1216         struct usb_serial               *serial = port->serial;
1217         const struct keyspan_device_details     *d_details;
1218         int                             i, err;
1219         int                             baud_rate, device_port;
1220         struct urb                      *urb;
1221         unsigned int                    cflag = 0;
1222
1223         s_priv = usb_get_serial_data(serial);
1224         p_priv = usb_get_serial_port_data(port);
1225         d_details = p_priv->device_details;
1226
1227         dbg("%s - port%d.", __func__, port->number);
1228
1229         /* Set some sane defaults */
1230         p_priv->rts_state = 1;
1231         p_priv->dtr_state = 1;
1232         p_priv->baud = 9600;
1233
1234         /* force baud and lcr to be set on open */
1235         p_priv->old_baud = 0;
1236         p_priv->old_cflag = 0;
1237
1238         p_priv->out_flip = 0;
1239         p_priv->in_flip = 0;
1240
1241         /* Reset low level data toggle and start reading from endpoints */
1242         for (i = 0; i < 2; i++) {
1243                 urb = p_priv->in_urbs[i];
1244                 if (urb == NULL)
1245                         continue;
1246                 urb->dev = serial->dev;
1247
1248                 /* make sure endpoint data toggle is synchronized
1249                    with the device */
1250                 usb_clear_halt(urb->dev, urb->pipe);
1251                 err = usb_submit_urb(urb, GFP_KERNEL);
1252                 if (err != 0)
1253                         dbg("%s - submit urb %d failed (%d)",
1254                                                         __func__, i, err);
1255         }
1256
1257         /* Reset low level data toggle on out endpoints */
1258         for (i = 0; i < 2; i++) {
1259                 urb = p_priv->out_urbs[i];
1260                 if (urb == NULL)
1261                         continue;
1262                 urb->dev = serial->dev;
1263                 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1264                                                 usb_pipeout(urb->pipe), 0); */
1265         }
1266
1267         /* get the terminal config for the setup message now so we don't
1268          * need to send 2 of them */
1269
1270         device_port = port->number - port->serial->minor;
1271         if (tty) {
1272                 cflag = tty->termios->c_cflag;
1273                 /* Baud rate calculation takes baud rate as an integer
1274                    so other rates can be generated if desired. */
1275                 baud_rate = tty_get_baud_rate(tty);
1276                 /* If no match or invalid, leave as default */
1277                 if (baud_rate >= 0
1278                     && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
1279                                         NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1280                         p_priv->baud = baud_rate;
1281                 }
1282         }
1283         /* set CTS/RTS handshake etc. */
1284         p_priv->cflag = cflag;
1285         p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
1286
1287         keyspan_send_setup(port, 1);
1288         /* mdelay(100); */
1289         /* keyspan_set_termios(port, NULL); */
1290
1291         return 0;
1292 }
1293
1294 static inline void stop_urb(struct urb *urb)
1295 {
1296         if (urb && urb->status == -EINPROGRESS)
1297                 usb_kill_urb(urb);
1298 }
1299
1300 static void keyspan_dtr_rts(struct usb_serial_port *port, int on)
1301 {
1302         struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
1303
1304         p_priv->rts_state = on;
1305         p_priv->dtr_state = on;
1306         keyspan_send_setup(port, 0);
1307 }
1308
1309 static void keyspan_close(struct usb_serial_port *port)
1310 {
1311         int                     i;
1312         struct usb_serial       *serial = port->serial;
1313         struct keyspan_serial_private   *s_priv;
1314         struct keyspan_port_private     *p_priv;
1315
1316         dbg("%s", __func__);
1317         s_priv = usb_get_serial_data(serial);
1318         p_priv = usb_get_serial_port_data(port);
1319
1320         p_priv->rts_state = 0;
1321         p_priv->dtr_state = 0;
1322
1323         if (serial->dev) {
1324                 keyspan_send_setup(port, 2);
1325                 /* pilot-xfer seems to work best with this delay */
1326                 mdelay(100);
1327                 /* keyspan_set_termios(port, NULL); */
1328         }
1329
1330         /*while (p_priv->outcont_urb->status == -EINPROGRESS) {
1331                 dbg("%s - urb in progress", __func__);
1332         }*/
1333
1334         p_priv->out_flip = 0;
1335         p_priv->in_flip = 0;
1336
1337         if (serial->dev) {
1338                 /* Stop reading/writing urbs */
1339                 stop_urb(p_priv->inack_urb);
1340                 /* stop_urb(p_priv->outcont_urb); */
1341                 for (i = 0; i < 2; i++) {
1342                         stop_urb(p_priv->in_urbs[i]);
1343                         stop_urb(p_priv->out_urbs[i]);
1344                 }
1345         }
1346 }
1347
1348 /* download the firmware to a pre-renumeration device */
1349 static int keyspan_fake_startup(struct usb_serial *serial)
1350 {
1351         int                             response;
1352         const struct ihex_binrec        *record;
1353         char                            *fw_name;
1354         const struct firmware           *fw;
1355
1356         dbg("Keyspan startup version %04x product %04x",
1357             le16_to_cpu(serial->dev->descriptor.bcdDevice),
1358             le16_to_cpu(serial->dev->descriptor.idProduct));
1359
1360         if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)
1361                                                                 != 0x8000) {
1362                 dbg("Firmware already loaded.  Quitting.");
1363                 return 1;
1364         }
1365
1366                 /* Select firmware image on the basis of idProduct */
1367         switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1368         case keyspan_usa28_pre_product_id:
1369                 fw_name = "keyspan/usa28.fw";
1370                 break;
1371
1372         case keyspan_usa28x_pre_product_id:
1373                 fw_name = "keyspan/usa28x.fw";
1374                 break;
1375
1376         case keyspan_usa28xa_pre_product_id:
1377                 fw_name = "keyspan/usa28xa.fw";
1378                 break;
1379
1380         case keyspan_usa28xb_pre_product_id:
1381                 fw_name = "keyspan/usa28xb.fw";
1382                 break;
1383
1384         case keyspan_usa19_pre_product_id:
1385                 fw_name = "keyspan/usa19.fw";
1386                 break;
1387
1388         case keyspan_usa19qi_pre_product_id:
1389                 fw_name = "keyspan/usa19qi.fw";
1390                 break;
1391
1392         case keyspan_mpr_pre_product_id:
1393                 fw_name = "keyspan/mpr.fw";
1394                 break;
1395
1396         case keyspan_usa19qw_pre_product_id:
1397                 fw_name = "keyspan/usa19qw.fw";
1398                 break;
1399
1400         case keyspan_usa18x_pre_product_id:
1401                 fw_name = "keyspan/usa18x.fw";
1402                 break;
1403
1404         case keyspan_usa19w_pre_product_id:
1405                 fw_name = "keyspan/usa19w.fw";
1406                 break;
1407
1408         case keyspan_usa49w_pre_product_id:
1409                 fw_name = "keyspan/usa49w.fw";
1410                 break;
1411
1412         case keyspan_usa49wlc_pre_product_id:
1413                 fw_name = "keyspan/usa49wlc.fw";
1414                 break;
1415
1416         default:
1417                 dev_err(&serial->dev->dev, "Unknown product ID (%04x)\n",
1418                         le16_to_cpu(serial->dev->descriptor.idProduct));
1419                 return 1;
1420         }
1421
1422         if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
1423                 dev_err(&serial->dev->dev, "Required keyspan firmware image (%s) unavailable.\n", fw_name);
1424                 return(1);
1425         }
1426
1427         dbg("Uploading Keyspan %s firmware.", fw_name);
1428
1429                 /* download the firmware image */
1430         response = ezusb_set_reset(serial, 1);
1431
1432         record = (const struct ihex_binrec *)fw->data;
1433
1434         while (record) {
1435                 response = ezusb_writememory(serial, be32_to_cpu(record->addr),
1436                                              (unsigned char *)record->data,
1437                                              be16_to_cpu(record->len), 0xa0);
1438                 if (response < 0) {
1439                         dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan firmware (%d %04X %p %d)\n",
1440                                 response, be32_to_cpu(record->addr),
1441                                 record->data, be16_to_cpu(record->len));
1442                         break;
1443                 }
1444                 record = ihex_next_binrec(record);
1445         }
1446         release_firmware(fw);
1447                 /* bring device out of reset. Renumeration will occur in a
1448                    moment and the new device will bind to the real driver */
1449         response = ezusb_set_reset(serial, 0);
1450
1451         /* we don't want this device to have a driver assigned to it. */
1452         return 1;
1453 }
1454
1455 /* Helper functions used by keyspan_setup_urbs */
1456 static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *serial,
1457                                                      int endpoint)
1458 {
1459         struct usb_host_interface *iface_desc;
1460         struct usb_endpoint_descriptor *ep;
1461         int i;
1462
1463         iface_desc = serial->interface->cur_altsetting;
1464         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1465                 ep = &iface_desc->endpoint[i].desc;
1466                 if (ep->bEndpointAddress == endpoint)
1467                         return ep;
1468         }
1469         dev_warn(&serial->interface->dev, "found no endpoint descriptor for "
1470                  "endpoint %x\n", endpoint);
1471         return NULL;
1472 }
1473
1474 static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
1475                                       int dir, void *ctx, char *buf, int len,
1476                                       void (*callback)(struct urb *))
1477 {
1478         struct urb *urb;
1479         struct usb_endpoint_descriptor const *ep_desc;
1480         char const *ep_type_name;
1481
1482         if (endpoint == -1)
1483                 return NULL;            /* endpoint not needed */
1484
1485         dbg("%s - alloc for endpoint %d.", __func__, endpoint);
1486         urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
1487         if (urb == NULL) {
1488                 dbg("%s - alloc for endpoint %d failed.", __func__, endpoint);
1489                 return NULL;
1490         }
1491
1492         if (endpoint == 0) {
1493                 /* control EP filled in when used */
1494                 return urb;
1495         }
1496
1497         ep_desc = find_ep(serial, endpoint);
1498         if (!ep_desc) {
1499                 /* leak the urb, something's wrong and the callers don't care */
1500                 return urb;
1501         }
1502         if (usb_endpoint_xfer_int(ep_desc)) {
1503                 ep_type_name = "INT";
1504                 usb_fill_int_urb(urb, serial->dev,
1505                                  usb_sndintpipe(serial->dev, endpoint) | dir,
1506                                  buf, len, callback, ctx,
1507                                  ep_desc->bInterval);
1508         } else if (usb_endpoint_xfer_bulk(ep_desc)) {
1509                 ep_type_name = "BULK";
1510                 usb_fill_bulk_urb(urb, serial->dev,
1511                                   usb_sndbulkpipe(serial->dev, endpoint) | dir,
1512                                   buf, len, callback, ctx);
1513         } else {
1514                 dev_warn(&serial->interface->dev,
1515                          "unsupported endpoint type %x\n",
1516                          usb_endpoint_type(ep_desc));
1517                 usb_free_urb(urb);
1518                 return NULL;
1519         }
1520
1521         dbg("%s - using urb %p for %s endpoint %x",
1522             __func__, urb, ep_type_name, endpoint);
1523         return urb;
1524 }
1525
1526 static struct callbacks {
1527         void    (*instat_callback)(struct urb *);
1528         void    (*glocont_callback)(struct urb *);
1529         void    (*indat_callback)(struct urb *);
1530         void    (*outdat_callback)(struct urb *);
1531         void    (*inack_callback)(struct urb *);
1532         void    (*outcont_callback)(struct urb *);
1533 } keyspan_callbacks[] = {
1534         {
1535                 /* msg_usa26 callbacks */
1536                 .instat_callback =      usa26_instat_callback,
1537                 .glocont_callback =     usa26_glocont_callback,
1538                 .indat_callback =       usa26_indat_callback,
1539                 .outdat_callback =      usa2x_outdat_callback,
1540                 .inack_callback =       usa26_inack_callback,
1541                 .outcont_callback =     usa26_outcont_callback,
1542         }, {
1543                 /* msg_usa28 callbacks */
1544                 .instat_callback =      usa28_instat_callback,
1545                 .glocont_callback =     usa28_glocont_callback,
1546                 .indat_callback =       usa28_indat_callback,
1547                 .outdat_callback =      usa2x_outdat_callback,
1548                 .inack_callback =       usa28_inack_callback,
1549                 .outcont_callback =     usa28_outcont_callback,
1550         }, {
1551                 /* msg_usa49 callbacks */
1552                 .instat_callback =      usa49_instat_callback,
1553                 .glocont_callback =     usa49_glocont_callback,
1554                 .indat_callback =       usa49_indat_callback,
1555                 .outdat_callback =      usa2x_outdat_callback,
1556                 .inack_callback =       usa49_inack_callback,
1557                 .outcont_callback =     usa49_outcont_callback,
1558         }, {
1559                 /* msg_usa90 callbacks */
1560                 .instat_callback =      usa90_instat_callback,
1561                 .glocont_callback =     usa28_glocont_callback,
1562                 .indat_callback =       usa90_indat_callback,
1563                 .outdat_callback =      usa2x_outdat_callback,
1564                 .inack_callback =       usa28_inack_callback,
1565                 .outcont_callback =     usa90_outcont_callback,
1566         }, {
1567                 /* msg_usa67 callbacks */
1568                 .instat_callback =      usa67_instat_callback,
1569                 .glocont_callback =     usa67_glocont_callback,
1570                 .indat_callback =       usa26_indat_callback,
1571                 .outdat_callback =      usa2x_outdat_callback,
1572                 .inack_callback =       usa26_inack_callback,
1573                 .outcont_callback =     usa26_outcont_callback,
1574         }
1575 };
1576
1577         /* Generic setup urbs function that uses
1578            data in device_details */
1579 static void keyspan_setup_urbs(struct usb_serial *serial)
1580 {
1581         int                             i, j;
1582         struct keyspan_serial_private   *s_priv;
1583         const struct keyspan_device_details     *d_details;
1584         struct usb_serial_port          *port;
1585         struct keyspan_port_private     *p_priv;
1586         struct callbacks                *cback;
1587         int                             endp;
1588
1589         dbg("%s", __func__);
1590
1591         s_priv = usb_get_serial_data(serial);
1592         d_details = s_priv->device_details;
1593
1594         /* Setup values for the various callback routines */
1595         cback = &keyspan_callbacks[d_details->msg_format];
1596
1597         /* Allocate and set up urbs for each one that is in use,
1598            starting with instat endpoints */
1599         s_priv->instat_urb = keyspan_setup_urb
1600                 (serial, d_details->instat_endpoint, USB_DIR_IN,
1601                  serial, s_priv->instat_buf, INSTAT_BUFLEN,
1602                  cback->instat_callback);
1603
1604         s_priv->indat_urb = keyspan_setup_urb
1605                 (serial, d_details->indat_endpoint, USB_DIR_IN,
1606                  serial, s_priv->indat_buf, INDAT49W_BUFLEN,
1607                  usa49wg_indat_callback);
1608
1609         s_priv->glocont_urb = keyspan_setup_urb
1610                 (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1611                  serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1612                  cback->glocont_callback);
1613
1614         /* Setup endpoints for each port specific thing */
1615         for (i = 0; i < d_details->num_ports; i++) {
1616                 port = serial->port[i];
1617                 p_priv = usb_get_serial_port_data(port);
1618
1619                 /* Do indat endpoints first, once for each flip */
1620                 endp = d_details->indat_endpoints[i];
1621                 for (j = 0; j <= d_details->indat_endp_flip; ++j, ++endp) {
1622                         p_priv->in_urbs[j] = keyspan_setup_urb
1623                                 (serial, endp, USB_DIR_IN, port,
1624                                  p_priv->in_buffer[j], 64,
1625                                  cback->indat_callback);
1626                 }
1627                 for (; j < 2; ++j)
1628                         p_priv->in_urbs[j] = NULL;
1629
1630                 /* outdat endpoints also have flip */
1631                 endp = d_details->outdat_endpoints[i];
1632                 for (j = 0; j <= d_details->outdat_endp_flip; ++j, ++endp) {
1633                         p_priv->out_urbs[j] = keyspan_setup_urb
1634                                 (serial, endp, USB_DIR_OUT, port,
1635                                  p_priv->out_buffer[j], 64,
1636                                  cback->outdat_callback);
1637                 }
1638                 for (; j < 2; ++j)
1639                         p_priv->out_urbs[j] = NULL;
1640
1641                 /* inack endpoint */
1642                 p_priv->inack_urb = keyspan_setup_urb
1643                         (serial, d_details->inack_endpoints[i], USB_DIR_IN,
1644                          port, p_priv->inack_buffer, 1, cback->inack_callback);
1645
1646                 /* outcont endpoint */
1647                 p_priv->outcont_urb = keyspan_setup_urb
1648                         (serial, d_details->outcont_endpoints[i], USB_DIR_OUT,
1649                          port, p_priv->outcont_buffer, 64,
1650                          cback->outcont_callback);
1651         }
1652 }
1653
1654 /* usa19 function doesn't require prescaler */
1655 static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1656                                    u8 *rate_low, u8 *prescaler, int portnum)
1657 {
1658         u32     b16,    /* baud rate times 16 (actual rate used internally) */
1659                 div,    /* divisor */
1660                 cnt;    /* inverse of divisor (programmed into 8051) */
1661
1662         dbg("%s - %d.", __func__, baud_rate);
1663
1664         /* prevent divide by zero...  */
1665         b16 = baud_rate * 16L;
1666         if (b16 == 0)
1667                 return KEYSPAN_INVALID_BAUD_RATE;
1668         /* Any "standard" rate over 57k6 is marginal on the USA-19
1669            as we run out of divisor resolution. */
1670         if (baud_rate > 57600)
1671                 return KEYSPAN_INVALID_BAUD_RATE;
1672
1673         /* calculate the divisor and the counter (its inverse) */
1674         div = baudclk / b16;
1675         if (div == 0)
1676                 return KEYSPAN_INVALID_BAUD_RATE;
1677         else
1678                 cnt = 0 - div;
1679
1680         if (div > 0xffff)
1681                 return KEYSPAN_INVALID_BAUD_RATE;
1682
1683         /* return the counter values if non-null */
1684         if (rate_low)
1685                 *rate_low = (u8) (cnt & 0xff);
1686         if (rate_hi)
1687                 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1688         if (rate_low && rate_hi)
1689                 dbg("%s - %d %02x %02x.",
1690                                 __func__, baud_rate, *rate_hi, *rate_low);
1691         return KEYSPAN_BAUD_RATE_OK;
1692 }
1693
1694 /* usa19hs function doesn't require prescaler */
1695 static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1696                                    u8 *rate_low, u8 *prescaler, int portnum)
1697 {
1698         u32     b16,    /* baud rate times 16 (actual rate used internally) */
1699                         div;    /* divisor */
1700
1701         dbg("%s - %d.", __func__, baud_rate);
1702
1703         /* prevent divide by zero...  */
1704         b16 = baud_rate * 16L;
1705         if (b16 == 0)
1706                 return KEYSPAN_INVALID_BAUD_RATE;
1707
1708         /* calculate the divisor */
1709         div = baudclk / b16;
1710         if (div == 0)
1711                 return KEYSPAN_INVALID_BAUD_RATE;
1712
1713         if (div > 0xffff)
1714                 return KEYSPAN_INVALID_BAUD_RATE;
1715
1716         /* return the counter values if non-null */
1717         if (rate_low)
1718                 *rate_low = (u8) (div & 0xff);
1719
1720         if (rate_hi)
1721                 *rate_hi = (u8) ((div >> 8) & 0xff);
1722
1723         if (rate_low && rate_hi)
1724                 dbg("%s - %d %02x %02x.",
1725                         __func__, baud_rate, *rate_hi, *rate_low);
1726
1727         return KEYSPAN_BAUD_RATE_OK;
1728 }
1729
1730 static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1731                                     u8 *rate_low, u8 *prescaler, int portnum)
1732 {
1733         u32     b16,    /* baud rate times 16 (actual rate used internally) */
1734                 clk,    /* clock with 13/8 prescaler */
1735                 div,    /* divisor using 13/8 prescaler */
1736                 res,    /* resulting baud rate using 13/8 prescaler */
1737                 diff,   /* error using 13/8 prescaler */
1738                 smallest_diff;
1739         u8      best_prescaler;
1740         int     i;
1741
1742         dbg("%s - %d.", __func__, baud_rate);
1743
1744         /* prevent divide by zero */
1745         b16 = baud_rate * 16L;
1746         if (b16 == 0)
1747                 return KEYSPAN_INVALID_BAUD_RATE;
1748
1749         /* Calculate prescaler by trying them all and looking
1750            for best fit */
1751
1752         /* start with largest possible difference */
1753         smallest_diff = 0xffffffff;
1754
1755                 /* 0 is an invalid prescaler, used as a flag */
1756         best_prescaler = 0;
1757
1758         for (i = 8; i <= 0xff; ++i) {
1759                 clk = (baudclk * 8) / (u32) i;
1760
1761                 div = clk / b16;
1762                 if (div == 0)
1763                         continue;
1764
1765                 res = clk / div;
1766                 diff = (res > b16) ? (res-b16) : (b16-res);
1767
1768                 if (diff < smallest_diff) {
1769                         best_prescaler = i;
1770                         smallest_diff = diff;
1771                 }
1772         }
1773
1774         if (best_prescaler == 0)
1775                 return KEYSPAN_INVALID_BAUD_RATE;
1776
1777         clk = (baudclk * 8) / (u32) best_prescaler;
1778         div = clk / b16;
1779
1780         /* return the divisor and prescaler if non-null */
1781         if (rate_low)
1782                 *rate_low = (u8) (div & 0xff);
1783         if (rate_hi)
1784                 *rate_hi = (u8) ((div >> 8) & 0xff);
1785         if (prescaler) {
1786                 *prescaler = best_prescaler;
1787                 /*  dbg("%s - %d %d", __func__, *prescaler, div); */
1788         }
1789         return KEYSPAN_BAUD_RATE_OK;
1790 }
1791
1792         /* USA-28 supports different maximum baud rates on each port */
1793 static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1794                                     u8 *rate_low, u8 *prescaler, int portnum)
1795 {
1796         u32     b16,    /* baud rate times 16 (actual rate used internally) */
1797                 div,    /* divisor */
1798                 cnt;    /* inverse of divisor (programmed into 8051) */
1799
1800         dbg("%s - %d.", __func__, baud_rate);
1801
1802                 /* prevent divide by zero */
1803         b16 = baud_rate * 16L;
1804         if (b16 == 0)
1805                 return KEYSPAN_INVALID_BAUD_RATE;
1806
1807         /* calculate the divisor and the counter (its inverse) */
1808         div = KEYSPAN_USA28_BAUDCLK / b16;
1809         if (div == 0)
1810                 return KEYSPAN_INVALID_BAUD_RATE;
1811         else
1812                 cnt = 0 - div;
1813
1814         /* check for out of range, based on portnum,
1815            and return result */
1816         if (portnum == 0) {
1817                 if (div > 0xffff)
1818                         return KEYSPAN_INVALID_BAUD_RATE;
1819         } else {
1820                 if (portnum == 1) {
1821                         if (div > 0xff)
1822                                 return KEYSPAN_INVALID_BAUD_RATE;
1823                 } else
1824                         return KEYSPAN_INVALID_BAUD_RATE;
1825         }
1826
1827                 /* return the counter values if not NULL
1828                    (port 1 will ignore retHi) */
1829         if (rate_low)
1830                 *rate_low = (u8) (cnt & 0xff);
1831         if (rate_hi)
1832                 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1833         dbg("%s - %d OK.", __func__, baud_rate);
1834         return KEYSPAN_BAUD_RATE_OK;
1835 }
1836
1837 static int keyspan_usa26_send_setup(struct usb_serial *serial,
1838                                     struct usb_serial_port *port,
1839                                     int reset_port)
1840 {
1841         struct keyspan_usa26_portControlMessage msg;
1842         struct keyspan_serial_private           *s_priv;
1843         struct keyspan_port_private             *p_priv;
1844         const struct keyspan_device_details     *d_details;
1845         int                                     outcont_urb;
1846         struct urb                              *this_urb;
1847         int                                     device_port, err;
1848
1849         dbg("%s reset=%d", __func__, reset_port);
1850
1851         s_priv = usb_get_serial_data(serial);
1852         p_priv = usb_get_serial_port_data(port);
1853         d_details = s_priv->device_details;
1854         device_port = port->number - port->serial->minor;
1855
1856         outcont_urb = d_details->outcont_endpoints[port->number];
1857         this_urb = p_priv->outcont_urb;
1858
1859         dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe));
1860
1861                 /* Make sure we have an urb then send the message */
1862         if (this_urb == NULL) {
1863                 dbg("%s - oops no urb.", __func__);
1864                 return -1;
1865         }
1866
1867         /* Save reset port val for resend.
1868            Don't overwrite resend for open/close condition. */
1869         if ((reset_port + 1) > p_priv->resend_cont)
1870                 p_priv->resend_cont = reset_port + 1;
1871         if (this_urb->status == -EINPROGRESS) {
1872                 /*  dbg("%s - already writing", __func__); */
1873                 mdelay(5);
1874                 return -1;
1875         }
1876
1877         memset(&msg, 0, sizeof(struct keyspan_usa26_portControlMessage));
1878
1879         /* Only set baud rate if it's changed */
1880         if (p_priv->old_baud != p_priv->baud) {
1881                 p_priv->old_baud = p_priv->baud;
1882                 msg.setClocking = 0xff;
1883                 if (d_details->calculate_baud_rate
1884                     (p_priv->baud, d_details->baudclk, &msg.baudHi,
1885                      &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
1886                         dbg("%s - Invalid baud rate %d requested, using 9600.",
1887                                                 __func__, p_priv->baud);
1888                         msg.baudLo = 0;
1889                         msg.baudHi = 125;       /* Values for 9600 baud */
1890                         msg.prescaler = 10;
1891                 }
1892                 msg.setPrescaler = 0xff;
1893         }
1894
1895         msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
1896         switch (p_priv->cflag & CSIZE) {
1897         case CS5:
1898                 msg.lcr |= USA_DATABITS_5;
1899                 break;
1900         case CS6:
1901                 msg.lcr |= USA_DATABITS_6;
1902                 break;
1903         case CS7:
1904                 msg.lcr |= USA_DATABITS_7;
1905                 break;
1906         case CS8:
1907                 msg.lcr |= USA_DATABITS_8;
1908                 break;
1909         }
1910         if (p_priv->cflag & PARENB) {
1911                 /* note USA_PARITY_NONE == 0 */
1912                 msg.lcr |= (p_priv->cflag & PARODD)?
1913                         USA_PARITY_ODD : USA_PARITY_EVEN;
1914         }
1915         msg.setLcr = 0xff;
1916
1917         msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1918         msg.xonFlowControl = 0;
1919         msg.setFlowControl = 0xff;
1920         msg.forwardingLength = 16;
1921         msg.xonChar = 17;
1922         msg.xoffChar = 19;
1923
1924         /* Opening port */
1925         if (reset_port == 1) {
1926                 msg._txOn = 1;
1927                 msg._txOff = 0;
1928                 msg.txFlush = 0;
1929                 msg.txBreak = 0;
1930                 msg.rxOn = 1;
1931                 msg.rxOff = 0;
1932                 msg.rxFlush = 1;
1933                 msg.rxForward = 0;
1934                 msg.returnStatus = 0;
1935                 msg.resetDataToggle = 0xff;
1936         }
1937
1938         /* Closing port */
1939         else if (reset_port == 2) {
1940                 msg._txOn = 0;
1941                 msg._txOff = 1;
1942                 msg.txFlush = 0;
1943                 msg.txBreak = 0;
1944                 msg.rxOn = 0;
1945                 msg.rxOff = 1;
1946                 msg.rxFlush = 1;
1947                 msg.rxForward = 0;
1948                 msg.returnStatus = 0;
1949                 msg.resetDataToggle = 0;
1950         }
1951
1952         /* Sending intermediate configs */
1953         else {
1954                 msg._txOn = (!p_priv->break_on);
1955                 msg._txOff = 0;
1956                 msg.txFlush = 0;
1957                 msg.txBreak = (p_priv->break_on);
1958                 msg.rxOn = 0;
1959                 msg.rxOff = 0;
1960                 msg.rxFlush = 0;
1961                 msg.rxForward = 0;
1962                 msg.returnStatus = 0;
1963                 msg.resetDataToggle = 0x0;
1964         }
1965
1966         /* Do handshaking outputs */
1967         msg.setTxTriState_setRts = 0xff;
1968         msg.txTriState_rts = p_priv->rts_state;
1969
1970         msg.setHskoa_setDtr = 0xff;
1971         msg.hskoa_dtr = p_priv->dtr_state;
1972
1973         p_priv->resend_cont = 0;
1974         memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
1975
1976         /* send the data out the device on control endpoint */
1977         this_urb->transfer_buffer_length = sizeof(msg);
1978
1979         this_urb->dev = serial->dev;
1980         err = usb_submit_urb(this_urb, GFP_ATOMIC);
1981         if (err != 0)
1982                 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
1983 #if 0
1984         else {
1985                 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__
1986                     outcont_urb, this_urb->transfer_buffer_length,
1987                     usb_pipeendpoint(this_urb->pipe));
1988         }
1989 #endif
1990
1991         return 0;
1992 }
1993
1994 static int keyspan_usa28_send_setup(struct usb_serial *serial,
1995                                     struct usb_serial_port *port,
1996                                     int reset_port)
1997 {
1998         struct keyspan_usa28_portControlMessage msg;
1999         struct keyspan_serial_private           *s_priv;
2000         struct keyspan_port_private             *p_priv;
2001         const struct keyspan_device_details     *d_details;
2002         struct urb                              *this_urb;
2003         int                                     device_port, err;
2004
2005         dbg("%s", __func__);
2006
2007         s_priv = usb_get_serial_data(serial);
2008         p_priv = usb_get_serial_port_data(port);
2009         d_details = s_priv->device_details;
2010         device_port = port->number - port->serial->minor;
2011
2012         /* only do something if we have a bulk out endpoint */
2013         this_urb = p_priv->outcont_urb;
2014         if (this_urb == NULL) {
2015                 dbg("%s - oops no urb.", __func__);
2016                 return -1;
2017         }
2018
2019         /* Save reset port val for resend.
2020            Don't overwrite resend for open/close condition. */
2021         if ((reset_port + 1) > p_priv->resend_cont)
2022                 p_priv->resend_cont = reset_port + 1;
2023         if (this_urb->status == -EINPROGRESS) {
2024                 dbg("%s already writing", __func__);
2025                 mdelay(5);
2026                 return -1;
2027         }
2028
2029         memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));
2030
2031         msg.setBaudRate = 1;
2032         if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2033                 &msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2034                 dbg("%s - Invalid baud rate requested %d.",
2035                                                 __func__, p_priv->baud);
2036                 msg.baudLo = 0xff;
2037                 msg.baudHi = 0xb2;      /* Values for 9600 baud */
2038         }
2039
2040         /* If parity is enabled, we must calculate it ourselves. */
2041         msg.parity = 0;         /* XXX for now */
2042
2043         msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2044         msg.xonFlowControl = 0;
2045
2046         /* Do handshaking outputs, DTR is inverted relative to RTS */
2047         msg.rts = p_priv->rts_state;
2048         msg.dtr = p_priv->dtr_state;
2049
2050         msg.forwardingLength = 16;
2051         msg.forwardMs = 10;
2052         msg.breakThreshold = 45;
2053         msg.xonChar = 17;
2054         msg.xoffChar = 19;
2055
2056         /*msg.returnStatus = 1;
2057         msg.resetDataToggle = 0xff;*/
2058         /* Opening port */
2059         if (reset_port == 1) {
2060                 msg._txOn = 1;
2061                 msg._txOff = 0;
2062                 msg.txFlush = 0;
2063                 msg.txForceXoff = 0;
2064                 msg.txBreak = 0;
2065                 msg.rxOn = 1;
2066                 msg.rxOff = 0;
2067                 msg.rxFlush = 1;
2068                 msg.rxForward = 0;
2069                 msg.returnStatus = 0;
2070                 msg.resetDataToggle = 0xff;
2071         }
2072         /* Closing port */
2073         else if (reset_port == 2) {
2074                 msg._txOn = 0;
2075                 msg._txOff = 1;
2076                 msg.txFlush = 0;
2077                 msg.txForceXoff = 0;
2078                 msg.txBreak = 0;
2079                 msg.rxOn = 0;
2080                 msg.rxOff = 1;
2081                 msg.rxFlush = 1;
2082                 msg.rxForward = 0;
2083                 msg.returnStatus = 0;
2084                 msg.resetDataToggle = 0;
2085         }
2086         /* Sending intermediate configs */
2087         else {
2088                 msg._txOn = (!p_priv->break_on);
2089                 msg._txOff = 0;
2090                 msg.txFlush = 0;
2091                 msg.txForceXoff = 0;
2092                 msg.txBreak = (p_priv->break_on);
2093                 msg.rxOn = 0;
2094                 msg.rxOff = 0;
2095                 msg.rxFlush = 0;
2096                 msg.rxForward = 0;
2097                 msg.returnStatus = 0;
2098                 msg.resetDataToggle = 0x0;
2099         }
2100
2101         p_priv->resend_cont = 0;
2102         memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2103
2104         /* send the data out the device on control endpoint */
2105         this_urb->transfer_buffer_length = sizeof(msg);
2106
2107         this_urb->dev = serial->dev;
2108         err = usb_submit_urb(this_urb, GFP_ATOMIC);
2109         if (err != 0)
2110                 dbg("%s - usb_submit_urb(setup) failed", __func__);
2111 #if 0
2112         else {
2113                 dbg("%s - usb_submit_urb(setup) OK %d bytes", __func__,
2114                     this_urb->transfer_buffer_length);
2115         }
2116 #endif
2117
2118         return 0;
2119 }
2120
2121 static int keyspan_usa49_send_setup(struct usb_serial *serial,
2122                                     struct usb_serial_port *port,
2123                                     int reset_port)
2124 {
2125         struct keyspan_usa49_portControlMessage msg;
2126         struct usb_ctrlrequest                  *dr = NULL;
2127         struct keyspan_serial_private           *s_priv;
2128         struct keyspan_port_private             *p_priv;
2129         const struct keyspan_device_details     *d_details;
2130         struct urb                              *this_urb;
2131         int                                     err, device_port;
2132
2133         dbg("%s", __func__);
2134
2135         s_priv = usb_get_serial_data(serial);
2136         p_priv = usb_get_serial_port_data(port);
2137         d_details = s_priv->device_details;
2138
2139         this_urb = s_priv->glocont_urb;
2140
2141         /* Work out which port within the device is being setup */
2142         device_port = port->number - port->serial->minor;
2143
2144         dbg("%s - endpoint %d port %d (%d)",
2145                         __func__, usb_pipeendpoint(this_urb->pipe),
2146                         port->number, device_port);
2147
2148                 /* Make sure we have an urb then send the message */
2149         if (this_urb == NULL) {
2150                 dbg("%s - oops no urb for port %d.", __func__, port->number);
2151                 return -1;
2152         }
2153
2154         /* Save reset port val for resend.
2155            Don't overwrite resend for open/close condition. */
2156         if ((reset_port + 1) > p_priv->resend_cont)
2157                 p_priv->resend_cont = reset_port + 1;
2158
2159         if (this_urb->status == -EINPROGRESS) {
2160                 /*  dbg("%s - already writing", __func__); */
2161                 mdelay(5);
2162                 return -1;
2163         }
2164
2165         memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage));
2166
2167         /*msg.portNumber = port->number;*/
2168         msg.portNumber = device_port;
2169
2170         /* Only set baud rate if it's changed */
2171         if (p_priv->old_baud != p_priv->baud) {
2172                 p_priv->old_baud = p_priv->baud;
2173                 msg.setClocking = 0xff;
2174                 if (d_details->calculate_baud_rate
2175                     (p_priv->baud, d_details->baudclk, &msg.baudHi,
2176                      &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2177                         dbg("%s - Invalid baud rate %d requested, using 9600.",
2178                                                 __func__, p_priv->baud);
2179                         msg.baudLo = 0;
2180                         msg.baudHi = 125;       /* Values for 9600 baud */
2181                         msg.prescaler = 10;
2182                 }
2183                 /* msg.setPrescaler = 0xff; */
2184         }
2185
2186         msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2187         switch (p_priv->cflag & CSIZE) {
2188         case CS5:
2189                 msg.lcr |= USA_DATABITS_5;
2190                 break;
2191         case CS6:
2192                 msg.lcr |= USA_DATABITS_6;
2193                 break;
2194         case CS7:
2195                 msg.lcr |= USA_DATABITS_7;
2196                 break;
2197         case CS8:
2198                 msg.lcr |= USA_DATABITS_8;
2199                 break;
2200         }
2201         if (p_priv->cflag & PARENB) {
2202                 /* note USA_PARITY_NONE == 0 */
2203                 msg.lcr |= (p_priv->cflag & PARODD)?
2204                         USA_PARITY_ODD : USA_PARITY_EVEN;
2205         }
2206         msg.setLcr = 0xff;
2207
2208         msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2209         msg.xonFlowControl = 0;
2210         msg.setFlowControl = 0xff;
2211
2212         msg.forwardingLength = 16;
2213         msg.xonChar = 17;
2214         msg.xoffChar = 19;
2215
2216         /* Opening port */
2217         if (reset_port == 1) {
2218                 msg._txOn = 1;
2219                 msg._txOff = 0;
2220                 msg.txFlush = 0;
2221                 msg.txBreak = 0;
2222                 msg.rxOn = 1;
2223                 msg.rxOff = 0;
2224                 msg.rxFlush = 1;
2225                 msg.rxForward = 0;
2226                 msg.returnStatus = 0;
2227                 msg.resetDataToggle = 0xff;
2228                 msg.enablePort = 1;
2229                 msg.disablePort = 0;
2230         }
2231         /* Closing port */
2232         else if (reset_port == 2) {
2233                 msg._txOn = 0;
2234                 msg._txOff = 1;
2235                 msg.txFlush = 0;
2236                 msg.txBreak = 0;
2237                 msg.rxOn = 0;
2238                 msg.rxOff = 1;
2239                 msg.rxFlush = 1;
2240                 msg.rxForward = 0;
2241                 msg.returnStatus = 0;
2242                 msg.resetDataToggle = 0;
2243                 msg.enablePort = 0;
2244                 msg.disablePort = 1;
2245         }
2246         /* Sending intermediate configs */
2247         else {
2248                 msg._txOn = (!p_priv->break_on);
2249                 msg._txOff = 0;
2250                 msg.txFlush = 0;
2251                 msg.txBreak = (p_priv->break_on);
2252                 msg.rxOn = 0;
2253                 msg.rxOff = 0;
2254                 msg.rxFlush = 0;
2255                 msg.rxForward = 0;
2256                 msg.returnStatus = 0;
2257                 msg.resetDataToggle = 0x0;
2258                 msg.enablePort = 0;
2259                 msg.disablePort = 0;
2260         }
2261
2262         /* Do handshaking outputs */
2263         msg.setRts = 0xff;
2264         msg.rts = p_priv->rts_state;
2265
2266         msg.setDtr = 0xff;
2267         msg.dtr = p_priv->dtr_state;
2268
2269         p_priv->resend_cont = 0;
2270
2271         /* if the device is a 49wg, we send control message on usb
2272            control EP 0 */
2273
2274         if (d_details->product_id == keyspan_usa49wg_product_id) {
2275                 dr = (void *)(s_priv->ctrl_buf);
2276                 dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;
2277                 dr->bRequest = 0xB0;    /* 49wg control message */;
2278                 dr->wValue = 0;
2279                 dr->wIndex = 0;
2280                 dr->wLength = cpu_to_le16(sizeof(msg));
2281
2282                 memcpy(s_priv->glocont_buf, &msg, sizeof(msg));
2283
2284                 usb_fill_control_urb(this_urb, serial->dev,
2285                                 usb_sndctrlpipe(serial->dev, 0),
2286                                 (unsigned char *)dr, s_priv->glocont_buf,
2287                                 sizeof(msg), usa49_glocont_callback, serial);
2288
2289         } else {
2290                 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2291
2292                 /* send the data out the device on control endpoint */
2293                 this_urb->transfer_buffer_length = sizeof(msg);
2294
2295                 this_urb->dev = serial->dev;
2296         }
2297         err = usb_submit_urb(this_urb, GFP_ATOMIC);
2298         if (err != 0)
2299                 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
2300 #if 0
2301         else {
2302                 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__,
2303                            outcont_urb, this_urb->transfer_buffer_length,
2304                            usb_pipeendpoint(this_urb->pipe));
2305         }
2306 #endif
2307
2308         return 0;
2309 }
2310
2311 static int keyspan_usa90_send_setup(struct usb_serial *serial,
2312                                     struct usb_serial_port *port,
2313                                     int reset_port)
2314 {
2315         struct keyspan_usa90_portControlMessage msg;
2316         struct keyspan_serial_private           *s_priv;
2317         struct keyspan_port_private             *p_priv;
2318         const struct keyspan_device_details     *d_details;
2319         struct urb                              *this_urb;
2320         int                                     err;
2321         u8                                              prescaler;
2322
2323         dbg("%s", __func__);
2324
2325         s_priv = usb_get_serial_data(serial);
2326         p_priv = usb_get_serial_port_data(port);
2327         d_details = s_priv->device_details;
2328
2329         /* only do something if we have a bulk out endpoint */
2330         this_urb = p_priv->outcont_urb;
2331         if (this_urb == NULL) {
2332                 dbg("%s - oops no urb.", __func__);
2333                 return -1;
2334         }
2335
2336         /* Save reset port val for resend.
2337            Don't overwrite resend for open/close condition. */
2338         if ((reset_port + 1) > p_priv->resend_cont)
2339                 p_priv->resend_cont = reset_port + 1;
2340         if (this_urb->status == -EINPROGRESS) {
2341                 dbg("%s already writing", __func__);
2342                 mdelay(5);
2343                 return -1;
2344         }
2345
2346         memset(&msg, 0, sizeof(struct keyspan_usa90_portControlMessage));
2347
2348         /* Only set baud rate if it's changed */
2349         if (p_priv->old_baud != p_priv->baud) {
2350                 p_priv->old_baud = p_priv->baud;
2351                 msg.setClocking = 0x01;
2352                 if (d_details->calculate_baud_rate
2353                     (p_priv->baud, d_details->baudclk, &msg.baudHi,
2354                      &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) {
2355                         dbg("%s - Invalid baud rate %d requested, using 9600.",
2356                                                 __func__, p_priv->baud);
2357                         p_priv->baud = 9600;
2358                         d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2359                                 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2360                 }
2361                 msg.setRxMode = 1;
2362                 msg.setTxMode = 1;
2363         }
2364
2365         /* modes must always be correctly specified */
2366         if (p_priv->baud > 57600) {
2367                 msg.rxMode = RXMODE_DMA;
2368                 msg.txMode = TXMODE_DMA;
2369         } else {
2370                 msg.rxMode = RXMODE_BYHAND;
2371                 msg.txMode = TXMODE_BYHAND;
2372         }
2373
2374         msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2375         switch (p_priv->cflag & CSIZE) {
2376         case CS5:
2377                 msg.lcr |= USA_DATABITS_5;
2378                 break;
2379         case CS6:
2380                 msg.lcr |= USA_DATABITS_6;
2381                 break;
2382         case CS7:
2383                 msg.lcr |= USA_DATABITS_7;
2384                 break;
2385         case CS8:
2386                 msg.lcr |= USA_DATABITS_8;
2387                 break;
2388         }
2389         if (p_priv->cflag & PARENB) {
2390                 /* note USA_PARITY_NONE == 0 */
2391                 msg.lcr |= (p_priv->cflag & PARODD)?
2392                         USA_PARITY_ODD : USA_PARITY_EVEN;
2393         }
2394         if (p_priv->old_cflag != p_priv->cflag) {
2395                 p_priv->old_cflag = p_priv->cflag;
2396                 msg.setLcr = 0x01;
2397         }
2398
2399         if (p_priv->flow_control == flow_cts)
2400                 msg.txFlowControl = TXFLOW_CTS;
2401         msg.setTxFlowControl = 0x01;
2402         msg.setRxFlowControl = 0x01;
2403
2404         msg.rxForwardingLength = 16;
2405         msg.rxForwardingTimeout = 16;
2406         msg.txAckSetting = 0;
2407         msg.xonChar = 17;
2408         msg.xoffChar = 19;
2409
2410         /* Opening port */
2411         if (reset_port == 1) {
2412                 msg.portEnabled = 1;
2413                 msg.rxFlush = 1;
2414                 msg.txBreak = (p_priv->break_on);
2415         }
2416         /* Closing port */
2417         else if (reset_port == 2)
2418                 msg.portEnabled = 0;
2419         /* Sending intermediate configs */
2420         else {
2421                 if (port->port.count)
2422                         msg.portEnabled = 1;
2423                 msg.txBreak = (p_priv->break_on);
2424         }
2425
2426         /* Do handshaking outputs */
2427         msg.setRts = 0x01;
2428         msg.rts = p_priv->rts_state;
2429
2430         msg.setDtr = 0x01;
2431         msg.dtr = p_priv->dtr_state;
2432
2433         p_priv->resend_cont = 0;
2434         memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2435
2436         /* send the data out the device on control endpoint */
2437         this_urb->transfer_buffer_length = sizeof(msg);
2438
2439         this_urb->dev = serial->dev;
2440         err = usb_submit_urb(this_urb, GFP_ATOMIC);
2441         if (err != 0)
2442                 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
2443         return 0;
2444 }
2445
2446 static int keyspan_usa67_send_setup(struct usb_serial *serial,
2447                                     struct usb_serial_port *port,
2448                                     int reset_port)
2449 {
2450         struct keyspan_usa67_portControlMessage msg;
2451         struct keyspan_serial_private           *s_priv;
2452         struct keyspan_port_private             *p_priv;
2453         const struct keyspan_device_details     *d_details;
2454         struct urb                              *this_urb;
2455         int                                     err, device_port;
2456
2457         dbg("%s", __func__);
2458
2459         s_priv = usb_get_serial_data(serial);
2460         p_priv = usb_get_serial_port_data(port);
2461         d_details = s_priv->device_details;
2462
2463         this_urb = s_priv->glocont_urb;
2464
2465         /* Work out which port within the device is being setup */
2466         device_port = port->number - port->serial->minor;
2467
2468         /* Make sure we have an urb then send the message */
2469         if (this_urb == NULL) {
2470                 dbg("%s - oops no urb for port %d.", __func__,
2471                         port->number);
2472                 return -1;
2473         }
2474
2475         /* Save reset port val for resend.
2476            Don't overwrite resend for open/close condition. */
2477         if ((reset_port + 1) > p_priv->resend_cont)
2478                 p_priv->resend_cont = reset_port + 1;
2479         if (this_urb->status == -EINPROGRESS) {
2480                 /*  dbg("%s - already writing", __func__); */
2481                 mdelay(5);
2482                 return -1;
2483         }
2484
2485         memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
2486
2487         msg.port = device_port;
2488
2489         /* Only set baud rate if it's changed */
2490         if (p_priv->old_baud != p_priv->baud) {
2491                 p_priv->old_baud = p_priv->baud;
2492                 msg.setClocking = 0xff;
2493                 if (d_details->calculate_baud_rate
2494                     (p_priv->baud, d_details->baudclk, &msg.baudHi,
2495                      &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2496                         dbg("%s - Invalid baud rate %d requested, using 9600.",
2497                                                 __func__, p_priv->baud);
2498                         msg.baudLo = 0;
2499                         msg.baudHi = 125;       /* Values for 9600 baud */
2500                         msg.prescaler = 10;
2501                 }
2502                 msg.setPrescaler = 0xff;
2503         }
2504
2505         msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2506         switch (p_priv->cflag & CSIZE) {
2507         case CS5:
2508                 msg.lcr |= USA_DATABITS_5;
2509                 break;
2510         case CS6:
2511                 msg.lcr |= USA_DATABITS_6;
2512                 break;
2513         case CS7:
2514                 msg.lcr |= USA_DATABITS_7;
2515                 break;
2516         case CS8:
2517                 msg.lcr |= USA_DATABITS_8;
2518                 break;
2519         }
2520         if (p_priv->cflag & PARENB) {
2521                 /* note USA_PARITY_NONE == 0 */
2522                 msg.lcr |= (p_priv->cflag & PARODD)?
2523                                         USA_PARITY_ODD : USA_PARITY_EVEN;
2524         }
2525         msg.setLcr = 0xff;
2526
2527         msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2528         msg.xonFlowControl = 0;
2529         msg.setFlowControl = 0xff;
2530         msg.forwardingLength = 16;
2531         msg.xonChar = 17;
2532         msg.xoffChar = 19;
2533
2534         if (reset_port == 1) {
2535                 /* Opening port */
2536                 msg._txOn = 1;
2537                 msg._txOff = 0;
2538                 msg.txFlush = 0;
2539                 msg.txBreak = 0;
2540                 msg.rxOn = 1;
2541                 msg.rxOff = 0;
2542                 msg.rxFlush = 1;
2543                 msg.rxForward = 0;
2544                 msg.returnStatus = 0;
2545                 msg.resetDataToggle = 0xff;
2546         } else if (reset_port == 2) {
2547                 /* Closing port */
2548                 msg._txOn = 0;
2549                 msg._txOff = 1;
2550                 msg.txFlush = 0;
2551                 msg.txBreak = 0;
2552                 msg.rxOn = 0;
2553                 msg.rxOff = 1;
2554                 msg.rxFlush = 1;
2555                 msg.rxForward = 0;
2556                 msg.returnStatus = 0;
2557                 msg.resetDataToggle = 0;
2558         } else {
2559                 /* Sending intermediate configs */
2560                 msg._txOn = (!p_priv->break_on);
2561                 msg._txOff = 0;
2562                 msg.txFlush = 0;
2563                 msg.txBreak = (p_priv->break_on);
2564                 msg.rxOn = 0;
2565                 msg.rxOff = 0;
2566                 msg.rxFlush = 0;
2567                 msg.rxForward = 0;
2568                 msg.returnStatus = 0;
2569                 msg.resetDataToggle = 0x0;
2570         }
2571
2572         /* Do handshaking outputs */
2573         msg.setTxTriState_setRts = 0xff;
2574         msg.txTriState_rts = p_priv->rts_state;
2575
2576         msg.setHskoa_setDtr = 0xff;
2577         msg.hskoa_dtr = p_priv->dtr_state;
2578
2579         p_priv->resend_cont = 0;
2580
2581         memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2582
2583         /* send the data out the device on control endpoint */
2584         this_urb->transfer_buffer_length = sizeof(msg);
2585         this_urb->dev = serial->dev;
2586
2587         err = usb_submit_urb(this_urb, GFP_ATOMIC);
2588         if (err != 0)
2589                 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__,
2590                                 err);
2591         return 0;
2592 }
2593
2594 static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2595 {
2596         struct usb_serial *serial = port->serial;
2597         struct keyspan_serial_private *s_priv;
2598         const struct keyspan_device_details *d_details;
2599
2600         dbg("%s", __func__);
2601
2602         s_priv = usb_get_serial_data(serial);
2603         d_details = s_priv->device_details;
2604
2605         switch (d_details->msg_format) {
2606         case msg_usa26:
2607                 keyspan_usa26_send_setup(serial, port, reset_port);
2608                 break;
2609         case msg_usa28:
2610                 keyspan_usa28_send_setup(serial, port, reset_port);
2611                 break;
2612         case msg_usa49:
2613                 keyspan_usa49_send_setup(serial, port, reset_port);
2614                 break;
2615         case msg_usa90:
2616                 keyspan_usa90_send_setup(serial, port, reset_port);
2617                 break;
2618         case msg_usa67:
2619                 keyspan_usa67_send_setup(serial, port, reset_port);
2620                 break;
2621         }
2622 }
2623
2624
2625 /* Gets called by the "real" driver (ie once firmware is loaded
2626    and renumeration has taken place. */
2627 static int keyspan_startup(struct usb_serial *serial)
2628 {
2629         int                             i, err;
2630         struct usb_serial_port          *port;
2631         struct keyspan_serial_private   *s_priv;
2632         struct keyspan_port_private     *p_priv;
2633         const struct keyspan_device_details     *d_details;
2634
2635         dbg("%s", __func__);
2636
2637         for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2638                 if (d_details->product_id ==
2639                                 le16_to_cpu(serial->dev->descriptor.idProduct))
2640                         break;
2641         if (d_details == NULL) {
2642                 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2643                     __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2644                 return 1;
2645         }
2646
2647         /* Setup private data for serial driver */
2648         s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2649         if (!s_priv) {
2650                 dbg("%s - kmalloc for keyspan_serial_private failed.",
2651                                                                 __func__);
2652                 return -ENOMEM;
2653         }
2654
2655         s_priv->device_details = d_details;
2656         usb_set_serial_data(serial, s_priv);
2657
2658         /* Now setup per port private data */
2659         for (i = 0; i < serial->num_ports; i++) {
2660                 port = serial->port[i];
2661                 p_priv = kzalloc(sizeof(struct keyspan_port_private),
2662                                                                 GFP_KERNEL);
2663                 if (!p_priv) {
2664                         dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __func__, i);
2665                         return 1;
2666                 }
2667                 p_priv->device_details = d_details;
2668                 usb_set_serial_port_data(port, p_priv);
2669         }
2670
2671         keyspan_setup_urbs(serial);
2672
2673         if (s_priv->instat_urb != NULL) {
2674                 s_priv->instat_urb->dev = serial->dev;
2675                 err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);
2676                 if (err != 0)
2677                         dbg("%s - submit instat urb failed %d", __func__,
2678                                 err);
2679         }
2680         if (s_priv->indat_urb != NULL) {
2681                 s_priv->indat_urb->dev = serial->dev;
2682                 err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);
2683                 if (err != 0)
2684                         dbg("%s - submit indat urb failed %d", __func__,
2685                                 err);
2686         }
2687
2688         return 0;
2689 }
2690
2691 static void keyspan_disconnect(struct usb_serial *serial)
2692 {
2693         int                             i, j;
2694         struct usb_serial_port          *port;
2695         struct keyspan_serial_private   *s_priv;
2696         struct keyspan_port_private     *p_priv;
2697
2698         dbg("%s", __func__);
2699
2700         s_priv = usb_get_serial_data(serial);
2701
2702         /* Stop reading/writing urbs */
2703         stop_urb(s_priv->instat_urb);
2704         stop_urb(s_priv->glocont_urb);
2705         stop_urb(s_priv->indat_urb);
2706         for (i = 0; i < serial->num_ports; ++i) {
2707                 port = serial->port[i];
2708                 p_priv = usb_get_serial_port_data(port);
2709                 stop_urb(p_priv->inack_urb);
2710                 stop_urb(p_priv->outcont_urb);
2711                 for (j = 0; j < 2; j++) {
2712                         stop_urb(p_priv->in_urbs[j]);
2713                         stop_urb(p_priv->out_urbs[j]);
2714                 }
2715         }
2716
2717         /* Now free them */
2718         usb_free_urb(s_priv->instat_urb);
2719         usb_free_urb(s_priv->indat_urb);
2720         usb_free_urb(s_priv->glocont_urb);
2721         for (i = 0; i < serial->num_ports; ++i) {
2722                 port = serial->port[i];
2723                 p_priv = usb_get_serial_port_data(port);
2724                 usb_free_urb(p_priv->inack_urb);
2725                 usb_free_urb(p_priv->outcont_urb);
2726                 for (j = 0; j < 2; j++) {
2727                         usb_free_urb(p_priv->in_urbs[j]);
2728                         usb_free_urb(p_priv->out_urbs[j]);
2729                 }
2730         }
2731 }
2732
2733 static void keyspan_release(struct usb_serial *serial)
2734 {
2735         int                             i;
2736         struct usb_serial_port          *port;
2737         struct keyspan_serial_private   *s_priv;
2738
2739         dbg("%s", __func__);
2740
2741         s_priv = usb_get_serial_data(serial);
2742
2743         /*  dbg("Freeing serial->private."); */
2744         kfree(s_priv);
2745
2746         /*  dbg("Freeing port->private."); */
2747         /* Now free per port private data */
2748         for (i = 0; i < serial->num_ports; i++) {
2749                 port = serial->port[i];
2750                 kfree(usb_get_serial_port_data(port));
2751         }
2752 }
2753
2754 MODULE_AUTHOR(DRIVER_AUTHOR);
2755 MODULE_DESCRIPTION(DRIVER_DESC);
2756 MODULE_LICENSE("GPL");
2757
2758 MODULE_FIRMWARE("keyspan/usa28.fw");
2759 MODULE_FIRMWARE("keyspan/usa28x.fw");
2760 MODULE_FIRMWARE("keyspan/usa28xa.fw");
2761 MODULE_FIRMWARE("keyspan/usa28xb.fw");
2762 MODULE_FIRMWARE("keyspan/usa19.fw");
2763 MODULE_FIRMWARE("keyspan/usa19qi.fw");
2764 MODULE_FIRMWARE("keyspan/mpr.fw");
2765 MODULE_FIRMWARE("keyspan/usa19qw.fw");
2766 MODULE_FIRMWARE("keyspan/usa18x.fw");
2767 MODULE_FIRMWARE("keyspan/usa19w.fw");
2768 MODULE_FIRMWARE("keyspan/usa49w.fw");
2769 MODULE_FIRMWARE("keyspan/usa49wlc.fw");
2770
2771 module_param(debug, bool, S_IRUGO | S_IWUSR);
2772 MODULE_PARM_DESC(debug, "Debug enabled or not");
2773