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