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