]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/usb/serial/keyspan.c
usb: chipidea: udc: fix memory leak in _ep_nuke
[mirror_ubuntu-artful-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
729 if (urb->actual_length) {
730 while (i < urb->actual_length) {
731
732 /* Check port number from message*/
733 if (data[i] >= serial->num_ports) {
049c6b4e 734 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
441b62c1 735 __func__, data[i]);
0ca1268e
LM
736 return;
737 }
738 port = serial->port[data[i++]];
0ca1268e
LM
739 len = data[i++];
740
741 /* 0x80 bit is error flag */
742 if ((data[i] & 0x80) == 0) {
743 /* no error on any byte */
744 i++;
745 for (x = 1; x < len ; ++x)
92a19f9c
JS
746 tty_insert_flip_char(&port->port,
747 data[i++], 0);
0ca1268e
LM
748 } else {
749 /*
750 * some bytes had errors, every byte has status
751 */
752 for (x = 0; x + 1 < len; x += 2) {
753 int stat = data[i], flag = 0;
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) */
92a19f9c 761 tty_insert_flip_char(&port->port,
0ca1268e
LM
762 data[i+1], flag);
763 i += 2;
764 }
765 }
2e124b4a 766 tty_flip_buffer_push(&port->port);
0ca1268e
LM
767 }
768 }
769
770 /* Resubmit urb so we continue receiving */
0ca1268e
LM
771 err = usb_submit_urb(urb, GFP_ATOMIC);
772 if (err != 0)
049c6b4e 773 dev_dbg(&urb->dev->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
0ca1268e
LM
774}
775
1da177e4 776/* not used, usa-49 doesn't have per-port control endpoints */
0ca1268e 777static void usa49_outcont_callback(struct urb *urb)
1da177e4 778{
1da177e4
LT
779}
780
0ca1268e 781static void usa90_indat_callback(struct urb *urb)
1da177e4
LT
782{
783 int i, err;
784 int endpoint;
785 struct usb_serial_port *port;
786 struct keyspan_port_private *p_priv;
1da177e4 787 unsigned char *data = urb->transfer_buffer;
95b93454 788 int status = urb->status;
1da177e4 789
1da177e4
LT
790 endpoint = usb_pipeendpoint(urb->pipe);
791
95b93454 792 if (status) {
049c6b4e 793 dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n",
441b62c1 794 __func__, status, endpoint);
1da177e4
LT
795 return;
796 }
797
cdc97792 798 port = urb->context;
1da177e4
LT
799 p_priv = usb_get_serial_port_data(port);
800
1da177e4 801 if (urb->actual_length) {
1da177e4 802 /* if current mode is DMA, looks like usa28 format
deb91685 803 otherwise looks like usa26 data format */
1da177e4 804
f035a8ad 805 if (p_priv->baud > 57600)
05c7cd39
JS
806 tty_insert_flip_string(&port->port, data,
807 urb->actual_length);
f035a8ad 808 else {
1da177e4
LT
809 /* 0x80 bit is error flag */
810 if ((data[0] & 0x80) == 0) {
deb91685
AC
811 /* no errors on individual bytes, only
812 possible overrun err*/
1da177e4 813 if (data[0] & RXERROR_OVERRUN)
deb91685
AC
814 err = TTY_OVERRUN;
815 else
816 err = 0;
817 for (i = 1; i < urb->actual_length ; ++i)
92a19f9c
JS
818 tty_insert_flip_char(&port->port,
819 data[i], err);
deb91685 820 } else {
1da177e4 821 /* some bytes had errors, every byte has status */
049c6b4e 822 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
1da177e4
LT
823 for (i = 0; i + 1 < urb->actual_length; i += 2) {
824 int stat = data[i], flag = 0;
825 if (stat & RXERROR_OVERRUN)
826 flag |= TTY_OVERRUN;
827 if (stat & RXERROR_FRAMING)
828 flag |= TTY_FRAME;
829 if (stat & RXERROR_PARITY)
830 flag |= TTY_PARITY;
831 /* XXX should handle break (0x10) */
92a19f9c
JS
832 tty_insert_flip_char(&port->port,
833 data[i+1], flag);
1da177e4
LT
834 }
835 }
836 }
2e124b4a 837 tty_flip_buffer_push(&port->port);
1da177e4 838 }
deb91685 839
1da177e4 840 /* Resubmit urb so we continue receiving */
1f87158e
AS
841 err = usb_submit_urb(urb, GFP_ATOMIC);
842 if (err != 0)
049c6b4e 843 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1da177e4
LT
844}
845
846
7d12e780 847static void usa90_instat_callback(struct urb *urb)
1da177e4
LT
848{
849 unsigned char *data = urb->transfer_buffer;
850 struct keyspan_usa90_portStatusMessage *msg;
851 struct usb_serial *serial;
852 struct usb_serial_port *port;
853 struct keyspan_port_private *p_priv;
4a90f09b 854 struct tty_struct *tty;
1da177e4 855 int old_dcd_state, err;
95b93454 856 int status = urb->status;
1da177e4 857
cdc97792 858 serial = urb->context;
1da177e4 859
95b93454 860 if (status) {
049c6b4e 861 dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
1da177e4
LT
862 return;
863 }
864 if (urb->actual_length < 14) {
049c6b4e 865 dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);
1da177e4
LT
866 goto exit;
867 }
868
869 msg = (struct keyspan_usa90_portStatusMessage *)data;
870
871 /* Now do something useful with the data */
872
873 port = serial->port[0];
874 p_priv = usb_get_serial_port_data(port);
deb91685 875
1da177e4
LT
876 /* Update handshaking pin state information */
877 old_dcd_state = p_priv->dcd_state;
878 p_priv->cts_state = ((msg->cts) ? 1 : 0);
879 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
880 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
881 p_priv->ri_state = ((msg->ri) ? 1 : 0);
882
4a90f09b
AC
883 if (old_dcd_state != p_priv->dcd_state && old_dcd_state) {
884 tty = tty_port_tty_get(&port->port);
885 if (tty && !C_CLOCAL(tty))
886 tty_hangup(tty);
887 tty_kref_put(tty);
1da177e4 888 }
deb91685 889
1da177e4 890 /* Resubmit urb so we continue receiving */
deb91685
AC
891 err = usb_submit_urb(urb, GFP_ATOMIC);
892 if (err != 0)
049c6b4e 893 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1da177e4
LT
894exit:
895 ;
896}
897
7d12e780 898static void usa90_outcont_callback(struct urb *urb)
1da177e4
LT
899{
900 struct usb_serial_port *port;
901 struct keyspan_port_private *p_priv;
902
cdc97792 903 port = urb->context;
1da177e4
LT
904 p_priv = usb_get_serial_port_data(port);
905
906 if (p_priv->resend_cont) {
049c6b4e 907 dev_dbg(&urb->dev->dev, "%s - sending setup\n", __func__);
deb91685
AC
908 keyspan_usa90_send_setup(port->serial, port,
909 p_priv->resend_cont - 1);
1da177e4
LT
910 }
911}
912
0ca1268e
LM
913/* Status messages from the 28xg */
914static void usa67_instat_callback(struct urb *urb)
915{
916 int err;
917 unsigned char *data = urb->transfer_buffer;
918 struct keyspan_usa67_portStatusMessage *msg;
919 struct usb_serial *serial;
920 struct usb_serial_port *port;
921 struct keyspan_port_private *p_priv;
922 int old_dcd_state;
95b93454 923 int status = urb->status;
0ca1268e 924
0ca1268e
LM
925 serial = urb->context;
926
95b93454 927 if (status) {
049c6b4e 928 dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
0ca1268e
LM
929 return;
930 }
931
deb91685
AC
932 if (urb->actual_length !=
933 sizeof(struct keyspan_usa67_portStatusMessage)) {
049c6b4e 934 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
0ca1268e
LM
935 return;
936 }
937
938
939 /* Now do something useful with the data */
940 msg = (struct keyspan_usa67_portStatusMessage *)data;
941
942 /* Check port number from message and retrieve private data */
943 if (msg->port >= serial->num_ports) {
049c6b4e 944 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
0ca1268e
LM
945 return;
946 }
947
948 port = serial->port[msg->port];
949 p_priv = usb_get_serial_port_data(port);
950
951 /* Update handshaking pin state information */
952 old_dcd_state = p_priv->dcd_state;
953 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
954 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
955
4a90f09b
AC
956 if (old_dcd_state != p_priv->dcd_state && old_dcd_state) {
957 struct tty_struct *tty = tty_port_tty_get(&port->port);
958 if (tty && !C_CLOCAL(tty))
959 tty_hangup(tty);
960 tty_kref_put(tty);
0ca1268e
LM
961 }
962
963 /* Resubmit urb so we continue receiving */
0ca1268e
LM
964 err = usb_submit_urb(urb, GFP_ATOMIC);
965 if (err != 0)
049c6b4e 966 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
0ca1268e
LM
967}
968
969static void usa67_glocont_callback(struct urb *urb)
970{
971 struct usb_serial *serial;
972 struct usb_serial_port *port;
973 struct keyspan_port_private *p_priv;
974 int i;
975
0ca1268e
LM
976 serial = urb->context;
977 for (i = 0; i < serial->num_ports; ++i) {
978 port = serial->port[i];
979 p_priv = usb_get_serial_port_data(port);
980
981 if (p_priv->resend_cont) {
049c6b4e 982 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
0ca1268e
LM
983 keyspan_usa67_send_setup(serial, port,
984 p_priv->resend_cont - 1);
985 break;
986 }
987 }
988}
989
95da310e 990static int keyspan_write_room(struct tty_struct *tty)
1da177e4 991{
95da310e 992 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
993 struct keyspan_port_private *p_priv;
994 const struct keyspan_device_details *d_details;
995 int flip;
996 int data_len;
997 struct urb *this_urb;
998
1da177e4
LT
999 p_priv = usb_get_serial_port_data(port);
1000 d_details = p_priv->device_details;
1001
a5b6f60c 1002 /* FIXME: locking */
1da177e4 1003 if (d_details->msg_format == msg_usa90)
deb91685 1004 data_len = 64;
1da177e4
LT
1005 else
1006 data_len = 63;
1007
1008 flip = p_priv->out_flip;
1009
1010 /* Check both endpoints to see if any are available. */
deb91685
AC
1011 this_urb = p_priv->out_urbs[flip];
1012 if (this_urb != NULL) {
1da177e4 1013 if (this_urb->status != -EINPROGRESS)
deb91685
AC
1014 return data_len;
1015 flip = (flip + 1) & d_details->outdat_endp_flip;
1016 this_urb = p_priv->out_urbs[flip];
1017 if (this_urb != NULL) {
1da177e4 1018 if (this_urb->status != -EINPROGRESS)
deb91685
AC
1019 return data_len;
1020 }
1da177e4 1021 }
a5b6f60c 1022 return 0;
1da177e4
LT
1023}
1024
1025
a509a7e4 1026static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
1da177e4 1027{
f78ba157 1028 struct keyspan_port_private *p_priv;
1da177e4
LT
1029 const struct keyspan_device_details *d_details;
1030 int i, err;
f78ba157 1031 int baud_rate, device_port;
1da177e4 1032 struct urb *urb;
95da310e 1033 unsigned int cflag = 0;
1da177e4 1034
1da177e4
LT
1035 p_priv = usb_get_serial_port_data(port);
1036 d_details = p_priv->device_details;
7eea4364 1037
1da177e4
LT
1038 /* Set some sane defaults */
1039 p_priv->rts_state = 1;
1040 p_priv->dtr_state = 1;
1041 p_priv->baud = 9600;
1042
1043 /* force baud and lcr to be set on open */
1044 p_priv->old_baud = 0;
1045 p_priv->old_cflag = 0;
1046
1047 p_priv->out_flip = 0;
1048 p_priv->in_flip = 0;
1049
1050 /* Reset low level data toggle and start reading from endpoints */
1051 for (i = 0; i < 2; i++) {
deb91685
AC
1052 urb = p_priv->in_urbs[i];
1053 if (urb == NULL)
1da177e4 1054 continue;
1da177e4 1055
deb91685
AC
1056 /* make sure endpoint data toggle is synchronized
1057 with the device */
1da177e4 1058 usb_clear_halt(urb->dev, urb->pipe);
deb91685
AC
1059 err = usb_submit_urb(urb, GFP_KERNEL);
1060 if (err != 0)
049c6b4e 1061 dev_dbg(&port->dev, "%s - submit urb %d failed (%d)\n", __func__, i, err);
1da177e4
LT
1062 }
1063
1064 /* Reset low level data toggle on out endpoints */
1065 for (i = 0; i < 2; i++) {
deb91685
AC
1066 urb = p_priv->out_urbs[i];
1067 if (urb == NULL)
1da177e4 1068 continue;
deb91685
AC
1069 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1070 usb_pipeout(urb->pipe), 0); */
1da177e4
LT
1071 }
1072
f78ba157
AM
1073 /* get the terminal config for the setup message now so we don't
1074 * need to send 2 of them */
1075
f78ba157 1076 device_port = port->number - port->serial->minor;
95da310e 1077 if (tty) {
adc8d746 1078 cflag = tty->termios.c_cflag;
95da310e
AC
1079 /* Baud rate calculation takes baud rate as an integer
1080 so other rates can be generated if desired. */
1081 baud_rate = tty_get_baud_rate(tty);
1082 /* If no match or invalid, leave as default */
1083 if (baud_rate >= 0
049c6b4e 1084 && d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,
95da310e
AC
1085 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1086 p_priv->baud = baud_rate;
1087 }
f78ba157 1088 }
f78ba157
AM
1089 /* set CTS/RTS handshake etc. */
1090 p_priv->cflag = cflag;
2b982ab1 1091 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
f78ba157
AM
1092
1093 keyspan_send_setup(port, 1);
deb91685
AC
1094 /* mdelay(100); */
1095 /* keyspan_set_termios(port, NULL); */
f78ba157 1096
a5b6f60c 1097 return 0;
1da177e4
LT
1098}
1099
1100static inline void stop_urb(struct urb *urb)
1101{
242cf670 1102 if (urb && urb->status == -EINPROGRESS)
1da177e4 1103 usb_kill_urb(urb);
1da177e4
LT
1104}
1105
335f8514
AC
1106static void keyspan_dtr_rts(struct usb_serial_port *port, int on)
1107{
1108 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
1109
1110 p_priv->rts_state = on;
1111 p_priv->dtr_state = on;
1112 keyspan_send_setup(port, 0);
1113}
1114
1115static void keyspan_close(struct usb_serial_port *port)
1da177e4
LT
1116{
1117 int i;
1da177e4
LT
1118 struct keyspan_port_private *p_priv;
1119
1da177e4 1120 p_priv = usb_get_serial_port_data(port);
deb91685 1121
1da177e4
LT
1122 p_priv->rts_state = 0;
1123 p_priv->dtr_state = 0;
deb91685 1124
80dfe0ce
JH
1125 keyspan_send_setup(port, 2);
1126 /* pilot-xfer seems to work best with this delay */
1127 mdelay(100);
1da177e4
LT
1128
1129 p_priv->out_flip = 0;
1130 p_priv->in_flip = 0;
1131
80dfe0ce
JH
1132 stop_urb(p_priv->inack_urb);
1133 for (i = 0; i < 2; i++) {
1134 stop_urb(p_priv->in_urbs[i]);
1135 stop_urb(p_priv->out_urbs[i]);
1da177e4 1136 }
1da177e4
LT
1137}
1138
deb91685
AC
1139/* download the firmware to a pre-renumeration device */
1140static int keyspan_fake_startup(struct usb_serial *serial)
1da177e4 1141{
8d733e26 1142 char *fw_name;
1da177e4 1143
049c6b4e
GKH
1144 dev_dbg(&serial->dev->dev, "Keyspan startup version %04x product %04x\n",
1145 le16_to_cpu(serial->dev->descriptor.bcdDevice),
1146 le16_to_cpu(serial->dev->descriptor.idProduct));
deb91685
AC
1147
1148 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)
1149 != 0x8000) {
049c6b4e 1150 dev_dbg(&serial->dev->dev, "Firmware already loaded. Quitting.\n");
deb91685 1151 return 1;
1da177e4
LT
1152 }
1153
1154 /* Select firmware image on the basis of idProduct */
1155 switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1156 case keyspan_usa28_pre_product_id:
2971c579 1157 fw_name = "keyspan/usa28.fw";
1da177e4
LT
1158 break;
1159
1160 case keyspan_usa28x_pre_product_id:
2971c579 1161 fw_name = "keyspan/usa28x.fw";
1da177e4
LT
1162 break;
1163
1164 case keyspan_usa28xa_pre_product_id:
2971c579 1165 fw_name = "keyspan/usa28xa.fw";
1da177e4
LT
1166 break;
1167
1168 case keyspan_usa28xb_pre_product_id:
2971c579 1169 fw_name = "keyspan/usa28xb.fw";
1da177e4
LT
1170 break;
1171
1172 case keyspan_usa19_pre_product_id:
2971c579 1173 fw_name = "keyspan/usa19.fw";
1da177e4 1174 break;
deb91685 1175
1da177e4 1176 case keyspan_usa19qi_pre_product_id:
2971c579 1177 fw_name = "keyspan/usa19qi.fw";
1da177e4 1178 break;
deb91685 1179
1da177e4 1180 case keyspan_mpr_pre_product_id:
2971c579 1181 fw_name = "keyspan/mpr.fw";
1da177e4
LT
1182 break;
1183
1184 case keyspan_usa19qw_pre_product_id:
2971c579 1185 fw_name = "keyspan/usa19qw.fw";
1da177e4 1186 break;
deb91685 1187
1da177e4 1188 case keyspan_usa18x_pre_product_id:
2971c579 1189 fw_name = "keyspan/usa18x.fw";
1da177e4 1190 break;
deb91685 1191
1da177e4 1192 case keyspan_usa19w_pre_product_id:
2971c579 1193 fw_name = "keyspan/usa19w.fw";
1da177e4 1194 break;
deb91685 1195
1da177e4 1196 case keyspan_usa49w_pre_product_id:
2971c579 1197 fw_name = "keyspan/usa49w.fw";
1da177e4
LT
1198 break;
1199
1200 case keyspan_usa49wlc_pre_product_id:
2971c579 1201 fw_name = "keyspan/usa49wlc.fw";
1da177e4
LT
1202 break;
1203
1204 default:
2971c579
DW
1205 dev_err(&serial->dev->dev, "Unknown product ID (%04x)\n",
1206 le16_to_cpu(serial->dev->descriptor.idProduct));
1207 return 1;
1da177e4
LT
1208 }
1209
049c6b4e 1210 dev_dbg(&serial->dev->dev, "Uploading Keyspan %s firmware.\n", fw_name);
1da177e4 1211
8d733e26
RB
1212 if (ezusb_fx1_ihex_firmware_download(serial->dev, fw_name) < 0) {
1213 dev_err(&serial->dev->dev, "failed to load firmware \"%s\"\n",
1214 fw_name);
1215 return -ENOENT;
1da177e4 1216 }
8d733e26
RB
1217
1218 /* after downloading firmware Renumeration will occur in a
1219 moment and the new device will bind to the real driver */
1da177e4
LT
1220
1221 /* we don't want this device to have a driver assigned to it. */
deb91685 1222 return 1;
1da177e4
LT
1223}
1224
1225/* Helper functions used by keyspan_setup_urbs */
fdcba53e
RW
1226static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *serial,
1227 int endpoint)
1228{
1229 struct usb_host_interface *iface_desc;
1230 struct usb_endpoint_descriptor *ep;
1231 int i;
1232
1233 iface_desc = serial->interface->cur_altsetting;
1234 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1235 ep = &iface_desc->endpoint[i].desc;
1236 if (ep->bEndpointAddress == endpoint)
1237 return ep;
1238 }
1239 dev_warn(&serial->interface->dev, "found no endpoint descriptor for "
1240 "endpoint %x\n", endpoint);
1241 return NULL;
1242}
1243
deb91685 1244static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
1da177e4 1245 int dir, void *ctx, char *buf, int len,
7d12e780 1246 void (*callback)(struct urb *))
1da177e4
LT
1247{
1248 struct urb *urb;
fdcba53e
RW
1249 struct usb_endpoint_descriptor const *ep_desc;
1250 char const *ep_type_name;
1da177e4
LT
1251
1252 if (endpoint == -1)
1253 return NULL; /* endpoint not needed */
1254
049c6b4e 1255 dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %d.\n", __func__, endpoint);
1da177e4
LT
1256 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
1257 if (urb == NULL) {
049c6b4e 1258 dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %d failed.\n", __func__, endpoint);
1da177e4
LT
1259 return NULL;
1260 }
1261
0ca1268e
LM
1262 if (endpoint == 0) {
1263 /* control EP filled in when used */
1264 return urb;
1265 }
1266
fdcba53e
RW
1267 ep_desc = find_ep(serial, endpoint);
1268 if (!ep_desc) {
1269 /* leak the urb, something's wrong and the callers don't care */
1270 return urb;
1271 }
1272 if (usb_endpoint_xfer_int(ep_desc)) {
1273 ep_type_name = "INT";
1274 usb_fill_int_urb(urb, serial->dev,
1275 usb_sndintpipe(serial->dev, endpoint) | dir,
1276 buf, len, callback, ctx,
1277 ep_desc->bInterval);
1278 } else if (usb_endpoint_xfer_bulk(ep_desc)) {
1279 ep_type_name = "BULK";
1280 usb_fill_bulk_urb(urb, serial->dev,
1281 usb_sndbulkpipe(serial->dev, endpoint) | dir,
1282 buf, len, callback, ctx);
1283 } else {
1284 dev_warn(&serial->interface->dev,
1285 "unsupported endpoint type %x\n",
2e0fe709 1286 usb_endpoint_type(ep_desc));
fdcba53e
RW
1287 usb_free_urb(urb);
1288 return NULL;
1289 }
1da177e4 1290
049c6b4e 1291 dev_dbg(&serial->interface->dev, "%s - using urb %p for %s endpoint %x\n",
fdcba53e 1292 __func__, urb, ep_type_name, endpoint);
1da177e4
LT
1293 return urb;
1294}
1295
1296static struct callbacks {
7d12e780
DH
1297 void (*instat_callback)(struct urb *);
1298 void (*glocont_callback)(struct urb *);
1299 void (*indat_callback)(struct urb *);
1300 void (*outdat_callback)(struct urb *);
1301 void (*inack_callback)(struct urb *);
1302 void (*outcont_callback)(struct urb *);
1da177e4
LT
1303} keyspan_callbacks[] = {
1304 {
1305 /* msg_usa26 callbacks */
1306 .instat_callback = usa26_instat_callback,
1307 .glocont_callback = usa26_glocont_callback,
1308 .indat_callback = usa26_indat_callback,
1309 .outdat_callback = usa2x_outdat_callback,
1310 .inack_callback = usa26_inack_callback,
1311 .outcont_callback = usa26_outcont_callback,
1312 }, {
1313 /* msg_usa28 callbacks */
1314 .instat_callback = usa28_instat_callback,
1315 .glocont_callback = usa28_glocont_callback,
1316 .indat_callback = usa28_indat_callback,
1317 .outdat_callback = usa2x_outdat_callback,
1318 .inack_callback = usa28_inack_callback,
1319 .outcont_callback = usa28_outcont_callback,
1320 }, {
1321 /* msg_usa49 callbacks */
1322 .instat_callback = usa49_instat_callback,
1323 .glocont_callback = usa49_glocont_callback,
1324 .indat_callback = usa49_indat_callback,
1325 .outdat_callback = usa2x_outdat_callback,
1326 .inack_callback = usa49_inack_callback,
1327 .outcont_callback = usa49_outcont_callback,
1328 }, {
1329 /* msg_usa90 callbacks */
1330 .instat_callback = usa90_instat_callback,
deb91685 1331 .glocont_callback = usa28_glocont_callback,
1da177e4
LT
1332 .indat_callback = usa90_indat_callback,
1333 .outdat_callback = usa2x_outdat_callback,
1334 .inack_callback = usa28_inack_callback,
1335 .outcont_callback = usa90_outcont_callback,
0ca1268e
LM
1336 }, {
1337 /* msg_usa67 callbacks */
1338 .instat_callback = usa67_instat_callback,
1339 .glocont_callback = usa67_glocont_callback,
1340 .indat_callback = usa26_indat_callback,
1341 .outdat_callback = usa2x_outdat_callback,
1342 .inack_callback = usa26_inack_callback,
1343 .outcont_callback = usa26_outcont_callback,
1da177e4
LT
1344 }
1345};
1346
1347 /* Generic setup urbs function that uses
1348 data in device_details */
1349static void keyspan_setup_urbs(struct usb_serial *serial)
1350{
1da177e4
LT
1351 struct keyspan_serial_private *s_priv;
1352 const struct keyspan_device_details *d_details;
1da177e4 1353 struct callbacks *cback;
1da177e4 1354
1da177e4
LT
1355 s_priv = usb_get_serial_data(serial);
1356 d_details = s_priv->device_details;
1357
deb91685 1358 /* Setup values for the various callback routines */
1da177e4
LT
1359 cback = &keyspan_callbacks[d_details->msg_format];
1360
deb91685
AC
1361 /* Allocate and set up urbs for each one that is in use,
1362 starting with instat endpoints */
1da177e4
LT
1363 s_priv->instat_urb = keyspan_setup_urb
1364 (serial, d_details->instat_endpoint, USB_DIR_IN,
1365 serial, s_priv->instat_buf, INSTAT_BUFLEN,
1366 cback->instat_callback);
1367
0ca1268e
LM
1368 s_priv->indat_urb = keyspan_setup_urb
1369 (serial, d_details->indat_endpoint, USB_DIR_IN,
1370 serial, s_priv->indat_buf, INDAT49W_BUFLEN,
1371 usa49wg_indat_callback);
1372
1da177e4
LT
1373 s_priv->glocont_urb = keyspan_setup_urb
1374 (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1375 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1376 cback->glocont_callback);
1da177e4
LT
1377}
1378
1379/* usa19 function doesn't require prescaler */
049c6b4e
GKH
1380static int keyspan_usa19_calc_baud(struct usb_serial_port *port,
1381 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1da177e4
LT
1382 u8 *rate_low, u8 *prescaler, int portnum)
1383{
1384 u32 b16, /* baud rate times 16 (actual rate used internally) */
deb91685 1385 div, /* divisor */
1da177e4 1386 cnt; /* inverse of divisor (programmed into 8051) */
1da177e4 1387
049c6b4e 1388 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
deb91685
AC
1389
1390 /* prevent divide by zero... */
1391 b16 = baud_rate * 16L;
1392 if (b16 == 0)
1393 return KEYSPAN_INVALID_BAUD_RATE;
1394 /* Any "standard" rate over 57k6 is marginal on the USA-19
1395 as we run out of divisor resolution. */
1396 if (baud_rate > 57600)
1397 return KEYSPAN_INVALID_BAUD_RATE;
1398
1399 /* calculate the divisor and the counter (its inverse) */
1400 div = baudclk / b16;
1401 if (div == 0)
1402 return KEYSPAN_INVALID_BAUD_RATE;
1403 else
1da177e4 1404 cnt = 0 - div;
1da177e4 1405
deb91685
AC
1406 if (div > 0xffff)
1407 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4 1408
deb91685
AC
1409 /* return the counter values if non-null */
1410 if (rate_low)
1da177e4 1411 *rate_low = (u8) (cnt & 0xff);
deb91685 1412 if (rate_hi)
1da177e4 1413 *rate_hi = (u8) ((cnt >> 8) & 0xff);
deb91685 1414 if (rate_low && rate_hi)
049c6b4e 1415 dev_dbg(&port->dev, "%s - %d %02x %02x.\n",
deb91685
AC
1416 __func__, baud_rate, *rate_hi, *rate_low);
1417 return KEYSPAN_BAUD_RATE_OK;
1da177e4
LT
1418}
1419
1420/* usa19hs function doesn't require prescaler */
049c6b4e
GKH
1421static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port,
1422 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1423 u8 *rate_low, u8 *prescaler, int portnum)
1da177e4
LT
1424{
1425 u32 b16, /* baud rate times 16 (actual rate used internally) */
deb91685 1426 div; /* divisor */
1da177e4 1427
049c6b4e 1428 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1da177e4 1429
deb91685
AC
1430 /* prevent divide by zero... */
1431 b16 = baud_rate * 16L;
1432 if (b16 == 0)
1433 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4 1434
deb91685
AC
1435 /* calculate the divisor */
1436 div = baudclk / b16;
1437 if (div == 0)
1438 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4 1439
deb91685
AC
1440 if (div > 0xffff)
1441 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4 1442
deb91685
AC
1443 /* return the counter values if non-null */
1444 if (rate_low)
1da177e4 1445 *rate_low = (u8) (div & 0xff);
deb91685
AC
1446
1447 if (rate_hi)
1da177e4 1448 *rate_hi = (u8) ((div >> 8) & 0xff);
deb91685
AC
1449
1450 if (rate_low && rate_hi)
049c6b4e 1451 dev_dbg(&port->dev, "%s - %d %02x %02x.\n",
deb91685
AC
1452 __func__, baud_rate, *rate_hi, *rate_low);
1453
1454 return KEYSPAN_BAUD_RATE_OK;
1da177e4
LT
1455}
1456
049c6b4e
GKH
1457static int keyspan_usa19w_calc_baud(struct usb_serial_port *port,
1458 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1da177e4
LT
1459 u8 *rate_low, u8 *prescaler, int portnum)
1460{
1461 u32 b16, /* baud rate times 16 (actual rate used internally) */
1462 clk, /* clock with 13/8 prescaler */
deb91685 1463 div, /* divisor using 13/8 prescaler */
1da177e4
LT
1464 res, /* resulting baud rate using 13/8 prescaler */
1465 diff, /* error using 13/8 prescaler */
1466 smallest_diff;
1467 u8 best_prescaler;
1468 int i;
1469
049c6b4e 1470 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1da177e4 1471
deb91685
AC
1472 /* prevent divide by zero */
1473 b16 = baud_rate * 16L;
1474 if (b16 == 0)
1475 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4 1476
deb91685
AC
1477 /* Calculate prescaler by trying them all and looking
1478 for best fit */
1479
1480 /* start with largest possible difference */
1da177e4
LT
1481 smallest_diff = 0xffffffff;
1482
1483 /* 0 is an invalid prescaler, used as a flag */
1484 best_prescaler = 0;
1485
deb91685 1486 for (i = 8; i <= 0xff; ++i) {
1da177e4 1487 clk = (baudclk * 8) / (u32) i;
deb91685
AC
1488
1489 div = clk / b16;
1490 if (div == 0)
1da177e4 1491 continue;
1da177e4
LT
1492
1493 res = clk / div;
deb91685 1494 diff = (res > b16) ? (res-b16) : (b16-res);
1da177e4 1495
deb91685 1496 if (diff < smallest_diff) {
1da177e4
LT
1497 best_prescaler = i;
1498 smallest_diff = diff;
1499 }
1500 }
1501
deb91685
AC
1502 if (best_prescaler == 0)
1503 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4
LT
1504
1505 clk = (baudclk * 8) / (u32) best_prescaler;
1506 div = clk / b16;
1507
deb91685
AC
1508 /* return the divisor and prescaler if non-null */
1509 if (rate_low)
1da177e4 1510 *rate_low = (u8) (div & 0xff);
deb91685 1511 if (rate_hi)
1da177e4 1512 *rate_hi = (u8) ((div >> 8) & 0xff);
1da177e4
LT
1513 if (prescaler) {
1514 *prescaler = best_prescaler;
049c6b4e 1515 /* dev_dbg(&port->dev, "%s - %d %d\n", __func__, *prescaler, div); */
1da177e4 1516 }
deb91685 1517 return KEYSPAN_BAUD_RATE_OK;
1da177e4
LT
1518}
1519
1520 /* USA-28 supports different maximum baud rates on each port */
049c6b4e
GKH
1521static int keyspan_usa28_calc_baud(struct usb_serial_port *port,
1522 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1523 u8 *rate_low, u8 *prescaler, int portnum)
1da177e4
LT
1524{
1525 u32 b16, /* baud rate times 16 (actual rate used internally) */
deb91685 1526 div, /* divisor */
1da177e4
LT
1527 cnt; /* inverse of divisor (programmed into 8051) */
1528
049c6b4e 1529 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1da177e4
LT
1530
1531 /* prevent divide by zero */
deb91685
AC
1532 b16 = baud_rate * 16L;
1533 if (b16 == 0)
1534 return KEYSPAN_INVALID_BAUD_RATE;
1535
1536 /* calculate the divisor and the counter (its inverse) */
1537 div = KEYSPAN_USA28_BAUDCLK / b16;
1538 if (div == 0)
1539 return KEYSPAN_INVALID_BAUD_RATE;
1540 else
1da177e4 1541 cnt = 0 - div;
1da177e4 1542
deb91685
AC
1543 /* check for out of range, based on portnum,
1544 and return result */
1545 if (portnum == 0) {
1546 if (div > 0xffff)
1547 return KEYSPAN_INVALID_BAUD_RATE;
1548 } else {
1549 if (portnum == 1) {
1550 if (div > 0xff)
1551 return KEYSPAN_INVALID_BAUD_RATE;
1552 } else
1553 return KEYSPAN_INVALID_BAUD_RATE;
1da177e4
LT
1554 }
1555
1556 /* return the counter values if not NULL
1557 (port 1 will ignore retHi) */
deb91685 1558 if (rate_low)
1da177e4 1559 *rate_low = (u8) (cnt & 0xff);
deb91685 1560 if (rate_hi)
1da177e4 1561 *rate_hi = (u8) ((cnt >> 8) & 0xff);
049c6b4e 1562 dev_dbg(&port->dev, "%s - %d OK.\n", __func__, baud_rate);
deb91685 1563 return KEYSPAN_BAUD_RATE_OK;
1da177e4
LT
1564}
1565
1566static int keyspan_usa26_send_setup(struct usb_serial *serial,
1567 struct usb_serial_port *port,
1568 int reset_port)
1569{
deb91685 1570 struct keyspan_usa26_portControlMessage msg;
1da177e4
LT
1571 struct keyspan_serial_private *s_priv;
1572 struct keyspan_port_private *p_priv;
1573 const struct keyspan_device_details *d_details;
1574 int outcont_urb;
1575 struct urb *this_urb;
1576 int device_port, err;
1577
049c6b4e 1578 dev_dbg(&port->dev, "%s reset=%d\n", __func__, reset_port);
1da177e4
LT
1579
1580 s_priv = usb_get_serial_data(serial);
1581 p_priv = usb_get_serial_port_data(port);
1582 d_details = s_priv->device_details;
1583 device_port = port->number - port->serial->minor;
1584
1585 outcont_urb = d_details->outcont_endpoints[port->number];
1586 this_urb = p_priv->outcont_urb;
1587
049c6b4e 1588 dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe));
1da177e4
LT
1589
1590 /* Make sure we have an urb then send the message */
1591 if (this_urb == NULL) {
049c6b4e 1592 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
1da177e4
LT
1593 return -1;
1594 }
1595
1596 /* Save reset port val for resend.
0ca1268e
LM
1597 Don't overwrite resend for open/close condition. */
1598 if ((reset_port + 1) > p_priv->resend_cont)
1da177e4
LT
1599 p_priv->resend_cont = reset_port + 1;
1600 if (this_urb->status == -EINPROGRESS) {
049c6b4e 1601 /* dev_dbg(&port->dev, "%s - already writing\n", __func__); */
1da177e4 1602 mdelay(5);
deb91685 1603 return -1;
1da177e4
LT
1604 }
1605
deb91685
AC
1606 memset(&msg, 0, sizeof(struct keyspan_usa26_portControlMessage));
1607
1608 /* Only set baud rate if it's changed */
1da177e4
LT
1609 if (p_priv->old_baud != p_priv->baud) {
1610 p_priv->old_baud = p_priv->baud;
1611 msg.setClocking = 0xff;
049c6b4e
GKH
1612 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
1613 &msg.baudHi, &msg.baudLo, &msg.prescaler,
1614 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
1615 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
1616 __func__, p_priv->baud);
1da177e4
LT
1617 msg.baudLo = 0;
1618 msg.baudHi = 125; /* Values for 9600 baud */
1619 msg.prescaler = 10;
1620 }
1621 msg.setPrescaler = 0xff;
1622 }
1623
2b982ab1 1624 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
1da177e4
LT
1625 switch (p_priv->cflag & CSIZE) {
1626 case CS5:
1627 msg.lcr |= USA_DATABITS_5;
1628 break;
1629 case CS6:
1630 msg.lcr |= USA_DATABITS_6;
1631 break;
1632 case CS7:
1633 msg.lcr |= USA_DATABITS_7;
1634 break;
1635 case CS8:
1636 msg.lcr |= USA_DATABITS_8;
1637 break;
1638 }
1639 if (p_priv->cflag & PARENB) {
1640 /* note USA_PARITY_NONE == 0 */
2b982ab1 1641 msg.lcr |= (p_priv->cflag & PARODD) ?
deb91685 1642 USA_PARITY_ODD : USA_PARITY_EVEN;
1da177e4
LT
1643 }
1644 msg.setLcr = 0xff;
1645
1646 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1647 msg.xonFlowControl = 0;
1648 msg.setFlowControl = 0xff;
1649 msg.forwardingLength = 16;
1650 msg.xonChar = 17;
1651 msg.xoffChar = 19;
1652
1653 /* Opening port */
1654 if (reset_port == 1) {
1655 msg._txOn = 1;
1656 msg._txOff = 0;
1657 msg.txFlush = 0;
1658 msg.txBreak = 0;
1659 msg.rxOn = 1;
1660 msg.rxOff = 0;
1661 msg.rxFlush = 1;
1662 msg.rxForward = 0;
1663 msg.returnStatus = 0;
1664 msg.resetDataToggle = 0xff;
1665 }
1666
1667 /* Closing port */
1668 else if (reset_port == 2) {
1669 msg._txOn = 0;
1670 msg._txOff = 1;
1671 msg.txFlush = 0;
1672 msg.txBreak = 0;
1673 msg.rxOn = 0;
1674 msg.rxOff = 1;
1675 msg.rxFlush = 1;
1676 msg.rxForward = 0;
1677 msg.returnStatus = 0;
1678 msg.resetDataToggle = 0;
1679 }
1680
1681 /* Sending intermediate configs */
1682 else {
deb91685 1683 msg._txOn = (!p_priv->break_on);
1da177e4
LT
1684 msg._txOff = 0;
1685 msg.txFlush = 0;
1686 msg.txBreak = (p_priv->break_on);
1687 msg.rxOn = 0;
1688 msg.rxOff = 0;
1689 msg.rxFlush = 0;
1690 msg.rxForward = 0;
1691 msg.returnStatus = 0;
1692 msg.resetDataToggle = 0x0;
1693 }
1694
deb91685 1695 /* Do handshaking outputs */
1da177e4
LT
1696 msg.setTxTriState_setRts = 0xff;
1697 msg.txTriState_rts = p_priv->rts_state;
1698
1699 msg.setHskoa_setDtr = 0xff;
1700 msg.hskoa_dtr = p_priv->dtr_state;
deb91685 1701
1da177e4 1702 p_priv->resend_cont = 0;
deb91685
AC
1703 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
1704
1da177e4
LT
1705 /* send the data out the device on control endpoint */
1706 this_urb->transfer_buffer_length = sizeof(msg);
1707
deb91685
AC
1708 err = usb_submit_urb(this_urb, GFP_ATOMIC);
1709 if (err != 0)
049c6b4e 1710 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
1da177e4
LT
1711#if 0
1712 else {
049c6b4e
GKH
1713 dev_dbg(&port->dev, "%s - usb_submit_urb(%d) OK %d bytes (end %d)\n", __func__
1714 outcont_urb, this_urb->transfer_buffer_length,
1715 usb_pipeendpoint(this_urb->pipe));
1da177e4
LT
1716 }
1717#endif
1718
a5b6f60c 1719 return 0;
1da177e4
LT
1720}
1721
1722static int keyspan_usa28_send_setup(struct usb_serial *serial,
1723 struct usb_serial_port *port,
1724 int reset_port)
1725{
deb91685 1726 struct keyspan_usa28_portControlMessage msg;
1da177e4
LT
1727 struct keyspan_serial_private *s_priv;
1728 struct keyspan_port_private *p_priv;
1729 const struct keyspan_device_details *d_details;
1730 struct urb *this_urb;
1731 int device_port, err;
1732
1da177e4
LT
1733 s_priv = usb_get_serial_data(serial);
1734 p_priv = usb_get_serial_port_data(port);
1735 d_details = s_priv->device_details;
1736 device_port = port->number - port->serial->minor;
1737
1738 /* only do something if we have a bulk out endpoint */
deb91685
AC
1739 this_urb = p_priv->outcont_urb;
1740 if (this_urb == NULL) {
049c6b4e 1741 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
1da177e4
LT
1742 return -1;
1743 }
1744
1745 /* Save reset port val for resend.
0ca1268e
LM
1746 Don't overwrite resend for open/close condition. */
1747 if ((reset_port + 1) > p_priv->resend_cont)
1da177e4
LT
1748 p_priv->resend_cont = reset_port + 1;
1749 if (this_urb->status == -EINPROGRESS) {
049c6b4e 1750 dev_dbg(&port->dev, "%s already writing\n", __func__);
1da177e4 1751 mdelay(5);
deb91685 1752 return -1;
1da177e4
LT
1753 }
1754
deb91685 1755 memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));
1da177e4
LT
1756
1757 msg.setBaudRate = 1;
049c6b4e
GKH
1758 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
1759 &msg.baudHi, &msg.baudLo, NULL,
1760 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
1761 dev_dbg(&port->dev, "%s - Invalid baud rate requested %d.\n",
deb91685 1762 __func__, p_priv->baud);
1da177e4
LT
1763 msg.baudLo = 0xff;
1764 msg.baudHi = 0xb2; /* Values for 9600 baud */
1765 }
1766
1767 /* If parity is enabled, we must calculate it ourselves. */
1768 msg.parity = 0; /* XXX for now */
1769
1770 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1771 msg.xonFlowControl = 0;
1772
deb91685 1773 /* Do handshaking outputs, DTR is inverted relative to RTS */
1da177e4
LT
1774 msg.rts = p_priv->rts_state;
1775 msg.dtr = p_priv->dtr_state;
1776
1777 msg.forwardingLength = 16;
1778 msg.forwardMs = 10;
1779 msg.breakThreshold = 45;
1780 msg.xonChar = 17;
1781 msg.xoffChar = 19;
1782
1783 /*msg.returnStatus = 1;
1784 msg.resetDataToggle = 0xff;*/
1785 /* Opening port */
1786 if (reset_port == 1) {
1787 msg._txOn = 1;
1788 msg._txOff = 0;
1789 msg.txFlush = 0;
1790 msg.txForceXoff = 0;
1791 msg.txBreak = 0;
1792 msg.rxOn = 1;
1793 msg.rxOff = 0;
1794 msg.rxFlush = 1;
1795 msg.rxForward = 0;
1796 msg.returnStatus = 0;
1797 msg.resetDataToggle = 0xff;
1798 }
1799 /* Closing port */
1800 else if (reset_port == 2) {
1801 msg._txOn = 0;
1802 msg._txOff = 1;
1803 msg.txFlush = 0;
1804 msg.txForceXoff = 0;
1805 msg.txBreak = 0;
1806 msg.rxOn = 0;
1807 msg.rxOff = 1;
1808 msg.rxFlush = 1;
1809 msg.rxForward = 0;
1810 msg.returnStatus = 0;
1811 msg.resetDataToggle = 0;
1812 }
1813 /* Sending intermediate configs */
1814 else {
deb91685 1815 msg._txOn = (!p_priv->break_on);
1da177e4
LT
1816 msg._txOff = 0;
1817 msg.txFlush = 0;
1818 msg.txForceXoff = 0;
1819 msg.txBreak = (p_priv->break_on);
1820 msg.rxOn = 0;
1821 msg.rxOff = 0;
1822 msg.rxFlush = 0;
1823 msg.rxForward = 0;
1824 msg.returnStatus = 0;
1825 msg.resetDataToggle = 0x0;
1826 }
1827
1828 p_priv->resend_cont = 0;
deb91685 1829 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
1da177e4
LT
1830
1831 /* send the data out the device on control endpoint */
1832 this_urb->transfer_buffer_length = sizeof(msg);
1833
deb91685
AC
1834 err = usb_submit_urb(this_urb, GFP_ATOMIC);
1835 if (err != 0)
049c6b4e 1836 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed\n", __func__);
1da177e4
LT
1837#if 0
1838 else {
049c6b4e 1839 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) OK %d bytes\n", __func__,
1da177e4
LT
1840 this_urb->transfer_buffer_length);
1841 }
1842#endif
1843
a5b6f60c 1844 return 0;
1da177e4
LT
1845}
1846
1847static int keyspan_usa49_send_setup(struct usb_serial *serial,
1848 struct usb_serial_port *port,
1849 int reset_port)
1850{
0ca1268e
LM
1851 struct keyspan_usa49_portControlMessage msg;
1852 struct usb_ctrlrequest *dr = NULL;
1da177e4
LT
1853 struct keyspan_serial_private *s_priv;
1854 struct keyspan_port_private *p_priv;
1855 const struct keyspan_device_details *d_details;
1da177e4
LT
1856 struct urb *this_urb;
1857 int err, device_port;
1858
1da177e4
LT
1859 s_priv = usb_get_serial_data(serial);
1860 p_priv = usb_get_serial_port_data(port);
1861 d_details = s_priv->device_details;
1862
1da177e4
LT
1863 this_urb = s_priv->glocont_urb;
1864
0ca1268e 1865 /* Work out which port within the device is being setup */
1da177e4
LT
1866 device_port = port->number - port->serial->minor;
1867
d866150a 1868 /* Make sure we have an urb then send the message */
1da177e4 1869 if (this_urb == NULL) {
049c6b4e 1870 dev_dbg(&port->dev, "%s - oops no urb for port %d.\n", __func__, port->number);
1da177e4
LT
1871 return -1;
1872 }
1873
049c6b4e
GKH
1874 dev_dbg(&port->dev, "%s - endpoint %d port %d (%d)\n",
1875 __func__, usb_pipeendpoint(this_urb->pipe),
1876 port->number, device_port);
d866150a 1877
1da177e4 1878 /* Save reset port val for resend.
0ca1268e
LM
1879 Don't overwrite resend for open/close condition. */
1880 if ((reset_port + 1) > p_priv->resend_cont)
1da177e4 1881 p_priv->resend_cont = reset_port + 1;
0ca1268e 1882
1da177e4 1883 if (this_urb->status == -EINPROGRESS) {
049c6b4e 1884 /* dev_dbg(&port->dev, "%s - already writing\n", __func__); */
1da177e4 1885 mdelay(5);
deb91685 1886 return -1;
1da177e4
LT
1887 }
1888
deb91685 1889 memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage));
1da177e4
LT
1890
1891 /*msg.portNumber = port->number;*/
1892 msg.portNumber = device_port;
deb91685
AC
1893
1894 /* Only set baud rate if it's changed */
1da177e4
LT
1895 if (p_priv->old_baud != p_priv->baud) {
1896 p_priv->old_baud = p_priv->baud;
1897 msg.setClocking = 0xff;
049c6b4e
GKH
1898 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
1899 &msg.baudHi, &msg.baudLo, &msg.prescaler,
1900 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
1901 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
1902 __func__, p_priv->baud);
1da177e4
LT
1903 msg.baudLo = 0;
1904 msg.baudHi = 125; /* Values for 9600 baud */
1905 msg.prescaler = 10;
1906 }
deb91685 1907 /* msg.setPrescaler = 0xff; */
1da177e4
LT
1908 }
1909
2b982ab1 1910 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
1da177e4
LT
1911 switch (p_priv->cflag & CSIZE) {
1912 case CS5:
1913 msg.lcr |= USA_DATABITS_5;
1914 break;
1915 case CS6:
1916 msg.lcr |= USA_DATABITS_6;
1917 break;
1918 case CS7:
1919 msg.lcr |= USA_DATABITS_7;
1920 break;
1921 case CS8:
1922 msg.lcr |= USA_DATABITS_8;
1923 break;
1924 }
1925 if (p_priv->cflag & PARENB) {
1926 /* note USA_PARITY_NONE == 0 */
2b982ab1 1927 msg.lcr |= (p_priv->cflag & PARODD) ?
deb91685 1928 USA_PARITY_ODD : USA_PARITY_EVEN;
1da177e4
LT
1929 }
1930 msg.setLcr = 0xff;
1931
1932 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1933 msg.xonFlowControl = 0;
1934 msg.setFlowControl = 0xff;
deb91685 1935
1da177e4
LT
1936 msg.forwardingLength = 16;
1937 msg.xonChar = 17;
1938 msg.xoffChar = 19;
1939
deb91685 1940 /* Opening port */
1da177e4
LT
1941 if (reset_port == 1) {
1942 msg._txOn = 1;
1943 msg._txOff = 0;
1944 msg.txFlush = 0;
1945 msg.txBreak = 0;
1946 msg.rxOn = 1;
1947 msg.rxOff = 0;
1948 msg.rxFlush = 1;
1949 msg.rxForward = 0;
1950 msg.returnStatus = 0;
1951 msg.resetDataToggle = 0xff;
1952 msg.enablePort = 1;
1953 msg.disablePort = 0;
1954 }
1955 /* Closing port */
1956 else if (reset_port == 2) {
1957 msg._txOn = 0;
1958 msg._txOff = 1;
1959 msg.txFlush = 0;
1960 msg.txBreak = 0;
1961 msg.rxOn = 0;
1962 msg.rxOff = 1;
1963 msg.rxFlush = 1;
1964 msg.rxForward = 0;
1965 msg.returnStatus = 0;
1966 msg.resetDataToggle = 0;
1967 msg.enablePort = 0;
1968 msg.disablePort = 1;
1969 }
1970 /* Sending intermediate configs */
1971 else {
deb91685 1972 msg._txOn = (!p_priv->break_on);
1da177e4
LT
1973 msg._txOff = 0;
1974 msg.txFlush = 0;
1975 msg.txBreak = (p_priv->break_on);
1976 msg.rxOn = 0;
1977 msg.rxOff = 0;
1978 msg.rxFlush = 0;
1979 msg.rxForward = 0;
1980 msg.returnStatus = 0;
1981 msg.resetDataToggle = 0x0;
1982 msg.enablePort = 0;
1983 msg.disablePort = 0;
1984 }
1985
deb91685 1986 /* Do handshaking outputs */
1da177e4
LT
1987 msg.setRts = 0xff;
1988 msg.rts = p_priv->rts_state;
1989
1990 msg.setDtr = 0xff;
1991 msg.dtr = p_priv->dtr_state;
deb91685 1992
1da177e4 1993 p_priv->resend_cont = 0;
0ca1268e 1994
deb91685
AC
1995 /* if the device is a 49wg, we send control message on usb
1996 control EP 0 */
0ca1268e
LM
1997
1998 if (d_details->product_id == keyspan_usa49wg_product_id) {
1999 dr = (void *)(s_priv->ctrl_buf);
2000 dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;
2001 dr->bRequest = 0xB0; /* 49wg control message */;
2002 dr->wValue = 0;
2003 dr->wIndex = 0;
2004 dr->wLength = cpu_to_le16(sizeof(msg));
2005
deb91685 2006 memcpy(s_priv->glocont_buf, &msg, sizeof(msg));
0ca1268e 2007
deb91685
AC
2008 usb_fill_control_urb(this_urb, serial->dev,
2009 usb_sndctrlpipe(serial->dev, 0),
2010 (unsigned char *)dr, s_priv->glocont_buf,
2011 sizeof(msg), usa49_glocont_callback, serial);
0ca1268e
LM
2012
2013 } else {
2014 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
deb91685 2015
0ca1268e
LM
2016 /* send the data out the device on control endpoint */
2017 this_urb->transfer_buffer_length = sizeof(msg);
0ca1268e 2018 }
deb91685
AC
2019 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2020 if (err != 0)
049c6b4e 2021 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
1da177e4
LT
2022#if 0
2023 else {
049c6b4e
GKH
2024 dev_dbg(&port->dev, "%s - usb_submit_urb(%d) OK %d bytes (end %d)\n", __func__,
2025 outcont_urb, this_urb->transfer_buffer_length,
2026 usb_pipeendpoint(this_urb->pipe));
1da177e4
LT
2027 }
2028#endif
2029
a5b6f60c 2030 return 0;
1da177e4
LT
2031}
2032
2033static int keyspan_usa90_send_setup(struct usb_serial *serial,
2034 struct usb_serial_port *port,
2035 int reset_port)
2036{
deb91685 2037 struct keyspan_usa90_portControlMessage msg;
1da177e4
LT
2038 struct keyspan_serial_private *s_priv;
2039 struct keyspan_port_private *p_priv;
2040 const struct keyspan_device_details *d_details;
2041 struct urb *this_urb;
2042 int err;
2043 u8 prescaler;
2044
1da177e4
LT
2045 s_priv = usb_get_serial_data(serial);
2046 p_priv = usb_get_serial_port_data(port);
2047 d_details = s_priv->device_details;
2048
2049 /* only do something if we have a bulk out endpoint */
deb91685
AC
2050 this_urb = p_priv->outcont_urb;
2051 if (this_urb == NULL) {
049c6b4e 2052 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
1da177e4
LT
2053 return -1;
2054 }
2055
2056 /* Save reset port val for resend.
2057 Don't overwrite resend for open/close condition. */
2058 if ((reset_port + 1) > p_priv->resend_cont)
2059 p_priv->resend_cont = reset_port + 1;
2060 if (this_urb->status == -EINPROGRESS) {
049c6b4e 2061 dev_dbg(&port->dev, "%s already writing\n", __func__);
1da177e4 2062 mdelay(5);
deb91685 2063 return -1;
1da177e4
LT
2064 }
2065
deb91685 2066 memset(&msg, 0, sizeof(struct keyspan_usa90_portControlMessage));
1da177e4 2067
deb91685 2068 /* Only set baud rate if it's changed */
1da177e4
LT
2069 if (p_priv->old_baud != p_priv->baud) {
2070 p_priv->old_baud = p_priv->baud;
2071 msg.setClocking = 0x01;
049c6b4e
GKH
2072 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2073 &msg.baudHi, &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) {
2074 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2075 __func__, p_priv->baud);
1da177e4 2076 p_priv->baud = 9600;
049c6b4e 2077 d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
1da177e4
LT
2078 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2079 }
2080 msg.setRxMode = 1;
2081 msg.setTxMode = 1;
2082 }
2083
2084 /* modes must always be correctly specified */
deb91685 2085 if (p_priv->baud > 57600) {
1da177e4
LT
2086 msg.rxMode = RXMODE_DMA;
2087 msg.txMode = TXMODE_DMA;
deb91685 2088 } else {
1da177e4
LT
2089 msg.rxMode = RXMODE_BYHAND;
2090 msg.txMode = TXMODE_BYHAND;
2091 }
2092
2b982ab1 2093 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
1da177e4
LT
2094 switch (p_priv->cflag & CSIZE) {
2095 case CS5:
2096 msg.lcr |= USA_DATABITS_5;
2097 break;
2098 case CS6:
2099 msg.lcr |= USA_DATABITS_6;
2100 break;
2101 case CS7:
2102 msg.lcr |= USA_DATABITS_7;
2103 break;
2104 case CS8:
2105 msg.lcr |= USA_DATABITS_8;
2106 break;
2107 }
2108 if (p_priv->cflag & PARENB) {
2109 /* note USA_PARITY_NONE == 0 */
2b982ab1 2110 msg.lcr |= (p_priv->cflag & PARODD) ?
deb91685 2111 USA_PARITY_ODD : USA_PARITY_EVEN;
1da177e4
LT
2112 }
2113 if (p_priv->old_cflag != p_priv->cflag) {
2114 p_priv->old_cflag = p_priv->cflag;
2115 msg.setLcr = 0x01;
2116 }
2117
2118 if (p_priv->flow_control == flow_cts)
2119 msg.txFlowControl = TXFLOW_CTS;
2120 msg.setTxFlowControl = 0x01;
2121 msg.setRxFlowControl = 0x01;
deb91685 2122
1da177e4 2123 msg.rxForwardingLength = 16;
deb91685 2124 msg.rxForwardingTimeout = 16;
1da177e4
LT
2125 msg.txAckSetting = 0;
2126 msg.xonChar = 17;
2127 msg.xoffChar = 19;
2128
deb91685 2129 /* Opening port */
1da177e4
LT
2130 if (reset_port == 1) {
2131 msg.portEnabled = 1;
2132 msg.rxFlush = 1;
2133 msg.txBreak = (p_priv->break_on);
2134 }
2135 /* Closing port */
deb91685 2136 else if (reset_port == 2)
1da177e4 2137 msg.portEnabled = 0;
1da177e4
LT
2138 /* Sending intermediate configs */
2139 else {
1f87158e 2140 msg.portEnabled = 1;
1da177e4
LT
2141 msg.txBreak = (p_priv->break_on);
2142 }
2143
deb91685 2144 /* Do handshaking outputs */
1da177e4
LT
2145 msg.setRts = 0x01;
2146 msg.rts = p_priv->rts_state;
2147
2148 msg.setDtr = 0x01;
2149 msg.dtr = p_priv->dtr_state;
deb91685 2150
1da177e4 2151 p_priv->resend_cont = 0;
deb91685
AC
2152 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2153
1da177e4
LT
2154 /* send the data out the device on control endpoint */
2155 this_urb->transfer_buffer_length = sizeof(msg);
2156
deb91685
AC
2157 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2158 if (err != 0)
049c6b4e 2159 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
a5b6f60c 2160 return 0;
1da177e4
LT
2161}
2162
0ca1268e
LM
2163static int keyspan_usa67_send_setup(struct usb_serial *serial,
2164 struct usb_serial_port *port,
2165 int reset_port)
2166{
2167 struct keyspan_usa67_portControlMessage msg;
2168 struct keyspan_serial_private *s_priv;
2169 struct keyspan_port_private *p_priv;
2170 const struct keyspan_device_details *d_details;
2171 struct urb *this_urb;
2172 int err, device_port;
2173
0ca1268e
LM
2174 s_priv = usb_get_serial_data(serial);
2175 p_priv = usb_get_serial_port_data(port);
2176 d_details = s_priv->device_details;
2177
2178 this_urb = s_priv->glocont_urb;
2179
2180 /* Work out which port within the device is being setup */
2181 device_port = port->number - port->serial->minor;
2182
2183 /* Make sure we have an urb then send the message */
2184 if (this_urb == NULL) {
049c6b4e 2185 dev_dbg(&port->dev, "%s - oops no urb for port %d.\n", __func__,
0ca1268e
LM
2186 port->number);
2187 return -1;
2188 }
2189
2190 /* Save reset port val for resend.
2191 Don't overwrite resend for open/close condition. */
2192 if ((reset_port + 1) > p_priv->resend_cont)
2193 p_priv->resend_cont = reset_port + 1;
2194 if (this_urb->status == -EINPROGRESS) {
049c6b4e 2195 /* dev_dbg(&port->dev, "%s - already writing\n", __func__); */
0ca1268e 2196 mdelay(5);
deb91685 2197 return -1;
0ca1268e
LM
2198 }
2199
2200 memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
2201
2202 msg.port = device_port;
2203
2204 /* Only set baud rate if it's changed */
2205 if (p_priv->old_baud != p_priv->baud) {
2206 p_priv->old_baud = p_priv->baud;
2207 msg.setClocking = 0xff;
049c6b4e
GKH
2208 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2209 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2210 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2211 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2212 __func__, p_priv->baud);
0ca1268e
LM
2213 msg.baudLo = 0;
2214 msg.baudHi = 125; /* Values for 9600 baud */
2215 msg.prescaler = 10;
2216 }
2217 msg.setPrescaler = 0xff;
2218 }
2219
2220 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2221 switch (p_priv->cflag & CSIZE) {
2222 case CS5:
2223 msg.lcr |= USA_DATABITS_5;
2224 break;
2225 case CS6:
2226 msg.lcr |= USA_DATABITS_6;
2227 break;
2228 case CS7:
2229 msg.lcr |= USA_DATABITS_7;
2230 break;
2231 case CS8:
2232 msg.lcr |= USA_DATABITS_8;
2233 break;
2234 }
2235 if (p_priv->cflag & PARENB) {
2236 /* note USA_PARITY_NONE == 0 */
2b982ab1 2237 msg.lcr |= (p_priv->cflag & PARODD) ?
deb91685 2238 USA_PARITY_ODD : USA_PARITY_EVEN;
0ca1268e
LM
2239 }
2240 msg.setLcr = 0xff;
2241
2242 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2243 msg.xonFlowControl = 0;
2244 msg.setFlowControl = 0xff;
2245 msg.forwardingLength = 16;
2246 msg.xonChar = 17;
2247 msg.xoffChar = 19;
2248
2249 if (reset_port == 1) {
2250 /* Opening port */
2251 msg._txOn = 1;
2252 msg._txOff = 0;
2253 msg.txFlush = 0;
2254 msg.txBreak = 0;
2255 msg.rxOn = 1;
2256 msg.rxOff = 0;
2257 msg.rxFlush = 1;
2258 msg.rxForward = 0;
2259 msg.returnStatus = 0;
2260 msg.resetDataToggle = 0xff;
2261 } else if (reset_port == 2) {
2262 /* Closing port */
2263 msg._txOn = 0;
2264 msg._txOff = 1;
2265 msg.txFlush = 0;
2266 msg.txBreak = 0;
2267 msg.rxOn = 0;
2268 msg.rxOff = 1;
2269 msg.rxFlush = 1;
2270 msg.rxForward = 0;
2271 msg.returnStatus = 0;
2272 msg.resetDataToggle = 0;
2273 } else {
2274 /* Sending intermediate configs */
deb91685 2275 msg._txOn = (!p_priv->break_on);
0ca1268e
LM
2276 msg._txOff = 0;
2277 msg.txFlush = 0;
2278 msg.txBreak = (p_priv->break_on);
2279 msg.rxOn = 0;
2280 msg.rxOff = 0;
2281 msg.rxFlush = 0;
2282 msg.rxForward = 0;
2283 msg.returnStatus = 0;
2284 msg.resetDataToggle = 0x0;
2285 }
2286
2287 /* Do handshaking outputs */
2288 msg.setTxTriState_setRts = 0xff;
2289 msg.txTriState_rts = p_priv->rts_state;
2290
2291 msg.setHskoa_setDtr = 0xff;
2292 msg.hskoa_dtr = p_priv->dtr_state;
2293
2294 p_priv->resend_cont = 0;
2295
2296 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2297
2298 /* send the data out the device on control endpoint */
2299 this_urb->transfer_buffer_length = sizeof(msg);
0ca1268e
LM
2300
2301 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2302 if (err != 0)
049c6b4e 2303 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
a5b6f60c 2304 return 0;
0ca1268e
LM
2305}
2306
1da177e4
LT
2307static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2308{
2309 struct usb_serial *serial = port->serial;
2310 struct keyspan_serial_private *s_priv;
2311 const struct keyspan_device_details *d_details;
2312
1da177e4
LT
2313 s_priv = usb_get_serial_data(serial);
2314 d_details = s_priv->device_details;
2315
2316 switch (d_details->msg_format) {
2317 case msg_usa26:
2318 keyspan_usa26_send_setup(serial, port, reset_port);
2319 break;
2320 case msg_usa28:
2321 keyspan_usa28_send_setup(serial, port, reset_port);
2322 break;
2323 case msg_usa49:
2324 keyspan_usa49_send_setup(serial, port, reset_port);
2325 break;
2326 case msg_usa90:
2327 keyspan_usa90_send_setup(serial, port, reset_port);
2328 break;
0ca1268e
LM
2329 case msg_usa67:
2330 keyspan_usa67_send_setup(serial, port, reset_port);
2331 break;
1da177e4
LT
2332 }
2333}
2334
2335
2336/* Gets called by the "real" driver (ie once firmware is loaded
2337 and renumeration has taken place. */
deb91685 2338static int keyspan_startup(struct usb_serial *serial)
1da177e4
LT
2339{
2340 int i, err;
1da177e4 2341 struct keyspan_serial_private *s_priv;
1da177e4
LT
2342 const struct keyspan_device_details *d_details;
2343
1da177e4 2344 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
deb91685
AC
2345 if (d_details->product_id ==
2346 le16_to_cpu(serial->dev->descriptor.idProduct))
1da177e4
LT
2347 break;
2348 if (d_details == NULL) {
deb91685
AC
2349 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2350 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
1da177e4
LT
2351 return 1;
2352 }
2353
2354 /* Setup private data for serial driver */
80b6ca48 2355 s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
1da177e4 2356 if (!s_priv) {
049c6b4e 2357 dev_dbg(&serial->dev->dev, "%s - kmalloc for keyspan_serial_private failed.\n", __func__);
1da177e4
LT
2358 return -ENOMEM;
2359 }
1da177e4
LT
2360
2361 s_priv->device_details = d_details;
2362 usb_set_serial_data(serial, s_priv);
2363
1da177e4
LT
2364 keyspan_setup_urbs(serial);
2365
0ca1268e 2366 if (s_priv->instat_urb != NULL) {
0ca1268e
LM
2367 err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);
2368 if (err != 0)
7ebcb334 2369 dev_dbg(&serial->dev->dev, "%s - submit instat urb failed %d\n", __func__, err);
0ca1268e
LM
2370 }
2371 if (s_priv->indat_urb != NULL) {
0ca1268e
LM
2372 err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);
2373 if (err != 0)
7ebcb334 2374 dev_dbg(&serial->dev->dev, "%s - submit indat urb failed %d\n", __func__, err);
1da177e4 2375 }
deb91685 2376
a5b6f60c 2377 return 0;
1da177e4
LT
2378}
2379
f9c99bb8 2380static void keyspan_disconnect(struct usb_serial *serial)
1da177e4 2381{
f79b2d0f 2382 struct keyspan_serial_private *s_priv;
1da177e4 2383
1da177e4
LT
2384 s_priv = usb_get_serial_data(serial);
2385
1da177e4
LT
2386 stop_urb(s_priv->instat_urb);
2387 stop_urb(s_priv->glocont_urb);
0ca1268e 2388 stop_urb(s_priv->indat_urb);
f79b2d0f
JH
2389}
2390
2391static void keyspan_release(struct usb_serial *serial)
2392{
2393 struct keyspan_serial_private *s_priv;
2394
2395 s_priv = usb_get_serial_data(serial);
1da177e4 2396
1cadc137 2397 usb_free_urb(s_priv->instat_urb);
0ca1268e 2398 usb_free_urb(s_priv->indat_urb);
1cadc137 2399 usb_free_urb(s_priv->glocont_urb);
f79b2d0f
JH
2400
2401 kfree(s_priv);
f9c99bb8
AS
2402}
2403
f79b2d0f 2404static int keyspan_port_probe(struct usb_serial_port *port)
f9c99bb8 2405{
f79b2d0f 2406 struct usb_serial *serial = port->serial;
f0e3e35c 2407 struct keyspan_serial_private *s_priv;
f79b2d0f
JH
2408 struct keyspan_port_private *p_priv;
2409 const struct keyspan_device_details *d_details;
2410 struct callbacks *cback;
2411 int endp;
2412 int port_num;
2413 int i;
f9c99bb8 2414
f9c99bb8 2415 s_priv = usb_get_serial_data(serial);
f79b2d0f 2416 d_details = s_priv->device_details;
1da177e4 2417
f79b2d0f
JH
2418 p_priv = kzalloc(sizeof(*p_priv), GFP_KERNEL);
2419 if (!p_priv)
2420 return -ENOMEM;
1da177e4 2421
f79b2d0f
JH
2422 p_priv->device_details = d_details;
2423
2424 /* Setup values for the various callback routines */
2425 cback = &keyspan_callbacks[d_details->msg_format];
2426
2427 port_num = port->number - port->serial->minor;
2428
2429 /* Do indat endpoints first, once for each flip */
2430 endp = d_details->indat_endpoints[port_num];
2431 for (i = 0; i <= d_details->indat_endp_flip; ++i, ++endp) {
2432 p_priv->in_urbs[i] = keyspan_setup_urb(serial, endp,
2433 USB_DIR_IN, port,
2434 p_priv->in_buffer[i], 64,
2435 cback->indat_callback);
2436 }
2437 /* outdat endpoints also have flip */
2438 endp = d_details->outdat_endpoints[port_num];
2439 for (i = 0; i <= d_details->outdat_endp_flip; ++i, ++endp) {
2440 p_priv->out_urbs[i] = keyspan_setup_urb(serial, endp,
2441 USB_DIR_OUT, port,
2442 p_priv->out_buffer[i], 64,
2443 cback->outdat_callback);
2444 }
2445 /* inack endpoint */
2446 p_priv->inack_urb = keyspan_setup_urb(serial,
2447 d_details->inack_endpoints[port_num],
2448 USB_DIR_IN, port,
2449 p_priv->inack_buffer, 1,
2450 cback->inack_callback);
2451 /* outcont endpoint */
2452 p_priv->outcont_urb = keyspan_setup_urb(serial,
2453 d_details->outcont_endpoints[port_num],
2454 USB_DIR_OUT, port,
2455 p_priv->outcont_buffer, 64,
2456 cback->outcont_callback);
2457
2458 usb_set_serial_port_data(port, p_priv);
2459
2460 return 0;
2461}
2462
2463static int keyspan_port_remove(struct usb_serial_port *port)
2464{
2465 struct keyspan_port_private *p_priv;
2466 int i;
2467
2468 p_priv = usb_get_serial_port_data(port);
2469
2470 stop_urb(p_priv->inack_urb);
2471 stop_urb(p_priv->outcont_urb);
2472 for (i = 0; i < 2; i++) {
2473 stop_urb(p_priv->in_urbs[i]);
2474 stop_urb(p_priv->out_urbs[i]);
2475 }
2476
2477 usb_free_urb(p_priv->inack_urb);
2478 usb_free_urb(p_priv->outcont_urb);
2479 for (i = 0; i < 2; i++) {
2480 usb_free_urb(p_priv->in_urbs[i]);
2481 usb_free_urb(p_priv->out_urbs[i]);
1da177e4 2482 }
f79b2d0f
JH
2483
2484 kfree(p_priv);
2485
2486 return 0;
1da177e4
LT
2487}
2488
deb91685
AC
2489MODULE_AUTHOR(DRIVER_AUTHOR);
2490MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4
LT
2491MODULE_LICENSE("GPL");
2492
2971c579
DW
2493MODULE_FIRMWARE("keyspan/usa28.fw");
2494MODULE_FIRMWARE("keyspan/usa28x.fw");
2495MODULE_FIRMWARE("keyspan/usa28xa.fw");
2496MODULE_FIRMWARE("keyspan/usa28xb.fw");
2497MODULE_FIRMWARE("keyspan/usa19.fw");
2498MODULE_FIRMWARE("keyspan/usa19qi.fw");
2499MODULE_FIRMWARE("keyspan/mpr.fw");
2500MODULE_FIRMWARE("keyspan/usa19qw.fw");
2501MODULE_FIRMWARE("keyspan/usa18x.fw");
2502MODULE_FIRMWARE("keyspan/usa19w.fw");
2503MODULE_FIRMWARE("keyspan/usa49w.fw");
2504MODULE_FIRMWARE("keyspan/usa49wlc.fw");