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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234#include <linux/kernel.h>
235#include <linux/errno.h>
236#include <linux/init.h>
237#include <linux/slab.h>
238#include <linux/tty.h>
239#include <linux/tty_driver.h>
240#include <linux/tty_flip.h>
241#include <linux/module.h>
242#include <linux/spinlock.h>
243#include <linux/workqueue.h>
244#include <linux/uaccess.h>
245#include <linux/usb.h>
246#include <linux/wait.h>
247#include <linux/usb/serial.h>
248
249
250
251
252
253
254#define DRIVER_VERSION "v1.80.1.2"
255#define DRIVER_AUTHOR "Peter Berger <pberger@brimson.com>, Al Borchers <borchers@steinerpoint.com>"
256#define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver"
257
258
259
260#define DIGI_OUT_BUF_SIZE 8
261
262
263
264#define DIGI_IN_BUF_SIZE 64
265
266
267#define DIGI_RETRY_TIMEOUT (HZ/10)
268
269
270
271
272#define DIGI_CLOSE_TIMEOUT (5*HZ)
273
274
275
276
277
278#define DIGI_VENDOR_ID 0x05c5
279#define DIGI_2_ID 0x0002
280#define DIGI_4_ID 0x0004
281
282
283
284
285
286#define DIGI_CMD_SET_BAUD_RATE 0
287#define DIGI_CMD_SET_WORD_SIZE 1
288#define DIGI_CMD_SET_PARITY 2
289#define DIGI_CMD_SET_STOP_BITS 3
290#define DIGI_CMD_SET_INPUT_FLOW_CONTROL 4
291#define DIGI_CMD_SET_OUTPUT_FLOW_CONTROL 5
292#define DIGI_CMD_SET_DTR_SIGNAL 6
293#define DIGI_CMD_SET_RTS_SIGNAL 7
294#define DIGI_CMD_READ_INPUT_SIGNALS 8
295#define DIGI_CMD_IFLUSH_FIFO 9
296#define DIGI_CMD_RECEIVE_ENABLE 10
297#define DIGI_CMD_BREAK_CONTROL 11
298#define DIGI_CMD_LOCAL_LOOPBACK 12
299#define DIGI_CMD_TRANSMIT_IDLE 13
300#define DIGI_CMD_READ_UART_REGISTER 14
301#define DIGI_CMD_WRITE_UART_REGISTER 15
302#define DIGI_CMD_AND_UART_REGISTER 16
303#define DIGI_CMD_OR_UART_REGISTER 17
304#define DIGI_CMD_SEND_DATA 18
305#define DIGI_CMD_RECEIVE_DATA 19
306#define DIGI_CMD_RECEIVE_DISABLE 20
307#define DIGI_CMD_GET_PORT_TYPE 21
308
309
310#define DIGI_BAUD_50 0
311#define DIGI_BAUD_75 1
312#define DIGI_BAUD_110 2
313#define DIGI_BAUD_150 3
314#define DIGI_BAUD_200 4
315#define DIGI_BAUD_300 5
316#define DIGI_BAUD_600 6
317#define DIGI_BAUD_1200 7
318#define DIGI_BAUD_1800 8
319#define DIGI_BAUD_2400 9
320#define DIGI_BAUD_4800 10
321#define DIGI_BAUD_7200 11
322#define DIGI_BAUD_9600 12
323#define DIGI_BAUD_14400 13
324#define DIGI_BAUD_19200 14
325#define DIGI_BAUD_28800 15
326#define DIGI_BAUD_38400 16
327#define DIGI_BAUD_57600 17
328#define DIGI_BAUD_76800 18
329#define DIGI_BAUD_115200 19
330#define DIGI_BAUD_153600 20
331#define DIGI_BAUD_230400 21
332#define DIGI_BAUD_460800 22
333
334
335#define DIGI_WORD_SIZE_5 0
336#define DIGI_WORD_SIZE_6 1
337#define DIGI_WORD_SIZE_7 2
338#define DIGI_WORD_SIZE_8 3
339
340#define DIGI_PARITY_NONE 0
341#define DIGI_PARITY_ODD 1
342#define DIGI_PARITY_EVEN 2
343#define DIGI_PARITY_MARK 3
344#define DIGI_PARITY_SPACE 4
345
346#define DIGI_STOP_BITS_1 0
347#define DIGI_STOP_BITS_2 1
348
349#define DIGI_INPUT_FLOW_CONTROL_XON_XOFF 1
350#define DIGI_INPUT_FLOW_CONTROL_RTS 2
351#define DIGI_INPUT_FLOW_CONTROL_DTR 4
352
353#define DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF 1
354#define DIGI_OUTPUT_FLOW_CONTROL_CTS 2
355#define DIGI_OUTPUT_FLOW_CONTROL_DSR 4
356
357#define DIGI_DTR_INACTIVE 0
358#define DIGI_DTR_ACTIVE 1
359#define DIGI_DTR_INPUT_FLOW_CONTROL 2
360
361#define DIGI_RTS_INACTIVE 0
362#define DIGI_RTS_ACTIVE 1
363#define DIGI_RTS_INPUT_FLOW_CONTROL 2
364#define DIGI_RTS_TOGGLE 3
365
366#define DIGI_FLUSH_TX 1
367#define DIGI_FLUSH_RX 2
368#define DIGI_RESUME_TX 4
369
370#define DIGI_TRANSMIT_NOT_IDLE 0
371#define DIGI_TRANSMIT_IDLE 1
372
373#define DIGI_DISABLE 0
374#define DIGI_ENABLE 1
375
376#define DIGI_DEASSERT 0
377#define DIGI_ASSERT 1
378
379
380#define DIGI_OVERRUN_ERROR 4
381#define DIGI_PARITY_ERROR 8
382#define DIGI_FRAMING_ERROR 16
383#define DIGI_BREAK_ERROR 32
384
385
386#define DIGI_NO_ERROR 0
387#define DIGI_BAD_FIRST_PARAMETER 1
388#define DIGI_BAD_SECOND_PARAMETER 2
389#define DIGI_INVALID_LINE 3
390#define DIGI_INVALID_OPCODE 4
391
392
393#define DIGI_READ_INPUT_SIGNALS_SLOT 1
394#define DIGI_READ_INPUT_SIGNALS_ERR 2
395#define DIGI_READ_INPUT_SIGNALS_BUSY 4
396#define DIGI_READ_INPUT_SIGNALS_PE 8
397#define DIGI_READ_INPUT_SIGNALS_CTS 16
398#define DIGI_READ_INPUT_SIGNALS_DSR 32
399#define DIGI_READ_INPUT_SIGNALS_RI 64
400#define DIGI_READ_INPUT_SIGNALS_DCD 128
401
402
403
404
405struct digi_serial {
406 spinlock_t ds_serial_lock;
407 struct usb_serial_port *ds_oob_port;
408 int ds_oob_port_num;
409 int ds_device_started;
410};
411
412struct digi_port {
413 spinlock_t dp_port_lock;
414 int dp_port_num;
415 int dp_out_buf_len;
416 unsigned char dp_out_buf[DIGI_OUT_BUF_SIZE];
417 int dp_write_urb_in_use;
418 unsigned int dp_modem_signals;
419 wait_queue_head_t dp_modem_change_wait;
420 int dp_transmit_idle;
421 wait_queue_head_t dp_transmit_idle_wait;
422 int dp_throttled;
423 int dp_throttle_restart;
424 wait_queue_head_t dp_flush_wait;
425 wait_queue_head_t dp_close_wait;
426 struct work_struct dp_wakeup_work;
427 struct usb_serial_port *dp_port;
428};
429
430
431
432
433static void digi_wakeup_write(struct usb_serial_port *port);
434static void digi_wakeup_write_lock(struct work_struct *work);
435static int digi_write_oob_command(struct usb_serial_port *port,
436 unsigned char *buf, int count, int interruptible);
437static int digi_write_inb_command(struct usb_serial_port *port,
438 unsigned char *buf, int count, unsigned long timeout);
439static int digi_set_modem_signals(struct usb_serial_port *port,
440 unsigned int modem_signals, int interruptible);
441static int digi_transmit_idle(struct usb_serial_port *port,
442 unsigned long timeout);
443static void digi_rx_throttle(struct tty_struct *tty);
444static void digi_rx_unthrottle(struct tty_struct *tty);
445static void digi_set_termios(struct tty_struct *tty,
446 struct usb_serial_port *port, struct ktermios *old_termios);
447static void digi_break_ctl(struct tty_struct *tty, int break_state);
448static int digi_tiocmget(struct tty_struct *tty);
449static int digi_tiocmset(struct tty_struct *tty, unsigned int set,
450 unsigned int clear);
451static int digi_write(struct tty_struct *tty, struct usb_serial_port *port,
452 const unsigned char *buf, int count);
453static void digi_write_bulk_callback(struct urb *urb);
454static int digi_write_room(struct tty_struct *tty);
455static int digi_chars_in_buffer(struct tty_struct *tty);
456static int digi_open(struct tty_struct *tty, struct usb_serial_port *port);
457static void digi_close(struct usb_serial_port *port);
458static void digi_dtr_rts(struct usb_serial_port *port, int on);
459static int digi_startup_device(struct usb_serial *serial);
460static int digi_startup(struct usb_serial *serial);
461static void digi_disconnect(struct usb_serial *serial);
462static void digi_release(struct usb_serial *serial);
463static void digi_read_bulk_callback(struct urb *urb);
464static int digi_read_inb_callback(struct urb *urb);
465static int digi_read_oob_callback(struct urb *urb);
466
467
468
469
470static int debug;
471
472static const struct usb_device_id id_table_combined[] = {
473 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) },
474 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) },
475 { }
476};
477
478static const struct usb_device_id id_table_2[] = {
479 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) },
480 { }
481};
482
483static const struct usb_device_id id_table_4[] = {
484 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) },
485 { }
486};
487
488MODULE_DEVICE_TABLE(usb, id_table_combined);
489
490static struct usb_driver digi_driver = {
491 .name = "digi_acceleport",
492 .probe = usb_serial_probe,
493 .disconnect = usb_serial_disconnect,
494 .id_table = id_table_combined,
495 .no_dynamic_id = 1,
496};
497
498
499
500
501static struct usb_serial_driver digi_acceleport_2_device = {
502 .driver = {
503 .owner = THIS_MODULE,
504 .name = "digi_2",
505 },
506 .description = "Digi 2 port USB adapter",
507 .usb_driver = &digi_driver,
508 .id_table = id_table_2,
509 .num_ports = 3,
510 .open = digi_open,
511 .close = digi_close,
512 .dtr_rts = digi_dtr_rts,
513 .write = digi_write,
514 .write_room = digi_write_room,
515 .write_bulk_callback = digi_write_bulk_callback,
516 .read_bulk_callback = digi_read_bulk_callback,
517 .chars_in_buffer = digi_chars_in_buffer,
518 .throttle = digi_rx_throttle,
519 .unthrottle = digi_rx_unthrottle,
520 .set_termios = digi_set_termios,
521 .break_ctl = digi_break_ctl,
522 .tiocmget = digi_tiocmget,
523 .tiocmset = digi_tiocmset,
524 .attach = digi_startup,
525 .disconnect = digi_disconnect,
526 .release = digi_release,
527};
528
529static struct usb_serial_driver digi_acceleport_4_device = {
530 .driver = {
531 .owner = THIS_MODULE,
532 .name = "digi_4",
533 },
534 .description = "Digi 4 port USB adapter",
535 .usb_driver = &digi_driver,
536 .id_table = id_table_4,
537 .num_ports = 4,
538 .open = digi_open,
539 .close = digi_close,
540 .write = digi_write,
541 .write_room = digi_write_room,
542 .write_bulk_callback = digi_write_bulk_callback,
543 .read_bulk_callback = digi_read_bulk_callback,
544 .chars_in_buffer = digi_chars_in_buffer,
545 .throttle = digi_rx_throttle,
546 .unthrottle = digi_rx_unthrottle,
547 .set_termios = digi_set_termios,
548 .break_ctl = digi_break_ctl,
549 .tiocmget = digi_tiocmget,
550 .tiocmset = digi_tiocmset,
551 .attach = digi_startup,
552 .disconnect = digi_disconnect,
553 .release = digi_release,
554};
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572static long cond_wait_interruptible_timeout_irqrestore(
573 wait_queue_head_t *q, long timeout,
574 spinlock_t *lock, unsigned long flags)
575__releases(lock)
576{
577 DEFINE_WAIT(wait);
578
579 prepare_to_wait(q, &wait, TASK_INTERRUPTIBLE);
580 spin_unlock_irqrestore(lock, flags);
581 timeout = schedule_timeout(timeout);
582 finish_wait(q, &wait);
583
584 return timeout;
585}
586
587
588
589
590
591
592
593
594
595static void digi_wakeup_write_lock(struct work_struct *work)
596{
597 struct digi_port *priv =
598 container_of(work, struct digi_port, dp_wakeup_work);
599 struct usb_serial_port *port = priv->dp_port;
600 unsigned long flags;
601
602 spin_lock_irqsave(&priv->dp_port_lock, flags);
603 digi_wakeup_write(port);
604 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
605}
606
607static void digi_wakeup_write(struct usb_serial_port *port)
608{
609 struct tty_struct *tty = tty_port_tty_get(&port->port);
610 if (tty) {
611 tty_wakeup(tty);
612 tty_kref_put(tty);
613 }
614}
615
616
617
618
619
620
621
622
623
624
625
626
627
628static int digi_write_oob_command(struct usb_serial_port *port,
629 unsigned char *buf, int count, int interruptible)
630{
631
632 int ret = 0;
633 int len;
634 struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
635 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
636 unsigned long flags = 0;
637
638 dbg("digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, count);
639
640 spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
641 while (count > 0) {
642 while (oob_priv->dp_write_urb_in_use) {
643 cond_wait_interruptible_timeout_irqrestore(
644 &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
645 &oob_priv->dp_port_lock, flags);
646 if (interruptible && signal_pending(current))
647 return -EINTR;
648 spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
649 }
650
651
652 len = min(count, oob_port->bulk_out_size);
653 if (len > 4)
654 len &= ~3;
655 memcpy(oob_port->write_urb->transfer_buffer, buf, len);
656 oob_port->write_urb->transfer_buffer_length = len;
657 oob_port->write_urb->dev = port->serial->dev;
658 ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC);
659 if (ret == 0) {
660 oob_priv->dp_write_urb_in_use = 1;
661 count -= len;
662 buf += len;
663 }
664 }
665 spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
666 if (ret)
667 dev_err(&port->dev, "%s: usb_submit_urb failed, ret=%d\n",
668 __func__, ret);
669 return ret;
670
671}
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686static int digi_write_inb_command(struct usb_serial_port *port,
687 unsigned char *buf, int count, unsigned long timeout)
688{
689 int ret = 0;
690 int len;
691 struct digi_port *priv = usb_get_serial_port_data(port);
692 unsigned char *data = port->write_urb->transfer_buffer;
693 unsigned long flags = 0;
694
695 dbg("digi_write_inb_command: TOP: port=%d, count=%d",
696 priv->dp_port_num, count);
697
698 if (timeout)
699 timeout += jiffies;
700 else
701 timeout = ULONG_MAX;
702
703 spin_lock_irqsave(&priv->dp_port_lock, flags);
704 while (count > 0 && ret == 0) {
705 while (priv->dp_write_urb_in_use &&
706 time_before(jiffies, timeout)) {
707 cond_wait_interruptible_timeout_irqrestore(
708 &port->write_wait, DIGI_RETRY_TIMEOUT,
709 &priv->dp_port_lock, flags);
710 if (signal_pending(current))
711 return -EINTR;
712 spin_lock_irqsave(&priv->dp_port_lock, flags);
713 }
714
715
716
717
718 len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
719 if (len > 4)
720 len &= ~3;
721
722
723 if (priv->dp_out_buf_len > 0) {
724 data[0] = DIGI_CMD_SEND_DATA;
725 data[1] = priv->dp_out_buf_len;
726 memcpy(data + 2, priv->dp_out_buf,
727 priv->dp_out_buf_len);
728 memcpy(data + 2 + priv->dp_out_buf_len, buf, len);
729 port->write_urb->transfer_buffer_length
730 = priv->dp_out_buf_len + 2 + len;
731 } else {
732 memcpy(data, buf, len);
733 port->write_urb->transfer_buffer_length = len;
734 }
735 port->write_urb->dev = port->serial->dev;
736
737 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
738 if (ret == 0) {
739 priv->dp_write_urb_in_use = 1;
740 priv->dp_out_buf_len = 0;
741 count -= len;
742 buf += len;
743 }
744
745 }
746 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
747
748 if (ret)
749 dev_err(&port->dev,
750 "%s: usb_submit_urb failed, ret=%d, port=%d\n",
751 __func__, ret, priv->dp_port_num);
752 return ret;
753}
754
755
756
757
758
759
760
761
762
763
764
765
766static int digi_set_modem_signals(struct usb_serial_port *port,
767 unsigned int modem_signals, int interruptible)
768{
769
770 int ret;
771 struct digi_port *port_priv = usb_get_serial_port_data(port);
772 struct usb_serial_port *oob_port = (struct usb_serial_port *) ((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
773 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
774 unsigned char *data = oob_port->write_urb->transfer_buffer;
775 unsigned long flags = 0;
776
777
778 dbg("digi_set_modem_signals: TOP: port=%d, modem_signals=0x%x",
779 port_priv->dp_port_num, modem_signals);
780
781 spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
782 spin_lock(&port_priv->dp_port_lock);
783
784 while (oob_priv->dp_write_urb_in_use) {
785 spin_unlock(&port_priv->dp_port_lock);
786 cond_wait_interruptible_timeout_irqrestore(
787 &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
788 &oob_priv->dp_port_lock, flags);
789 if (interruptible && signal_pending(current))
790 return -EINTR;
791 spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
792 spin_lock(&port_priv->dp_port_lock);
793 }
794 data[0] = DIGI_CMD_SET_DTR_SIGNAL;
795 data[1] = port_priv->dp_port_num;
796 data[2] = (modem_signals & TIOCM_DTR) ?
797 DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE;
798 data[3] = 0;
799 data[4] = DIGI_CMD_SET_RTS_SIGNAL;
800 data[5] = port_priv->dp_port_num;
801 data[6] = (modem_signals & TIOCM_RTS) ?
802 DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE;
803 data[7] = 0;
804
805 oob_port->write_urb->transfer_buffer_length = 8;
806 oob_port->write_urb->dev = port->serial->dev;
807
808 ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC);
809 if (ret == 0) {
810 oob_priv->dp_write_urb_in_use = 1;
811 port_priv->dp_modem_signals =
812 (port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS))
813 | (modem_signals&(TIOCM_DTR|TIOCM_RTS));
814 }
815 spin_unlock(&port_priv->dp_port_lock);
816 spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
817 if (ret)
818 dev_err(&port->dev, "%s: usb_submit_urb failed, ret=%d\n",
819 __func__, ret);
820 return ret;
821}
822
823
824
825
826
827
828
829
830
831
832
833
834
835static int digi_transmit_idle(struct usb_serial_port *port,
836 unsigned long timeout)
837{
838 int ret;
839 unsigned char buf[2];
840 struct digi_port *priv = usb_get_serial_port_data(port);
841 unsigned long flags = 0;
842
843 spin_lock_irqsave(&priv->dp_port_lock, flags);
844 priv->dp_transmit_idle = 0;
845 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
846
847 buf[0] = DIGI_CMD_TRANSMIT_IDLE;
848 buf[1] = 0;
849
850 timeout += jiffies;
851
852 ret = digi_write_inb_command(port, buf, 2, timeout - jiffies);
853 if (ret != 0)
854 return ret;
855
856 spin_lock_irqsave(&priv->dp_port_lock, flags);
857
858 while (time_before(jiffies, timeout) && !priv->dp_transmit_idle) {
859 cond_wait_interruptible_timeout_irqrestore(
860 &priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT,
861 &priv->dp_port_lock, flags);
862 if (signal_pending(current))
863 return -EINTR;
864 spin_lock_irqsave(&priv->dp_port_lock, flags);
865 }
866 priv->dp_transmit_idle = 0;
867 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
868 return 0;
869
870}
871
872
873static void digi_rx_throttle(struct tty_struct *tty)
874{
875 unsigned long flags;
876 struct usb_serial_port *port = tty->driver_data;
877 struct digi_port *priv = usb_get_serial_port_data(port);
878
879
880 dbg("digi_rx_throttle: TOP: port=%d", priv->dp_port_num);
881
882
883 spin_lock_irqsave(&priv->dp_port_lock, flags);
884 priv->dp_throttled = 1;
885 priv->dp_throttle_restart = 0;
886 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
887}
888
889
890static void digi_rx_unthrottle(struct tty_struct *tty)
891{
892 int ret = 0;
893 unsigned long flags;
894 struct usb_serial_port *port = tty->driver_data;
895 struct digi_port *priv = usb_get_serial_port_data(port);
896
897 dbg("digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num);
898
899 spin_lock_irqsave(&priv->dp_port_lock, flags);
900
901
902 if (priv->dp_throttle_restart) {
903 port->read_urb->dev = port->serial->dev;
904 ret = usb_submit_urb(port->read_urb, GFP_ATOMIC);
905 }
906
907
908 priv->dp_throttled = 0;
909 priv->dp_throttle_restart = 0;
910
911 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
912
913 if (ret)
914 dev_err(&port->dev,
915 "%s: usb_submit_urb failed, ret=%d, port=%d\n",
916 __func__, ret, priv->dp_port_num);
917}
918
919
920static void digi_set_termios(struct tty_struct *tty,
921 struct usb_serial_port *port, struct ktermios *old_termios)
922{
923 struct digi_port *priv = usb_get_serial_port_data(port);
924 unsigned int iflag = tty->termios->c_iflag;
925 unsigned int cflag = tty->termios->c_cflag;
926 unsigned int old_iflag = old_termios->c_iflag;
927 unsigned int old_cflag = old_termios->c_cflag;
928 unsigned char buf[32];
929 unsigned int modem_signals;
930 int arg, ret;
931 int i = 0;
932 speed_t baud;
933
934 dbg("digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x", priv->dp_port_num, iflag, old_iflag, cflag, old_cflag);
935
936
937 baud = tty_get_baud_rate(tty);
938 if (baud != tty_termios_baud_rate(old_termios)) {
939 arg = -1;
940
941
942 if ((old_cflag&CBAUD) == B0) {
943
944
945 modem_signals = TIOCM_DTR;
946 if (!(tty->termios->c_cflag & CRTSCTS) ||
947 !test_bit(TTY_THROTTLED, &tty->flags))
948 modem_signals |= TIOCM_RTS;
949 digi_set_modem_signals(port, modem_signals, 1);
950 }
951 switch (baud) {
952
953 case 0: digi_set_modem_signals(port, 0, 1); break;
954 case 50: arg = DIGI_BAUD_50; break;
955 case 75: arg = DIGI_BAUD_75; break;
956 case 110: arg = DIGI_BAUD_110; break;
957 case 150: arg = DIGI_BAUD_150; break;
958 case 200: arg = DIGI_BAUD_200; break;
959 case 300: arg = DIGI_BAUD_300; break;
960 case 600: arg = DIGI_BAUD_600; break;
961 case 1200: arg = DIGI_BAUD_1200; break;
962 case 1800: arg = DIGI_BAUD_1800; break;
963 case 2400: arg = DIGI_BAUD_2400; break;
964 case 4800: arg = DIGI_BAUD_4800; break;
965 case 9600: arg = DIGI_BAUD_9600; break;
966 case 19200: arg = DIGI_BAUD_19200; break;
967 case 38400: arg = DIGI_BAUD_38400; break;
968 case 57600: arg = DIGI_BAUD_57600; break;
969 case 115200: arg = DIGI_BAUD_115200; break;
970 case 230400: arg = DIGI_BAUD_230400; break;
971 case 460800: arg = DIGI_BAUD_460800; break;
972 default:
973 arg = DIGI_BAUD_9600;
974 baud = 9600;
975 break;
976 }
977 if (arg != -1) {
978 buf[i++] = DIGI_CMD_SET_BAUD_RATE;
979 buf[i++] = priv->dp_port_num;
980 buf[i++] = arg;
981 buf[i++] = 0;
982 }
983 }
984
985 tty->termios->c_cflag &= ~CMSPAR;
986
987 if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) {
988 if (cflag&PARENB) {
989 if (cflag&PARODD)
990 arg = DIGI_PARITY_ODD;
991 else
992 arg = DIGI_PARITY_EVEN;
993 } else {
994 arg = DIGI_PARITY_NONE;
995 }
996 buf[i++] = DIGI_CMD_SET_PARITY;
997 buf[i++] = priv->dp_port_num;
998 buf[i++] = arg;
999 buf[i++] = 0;
1000 }
1001
1002 if ((cflag&CSIZE) != (old_cflag&CSIZE)) {
1003 arg = -1;
1004 switch (cflag&CSIZE) {
1005 case CS5: arg = DIGI_WORD_SIZE_5; break;
1006 case CS6: arg = DIGI_WORD_SIZE_6; break;
1007 case CS7: arg = DIGI_WORD_SIZE_7; break;
1008 case CS8: arg = DIGI_WORD_SIZE_8; break;
1009 default:
1010 dbg("digi_set_termios: can't handle word size %d",
1011 (cflag&CSIZE));
1012 break;
1013 }
1014
1015 if (arg != -1) {
1016 buf[i++] = DIGI_CMD_SET_WORD_SIZE;
1017 buf[i++] = priv->dp_port_num;
1018 buf[i++] = arg;
1019 buf[i++] = 0;
1020 }
1021
1022 }
1023
1024
1025 if ((cflag&CSTOPB) != (old_cflag&CSTOPB)) {
1026
1027 if ((cflag&CSTOPB))
1028 arg = DIGI_STOP_BITS_2;
1029 else
1030 arg = DIGI_STOP_BITS_1;
1031
1032 buf[i++] = DIGI_CMD_SET_STOP_BITS;
1033 buf[i++] = priv->dp_port_num;
1034 buf[i++] = arg;
1035 buf[i++] = 0;
1036
1037 }
1038
1039
1040 if ((iflag&IXOFF) != (old_iflag&IXOFF)
1041 || (cflag&CRTSCTS) != (old_cflag&CRTSCTS)) {
1042 arg = 0;
1043 if (iflag&IXOFF)
1044 arg |= DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
1045 else
1046 arg &= ~DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
1047
1048 if (cflag&CRTSCTS) {
1049 arg |= DIGI_INPUT_FLOW_CONTROL_RTS;
1050
1051
1052
1053 buf[i++] = DIGI_CMD_SET_RTS_SIGNAL;
1054 buf[i++] = priv->dp_port_num;
1055 buf[i++] = DIGI_RTS_ACTIVE;
1056 buf[i++] = 0;
1057
1058 } else {
1059 arg &= ~DIGI_INPUT_FLOW_CONTROL_RTS;
1060 }
1061 buf[i++] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
1062 buf[i++] = priv->dp_port_num;
1063 buf[i++] = arg;
1064 buf[i++] = 0;
1065 }
1066
1067
1068 if ((iflag & IXON) != (old_iflag & IXON)
1069 || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
1070 arg = 0;
1071 if (iflag & IXON)
1072 arg |= DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
1073 else
1074 arg &= ~DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
1075
1076 if (cflag & CRTSCTS) {
1077 arg |= DIGI_OUTPUT_FLOW_CONTROL_CTS;
1078 } else {
1079 arg &= ~DIGI_OUTPUT_FLOW_CONTROL_CTS;
1080 tty->hw_stopped = 0;
1081 }
1082
1083 buf[i++] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
1084 buf[i++] = priv->dp_port_num;
1085 buf[i++] = arg;
1086 buf[i++] = 0;
1087 }
1088
1089
1090 if ((cflag & CREAD) != (old_cflag & CREAD)) {
1091 if (cflag & CREAD)
1092 arg = DIGI_ENABLE;
1093 else
1094 arg = DIGI_DISABLE;
1095
1096 buf[i++] = DIGI_CMD_RECEIVE_ENABLE;
1097 buf[i++] = priv->dp_port_num;
1098 buf[i++] = arg;
1099 buf[i++] = 0;
1100 }
1101 ret = digi_write_oob_command(port, buf, i, 1);
1102 if (ret != 0)
1103 dbg("digi_set_termios: write oob failed, ret=%d", ret);
1104 tty_encode_baud_rate(tty, baud, baud);
1105}
1106
1107
1108static void digi_break_ctl(struct tty_struct *tty, int break_state)
1109{
1110 struct usb_serial_port *port = tty->driver_data;
1111 unsigned char buf[4];
1112
1113 buf[0] = DIGI_CMD_BREAK_CONTROL;
1114 buf[1] = 2;
1115 buf[2] = break_state ? 1 : 0;
1116 buf[3] = 0;
1117 digi_write_inb_command(port, buf, 4, 0);
1118}
1119
1120
1121static int digi_tiocmget(struct tty_struct *tty)
1122{
1123 struct usb_serial_port *port = tty->driver_data;
1124 struct digi_port *priv = usb_get_serial_port_data(port);
1125 unsigned int val;
1126 unsigned long flags;
1127
1128 dbg("%s: TOP: port=%d", __func__, priv->dp_port_num);
1129
1130 spin_lock_irqsave(&priv->dp_port_lock, flags);
1131 val = priv->dp_modem_signals;
1132 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1133 return val;
1134}
1135
1136
1137static int digi_tiocmset(struct tty_struct *tty,
1138 unsigned int set, unsigned int clear)
1139{
1140 struct usb_serial_port *port = tty->driver_data;
1141 struct digi_port *priv = usb_get_serial_port_data(port);
1142 unsigned int val;
1143 unsigned long flags;
1144
1145 dbg("%s: TOP: port=%d", __func__, priv->dp_port_num);
1146
1147 spin_lock_irqsave(&priv->dp_port_lock, flags);
1148 val = (priv->dp_modem_signals & ~clear) | set;
1149 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1150 return digi_set_modem_signals(port, val, 1);
1151}
1152
1153
1154static int digi_write(struct tty_struct *tty, struct usb_serial_port *port,
1155 const unsigned char *buf, int count)
1156{
1157
1158 int ret, data_len, new_len;
1159 struct digi_port *priv = usb_get_serial_port_data(port);
1160 unsigned char *data = port->write_urb->transfer_buffer;
1161 unsigned long flags = 0;
1162
1163 dbg("digi_write: TOP: port=%d, count=%d, in_interrupt=%ld",
1164 priv->dp_port_num, count, in_interrupt());
1165
1166
1167 count = min(count, port->bulk_out_size-2);
1168 count = min(64, count);
1169
1170
1171
1172 spin_lock_irqsave(&priv->dp_port_lock, flags);
1173
1174
1175 if (priv->dp_write_urb_in_use) {
1176
1177 if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) {
1178 priv->dp_out_buf[priv->dp_out_buf_len++] = *buf;
1179 new_len = 1;
1180 } else {
1181 new_len = 0;
1182 }
1183 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1184 return new_len;
1185 }
1186
1187
1188
1189 new_len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
1190 data_len = new_len + priv->dp_out_buf_len;
1191
1192 if (data_len == 0) {
1193 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1194 return 0;
1195 }
1196
1197 port->write_urb->transfer_buffer_length = data_len+2;
1198 port->write_urb->dev = port->serial->dev;
1199
1200 *data++ = DIGI_CMD_SEND_DATA;
1201 *data++ = data_len;
1202
1203
1204 memcpy(data, priv->dp_out_buf, priv->dp_out_buf_len);
1205 data += priv->dp_out_buf_len;
1206
1207
1208 memcpy(data, buf, new_len);
1209
1210 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1211 if (ret == 0) {
1212 priv->dp_write_urb_in_use = 1;
1213 ret = new_len;
1214 priv->dp_out_buf_len = 0;
1215 }
1216
1217
1218 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1219 if (ret < 0)
1220 dev_err(&port->dev,
1221 "%s: usb_submit_urb failed, ret=%d, port=%d\n",
1222 __func__, ret, priv->dp_port_num);
1223 dbg("digi_write: returning %d", ret);
1224 return ret;
1225
1226}
1227
1228static void digi_write_bulk_callback(struct urb *urb)
1229{
1230
1231 struct usb_serial_port *port = urb->context;
1232 struct usb_serial *serial;
1233 struct digi_port *priv;
1234 struct digi_serial *serial_priv;
1235 int ret = 0;
1236 int status = urb->status;
1237
1238 dbg("digi_write_bulk_callback: TOP, status=%d", status);
1239
1240
1241 if (port == NULL || (priv = usb_get_serial_port_data(port)) == NULL) {
1242 pr_err("%s: port or port->private is NULL, status=%d\n",
1243 __func__, status);
1244 return;
1245 }
1246 serial = port->serial;
1247 if (serial == NULL || (serial_priv = usb_get_serial_data(serial)) == NULL) {
1248 dev_err(&port->dev,
1249 "%s: serial or serial->private is NULL, status=%d\n",
1250 __func__, status);
1251 return;
1252 }
1253
1254
1255 if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
1256 dbg("digi_write_bulk_callback: oob callback");
1257 spin_lock(&priv->dp_port_lock);
1258 priv->dp_write_urb_in_use = 0;
1259 wake_up_interruptible(&port->write_wait);
1260 spin_unlock(&priv->dp_port_lock);
1261 return;
1262 }
1263
1264
1265 spin_lock(&priv->dp_port_lock);
1266 priv->dp_write_urb_in_use = 0;
1267 if (priv->dp_out_buf_len > 0) {
1268 *((unsigned char *)(port->write_urb->transfer_buffer))
1269 = (unsigned char)DIGI_CMD_SEND_DATA;
1270 *((unsigned char *)(port->write_urb->transfer_buffer) + 1)
1271 = (unsigned char)priv->dp_out_buf_len;
1272 port->write_urb->transfer_buffer_length =
1273 priv->dp_out_buf_len + 2;
1274 port->write_urb->dev = serial->dev;
1275 memcpy(port->write_urb->transfer_buffer + 2, priv->dp_out_buf,
1276 priv->dp_out_buf_len);
1277 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1278 if (ret == 0) {
1279 priv->dp_write_urb_in_use = 1;
1280 priv->dp_out_buf_len = 0;
1281 }
1282 }
1283
1284 digi_wakeup_write(port);
1285
1286
1287 schedule_work(&priv->dp_wakeup_work);
1288
1289 spin_unlock(&priv->dp_port_lock);
1290 if (ret && ret != -EPERM)
1291 dev_err(&port->dev,
1292 "%s: usb_submit_urb failed, ret=%d, port=%d\n",
1293 __func__, ret, priv->dp_port_num);
1294}
1295
1296static int digi_write_room(struct tty_struct *tty)
1297{
1298 struct usb_serial_port *port = tty->driver_data;
1299 struct digi_port *priv = usb_get_serial_port_data(port);
1300 int room;
1301 unsigned long flags = 0;
1302
1303 spin_lock_irqsave(&priv->dp_port_lock, flags);
1304
1305 if (priv->dp_write_urb_in_use)
1306 room = 0;
1307 else
1308 room = port->bulk_out_size - 2 - priv->dp_out_buf_len;
1309
1310 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1311 dbg("digi_write_room: port=%d, room=%d", priv->dp_port_num, room);
1312 return room;
1313
1314}
1315
1316static int digi_chars_in_buffer(struct tty_struct *tty)
1317{
1318 struct usb_serial_port *port = tty->driver_data;
1319 struct digi_port *priv = usb_get_serial_port_data(port);
1320
1321 if (priv->dp_write_urb_in_use) {
1322 dbg("digi_chars_in_buffer: port=%d, chars=%d",
1323 priv->dp_port_num, port->bulk_out_size - 2);
1324
1325 return 256;
1326 } else {
1327 dbg("digi_chars_in_buffer: port=%d, chars=%d",
1328 priv->dp_port_num, priv->dp_out_buf_len);
1329 return priv->dp_out_buf_len;
1330 }
1331
1332}
1333
1334static void digi_dtr_rts(struct usb_serial_port *port, int on)
1335{
1336
1337 digi_set_modem_signals(port, on * (TIOCM_DTR|TIOCM_RTS), 1);
1338}
1339
1340static int digi_open(struct tty_struct *tty, struct usb_serial_port *port)
1341{
1342 int ret;
1343 unsigned char buf[32];
1344 struct digi_port *priv = usb_get_serial_port_data(port);
1345 struct ktermios not_termios;
1346
1347 dbg("digi_open: TOP: port=%d", priv->dp_port_num);
1348
1349
1350 if (digi_startup_device(port->serial) != 0)
1351 return -ENXIO;
1352
1353
1354 buf[0] = DIGI_CMD_READ_INPUT_SIGNALS;
1355 buf[1] = priv->dp_port_num;
1356 buf[2] = DIGI_ENABLE;
1357 buf[3] = 0;
1358
1359
1360 buf[4] = DIGI_CMD_IFLUSH_FIFO;
1361 buf[5] = priv->dp_port_num;
1362 buf[6] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
1363 buf[7] = 0;
1364
1365 ret = digi_write_oob_command(port, buf, 8, 1);
1366 if (ret != 0)
1367 dbg("digi_open: write oob failed, ret=%d", ret);
1368
1369
1370 if (tty) {
1371 not_termios.c_cflag = ~tty->termios->c_cflag;
1372 not_termios.c_iflag = ~tty->termios->c_iflag;
1373 digi_set_termios(tty, port, ¬_termios);
1374 }
1375 return 0;
1376}
1377
1378
1379static void digi_close(struct usb_serial_port *port)
1380{
1381 DEFINE_WAIT(wait);
1382 int ret;
1383 unsigned char buf[32];
1384 struct digi_port *priv = usb_get_serial_port_data(port);
1385
1386 dbg("digi_close: TOP: port=%d", priv->dp_port_num);
1387
1388 mutex_lock(&port->serial->disc_mutex);
1389
1390 if (port->serial->disconnected)
1391 goto exit;
1392
1393 if (port->serial->dev) {
1394
1395 digi_transmit_idle(port, DIGI_CLOSE_TIMEOUT);
1396
1397
1398 buf[0] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
1399 buf[1] = priv->dp_port_num;
1400 buf[2] = DIGI_DISABLE;
1401 buf[3] = 0;
1402
1403
1404 buf[4] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
1405 buf[5] = priv->dp_port_num;
1406 buf[6] = DIGI_DISABLE;
1407 buf[7] = 0;
1408
1409
1410 buf[8] = DIGI_CMD_READ_INPUT_SIGNALS;
1411 buf[9] = priv->dp_port_num;
1412 buf[10] = DIGI_DISABLE;
1413 buf[11] = 0;
1414
1415
1416 buf[12] = DIGI_CMD_RECEIVE_ENABLE;
1417 buf[13] = priv->dp_port_num;
1418 buf[14] = DIGI_DISABLE;
1419 buf[15] = 0;
1420
1421
1422 buf[16] = DIGI_CMD_IFLUSH_FIFO;
1423 buf[17] = priv->dp_port_num;
1424 buf[18] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
1425 buf[19] = 0;
1426
1427 ret = digi_write_oob_command(port, buf, 20, 0);
1428 if (ret != 0)
1429 dbg("digi_close: write oob failed, ret=%d", ret);
1430
1431
1432 prepare_to_wait(&priv->dp_flush_wait, &wait,
1433 TASK_INTERRUPTIBLE);
1434 schedule_timeout(DIGI_CLOSE_TIMEOUT);
1435 finish_wait(&priv->dp_flush_wait, &wait);
1436
1437
1438 usb_kill_urb(port->write_urb);
1439 }
1440exit:
1441 spin_lock_irq(&priv->dp_port_lock);
1442 priv->dp_write_urb_in_use = 0;
1443 wake_up_interruptible(&priv->dp_close_wait);
1444 spin_unlock_irq(&priv->dp_port_lock);
1445 mutex_unlock(&port->serial->disc_mutex);
1446 dbg("digi_close: done");
1447}
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457static int digi_startup_device(struct usb_serial *serial)
1458{
1459 int i, ret = 0;
1460 struct digi_serial *serial_priv = usb_get_serial_data(serial);
1461 struct usb_serial_port *port;
1462
1463
1464 spin_lock(&serial_priv->ds_serial_lock);
1465 if (serial_priv->ds_device_started) {
1466 spin_unlock(&serial_priv->ds_serial_lock);
1467 return 0;
1468 }
1469 serial_priv->ds_device_started = 1;
1470 spin_unlock(&serial_priv->ds_serial_lock);
1471
1472
1473
1474 for (i = 0; i < serial->type->num_ports + 1; i++) {
1475 port = serial->port[i];
1476 port->write_urb->dev = port->serial->dev;
1477 ret = usb_submit_urb(port->read_urb, GFP_KERNEL);
1478 if (ret != 0) {
1479 dev_err(&port->dev,
1480 "%s: usb_submit_urb failed, ret=%d, port=%d\n",
1481 __func__, ret, i);
1482 break;
1483 }
1484 }
1485 return ret;
1486}
1487
1488
1489static int digi_startup(struct usb_serial *serial)
1490{
1491
1492 int i;
1493 struct digi_port *priv;
1494 struct digi_serial *serial_priv;
1495
1496 dbg("digi_startup: TOP");
1497
1498
1499
1500 for (i = 0; i < serial->type->num_ports + 1; i++) {
1501
1502 priv = kmalloc(sizeof(struct digi_port), GFP_KERNEL);
1503 if (priv == NULL) {
1504 while (--i >= 0)
1505 kfree(usb_get_serial_port_data(serial->port[i]));
1506 return 1;
1507 }
1508
1509
1510 spin_lock_init(&priv->dp_port_lock);
1511 priv->dp_port_num = i;
1512 priv->dp_out_buf_len = 0;
1513 priv->dp_write_urb_in_use = 0;
1514 priv->dp_modem_signals = 0;
1515 init_waitqueue_head(&priv->dp_modem_change_wait);
1516 priv->dp_transmit_idle = 0;
1517 init_waitqueue_head(&priv->dp_transmit_idle_wait);
1518 priv->dp_throttled = 0;
1519 priv->dp_throttle_restart = 0;
1520 init_waitqueue_head(&priv->dp_flush_wait);
1521 init_waitqueue_head(&priv->dp_close_wait);
1522 INIT_WORK(&priv->dp_wakeup_work, digi_wakeup_write_lock);
1523 priv->dp_port = serial->port[i];
1524
1525 init_waitqueue_head(&serial->port[i]->write_wait);
1526
1527 usb_set_serial_port_data(serial->port[i], priv);
1528 }
1529
1530
1531 serial_priv = kmalloc(sizeof(struct digi_serial), GFP_KERNEL);
1532 if (serial_priv == NULL) {
1533 for (i = 0; i < serial->type->num_ports + 1; i++)
1534 kfree(usb_get_serial_port_data(serial->port[i]));
1535 return 1;
1536 }
1537
1538
1539 spin_lock_init(&serial_priv->ds_serial_lock);
1540 serial_priv->ds_oob_port_num = serial->type->num_ports;
1541 serial_priv->ds_oob_port = serial->port[serial_priv->ds_oob_port_num];
1542 serial_priv->ds_device_started = 0;
1543 usb_set_serial_data(serial, serial_priv);
1544
1545 return 0;
1546}
1547
1548
1549static void digi_disconnect(struct usb_serial *serial)
1550{
1551 int i;
1552 dbg("digi_disconnect: TOP, in_interrupt()=%ld", in_interrupt());
1553
1554
1555 for (i = 0; i < serial->type->num_ports + 1; i++) {
1556 usb_kill_urb(serial->port[i]->read_urb);
1557 usb_kill_urb(serial->port[i]->write_urb);
1558 }
1559}
1560
1561
1562static void digi_release(struct usb_serial *serial)
1563{
1564 int i;
1565 dbg("digi_release: TOP, in_interrupt()=%ld", in_interrupt());
1566
1567
1568
1569 for (i = 0; i < serial->type->num_ports + 1; i++)
1570 kfree(usb_get_serial_port_data(serial->port[i]));
1571 kfree(usb_get_serial_data(serial));
1572}
1573
1574
1575static void digi_read_bulk_callback(struct urb *urb)
1576{
1577 struct usb_serial_port *port = urb->context;
1578 struct digi_port *priv;
1579 struct digi_serial *serial_priv;
1580 int ret;
1581 int status = urb->status;
1582
1583 dbg("digi_read_bulk_callback: TOP");
1584
1585
1586 if (port == NULL)
1587 return;
1588 priv = usb_get_serial_port_data(port);
1589 if (priv == NULL) {
1590 dev_err(&port->dev, "%s: port->private is NULL, status=%d\n",
1591 __func__, status);
1592 return;
1593 }
1594 if (port->serial == NULL ||
1595 (serial_priv = usb_get_serial_data(port->serial)) == NULL) {
1596 dev_err(&port->dev, "%s: serial is bad or serial->private "
1597 "is NULL, status=%d\n", __func__, status);
1598 return;
1599 }
1600
1601
1602 if (status) {
1603 dev_err(&port->dev,
1604 "%s: nonzero read bulk status: status=%d, port=%d\n",
1605 __func__, status, priv->dp_port_num);
1606 return;
1607 }
1608
1609
1610 if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
1611 if (digi_read_oob_callback(urb) != 0)
1612 return;
1613 } else {
1614 if (digi_read_inb_callback(urb) != 0)
1615 return;
1616 }
1617
1618
1619 urb->dev = port->serial->dev;
1620 ret = usb_submit_urb(urb, GFP_ATOMIC);
1621 if (ret != 0 && ret != -EPERM) {
1622 dev_err(&port->dev,
1623 "%s: failed resubmitting urb, ret=%d, port=%d\n",
1624 __func__, ret, priv->dp_port_num);
1625 }
1626
1627}
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639static int digi_read_inb_callback(struct urb *urb)
1640{
1641
1642 struct usb_serial_port *port = urb->context;
1643 struct tty_struct *tty;
1644 struct digi_port *priv = usb_get_serial_port_data(port);
1645 int opcode = ((unsigned char *)urb->transfer_buffer)[0];
1646 int len = ((unsigned char *)urb->transfer_buffer)[1];
1647 int port_status = ((unsigned char *)urb->transfer_buffer)[2];
1648 unsigned char *data = ((unsigned char *)urb->transfer_buffer) + 3;
1649 int flag, throttled;
1650 int status = urb->status;
1651
1652
1653
1654 if (urb->status == -ENOENT)
1655 return 0;
1656
1657
1658 if (urb->actual_length != len + 2) {
1659 dev_err(&port->dev, "%s: INCOMPLETE OR MULTIPLE PACKET, "
1660 "status=%d, port=%d, opcode=%d, len=%d, "
1661 "actual_length=%d, status=%d\n", __func__, status,
1662 priv->dp_port_num, opcode, len, urb->actual_length,
1663 port_status);
1664 return -1;
1665 }
1666
1667 tty = tty_port_tty_get(&port->port);
1668 spin_lock(&priv->dp_port_lock);
1669
1670
1671
1672 throttled = priv->dp_throttled;
1673 if (throttled)
1674 priv->dp_throttle_restart = 1;
1675
1676
1677 if (tty && opcode == DIGI_CMD_RECEIVE_DATA) {
1678
1679 flag = 0;
1680
1681
1682 if (port_status & DIGI_OVERRUN_ERROR)
1683 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1684
1685
1686
1687 if (port_status & DIGI_BREAK_ERROR)
1688 flag = TTY_BREAK;
1689 else if (port_status & DIGI_PARITY_ERROR)
1690 flag = TTY_PARITY;
1691 else if (port_status & DIGI_FRAMING_ERROR)
1692 flag = TTY_FRAME;
1693
1694
1695 --len;
1696 if (len > 0) {
1697 tty_insert_flip_string_fixed_flag(tty, data, flag,
1698 len);
1699 tty_flip_buffer_push(tty);
1700 }
1701 }
1702 spin_unlock(&priv->dp_port_lock);
1703 tty_kref_put(tty);
1704
1705 if (opcode == DIGI_CMD_RECEIVE_DISABLE)
1706 dbg("%s: got RECEIVE_DISABLE", __func__);
1707 else if (opcode != DIGI_CMD_RECEIVE_DATA)
1708 dbg("%s: unknown opcode: %d", __func__, opcode);
1709
1710 return throttled ? 1 : 0;
1711
1712}
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724static int digi_read_oob_callback(struct urb *urb)
1725{
1726
1727 struct usb_serial_port *port = urb->context;
1728 struct usb_serial *serial = port->serial;
1729 struct tty_struct *tty;
1730 struct digi_port *priv = usb_get_serial_port_data(port);
1731 int opcode, line, status, val;
1732 int i;
1733 unsigned int rts;
1734
1735 dbg("digi_read_oob_callback: port=%d, len=%d",
1736 priv->dp_port_num, urb->actual_length);
1737
1738
1739 for (i = 0; i < urb->actual_length - 3;) {
1740 opcode = ((unsigned char *)urb->transfer_buffer)[i++];
1741 line = ((unsigned char *)urb->transfer_buffer)[i++];
1742 status = ((unsigned char *)urb->transfer_buffer)[i++];
1743 val = ((unsigned char *)urb->transfer_buffer)[i++];
1744
1745 dbg("digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d",
1746 opcode, line, status, val);
1747
1748 if (status != 0 || line >= serial->type->num_ports)
1749 continue;
1750
1751 port = serial->port[line];
1752
1753 priv = usb_get_serial_port_data(port);
1754 if (priv == NULL)
1755 return -1;
1756
1757 tty = tty_port_tty_get(&port->port);
1758
1759 rts = 0;
1760 if (tty)
1761 rts = tty->termios->c_cflag & CRTSCTS;
1762
1763 if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
1764 spin_lock(&priv->dp_port_lock);
1765
1766 if (val & DIGI_READ_INPUT_SIGNALS_CTS) {
1767 priv->dp_modem_signals |= TIOCM_CTS;
1768
1769 if (rts) {
1770 tty->hw_stopped = 0;
1771 digi_wakeup_write(port);
1772 }
1773 } else {
1774 priv->dp_modem_signals &= ~TIOCM_CTS;
1775
1776 if (rts)
1777 tty->hw_stopped = 1;
1778 }
1779 if (val & DIGI_READ_INPUT_SIGNALS_DSR)
1780 priv->dp_modem_signals |= TIOCM_DSR;
1781 else
1782 priv->dp_modem_signals &= ~TIOCM_DSR;
1783 if (val & DIGI_READ_INPUT_SIGNALS_RI)
1784 priv->dp_modem_signals |= TIOCM_RI;
1785 else
1786 priv->dp_modem_signals &= ~TIOCM_RI;
1787 if (val & DIGI_READ_INPUT_SIGNALS_DCD)
1788 priv->dp_modem_signals |= TIOCM_CD;
1789 else
1790 priv->dp_modem_signals &= ~TIOCM_CD;
1791
1792 wake_up_interruptible(&priv->dp_modem_change_wait);
1793 spin_unlock(&priv->dp_port_lock);
1794 } else if (opcode == DIGI_CMD_TRANSMIT_IDLE) {
1795 spin_lock(&priv->dp_port_lock);
1796 priv->dp_transmit_idle = 1;
1797 wake_up_interruptible(&priv->dp_transmit_idle_wait);
1798 spin_unlock(&priv->dp_port_lock);
1799 } else if (opcode == DIGI_CMD_IFLUSH_FIFO) {
1800 wake_up_interruptible(&priv->dp_flush_wait);
1801 }
1802 tty_kref_put(tty);
1803 }
1804 return 0;
1805
1806}
1807
1808static int __init digi_init(void)
1809{
1810 int retval;
1811 retval = usb_serial_register(&digi_acceleport_2_device);
1812 if (retval)
1813 goto failed_acceleport_2_device;
1814 retval = usb_serial_register(&digi_acceleport_4_device);
1815 if (retval)
1816 goto failed_acceleport_4_device;
1817 retval = usb_register(&digi_driver);
1818 if (retval)
1819 goto failed_usb_register;
1820 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
1821 DRIVER_DESC "\n");
1822 return 0;
1823failed_usb_register:
1824 usb_serial_deregister(&digi_acceleport_4_device);
1825failed_acceleport_4_device:
1826 usb_serial_deregister(&digi_acceleport_2_device);
1827failed_acceleport_2_device:
1828 return retval;
1829}
1830
1831static void __exit digi_exit (void)
1832{
1833 usb_deregister(&digi_driver);
1834 usb_serial_deregister(&digi_acceleport_2_device);
1835 usb_serial_deregister(&digi_acceleport_4_device);
1836}
1837
1838
1839module_init(digi_init);
1840module_exit(digi_exit);
1841
1842
1843MODULE_AUTHOR(DRIVER_AUTHOR);
1844MODULE_DESCRIPTION(DRIVER_DESC);
1845MODULE_LICENSE("GPL");
1846
1847module_param(debug, bool, S_IRUGO | S_IWUSR);
1848MODULE_PARM_DESC(debug, "Debug enabled or not");
1849