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