2 Keyspan USB to Serial Converter driver
4 (C) Copyright (C) 2000-2001 Hugh Blemings <hugh@blemings.org>
5 (C) Copyright (C) 2002 Greg Kroah-Hartman <greg@kroah.com>
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.
12 See http://misc.nu/hugh/keyspan.html for more information.
14 Code in this driver inspired by and in a number of places taken
15 from Brian Warner's original Keyspan-PDA driver.
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.
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
26 Tip 'o the hat to IBM (and previously Linuxcare :) for supporting
27 staff in their work on open source projects.
31 2003sep04 LPM (Keyspan) add support for new single port product USA19HS.
32 Improve setup message handling for all devices.
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.
39 2003jan30 LPM add support for the 49WLC and MPR
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.
49 Fri Oct 12 16:45:00 EST 2001
50 Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
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.
60 Fri Oct 12 16:45:00 EST 2001
61 Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
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.
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.
71 Thu May 31 11:56:42 PDT 2001 gkh
72 switched from using spinlock to a semaphore
75 Identify version on module load.
77 (11/01/2000) Adam J. Richter
78 usb_device_id table support.
80 Tue Oct 10 23:15:33 EST 2000 Hugh
81 Merged Paul's changes with my USA-49W mods. Work in progress
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.
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.
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...
98 #include <linux/kernel.h>
99 #include <linux/jiffies.h>
100 #include <linux/errno.h>
101 #include <linux/init.h>
102 #include <linux/slab.h>
103 #include <linux/tty.h>
104 #include <linux/tty_driver.h>
105 #include <linux/tty_flip.h>
106 #include <linux/module.h>
107 #include <linux/spinlock.h>
108 #include <linux/firmware.h>
109 #include <linux/ihex.h>
110 #include <linux/uaccess.h>
111 #include <linux/usb.h>
112 #include <linux/usb/serial.h>
118 * Version Information
120 #define DRIVER_VERSION "v1.1.5"
121 #define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
122 #define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
124 #define INSTAT_BUFLEN 32
125 #define GLOCONT_BUFLEN 64
126 #define INDAT49W_BUFLEN 512
128 /* Per device and per port private data */
129 struct keyspan_serial_private {
130 const struct keyspan_device_details *device_details;
132 struct urb *instat_urb;
133 char instat_buf[INSTAT_BUFLEN];
135 /* added to support 49wg, where data from all 4 ports comes in
136 on 1 EP and high-speed supported */
137 struct urb *indat_urb;
138 char indat_buf[INDAT49W_BUFLEN];
140 /* XXX this one probably will need a lock */
141 struct urb *glocont_urb;
142 char glocont_buf[GLOCONT_BUFLEN];
143 char ctrl_buf[8]; /* for EP0 control message */
146 struct keyspan_port_private {
147 /* Keep track of which input & output endpoints to use */
151 /* Keep duplicate of device details in each port
152 structure as well - simplifies some of the
153 callback functions etc. */
154 const struct keyspan_device_details *device_details;
156 /* Input endpoints and buffer for this port */
157 struct urb *in_urbs[2];
158 char in_buffer[2][64];
159 /* Output endpoints and buffer for this port */
160 struct urb *out_urbs[2];
161 char out_buffer[2][64];
163 /* Input ack endpoint */
164 struct urb *inack_urb;
165 char inack_buffer[1];
167 /* Output control endpoint */
168 struct urb *outcont_urb;
169 char outcont_buffer[64];
171 /* Settings for the port */
175 unsigned int old_cflag;
176 enum {flow_none, flow_cts, flow_xon} flow_control;
177 int rts_state; /* Handshaking pins (outputs) */
179 int cts_state; /* Handshaking pins (inputs) */
185 unsigned long tx_start_time[2];
186 int resend_cont; /* need to resend control packet */
189 /* Include Keyspan message headers. All current Keyspan Adapters
190 make use of one of five message formats which are referred
191 to as USA-26, USA-28, USA-49, USA-90, USA-67 by Keyspan and
192 within this driver. */
193 #include "keyspan_usa26msg.h"
194 #include "keyspan_usa28msg.h"
195 #include "keyspan_usa49msg.h"
196 #include "keyspan_usa90msg.h"
197 #include "keyspan_usa67msg.h"
200 /* Functions used by new usb-serial code. */
201 static int __init keyspan_init(void)
204 retval = usb_serial_register(&keyspan_pre_device);
206 goto failed_pre_device_register;
207 retval = usb_serial_register(&keyspan_1port_device);
209 goto failed_1port_device_register;
210 retval = usb_serial_register(&keyspan_2port_device);
212 goto failed_2port_device_register;
213 retval = usb_serial_register(&keyspan_4port_device);
215 goto failed_4port_device_register;
216 retval = usb_register(&keyspan_driver);
218 goto failed_usb_register;
220 info(DRIVER_VERSION ":" DRIVER_DESC);
224 usb_serial_deregister(&keyspan_4port_device);
225 failed_4port_device_register:
226 usb_serial_deregister(&keyspan_2port_device);
227 failed_2port_device_register:
228 usb_serial_deregister(&keyspan_1port_device);
229 failed_1port_device_register:
230 usb_serial_deregister(&keyspan_pre_device);
231 failed_pre_device_register:
235 static void __exit keyspan_exit(void)
237 usb_deregister(&keyspan_driver);
238 usb_serial_deregister(&keyspan_pre_device);
239 usb_serial_deregister(&keyspan_1port_device);
240 usb_serial_deregister(&keyspan_2port_device);
241 usb_serial_deregister(&keyspan_4port_device);
244 module_init(keyspan_init);
245 module_exit(keyspan_exit);
247 static void keyspan_break_ctl(struct tty_struct *tty, int break_state)
249 struct usb_serial_port *port = tty->driver_data;
250 struct keyspan_port_private *p_priv;
254 p_priv = usb_get_serial_port_data(port);
256 if (break_state == -1)
257 p_priv->break_on = 1;
259 p_priv->break_on = 0;
261 keyspan_send_setup(port, 0);
265 static void keyspan_set_termios(struct tty_struct *tty,
266 struct usb_serial_port *port, struct ktermios *old_termios)
268 int baud_rate, device_port;
269 struct keyspan_port_private *p_priv;
270 const struct keyspan_device_details *d_details;
275 p_priv = usb_get_serial_port_data(port);
276 d_details = p_priv->device_details;
277 cflag = tty->termios->c_cflag;
278 device_port = port->number - port->serial->minor;
280 /* Baud rate calculation takes baud rate as an integer
281 so other rates can be generated if desired. */
282 baud_rate = tty_get_baud_rate(tty);
283 /* If no match or invalid, don't change */
284 if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
285 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
286 /* FIXME - more to do here to ensure rate changes cleanly */
287 /* FIXME - calcuate exact rate from divisor ? */
288 p_priv->baud = baud_rate;
290 baud_rate = tty_termios_baud_rate(old_termios);
292 tty_encode_baud_rate(tty, baud_rate, baud_rate);
293 /* set CTS/RTS handshake etc. */
294 p_priv->cflag = cflag;
295 p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
297 /* Mark/Space not supported */
298 tty->termios->c_cflag &= ~CMSPAR;
300 keyspan_send_setup(port, 0);
303 static int keyspan_tiocmget(struct tty_struct *tty, struct file *file)
305 struct usb_serial_port *port = tty->driver_data;
306 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
309 value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
310 ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
311 ((p_priv->cts_state) ? TIOCM_CTS : 0) |
312 ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
313 ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
314 ((p_priv->ri_state) ? TIOCM_RNG : 0);
319 static int keyspan_tiocmset(struct tty_struct *tty, struct file *file,
320 unsigned int set, unsigned int clear)
322 struct usb_serial_port *port = tty->driver_data;
323 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
326 p_priv->rts_state = 1;
328 p_priv->dtr_state = 1;
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);
337 /* Write function is similar for the four protocols used
338 with only a minor change for usa90 (usa19hs) required */
339 static int keyspan_write(struct tty_struct *tty,
340 struct usb_serial_port *port, const unsigned char *buf, int count)
342 struct keyspan_port_private *p_priv;
343 const struct keyspan_device_details *d_details;
346 struct urb *this_urb;
347 int err, maxDataLen, dataOffset;
349 p_priv = usb_get_serial_port_data(port);
350 d_details = p_priv->device_details;
352 if (d_details->msg_format == msg_usa90) {
360 dbg("%s - for port %d (%d chars), flip=%d",
361 __func__, port->number, count, p_priv->out_flip);
363 for (left = count; left > 0; left -= todo) {
365 if (todo > maxDataLen)
368 flip = p_priv->out_flip;
370 /* Check we have a valid urb/endpoint before we use it... */
371 this_urb = p_priv->out_urbs[flip];
372 if (this_urb == NULL) {
373 /* no bulk out, so return 0 bytes written */
374 dbg("%s - no output urb :(", __func__);
378 dbg("%s - endpoint %d flip %d",
379 __func__, usb_pipeendpoint(this_urb->pipe), flip);
381 if (this_urb->status == -EINPROGRESS) {
382 if (time_before(jiffies,
383 p_priv->tx_start_time[flip] + 10 * HZ))
385 usb_unlink_urb(this_urb);
389 /* First byte in buffer is "last flag" (except for usa19hx)
390 - unused so for now so set to zero */
391 ((char *)this_urb->transfer_buffer)[0] = 0;
393 memcpy(this_urb->transfer_buffer + dataOffset, buf, todo);
396 /* send the data out the bulk port */
397 this_urb->transfer_buffer_length = todo + dataOffset;
399 this_urb->dev = port->serial->dev;
400 err = usb_submit_urb(this_urb, GFP_ATOMIC);
402 dbg("usb_submit_urb(write bulk) failed (%d)", err);
403 p_priv->tx_start_time[flip] = jiffies;
405 /* Flip for next time if usa26 or usa28 interface
406 (not used on usa49) */
407 p_priv->out_flip = (flip + 1) & d_details->outdat_endp_flip;
413 static void usa26_indat_callback(struct urb *urb)
417 struct usb_serial_port *port;
418 struct tty_struct *tty;
419 unsigned char *data = urb->transfer_buffer;
420 int status = urb->status;
424 endpoint = usb_pipeendpoint(urb->pipe);
427 dbg("%s - nonzero status: %x on endpoint %d.",
428 __func__, status, endpoint);
433 tty = port->port.tty;
434 if (tty && urb->actual_length) {
435 /* 0x80 bit is error flag */
436 if ((data[0] & 0x80) == 0) {
437 /* no errors on individual bytes, only
438 possible overrun err */
439 if (data[0] & RXERROR_OVERRUN)
443 for (i = 1; i < urb->actual_length ; ++i)
444 tty_insert_flip_char(tty, data[i], err);
446 /* some bytes had errors, every byte has status */
447 dbg("%s - RX error!!!!", __func__);
448 for (i = 0; i + 1 < urb->actual_length; i += 2) {
449 int stat = data[i], flag = 0;
450 if (stat & RXERROR_OVERRUN)
452 if (stat & RXERROR_FRAMING)
454 if (stat & RXERROR_PARITY)
456 /* XXX should handle break (0x10) */
457 tty_insert_flip_char(tty, data[i+1], flag);
460 tty_flip_buffer_push(tty);
463 /* Resubmit urb so we continue receiving */
464 urb->dev = port->serial->dev;
465 if (port->port.count) {
466 err = usb_submit_urb(urb, GFP_ATOMIC);
468 dbg("%s - resubmit read urb failed. (%d)",
474 /* Outdat handling is common for all devices */
475 static void usa2x_outdat_callback(struct urb *urb)
477 struct usb_serial_port *port;
478 struct keyspan_port_private *p_priv;
481 p_priv = usb_get_serial_port_data(port);
482 dbg("%s - urb %d", __func__, urb == p_priv->out_urbs[1]);
484 if (port->port.count)
485 usb_serial_port_softint(port);
488 static void usa26_inack_callback(struct urb *urb)
494 static void usa26_outcont_callback(struct urb *urb)
496 struct usb_serial_port *port;
497 struct keyspan_port_private *p_priv;
500 p_priv = usb_get_serial_port_data(port);
502 if (p_priv->resend_cont) {
503 dbg("%s - sending setup", __func__);
504 keyspan_usa26_send_setup(port->serial, port,
505 p_priv->resend_cont - 1);
509 static void usa26_instat_callback(struct urb *urb)
511 unsigned char *data = urb->transfer_buffer;
512 struct keyspan_usa26_portStatusMessage *msg;
513 struct usb_serial *serial;
514 struct usb_serial_port *port;
515 struct keyspan_port_private *p_priv;
516 int old_dcd_state, err;
517 int status = urb->status;
519 serial = urb->context;
522 dbg("%s - nonzero status: %x", __func__, status);
525 if (urb->actual_length != 9) {
526 dbg("%s - %d byte report??", __func__, urb->actual_length);
530 msg = (struct keyspan_usa26_portStatusMessage *)data;
533 dbg("%s - port status: port %d cts %d dcd %d dsr %d ri %d toff %d txoff %d rxen %d cr %d",
534 __func__, msg->port, msg->hskia_cts, msg->gpia_dcd, msg->dsr, msg->ri, msg->_txOff,
535 msg->_txXoff, msg->rxEnabled, msg->controlResponse);
538 /* Now do something useful with the data */
541 /* Check port number from message and retrieve private data */
542 if (msg->port >= serial->num_ports) {
543 dbg("%s - Unexpected port number %d", __func__, msg->port);
546 port = serial->port[msg->port];
547 p_priv = usb_get_serial_port_data(port);
549 /* Update handshaking pin state information */
550 old_dcd_state = p_priv->dcd_state;
551 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
552 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
553 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
554 p_priv->ri_state = ((msg->ri) ? 1 : 0);
556 if (port->port.tty && !C_CLOCAL(port->port.tty)
557 && old_dcd_state != p_priv->dcd_state) {
559 tty_hangup(port->port.tty);
561 /* wake_up_interruptible(&p_priv->open_wait); */
564 /* Resubmit urb so we continue receiving */
565 urb->dev = serial->dev;
566 err = usb_submit_urb(urb, GFP_ATOMIC);
568 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
572 static void usa26_glocont_callback(struct urb *urb)
578 static void usa28_indat_callback(struct urb *urb)
581 struct usb_serial_port *port;
582 struct tty_struct *tty;
584 struct keyspan_port_private *p_priv;
585 int status = urb->status;
590 p_priv = usb_get_serial_port_data(port);
591 data = urb->transfer_buffer;
593 if (urb != p_priv->in_urbs[p_priv->in_flip])
598 dbg("%s - nonzero status: %x on endpoint %d.",
599 __func__, status, usb_pipeendpoint(urb->pipe));
604 p_priv = usb_get_serial_port_data(port);
605 data = urb->transfer_buffer;
607 tty = port->port.tty;
608 if (urb->actual_length) {
609 for (i = 0; i < urb->actual_length ; ++i)
610 tty_insert_flip_char(tty, data[i], 0);
611 tty_flip_buffer_push(tty);
614 /* Resubmit urb so we continue receiving */
615 urb->dev = port->serial->dev;
616 if (port->port.count) {
617 err = usb_submit_urb(urb, GFP_ATOMIC);
619 dbg("%s - resubmit read urb failed. (%d)",
622 p_priv->in_flip ^= 1;
624 urb = p_priv->in_urbs[p_priv->in_flip];
625 } while (urb->status != -EINPROGRESS);
628 static void usa28_inack_callback(struct urb *urb)
633 static void usa28_outcont_callback(struct urb *urb)
635 struct usb_serial_port *port;
636 struct keyspan_port_private *p_priv;
639 p_priv = usb_get_serial_port_data(port);
641 if (p_priv->resend_cont) {
642 dbg("%s - sending setup", __func__);
643 keyspan_usa28_send_setup(port->serial, port,
644 p_priv->resend_cont - 1);
648 static void usa28_instat_callback(struct urb *urb)
651 unsigned char *data = urb->transfer_buffer;
652 struct keyspan_usa28_portStatusMessage *msg;
653 struct usb_serial *serial;
654 struct usb_serial_port *port;
655 struct keyspan_port_private *p_priv;
657 int status = urb->status;
659 serial = urb->context;
662 dbg("%s - nonzero status: %x", __func__, status);
666 if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {
667 dbg("%s - bad length %d", __func__, urb->actual_length);
671 /*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __func__
672 data[0], data[1], data[2], data[3], data[4], data[5],
673 data[6], data[7], data[8], data[9], data[10], data[11]);*/
675 /* Now do something useful with the data */
676 msg = (struct keyspan_usa28_portStatusMessage *)data;
678 /* Check port number from message and retrieve private data */
679 if (msg->port >= serial->num_ports) {
680 dbg("%s - Unexpected port number %d", __func__, msg->port);
683 port = serial->port[msg->port];
684 p_priv = usb_get_serial_port_data(port);
686 /* Update handshaking pin state information */
687 old_dcd_state = p_priv->dcd_state;
688 p_priv->cts_state = ((msg->cts) ? 1 : 0);
689 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
690 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
691 p_priv->ri_state = ((msg->ri) ? 1 : 0);
693 if (port->port.tty && !C_CLOCAL(port->port.tty)
694 && old_dcd_state != p_priv->dcd_state) {
696 tty_hangup(port->port.tty);
698 /* wake_up_interruptible(&p_priv->open_wait); */
701 /* Resubmit urb so we continue receiving */
702 urb->dev = serial->dev;
703 err = usb_submit_urb(urb, GFP_ATOMIC);
705 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
709 static void usa28_glocont_callback(struct urb *urb)
715 static void usa49_glocont_callback(struct urb *urb)
717 struct usb_serial *serial;
718 struct usb_serial_port *port;
719 struct keyspan_port_private *p_priv;
724 serial = urb->context;
725 for (i = 0; i < serial->num_ports; ++i) {
726 port = serial->port[i];
727 p_priv = usb_get_serial_port_data(port);
729 if (p_priv->resend_cont) {
730 dbg("%s - sending setup", __func__);
731 keyspan_usa49_send_setup(serial, port,
732 p_priv->resend_cont - 1);
738 /* This is actually called glostat in the Keyspan
740 static void usa49_instat_callback(struct urb *urb)
743 unsigned char *data = urb->transfer_buffer;
744 struct keyspan_usa49_portStatusMessage *msg;
745 struct usb_serial *serial;
746 struct usb_serial_port *port;
747 struct keyspan_port_private *p_priv;
749 int status = urb->status;
753 serial = urb->context;
756 dbg("%s - nonzero status: %x", __func__, status);
760 if (urb->actual_length !=
761 sizeof(struct keyspan_usa49_portStatusMessage)) {
762 dbg("%s - bad length %d", __func__, urb->actual_length);
766 /*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __func__,
767 data[0], data[1], data[2], data[3], data[4], data[5],
768 data[6], data[7], data[8], data[9], data[10]);*/
770 /* Now do something useful with the data */
771 msg = (struct keyspan_usa49_portStatusMessage *)data;
773 /* Check port number from message and retrieve private data */
774 if (msg->portNumber >= serial->num_ports) {
775 dbg("%s - Unexpected port number %d",
776 __func__, msg->portNumber);
779 port = serial->port[msg->portNumber];
780 p_priv = usb_get_serial_port_data(port);
782 /* Update handshaking pin state information */
783 old_dcd_state = p_priv->dcd_state;
784 p_priv->cts_state = ((msg->cts) ? 1 : 0);
785 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
786 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
787 p_priv->ri_state = ((msg->ri) ? 1 : 0);
789 if (port->port.tty && !C_CLOCAL(port->port.tty)
790 && old_dcd_state != p_priv->dcd_state) {
792 tty_hangup(port->port.tty);
794 /* wake_up_interruptible(&p_priv->open_wait); */
797 /* Resubmit urb so we continue receiving */
798 urb->dev = serial->dev;
800 err = usb_submit_urb(urb, GFP_ATOMIC);
802 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
806 static void usa49_inack_callback(struct urb *urb)
811 static void usa49_indat_callback(struct urb *urb)
815 struct usb_serial_port *port;
816 struct tty_struct *tty;
817 unsigned char *data = urb->transfer_buffer;
818 int status = urb->status;
822 endpoint = usb_pipeendpoint(urb->pipe);
825 dbg("%s - nonzero status: %x on endpoint %d.", __func__,
831 tty = port->port.tty;
832 if (tty && urb->actual_length) {
833 /* 0x80 bit is error flag */
834 if ((data[0] & 0x80) == 0) {
835 /* no error on any byte */
836 for (i = 1; i < urb->actual_length ; ++i)
837 tty_insert_flip_char(tty, data[i], 0);
839 /* some bytes had errors, every byte has status */
840 for (i = 0; i + 1 < urb->actual_length; i += 2) {
841 int stat = data[i], flag = 0;
842 if (stat & RXERROR_OVERRUN)
844 if (stat & RXERROR_FRAMING)
846 if (stat & RXERROR_PARITY)
848 /* XXX should handle break (0x10) */
849 tty_insert_flip_char(tty, data[i+1], flag);
852 tty_flip_buffer_push(tty);
855 /* Resubmit urb so we continue receiving */
856 urb->dev = port->serial->dev;
857 if (port->port.count) {
858 err = usb_submit_urb(urb, GFP_ATOMIC);
860 dbg("%s - resubmit read urb failed. (%d)",
865 static void usa49wg_indat_callback(struct urb *urb)
868 struct usb_serial *serial;
869 struct usb_serial_port *port;
870 struct tty_struct *tty;
871 unsigned char *data = urb->transfer_buffer;
872 int status = urb->status;
876 serial = urb->context;
879 dbg("%s - nonzero status: %x", __func__, status);
883 /* inbound data is in the form P#, len, status, data */
887 if (urb->actual_length) {
888 while (i < urb->actual_length) {
890 /* Check port number from message*/
891 if (data[i] >= serial->num_ports) {
892 dbg("%s - Unexpected port number %d",
896 port = serial->port[data[i++]];
897 tty = port->port.tty;
900 /* 0x80 bit is error flag */
901 if ((data[i] & 0x80) == 0) {
902 /* no error on any byte */
904 for (x = 1; x < len ; ++x)
905 if (port->port.count)
906 tty_insert_flip_char(tty,
912 * some bytes had errors, every byte has status
914 for (x = 0; x + 1 < len; x += 2) {
915 int stat = data[i], flag = 0;
916 if (stat & RXERROR_OVERRUN)
918 if (stat & RXERROR_FRAMING)
920 if (stat & RXERROR_PARITY)
922 /* XXX should handle break (0x10) */
923 if (port->port.count)
924 tty_insert_flip_char(tty,
929 if (port->port.count)
930 tty_flip_buffer_push(tty);
934 /* Resubmit urb so we continue receiving */
935 urb->dev = serial->dev;
937 err = usb_submit_urb(urb, GFP_ATOMIC);
939 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
942 /* not used, usa-49 doesn't have per-port control endpoints */
943 static void usa49_outcont_callback(struct urb *urb)
948 static void usa90_indat_callback(struct urb *urb)
952 struct usb_serial_port *port;
953 struct keyspan_port_private *p_priv;
954 struct tty_struct *tty;
955 unsigned char *data = urb->transfer_buffer;
956 int status = urb->status;
960 endpoint = usb_pipeendpoint(urb->pipe);
963 dbg("%s - nonzero status: %x on endpoint %d.",
964 __func__, status, endpoint);
969 p_priv = usb_get_serial_port_data(port);
971 tty = port->port.tty;
972 if (urb->actual_length) {
973 /* if current mode is DMA, looks like usa28 format
974 otherwise looks like usa26 data format */
976 if (p_priv->baud > 57600) {
977 for (i = 0; i < urb->actual_length ; ++i)
978 tty_insert_flip_char(tty, data[i], 0);
980 /* 0x80 bit is error flag */
981 if ((data[0] & 0x80) == 0) {
982 /* no errors on individual bytes, only
983 possible overrun err*/
984 if (data[0] & RXERROR_OVERRUN)
988 for (i = 1; i < urb->actual_length ; ++i)
989 tty_insert_flip_char(tty, data[i],
992 /* some bytes had errors, every byte has status */
993 dbg("%s - RX error!!!!", __func__);
994 for (i = 0; i + 1 < urb->actual_length; i += 2) {
995 int stat = data[i], flag = 0;
996 if (stat & RXERROR_OVERRUN)
998 if (stat & RXERROR_FRAMING)
1000 if (stat & RXERROR_PARITY)
1002 /* XXX should handle break (0x10) */
1003 tty_insert_flip_char(tty, data[i+1],
1008 tty_flip_buffer_push(tty);
1011 /* Resubmit urb so we continue receiving */
1012 urb->dev = port->serial->dev;
1013 if (port->port.count) {
1014 err = usb_submit_urb(urb, GFP_ATOMIC);
1016 dbg("%s - resubmit read urb failed. (%d)",
1023 static void usa90_instat_callback(struct urb *urb)
1025 unsigned char *data = urb->transfer_buffer;
1026 struct keyspan_usa90_portStatusMessage *msg;
1027 struct usb_serial *serial;
1028 struct usb_serial_port *port;
1029 struct keyspan_port_private *p_priv;
1030 int old_dcd_state, err;
1031 int status = urb->status;
1033 serial = urb->context;
1036 dbg("%s - nonzero status: %x", __func__, status);
1039 if (urb->actual_length < 14) {
1040 dbg("%s - %d byte report??", __func__, urb->actual_length);
1044 msg = (struct keyspan_usa90_portStatusMessage *)data;
1046 /* Now do something useful with the data */
1048 port = serial->port[0];
1049 p_priv = usb_get_serial_port_data(port);
1051 /* Update handshaking pin state information */
1052 old_dcd_state = p_priv->dcd_state;
1053 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1054 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1055 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1056 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1058 if (port->port.tty && !C_CLOCAL(port->port.tty)
1059 && old_dcd_state != p_priv->dcd_state) {
1061 tty_hangup(port->port.tty);
1063 /* wake_up_interruptible(&p_priv->open_wait); */
1066 /* Resubmit urb so we continue receiving */
1067 urb->dev = serial->dev;
1068 err = usb_submit_urb(urb, GFP_ATOMIC);
1070 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
1075 static void usa90_outcont_callback(struct urb *urb)
1077 struct usb_serial_port *port;
1078 struct keyspan_port_private *p_priv;
1080 port = urb->context;
1081 p_priv = usb_get_serial_port_data(port);
1083 if (p_priv->resend_cont) {
1084 dbg("%s - sending setup", __func__);
1085 keyspan_usa90_send_setup(port->serial, port,
1086 p_priv->resend_cont - 1);
1090 /* Status messages from the 28xg */
1091 static void usa67_instat_callback(struct urb *urb)
1094 unsigned char *data = urb->transfer_buffer;
1095 struct keyspan_usa67_portStatusMessage *msg;
1096 struct usb_serial *serial;
1097 struct usb_serial_port *port;
1098 struct keyspan_port_private *p_priv;
1100 int status = urb->status;
1102 dbg("%s", __func__);
1104 serial = urb->context;
1107 dbg("%s - nonzero status: %x", __func__, status);
1111 if (urb->actual_length !=
1112 sizeof(struct keyspan_usa67_portStatusMessage)) {
1113 dbg("%s - bad length %d", __func__, urb->actual_length);
1118 /* Now do something useful with the data */
1119 msg = (struct keyspan_usa67_portStatusMessage *)data;
1121 /* Check port number from message and retrieve private data */
1122 if (msg->port >= serial->num_ports) {
1123 dbg("%s - Unexpected port number %d", __func__, msg->port);
1127 port = serial->port[msg->port];
1128 p_priv = usb_get_serial_port_data(port);
1130 /* Update handshaking pin state information */
1131 old_dcd_state = p_priv->dcd_state;
1132 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
1133 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
1135 if (port->port.tty && !C_CLOCAL(port->port.tty)
1136 && old_dcd_state != p_priv->dcd_state) {
1138 tty_hangup(port->port.tty);
1140 /* wake_up_interruptible(&p_priv->open_wait); */
1143 /* Resubmit urb so we continue receiving */
1144 urb->dev = serial->dev;
1145 err = usb_submit_urb(urb, GFP_ATOMIC);
1147 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
1150 static void usa67_glocont_callback(struct urb *urb)
1152 struct usb_serial *serial;
1153 struct usb_serial_port *port;
1154 struct keyspan_port_private *p_priv;
1157 dbg("%s", __func__);
1159 serial = urb->context;
1160 for (i = 0; i < serial->num_ports; ++i) {
1161 port = serial->port[i];
1162 p_priv = usb_get_serial_port_data(port);
1164 if (p_priv->resend_cont) {
1165 dbg("%s - sending setup", __func__);
1166 keyspan_usa67_send_setup(serial, port,
1167 p_priv->resend_cont - 1);
1173 static int keyspan_write_room(struct tty_struct *tty)
1175 struct usb_serial_port *port = tty->driver_data;
1176 struct keyspan_port_private *p_priv;
1177 const struct keyspan_device_details *d_details;
1180 struct urb *this_urb;
1182 dbg("%s", __func__);
1183 p_priv = usb_get_serial_port_data(port);
1184 d_details = p_priv->device_details;
1186 /* FIXME: locking */
1187 if (d_details->msg_format == msg_usa90)
1192 flip = p_priv->out_flip;
1194 /* Check both endpoints to see if any are available. */
1195 this_urb = p_priv->out_urbs[flip];
1196 if (this_urb != NULL) {
1197 if (this_urb->status != -EINPROGRESS)
1199 flip = (flip + 1) & d_details->outdat_endp_flip;
1200 this_urb = p_priv->out_urbs[flip];
1201 if (this_urb != NULL) {
1202 if (this_urb->status != -EINPROGRESS)
1210 static int keyspan_open(struct tty_struct *tty,
1211 struct usb_serial_port *port, struct file *filp)
1213 struct keyspan_port_private *p_priv;
1214 struct keyspan_serial_private *s_priv;
1215 struct usb_serial *serial = port->serial;
1216 const struct keyspan_device_details *d_details;
1218 int baud_rate, device_port;
1220 unsigned int cflag = 0;
1222 s_priv = usb_get_serial_data(serial);
1223 p_priv = usb_get_serial_port_data(port);
1224 d_details = p_priv->device_details;
1226 dbg("%s - port%d.", __func__, port->number);
1228 /* Set some sane defaults */
1229 p_priv->rts_state = 1;
1230 p_priv->dtr_state = 1;
1231 p_priv->baud = 9600;
1233 /* force baud and lcr to be set on open */
1234 p_priv->old_baud = 0;
1235 p_priv->old_cflag = 0;
1237 p_priv->out_flip = 0;
1238 p_priv->in_flip = 0;
1240 /* Reset low level data toggle and start reading from endpoints */
1241 for (i = 0; i < 2; i++) {
1242 urb = p_priv->in_urbs[i];
1245 urb->dev = serial->dev;
1247 /* make sure endpoint data toggle is synchronized
1249 usb_clear_halt(urb->dev, urb->pipe);
1250 err = usb_submit_urb(urb, GFP_KERNEL);
1252 dbg("%s - submit urb %d failed (%d)",
1256 /* Reset low level data toggle on out endpoints */
1257 for (i = 0; i < 2; i++) {
1258 urb = p_priv->out_urbs[i];
1261 urb->dev = serial->dev;
1262 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1263 usb_pipeout(urb->pipe), 0); */
1266 /* get the terminal config for the setup message now so we don't
1267 * need to send 2 of them */
1269 device_port = port->number - port->serial->minor;
1271 cflag = tty->termios->c_cflag;
1272 /* Baud rate calculation takes baud rate as an integer
1273 so other rates can be generated if desired. */
1274 baud_rate = tty_get_baud_rate(tty);
1275 /* If no match or invalid, leave as default */
1277 && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
1278 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1279 p_priv->baud = baud_rate;
1282 /* set CTS/RTS handshake etc. */
1283 p_priv->cflag = cflag;
1284 p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
1286 keyspan_send_setup(port, 1);
1288 /* keyspan_set_termios(port, NULL); */
1293 static inline void stop_urb(struct urb *urb)
1295 if (urb && urb->status == -EINPROGRESS)
1299 static void keyspan_close(struct tty_struct *tty,
1300 struct usb_serial_port *port, struct file *filp)
1303 struct usb_serial *serial = port->serial;
1304 struct keyspan_serial_private *s_priv;
1305 struct keyspan_port_private *p_priv;
1307 dbg("%s", __func__);
1308 s_priv = usb_get_serial_data(serial);
1309 p_priv = usb_get_serial_port_data(port);
1311 p_priv->rts_state = 0;
1312 p_priv->dtr_state = 0;
1315 keyspan_send_setup(port, 2);
1316 /* pilot-xfer seems to work best with this delay */
1318 /* keyspan_set_termios(port, NULL); */
1321 /*while (p_priv->outcont_urb->status == -EINPROGRESS) {
1322 dbg("%s - urb in progress", __func__);
1325 p_priv->out_flip = 0;
1326 p_priv->in_flip = 0;
1329 /* Stop reading/writing urbs */
1330 stop_urb(p_priv->inack_urb);
1331 /* stop_urb(p_priv->outcont_urb); */
1332 for (i = 0; i < 2; i++) {
1333 stop_urb(p_priv->in_urbs[i]);
1334 stop_urb(p_priv->out_urbs[i]);
1337 port->port.tty = NULL;
1340 /* download the firmware to a pre-renumeration device */
1341 static int keyspan_fake_startup(struct usb_serial *serial)
1344 const struct ihex_binrec *record;
1346 const struct firmware *fw;
1348 dbg("Keyspan startup version %04x product %04x",
1349 le16_to_cpu(serial->dev->descriptor.bcdDevice),
1350 le16_to_cpu(serial->dev->descriptor.idProduct));
1352 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)
1354 dbg("Firmware already loaded. Quitting.");
1358 /* Select firmware image on the basis of idProduct */
1359 switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1360 case keyspan_usa28_pre_product_id:
1361 fw_name = "keyspan/usa28.fw";
1364 case keyspan_usa28x_pre_product_id:
1365 fw_name = "keyspan/usa28x.fw";
1368 case keyspan_usa28xa_pre_product_id:
1369 fw_name = "keyspan/usa28xa.fw";
1372 case keyspan_usa28xb_pre_product_id:
1373 fw_name = "keyspan/usa28xb.fw";
1376 case keyspan_usa19_pre_product_id:
1377 fw_name = "keyspan/usa19.fw";
1380 case keyspan_usa19qi_pre_product_id:
1381 fw_name = "keyspan/usa19qi.fw";
1384 case keyspan_mpr_pre_product_id:
1385 fw_name = "keyspan/mpr.fw";
1388 case keyspan_usa19qw_pre_product_id:
1389 fw_name = "keyspan/usa19qw.fw";
1392 case keyspan_usa18x_pre_product_id:
1393 fw_name = "keyspan/usa18x.fw";
1396 case keyspan_usa19w_pre_product_id:
1397 fw_name = "keyspan/usa19w.fw";
1400 case keyspan_usa49w_pre_product_id:
1401 fw_name = "keyspan/usa49w.fw";
1404 case keyspan_usa49wlc_pre_product_id:
1405 fw_name = "keyspan/usa49wlc.fw";
1409 dev_err(&serial->dev->dev, "Unknown product ID (%04x)\n",
1410 le16_to_cpu(serial->dev->descriptor.idProduct));
1414 if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
1415 dev_err(&serial->dev->dev, "Required keyspan firmware image (%s) unavailable.\n", fw_name);
1419 dbg("Uploading Keyspan %s firmware.", fw_name);
1421 /* download the firmware image */
1422 response = ezusb_set_reset(serial, 1);
1424 record = (const struct ihex_binrec *)fw->data;
1427 response = ezusb_writememory(serial, be32_to_cpu(record->addr),
1428 (unsigned char *)record->data,
1429 be16_to_cpu(record->len), 0xa0);
1431 dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan firmware (%d %04X %p %d)\n",
1432 response, be32_to_cpu(record->addr),
1433 record->data, be16_to_cpu(record->len));
1436 record = ihex_next_binrec(record);
1438 release_firmware(fw);
1439 /* bring device out of reset. Renumeration will occur in a
1440 moment and the new device will bind to the real driver */
1441 response = ezusb_set_reset(serial, 0);
1443 /* we don't want this device to have a driver assigned to it. */
1447 /* Helper functions used by keyspan_setup_urbs */
1448 static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *serial,
1451 struct usb_host_interface *iface_desc;
1452 struct usb_endpoint_descriptor *ep;
1455 iface_desc = serial->interface->cur_altsetting;
1456 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1457 ep = &iface_desc->endpoint[i].desc;
1458 if (ep->bEndpointAddress == endpoint)
1461 dev_warn(&serial->interface->dev, "found no endpoint descriptor for "
1462 "endpoint %x\n", endpoint);
1466 static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
1467 int dir, void *ctx, char *buf, int len,
1468 void (*callback)(struct urb *))
1471 struct usb_endpoint_descriptor const *ep_desc;
1472 char const *ep_type_name;
1475 return NULL; /* endpoint not needed */
1477 dbg("%s - alloc for endpoint %d.", __func__, endpoint);
1478 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
1480 dbg("%s - alloc for endpoint %d failed.", __func__, endpoint);
1484 if (endpoint == 0) {
1485 /* control EP filled in when used */
1489 ep_desc = find_ep(serial, endpoint);
1491 /* leak the urb, something's wrong and the callers don't care */
1494 if (usb_endpoint_xfer_int(ep_desc)) {
1495 ep_type_name = "INT";
1496 usb_fill_int_urb(urb, serial->dev,
1497 usb_sndintpipe(serial->dev, endpoint) | dir,
1498 buf, len, callback, ctx,
1499 ep_desc->bInterval);
1500 } else if (usb_endpoint_xfer_bulk(ep_desc)) {
1501 ep_type_name = "BULK";
1502 usb_fill_bulk_urb(urb, serial->dev,
1503 usb_sndbulkpipe(serial->dev, endpoint) | dir,
1504 buf, len, callback, ctx);
1506 dev_warn(&serial->interface->dev,
1507 "unsupported endpoint type %x\n",
1508 ep_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
1513 dbg("%s - using urb %p for %s endpoint %x",
1514 __func__, urb, ep_type_name, endpoint);
1518 static struct callbacks {
1519 void (*instat_callback)(struct urb *);
1520 void (*glocont_callback)(struct urb *);
1521 void (*indat_callback)(struct urb *);
1522 void (*outdat_callback)(struct urb *);
1523 void (*inack_callback)(struct urb *);
1524 void (*outcont_callback)(struct urb *);
1525 } keyspan_callbacks[] = {
1527 /* msg_usa26 callbacks */
1528 .instat_callback = usa26_instat_callback,
1529 .glocont_callback = usa26_glocont_callback,
1530 .indat_callback = usa26_indat_callback,
1531 .outdat_callback = usa2x_outdat_callback,
1532 .inack_callback = usa26_inack_callback,
1533 .outcont_callback = usa26_outcont_callback,
1535 /* msg_usa28 callbacks */
1536 .instat_callback = usa28_instat_callback,
1537 .glocont_callback = usa28_glocont_callback,
1538 .indat_callback = usa28_indat_callback,
1539 .outdat_callback = usa2x_outdat_callback,
1540 .inack_callback = usa28_inack_callback,
1541 .outcont_callback = usa28_outcont_callback,
1543 /* msg_usa49 callbacks */
1544 .instat_callback = usa49_instat_callback,
1545 .glocont_callback = usa49_glocont_callback,
1546 .indat_callback = usa49_indat_callback,
1547 .outdat_callback = usa2x_outdat_callback,
1548 .inack_callback = usa49_inack_callback,
1549 .outcont_callback = usa49_outcont_callback,
1551 /* msg_usa90 callbacks */
1552 .instat_callback = usa90_instat_callback,
1553 .glocont_callback = usa28_glocont_callback,
1554 .indat_callback = usa90_indat_callback,
1555 .outdat_callback = usa2x_outdat_callback,
1556 .inack_callback = usa28_inack_callback,
1557 .outcont_callback = usa90_outcont_callback,
1559 /* msg_usa67 callbacks */
1560 .instat_callback = usa67_instat_callback,
1561 .glocont_callback = usa67_glocont_callback,
1562 .indat_callback = usa26_indat_callback,
1563 .outdat_callback = usa2x_outdat_callback,
1564 .inack_callback = usa26_inack_callback,
1565 .outcont_callback = usa26_outcont_callback,
1569 /* Generic setup urbs function that uses
1570 data in device_details */
1571 static void keyspan_setup_urbs(struct usb_serial *serial)
1574 struct keyspan_serial_private *s_priv;
1575 const struct keyspan_device_details *d_details;
1576 struct usb_serial_port *port;
1577 struct keyspan_port_private *p_priv;
1578 struct callbacks *cback;
1581 dbg("%s", __func__);
1583 s_priv = usb_get_serial_data(serial);
1584 d_details = s_priv->device_details;
1586 /* Setup values for the various callback routines */
1587 cback = &keyspan_callbacks[d_details->msg_format];
1589 /* Allocate and set up urbs for each one that is in use,
1590 starting with instat endpoints */
1591 s_priv->instat_urb = keyspan_setup_urb
1592 (serial, d_details->instat_endpoint, USB_DIR_IN,
1593 serial, s_priv->instat_buf, INSTAT_BUFLEN,
1594 cback->instat_callback);
1596 s_priv->indat_urb = keyspan_setup_urb
1597 (serial, d_details->indat_endpoint, USB_DIR_IN,
1598 serial, s_priv->indat_buf, INDAT49W_BUFLEN,
1599 usa49wg_indat_callback);
1601 s_priv->glocont_urb = keyspan_setup_urb
1602 (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1603 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1604 cback->glocont_callback);
1606 /* Setup endpoints for each port specific thing */
1607 for (i = 0; i < d_details->num_ports; i++) {
1608 port = serial->port[i];
1609 p_priv = usb_get_serial_port_data(port);
1611 /* Do indat endpoints first, once for each flip */
1612 endp = d_details->indat_endpoints[i];
1613 for (j = 0; j <= d_details->indat_endp_flip; ++j, ++endp) {
1614 p_priv->in_urbs[j] = keyspan_setup_urb
1615 (serial, endp, USB_DIR_IN, port,
1616 p_priv->in_buffer[j], 64,
1617 cback->indat_callback);
1620 p_priv->in_urbs[j] = NULL;
1622 /* outdat endpoints also have flip */
1623 endp = d_details->outdat_endpoints[i];
1624 for (j = 0; j <= d_details->outdat_endp_flip; ++j, ++endp) {
1625 p_priv->out_urbs[j] = keyspan_setup_urb
1626 (serial, endp, USB_DIR_OUT, port,
1627 p_priv->out_buffer[j], 64,
1628 cback->outdat_callback);
1631 p_priv->out_urbs[j] = NULL;
1633 /* inack endpoint */
1634 p_priv->inack_urb = keyspan_setup_urb
1635 (serial, d_details->inack_endpoints[i], USB_DIR_IN,
1636 port, p_priv->inack_buffer, 1, cback->inack_callback);
1638 /* outcont endpoint */
1639 p_priv->outcont_urb = keyspan_setup_urb
1640 (serial, d_details->outcont_endpoints[i], USB_DIR_OUT,
1641 port, p_priv->outcont_buffer, 64,
1642 cback->outcont_callback);
1646 /* usa19 function doesn't require prescaler */
1647 static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1648 u8 *rate_low, u8 *prescaler, int portnum)
1650 u32 b16, /* baud rate times 16 (actual rate used internally) */
1652 cnt; /* inverse of divisor (programmed into 8051) */
1654 dbg("%s - %d.", __func__, baud_rate);
1656 /* prevent divide by zero... */
1657 b16 = baud_rate * 16L;
1659 return KEYSPAN_INVALID_BAUD_RATE;
1660 /* Any "standard" rate over 57k6 is marginal on the USA-19
1661 as we run out of divisor resolution. */
1662 if (baud_rate > 57600)
1663 return KEYSPAN_INVALID_BAUD_RATE;
1665 /* calculate the divisor and the counter (its inverse) */
1666 div = baudclk / b16;
1668 return KEYSPAN_INVALID_BAUD_RATE;
1673 return KEYSPAN_INVALID_BAUD_RATE;
1675 /* return the counter values if non-null */
1677 *rate_low = (u8) (cnt & 0xff);
1679 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1680 if (rate_low && rate_hi)
1681 dbg("%s - %d %02x %02x.",
1682 __func__, baud_rate, *rate_hi, *rate_low);
1683 return KEYSPAN_BAUD_RATE_OK;
1686 /* usa19hs function doesn't require prescaler */
1687 static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1688 u8 *rate_low, u8 *prescaler, int portnum)
1690 u32 b16, /* baud rate times 16 (actual rate used internally) */
1693 dbg("%s - %d.", __func__, baud_rate);
1695 /* prevent divide by zero... */
1696 b16 = baud_rate * 16L;
1698 return KEYSPAN_INVALID_BAUD_RATE;
1700 /* calculate the divisor */
1701 div = baudclk / b16;
1703 return KEYSPAN_INVALID_BAUD_RATE;
1706 return KEYSPAN_INVALID_BAUD_RATE;
1708 /* return the counter values if non-null */
1710 *rate_low = (u8) (div & 0xff);
1713 *rate_hi = (u8) ((div >> 8) & 0xff);
1715 if (rate_low && rate_hi)
1716 dbg("%s - %d %02x %02x.",
1717 __func__, baud_rate, *rate_hi, *rate_low);
1719 return KEYSPAN_BAUD_RATE_OK;
1722 static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1723 u8 *rate_low, u8 *prescaler, int portnum)
1725 u32 b16, /* baud rate times 16 (actual rate used internally) */
1726 clk, /* clock with 13/8 prescaler */
1727 div, /* divisor using 13/8 prescaler */
1728 res, /* resulting baud rate using 13/8 prescaler */
1729 diff, /* error using 13/8 prescaler */
1734 dbg("%s - %d.", __func__, baud_rate);
1736 /* prevent divide by zero */
1737 b16 = baud_rate * 16L;
1739 return KEYSPAN_INVALID_BAUD_RATE;
1741 /* Calculate prescaler by trying them all and looking
1744 /* start with largest possible difference */
1745 smallest_diff = 0xffffffff;
1747 /* 0 is an invalid prescaler, used as a flag */
1750 for (i = 8; i <= 0xff; ++i) {
1751 clk = (baudclk * 8) / (u32) i;
1758 diff = (res > b16) ? (res-b16) : (b16-res);
1760 if (diff < smallest_diff) {
1762 smallest_diff = diff;
1766 if (best_prescaler == 0)
1767 return KEYSPAN_INVALID_BAUD_RATE;
1769 clk = (baudclk * 8) / (u32) best_prescaler;
1772 /* return the divisor and prescaler if non-null */
1774 *rate_low = (u8) (div & 0xff);
1776 *rate_hi = (u8) ((div >> 8) & 0xff);
1778 *prescaler = best_prescaler;
1779 /* dbg("%s - %d %d", __func__, *prescaler, div); */
1781 return KEYSPAN_BAUD_RATE_OK;
1784 /* USA-28 supports different maximum baud rates on each port */
1785 static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1786 u8 *rate_low, u8 *prescaler, int portnum)
1788 u32 b16, /* baud rate times 16 (actual rate used internally) */
1790 cnt; /* inverse of divisor (programmed into 8051) */
1792 dbg("%s - %d.", __func__, baud_rate);
1794 /* prevent divide by zero */
1795 b16 = baud_rate * 16L;
1797 return KEYSPAN_INVALID_BAUD_RATE;
1799 /* calculate the divisor and the counter (its inverse) */
1800 div = KEYSPAN_USA28_BAUDCLK / b16;
1802 return KEYSPAN_INVALID_BAUD_RATE;
1806 /* check for out of range, based on portnum,
1807 and return result */
1810 return KEYSPAN_INVALID_BAUD_RATE;
1814 return KEYSPAN_INVALID_BAUD_RATE;
1816 return KEYSPAN_INVALID_BAUD_RATE;
1819 /* return the counter values if not NULL
1820 (port 1 will ignore retHi) */
1822 *rate_low = (u8) (cnt & 0xff);
1824 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1825 dbg("%s - %d OK.", __func__, baud_rate);
1826 return KEYSPAN_BAUD_RATE_OK;
1829 static int keyspan_usa26_send_setup(struct usb_serial *serial,
1830 struct usb_serial_port *port,
1833 struct keyspan_usa26_portControlMessage msg;
1834 struct keyspan_serial_private *s_priv;
1835 struct keyspan_port_private *p_priv;
1836 const struct keyspan_device_details *d_details;
1838 struct urb *this_urb;
1839 int device_port, err;
1841 dbg("%s reset=%d", __func__, reset_port);
1843 s_priv = usb_get_serial_data(serial);
1844 p_priv = usb_get_serial_port_data(port);
1845 d_details = s_priv->device_details;
1846 device_port = port->number - port->serial->minor;
1848 outcont_urb = d_details->outcont_endpoints[port->number];
1849 this_urb = p_priv->outcont_urb;
1851 dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe));
1853 /* Make sure we have an urb then send the message */
1854 if (this_urb == NULL) {
1855 dbg("%s - oops no urb.", __func__);
1859 /* Save reset port val for resend.
1860 Don't overwrite resend for open/close condition. */
1861 if ((reset_port + 1) > p_priv->resend_cont)
1862 p_priv->resend_cont = reset_port + 1;
1863 if (this_urb->status == -EINPROGRESS) {
1864 /* dbg("%s - already writing", __func__); */
1869 memset(&msg, 0, sizeof(struct keyspan_usa26_portControlMessage));
1871 /* Only set baud rate if it's changed */
1872 if (p_priv->old_baud != p_priv->baud) {
1873 p_priv->old_baud = p_priv->baud;
1874 msg.setClocking = 0xff;
1875 if (d_details->calculate_baud_rate
1876 (p_priv->baud, d_details->baudclk, &msg.baudHi,
1877 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
1878 dbg("%s - Invalid baud rate %d requested, using 9600.",
1879 __func__, p_priv->baud);
1881 msg.baudHi = 125; /* Values for 9600 baud */
1884 msg.setPrescaler = 0xff;
1887 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
1888 switch (p_priv->cflag & CSIZE) {
1890 msg.lcr |= USA_DATABITS_5;
1893 msg.lcr |= USA_DATABITS_6;
1896 msg.lcr |= USA_DATABITS_7;
1899 msg.lcr |= USA_DATABITS_8;
1902 if (p_priv->cflag & PARENB) {
1903 /* note USA_PARITY_NONE == 0 */
1904 msg.lcr |= (p_priv->cflag & PARODD)?
1905 USA_PARITY_ODD : USA_PARITY_EVEN;
1909 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1910 msg.xonFlowControl = 0;
1911 msg.setFlowControl = 0xff;
1912 msg.forwardingLength = 16;
1917 if (reset_port == 1) {
1926 msg.returnStatus = 0;
1927 msg.resetDataToggle = 0xff;
1931 else if (reset_port == 2) {
1940 msg.returnStatus = 0;
1941 msg.resetDataToggle = 0;
1944 /* Sending intermediate configs */
1946 msg._txOn = (!p_priv->break_on);
1949 msg.txBreak = (p_priv->break_on);
1954 msg.returnStatus = 0;
1955 msg.resetDataToggle = 0x0;
1958 /* Do handshaking outputs */
1959 msg.setTxTriState_setRts = 0xff;
1960 msg.txTriState_rts = p_priv->rts_state;
1962 msg.setHskoa_setDtr = 0xff;
1963 msg.hskoa_dtr = p_priv->dtr_state;
1965 p_priv->resend_cont = 0;
1966 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
1968 /* send the data out the device on control endpoint */
1969 this_urb->transfer_buffer_length = sizeof(msg);
1971 this_urb->dev = serial->dev;
1972 err = usb_submit_urb(this_urb, GFP_ATOMIC);
1974 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
1977 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__
1978 outcont_urb, this_urb->transfer_buffer_length,
1979 usb_pipeendpoint(this_urb->pipe));
1986 static int keyspan_usa28_send_setup(struct usb_serial *serial,
1987 struct usb_serial_port *port,
1990 struct keyspan_usa28_portControlMessage msg;
1991 struct keyspan_serial_private *s_priv;
1992 struct keyspan_port_private *p_priv;
1993 const struct keyspan_device_details *d_details;
1994 struct urb *this_urb;
1995 int device_port, err;
1997 dbg("%s", __func__);
1999 s_priv = usb_get_serial_data(serial);
2000 p_priv = usb_get_serial_port_data(port);
2001 d_details = s_priv->device_details;
2002 device_port = port->number - port->serial->minor;
2004 /* only do something if we have a bulk out endpoint */
2005 this_urb = p_priv->outcont_urb;
2006 if (this_urb == NULL) {
2007 dbg("%s - oops no urb.", __func__);
2011 /* Save reset port val for resend.
2012 Don't overwrite resend for open/close condition. */
2013 if ((reset_port + 1) > p_priv->resend_cont)
2014 p_priv->resend_cont = reset_port + 1;
2015 if (this_urb->status == -EINPROGRESS) {
2016 dbg("%s already writing", __func__);
2021 memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));
2023 msg.setBaudRate = 1;
2024 if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2025 &msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2026 dbg("%s - Invalid baud rate requested %d.",
2027 __func__, p_priv->baud);
2029 msg.baudHi = 0xb2; /* Values for 9600 baud */
2032 /* If parity is enabled, we must calculate it ourselves. */
2033 msg.parity = 0; /* XXX for now */
2035 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2036 msg.xonFlowControl = 0;
2038 /* Do handshaking outputs, DTR is inverted relative to RTS */
2039 msg.rts = p_priv->rts_state;
2040 msg.dtr = p_priv->dtr_state;
2042 msg.forwardingLength = 16;
2044 msg.breakThreshold = 45;
2048 /*msg.returnStatus = 1;
2049 msg.resetDataToggle = 0xff;*/
2051 if (reset_port == 1) {
2055 msg.txForceXoff = 0;
2061 msg.returnStatus = 0;
2062 msg.resetDataToggle = 0xff;
2065 else if (reset_port == 2) {
2069 msg.txForceXoff = 0;
2075 msg.returnStatus = 0;
2076 msg.resetDataToggle = 0;
2078 /* Sending intermediate configs */
2080 msg._txOn = (!p_priv->break_on);
2083 msg.txForceXoff = 0;
2084 msg.txBreak = (p_priv->break_on);
2089 msg.returnStatus = 0;
2090 msg.resetDataToggle = 0x0;
2093 p_priv->resend_cont = 0;
2094 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2096 /* send the data out the device on control endpoint */
2097 this_urb->transfer_buffer_length = sizeof(msg);
2099 this_urb->dev = serial->dev;
2100 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2102 dbg("%s - usb_submit_urb(setup) failed", __func__);
2105 dbg("%s - usb_submit_urb(setup) OK %d bytes", __func__,
2106 this_urb->transfer_buffer_length);
2113 static int keyspan_usa49_send_setup(struct usb_serial *serial,
2114 struct usb_serial_port *port,
2117 struct keyspan_usa49_portControlMessage msg;
2118 struct usb_ctrlrequest *dr = NULL;
2119 struct keyspan_serial_private *s_priv;
2120 struct keyspan_port_private *p_priv;
2121 const struct keyspan_device_details *d_details;
2122 struct urb *this_urb;
2123 int err, device_port;
2125 dbg("%s", __func__);
2127 s_priv = usb_get_serial_data(serial);
2128 p_priv = usb_get_serial_port_data(port);
2129 d_details = s_priv->device_details;
2131 this_urb = s_priv->glocont_urb;
2133 /* Work out which port within the device is being setup */
2134 device_port = port->number - port->serial->minor;
2136 dbg("%s - endpoint %d port %d (%d)",
2137 __func__, usb_pipeendpoint(this_urb->pipe),
2138 port->number, device_port);
2140 /* Make sure we have an urb then send the message */
2141 if (this_urb == NULL) {
2142 dbg("%s - oops no urb for port %d.", __func__, port->number);
2146 /* Save reset port val for resend.
2147 Don't overwrite resend for open/close condition. */
2148 if ((reset_port + 1) > p_priv->resend_cont)
2149 p_priv->resend_cont = reset_port + 1;
2151 if (this_urb->status == -EINPROGRESS) {
2152 /* dbg("%s - already writing", __func__); */
2157 memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage));
2159 /*msg.portNumber = port->number;*/
2160 msg.portNumber = device_port;
2162 /* Only set baud rate if it's changed */
2163 if (p_priv->old_baud != p_priv->baud) {
2164 p_priv->old_baud = p_priv->baud;
2165 msg.setClocking = 0xff;
2166 if (d_details->calculate_baud_rate
2167 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2168 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2169 dbg("%s - Invalid baud rate %d requested, using 9600.",
2170 __func__, p_priv->baud);
2172 msg.baudHi = 125; /* Values for 9600 baud */
2175 /* msg.setPrescaler = 0xff; */
2178 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2179 switch (p_priv->cflag & CSIZE) {
2181 msg.lcr |= USA_DATABITS_5;
2184 msg.lcr |= USA_DATABITS_6;
2187 msg.lcr |= USA_DATABITS_7;
2190 msg.lcr |= USA_DATABITS_8;
2193 if (p_priv->cflag & PARENB) {
2194 /* note USA_PARITY_NONE == 0 */
2195 msg.lcr |= (p_priv->cflag & PARODD)?
2196 USA_PARITY_ODD : USA_PARITY_EVEN;
2200 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2201 msg.xonFlowControl = 0;
2202 msg.setFlowControl = 0xff;
2204 msg.forwardingLength = 16;
2209 if (reset_port == 1) {
2218 msg.returnStatus = 0;
2219 msg.resetDataToggle = 0xff;
2221 msg.disablePort = 0;
2224 else if (reset_port == 2) {
2233 msg.returnStatus = 0;
2234 msg.resetDataToggle = 0;
2236 msg.disablePort = 1;
2238 /* Sending intermediate configs */
2240 msg._txOn = (!p_priv->break_on);
2243 msg.txBreak = (p_priv->break_on);
2248 msg.returnStatus = 0;
2249 msg.resetDataToggle = 0x0;
2251 msg.disablePort = 0;
2254 /* Do handshaking outputs */
2256 msg.rts = p_priv->rts_state;
2259 msg.dtr = p_priv->dtr_state;
2261 p_priv->resend_cont = 0;
2263 /* if the device is a 49wg, we send control message on usb
2266 if (d_details->product_id == keyspan_usa49wg_product_id) {
2267 dr = (void *)(s_priv->ctrl_buf);
2268 dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;
2269 dr->bRequest = 0xB0; /* 49wg control message */;
2272 dr->wLength = cpu_to_le16(sizeof(msg));
2274 memcpy(s_priv->glocont_buf, &msg, sizeof(msg));
2276 usb_fill_control_urb(this_urb, serial->dev,
2277 usb_sndctrlpipe(serial->dev, 0),
2278 (unsigned char *)dr, s_priv->glocont_buf,
2279 sizeof(msg), usa49_glocont_callback, serial);
2282 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2284 /* send the data out the device on control endpoint */
2285 this_urb->transfer_buffer_length = sizeof(msg);
2287 this_urb->dev = serial->dev;
2289 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2291 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
2294 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__,
2295 outcont_urb, this_urb->transfer_buffer_length,
2296 usb_pipeendpoint(this_urb->pipe));
2303 static int keyspan_usa90_send_setup(struct usb_serial *serial,
2304 struct usb_serial_port *port,
2307 struct keyspan_usa90_portControlMessage msg;
2308 struct keyspan_serial_private *s_priv;
2309 struct keyspan_port_private *p_priv;
2310 const struct keyspan_device_details *d_details;
2311 struct urb *this_urb;
2315 dbg("%s", __func__);
2317 s_priv = usb_get_serial_data(serial);
2318 p_priv = usb_get_serial_port_data(port);
2319 d_details = s_priv->device_details;
2321 /* only do something if we have a bulk out endpoint */
2322 this_urb = p_priv->outcont_urb;
2323 if (this_urb == NULL) {
2324 dbg("%s - oops no urb.", __func__);
2328 /* Save reset port val for resend.
2329 Don't overwrite resend for open/close condition. */
2330 if ((reset_port + 1) > p_priv->resend_cont)
2331 p_priv->resend_cont = reset_port + 1;
2332 if (this_urb->status == -EINPROGRESS) {
2333 dbg("%s already writing", __func__);
2338 memset(&msg, 0, sizeof(struct keyspan_usa90_portControlMessage));
2340 /* Only set baud rate if it's changed */
2341 if (p_priv->old_baud != p_priv->baud) {
2342 p_priv->old_baud = p_priv->baud;
2343 msg.setClocking = 0x01;
2344 if (d_details->calculate_baud_rate
2345 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2346 &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) {
2347 dbg("%s - Invalid baud rate %d requested, using 9600.",
2348 __func__, p_priv->baud);
2349 p_priv->baud = 9600;
2350 d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2351 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2357 /* modes must always be correctly specified */
2358 if (p_priv->baud > 57600) {
2359 msg.rxMode = RXMODE_DMA;
2360 msg.txMode = TXMODE_DMA;
2362 msg.rxMode = RXMODE_BYHAND;
2363 msg.txMode = TXMODE_BYHAND;
2366 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2367 switch (p_priv->cflag & CSIZE) {
2369 msg.lcr |= USA_DATABITS_5;
2372 msg.lcr |= USA_DATABITS_6;
2375 msg.lcr |= USA_DATABITS_7;
2378 msg.lcr |= USA_DATABITS_8;
2381 if (p_priv->cflag & PARENB) {
2382 /* note USA_PARITY_NONE == 0 */
2383 msg.lcr |= (p_priv->cflag & PARODD)?
2384 USA_PARITY_ODD : USA_PARITY_EVEN;
2386 if (p_priv->old_cflag != p_priv->cflag) {
2387 p_priv->old_cflag = p_priv->cflag;
2391 if (p_priv->flow_control == flow_cts)
2392 msg.txFlowControl = TXFLOW_CTS;
2393 msg.setTxFlowControl = 0x01;
2394 msg.setRxFlowControl = 0x01;
2396 msg.rxForwardingLength = 16;
2397 msg.rxForwardingTimeout = 16;
2398 msg.txAckSetting = 0;
2403 if (reset_port == 1) {
2404 msg.portEnabled = 1;
2406 msg.txBreak = (p_priv->break_on);
2409 else if (reset_port == 2)
2410 msg.portEnabled = 0;
2411 /* Sending intermediate configs */
2413 if (port->port.count)
2414 msg.portEnabled = 1;
2415 msg.txBreak = (p_priv->break_on);
2418 /* Do handshaking outputs */
2420 msg.rts = p_priv->rts_state;
2423 msg.dtr = p_priv->dtr_state;
2425 p_priv->resend_cont = 0;
2426 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2428 /* send the data out the device on control endpoint */
2429 this_urb->transfer_buffer_length = sizeof(msg);
2431 this_urb->dev = serial->dev;
2432 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2434 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
2438 static int keyspan_usa67_send_setup(struct usb_serial *serial,
2439 struct usb_serial_port *port,
2442 struct keyspan_usa67_portControlMessage msg;
2443 struct keyspan_serial_private *s_priv;
2444 struct keyspan_port_private *p_priv;
2445 const struct keyspan_device_details *d_details;
2446 struct urb *this_urb;
2447 int err, device_port;
2449 dbg("%s", __func__);
2451 s_priv = usb_get_serial_data(serial);
2452 p_priv = usb_get_serial_port_data(port);
2453 d_details = s_priv->device_details;
2455 this_urb = s_priv->glocont_urb;
2457 /* Work out which port within the device is being setup */
2458 device_port = port->number - port->serial->minor;
2460 /* Make sure we have an urb then send the message */
2461 if (this_urb == NULL) {
2462 dbg("%s - oops no urb for port %d.", __func__,
2467 /* Save reset port val for resend.
2468 Don't overwrite resend for open/close condition. */
2469 if ((reset_port + 1) > p_priv->resend_cont)
2470 p_priv->resend_cont = reset_port + 1;
2471 if (this_urb->status == -EINPROGRESS) {
2472 /* dbg("%s - already writing", __func__); */
2477 memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
2479 msg.port = device_port;
2481 /* Only set baud rate if it's changed */
2482 if (p_priv->old_baud != p_priv->baud) {
2483 p_priv->old_baud = p_priv->baud;
2484 msg.setClocking = 0xff;
2485 if (d_details->calculate_baud_rate
2486 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2487 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2488 dbg("%s - Invalid baud rate %d requested, using 9600.",
2489 __func__, p_priv->baud);
2491 msg.baudHi = 125; /* Values for 9600 baud */
2494 msg.setPrescaler = 0xff;
2497 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2498 switch (p_priv->cflag & CSIZE) {
2500 msg.lcr |= USA_DATABITS_5;
2503 msg.lcr |= USA_DATABITS_6;
2506 msg.lcr |= USA_DATABITS_7;
2509 msg.lcr |= USA_DATABITS_8;
2512 if (p_priv->cflag & PARENB) {
2513 /* note USA_PARITY_NONE == 0 */
2514 msg.lcr |= (p_priv->cflag & PARODD)?
2515 USA_PARITY_ODD : USA_PARITY_EVEN;
2519 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2520 msg.xonFlowControl = 0;
2521 msg.setFlowControl = 0xff;
2522 msg.forwardingLength = 16;
2526 if (reset_port == 1) {
2536 msg.returnStatus = 0;
2537 msg.resetDataToggle = 0xff;
2538 } else if (reset_port == 2) {
2548 msg.returnStatus = 0;
2549 msg.resetDataToggle = 0;
2551 /* Sending intermediate configs */
2552 msg._txOn = (!p_priv->break_on);
2555 msg.txBreak = (p_priv->break_on);
2560 msg.returnStatus = 0;
2561 msg.resetDataToggle = 0x0;
2564 /* Do handshaking outputs */
2565 msg.setTxTriState_setRts = 0xff;
2566 msg.txTriState_rts = p_priv->rts_state;
2568 msg.setHskoa_setDtr = 0xff;
2569 msg.hskoa_dtr = p_priv->dtr_state;
2571 p_priv->resend_cont = 0;
2573 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2575 /* send the data out the device on control endpoint */
2576 this_urb->transfer_buffer_length = sizeof(msg);
2577 this_urb->dev = serial->dev;
2579 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2581 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__,
2586 static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2588 struct usb_serial *serial = port->serial;
2589 struct keyspan_serial_private *s_priv;
2590 const struct keyspan_device_details *d_details;
2592 dbg("%s", __func__);
2594 s_priv = usb_get_serial_data(serial);
2595 d_details = s_priv->device_details;
2597 switch (d_details->msg_format) {
2599 keyspan_usa26_send_setup(serial, port, reset_port);
2602 keyspan_usa28_send_setup(serial, port, reset_port);
2605 keyspan_usa49_send_setup(serial, port, reset_port);
2608 keyspan_usa90_send_setup(serial, port, reset_port);
2611 keyspan_usa67_send_setup(serial, port, reset_port);
2617 /* Gets called by the "real" driver (ie once firmware is loaded
2618 and renumeration has taken place. */
2619 static int keyspan_startup(struct usb_serial *serial)
2622 struct usb_serial_port *port;
2623 struct keyspan_serial_private *s_priv;
2624 struct keyspan_port_private *p_priv;
2625 const struct keyspan_device_details *d_details;
2627 dbg("%s", __func__);
2629 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2630 if (d_details->product_id ==
2631 le16_to_cpu(serial->dev->descriptor.idProduct))
2633 if (d_details == NULL) {
2634 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2635 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2639 /* Setup private data for serial driver */
2640 s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2642 dbg("%s - kmalloc for keyspan_serial_private failed.",
2647 s_priv->device_details = d_details;
2648 usb_set_serial_data(serial, s_priv);
2650 /* Now setup per port private data */
2651 for (i = 0; i < serial->num_ports; i++) {
2652 port = serial->port[i];
2653 p_priv = kzalloc(sizeof(struct keyspan_port_private),
2656 dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __func__, i);
2659 p_priv->device_details = d_details;
2660 usb_set_serial_port_data(port, p_priv);
2663 keyspan_setup_urbs(serial);
2665 if (s_priv->instat_urb != NULL) {
2666 s_priv->instat_urb->dev = serial->dev;
2667 err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);
2669 dbg("%s - submit instat urb failed %d", __func__,
2672 if (s_priv->indat_urb != NULL) {
2673 s_priv->indat_urb->dev = serial->dev;
2674 err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);
2676 dbg("%s - submit indat urb failed %d", __func__,
2683 static void keyspan_shutdown(struct usb_serial *serial)
2686 struct usb_serial_port *port;
2687 struct keyspan_serial_private *s_priv;
2688 struct keyspan_port_private *p_priv;
2690 dbg("%s", __func__);
2692 s_priv = usb_get_serial_data(serial);
2694 /* Stop reading/writing urbs */
2695 stop_urb(s_priv->instat_urb);
2696 stop_urb(s_priv->glocont_urb);
2697 stop_urb(s_priv->indat_urb);
2698 for (i = 0; i < serial->num_ports; ++i) {
2699 port = serial->port[i];
2700 p_priv = usb_get_serial_port_data(port);
2701 stop_urb(p_priv->inack_urb);
2702 stop_urb(p_priv->outcont_urb);
2703 for (j = 0; j < 2; j++) {
2704 stop_urb(p_priv->in_urbs[j]);
2705 stop_urb(p_priv->out_urbs[j]);
2710 usb_free_urb(s_priv->instat_urb);
2711 usb_free_urb(s_priv->indat_urb);
2712 usb_free_urb(s_priv->glocont_urb);
2713 for (i = 0; i < serial->num_ports; ++i) {
2714 port = serial->port[i];
2715 p_priv = usb_get_serial_port_data(port);
2716 usb_free_urb(p_priv->inack_urb);
2717 usb_free_urb(p_priv->outcont_urb);
2718 for (j = 0; j < 2; j++) {
2719 usb_free_urb(p_priv->in_urbs[j]);
2720 usb_free_urb(p_priv->out_urbs[j]);
2724 /* dbg("Freeing serial->private."); */
2727 /* dbg("Freeing port->private."); */
2728 /* Now free per port private data */
2729 for (i = 0; i < serial->num_ports; i++) {
2730 port = serial->port[i];
2731 kfree(usb_get_serial_port_data(port));
2735 MODULE_AUTHOR(DRIVER_AUTHOR);
2736 MODULE_DESCRIPTION(DRIVER_DESC);
2737 MODULE_LICENSE("GPL");
2739 MODULE_FIRMWARE("keyspan/usa28.fw");
2740 MODULE_FIRMWARE("keyspan/usa28x.fw");
2741 MODULE_FIRMWARE("keyspan/usa28xa.fw");
2742 MODULE_FIRMWARE("keyspan/usa28xb.fw");
2743 MODULE_FIRMWARE("keyspan/usa19.fw");
2744 MODULE_FIRMWARE("keyspan/usa19qi.fw");
2745 MODULE_FIRMWARE("keyspan/mpr.fw");
2746 MODULE_FIRMWARE("keyspan/usa19qw.fw");
2747 MODULE_FIRMWARE("keyspan/usa18x.fw");
2748 MODULE_FIRMWARE("keyspan/usa19w.fw");
2749 MODULE_FIRMWARE("keyspan/usa49w.fw");
2750 MODULE_FIRMWARE("keyspan/usa49wlc.fw");
2752 module_param(debug, bool, S_IRUGO | S_IWUSR);
2753 MODULE_PARM_DESC(debug, "Debug enabled or not");