diff options
Diffstat (limited to 'drivers/usb/serial/digi_acceleport.c')
-rw-r--r-- | drivers/usb/serial/digi_acceleport.c | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index e92cbefc0f88..3786e9544ae0 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -13,222 +13,6 @@ | |||
13 | * | 13 | * |
14 | * Peter Berger (pberger@brimson.com) | 14 | * Peter Berger (pberger@brimson.com) |
15 | * Al Borchers (borchers@steinerpoint.com) | 15 | * Al Borchers (borchers@steinerpoint.com) |
16 | * | ||
17 | * (12/03/2001) gkh | ||
18 | * switched to using port->port.count instead of private version. | ||
19 | * Removed port->active | ||
20 | * | ||
21 | * (04/08/2001) gb | ||
22 | * Identify version on module load. | ||
23 | * | ||
24 | * (11/01/2000) Adam J. Richter | ||
25 | * usb_device_id table support | ||
26 | * | ||
27 | * (11/01/2000) pberger and borchers | ||
28 | * -- Turned off the USB_DISABLE_SPD flag for write bulk urbs--it caused | ||
29 | * USB 4 ports to hang on startup. | ||
30 | * -- Serialized access to write urbs by adding the dp_write_urb_in_use | ||
31 | * flag; otherwise, the driver caused SMP system hangs. Watching the | ||
32 | * urb status is not sufficient. | ||
33 | * | ||
34 | * (10/05/2000) gkh | ||
35 | * -- Fixed bug with urb->dev not being set properly, now that the usb | ||
36 | * core needs it. | ||
37 | * | ||
38 | * (8/8/2000) pberger and borchers | ||
39 | * -- Fixed close so that | ||
40 | * - it can timeout while waiting for transmit idle, if needed; | ||
41 | * - it ignores interrupts when flushing the port, turning | ||
42 | * of modem signalling, and so on; | ||
43 | * - it waits for the flush to really complete before returning. | ||
44 | * -- Read_bulk_callback and write_bulk_callback check for a closed | ||
45 | * port before using the tty struct or writing to the port. | ||
46 | * -- The two changes above fix the oops caused by interrupted closes. | ||
47 | * -- Added interruptible args to write_oob_command and set_modem_signals | ||
48 | * and added a timeout arg to transmit_idle; needed for fixes to | ||
49 | * close. | ||
50 | * -- Added code for rx_throttle and rx_unthrottle so that input flow | ||
51 | * control works. | ||
52 | * -- Added code to set overrun, parity, framing, and break errors | ||
53 | * (untested). | ||
54 | * -- Set USB_DISABLE_SPD flag for write bulk urbs, so no 0 length | ||
55 | * bulk writes are done. These hung the Digi USB device. The | ||
56 | * 0 length bulk writes were a new feature of usb-uhci added in | ||
57 | * the 2.4.0-test6 kernels. | ||
58 | * -- Fixed mod inc race in open; do mod inc before sleeping to wait | ||
59 | * for a close to finish. | ||
60 | * | ||
61 | * (7/31/2000) pberger | ||
62 | * -- Fixed bugs with hardware handshaking: | ||
63 | * - Added code to set/clear tty->hw_stopped in digi_read_oob_callback() | ||
64 | * and digi_set_termios() | ||
65 | * -- Added code in digi_set_termios() to | ||
66 | * - add conditional in code handling transition from B0 to only | ||
67 | * set RTS if RTS/CTS flow control is either not in use or if | ||
68 | * the port is not currently throttled. | ||
69 | * - handle turning off CRTSCTS. | ||
70 | * | ||
71 | * (7/30/2000) borchers | ||
72 | * -- Added support for more than one Digi USB device by moving | ||
73 | * globals to a private structure in the pointed to from the | ||
74 | * usb_serial structure. | ||
75 | * -- Moved the modem change and transmit idle wait queues into | ||
76 | * the port private structure, so each port has its own queue | ||
77 | * rather than sharing global queues. | ||
78 | * -- Added support for break signals. | ||
79 | * | ||
80 | * (7/25/2000) pberger | ||
81 | * -- Added USB-2 support. Note: the USB-2 supports 3 devices: two | ||
82 | * serial and a parallel port. The parallel port is implemented | ||
83 | * as a serial-to-parallel converter. That is, the driver actually | ||
84 | * presents all three USB-2 interfaces as serial ports, but the third | ||
85 | * one physically connects to a parallel device. Thus, for example, | ||
86 | * one could plug a parallel printer into the USB-2's third port, | ||
87 | * but from the kernel's (and userland's) point of view what's | ||
88 | * actually out there is a serial device. | ||
89 | * | ||
90 | * (7/15/2000) borchers | ||
91 | * -- Fixed race in open when a close is in progress. | ||
92 | * -- Keep count of opens and dec the module use count for each | ||
93 | * outstanding open when shutdown is called (on disconnect). | ||
94 | * -- Fixed sanity checks in read_bulk_callback and write_bulk_callback | ||
95 | * so pointers are checked before use. | ||
96 | * -- Split read bulk callback into in band and out of band | ||
97 | * callbacks, and no longer restart read chains if there is | ||
98 | * a status error or a sanity error. This fixed the seg | ||
99 | * faults and other errors we used to get on disconnect. | ||
100 | * -- Port->active is once again a flag as usb-serial intended it | ||
101 | * to be, not a count. Since it was only a char it would | ||
102 | * have been limited to 256 simultaneous opens. Now the open | ||
103 | * count is kept in the port private structure in dp_open_count. | ||
104 | * -- Added code for modularization of the digi_acceleport driver. | ||
105 | * | ||
106 | * (6/27/2000) pberger and borchers | ||
107 | * -- Zeroed out sync field in the wakeup_task before first use; | ||
108 | * otherwise the uninitialized value might prevent the task from | ||
109 | * being scheduled. | ||
110 | * -- Initialized ret value to 0 in write_bulk_callback, otherwise | ||
111 | * the uninitialized value could cause a spurious debugging message. | ||
112 | * | ||
113 | * (6/22/2000) pberger and borchers | ||
114 | * -- Made cond_wait_... inline--apparently on SPARC the flags arg | ||
115 | * to spin_lock_irqsave cannot be passed to another function | ||
116 | * to call spin_unlock_irqrestore. Thanks to Pauline Middelink. | ||
117 | * -- In digi_set_modem_signals the inner nested spin locks use just | ||
118 | * spin_lock() rather than spin_lock_irqsave(). The old code | ||
119 | * mistakenly left interrupts off. Thanks to Pauline Middelink. | ||
120 | * -- copy_from_user (which can sleep) is no longer called while a | ||
121 | * spinlock is held. We copy to a local buffer before getting | ||
122 | * the spinlock--don't like the extra copy but the code is simpler. | ||
123 | * -- Printk and dbg are no longer called while a spin lock is held. | ||
124 | * | ||
125 | * (6/4/2000) pberger and borchers | ||
126 | * -- Replaced separate calls to spin_unlock_irqrestore and | ||
127 | * interruptible_sleep_on_timeout with a new function | ||
128 | * cond_wait_interruptible_timeout_irqrestore. This eliminates | ||
129 | * the race condition where the wake up could happen after | ||
130 | * the unlock and before the sleep. | ||
131 | * -- Close now waits for output to drain. | ||
132 | * -- Open waits until any close in progress is finished. | ||
133 | * -- All out of band responses are now processed, not just the | ||
134 | * first in a USB packet. | ||
135 | * -- Fixed a bug that prevented the driver from working when the | ||
136 | * first Digi port was not the first USB serial port--the driver | ||
137 | * was mistakenly using the external USB serial port number to | ||
138 | * try to index into its internal ports. | ||
139 | * -- Fixed an SMP bug -- write_bulk_callback is called directly from | ||
140 | * an interrupt, so spin_lock_irqsave/spin_unlock_irqrestore are | ||
141 | * needed for locks outside write_bulk_callback that are also | ||
142 | * acquired by write_bulk_callback to prevent deadlocks. | ||
143 | * -- Fixed support for select() by making digi_chars_in_buffer() | ||
144 | * return 256 when -EINPROGRESS is set, as the line discipline | ||
145 | * code in n_tty.c expects. | ||
146 | * -- Fixed an include file ordering problem that prevented debugging | ||
147 | * messages from working. | ||
148 | * -- Fixed an intermittent timeout problem that caused writes to | ||
149 | * sometimes get stuck on some machines on some kernels. It turns | ||
150 | * out in these circumstances write_chan() (in n_tty.c) was | ||
151 | * asleep waiting for our wakeup call. Even though we call | ||
152 | * wake_up_interruptible() in digi_write_bulk_callback(), there is | ||
153 | * a race condition that could cause the wakeup to fail: if our | ||
154 | * wake_up_interruptible() call occurs between the time that our | ||
155 | * driver write routine finishes and write_chan() sets current->state | ||
156 | * to TASK_INTERRUPTIBLE, the effect of our wakeup setting the state | ||
157 | * to TASK_RUNNING will be lost and write_chan's subsequent call to | ||
158 | * schedule() will never return (unless it catches a signal). | ||
159 | * This race condition occurs because write_bulk_callback() (and thus | ||
160 | * the wakeup) are called asynchronously from an interrupt, rather than | ||
161 | * from the scheduler. We can avoid the race by calling the wakeup | ||
162 | * from the scheduler queue and that's our fix: Now, at the end of | ||
163 | * write_bulk_callback() we queue up a wakeup call on the scheduler | ||
164 | * task queue. We still also invoke the wakeup directly since that | ||
165 | * squeezes a bit more performance out of the driver, and any lost | ||
166 | * race conditions will get cleaned up at the next scheduler run. | ||
167 | * | ||
168 | * NOTE: The problem also goes away if you comment out | ||
169 | * the two code lines in write_chan() where current->state | ||
170 | * is set to TASK_RUNNING just before calling driver.write() and to | ||
171 | * TASK_INTERRUPTIBLE immediately afterwards. This is why the | ||
172 | * problem did not show up with the 2.2 kernels -- they do not | ||
173 | * include that code. | ||
174 | * | ||
175 | * (5/16/2000) pberger and borchers | ||
176 | * -- Added timeouts to sleeps, to defend against lost wake ups. | ||
177 | * -- Handle transition to/from B0 baud rate in digi_set_termios. | ||
178 | * | ||
179 | * (5/13/2000) pberger and borchers | ||
180 | * -- All commands now sent on out of band port, using | ||
181 | * digi_write_oob_command. | ||
182 | * -- Get modem control signals whenever they change, support TIOCMGET/ | ||
183 | * SET/BIS/BIC ioctls. | ||
184 | * -- digi_set_termios now supports parity, word size, stop bits, and | ||
185 | * receive enable. | ||
186 | * -- Cleaned up open and close, use digi_set_termios and | ||
187 | * digi_write_oob_command to set port parameters. | ||
188 | * -- Added digi_startup_device to start read chains on all ports. | ||
189 | * -- Write buffer is only used when count==1, to be sure put_char can | ||
190 | * write a char (unless the buffer is full). | ||
191 | * | ||
192 | * (5/10/2000) pberger and borchers | ||
193 | * -- Added MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT calls on open/close. | ||
194 | * -- Fixed problem where the first incoming character is lost on | ||
195 | * port opens after the first close on that port. Now we keep | ||
196 | * the read_urb chain open until shutdown. | ||
197 | * -- Added more port conditioning calls in digi_open and digi_close. | ||
198 | * -- Convert port->active to a use count so that we can deal with multiple | ||
199 | * opens and closes properly. | ||
200 | * -- Fixed some problems with the locking code. | ||
201 | * | ||
202 | * (5/3/2000) pberger and borchers | ||
203 | * -- First alpha version of the driver--many known limitations and bugs. | ||
204 | * | ||
205 | * | ||
206 | * Locking and SMP | ||
207 | * | ||
208 | * - Each port, including the out-of-band port, has a lock used to | ||
209 | * serialize all access to the port's private structure. | ||
210 | * - The port lock is also used to serialize all writes and access to | ||
211 | * the port's URB. | ||
212 | * - The port lock is also used for the port write_wait condition | ||
213 | * variable. Holding the port lock will prevent a wake up on the | ||
214 | * port's write_wait; this can be used with cond_wait_... to be sure | ||
215 | * the wake up is not lost in a race when dropping the lock and | ||
216 | * sleeping waiting for the wakeup. | ||
217 | * - digi_write() does not sleep, since it is sometimes called on | ||
218 | * interrupt time. | ||
219 | * - digi_write_bulk_callback() and digi_read_bulk_callback() are | ||
220 | * called directly from interrupts. Hence spin_lock_irqsave() | ||
221 | * and spin_unlock_irqrestore() are used in the rest of the code | ||
222 | * for any locks they acquire. | ||
223 | * - digi_write_bulk_callback() gets the port lock before waking up | ||
224 | * processes sleeping on the port write_wait. It also schedules | ||
225 | * wake ups so they happen from the scheduler, because the tty | ||
226 | * system can miss wake ups from interrupts. | ||
227 | * - All sleeps use a timeout of DIGI_RETRY_TIMEOUT before looping to | ||
228 | * recheck the condition they are sleeping on. This is defensive, | ||
229 | * in case a wake up is lost. | ||
230 | * - Following Documentation/DocBook/kernel-locking.tmpl no spin locks | ||
231 | * are held when calling copy_to/from_user or printk. | ||
232 | */ | 16 | */ |
233 | 17 | ||
234 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |