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