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