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