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