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