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