aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/serial/generic.c87
1 files changed, 49 insertions, 38 deletions
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
index 5128018c2766..fe84c88ec20c 100644
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -18,7 +18,7 @@
18#include <linux/moduleparam.h> 18#include <linux/moduleparam.h>
19#include <linux/usb.h> 19#include <linux/usb.h>
20#include <linux/usb/serial.h> 20#include <linux/usb/serial.h>
21#include <asm/uaccess.h> 21#include <linux/uaccess.h>
22 22
23 23
24static int debug; 24static int debug;
@@ -81,7 +81,7 @@ static int generic_probe(struct usb_interface *interface,
81} 81}
82#endif 82#endif
83 83
84int usb_serial_generic_register (int _debug) 84int usb_serial_generic_register(int _debug)
85{ 85{
86 int retval = 0; 86 int retval = 0;
87 87
@@ -89,10 +89,11 @@ int usb_serial_generic_register (int _debug)
89#ifdef CONFIG_USB_SERIAL_GENERIC 89#ifdef CONFIG_USB_SERIAL_GENERIC
90 generic_device_ids[0].idVendor = vendor; 90 generic_device_ids[0].idVendor = vendor;
91 generic_device_ids[0].idProduct = product; 91 generic_device_ids[0].idProduct = product;
92 generic_device_ids[0].match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT; 92 generic_device_ids[0].match_flags =
93 USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
93 94
94 /* register our generic driver with ourselves */ 95 /* register our generic driver with ourselves */
95 retval = usb_serial_register (&usb_serial_generic_device); 96 retval = usb_serial_register(&usb_serial_generic_device);
96 if (retval) 97 if (retval)
97 goto exit; 98 goto exit;
98 retval = usb_register(&generic_driver); 99 retval = usb_register(&generic_driver);
@@ -103,12 +104,12 @@ exit:
103 return retval; 104 return retval;
104} 105}
105 106
106void usb_serial_generic_deregister (void) 107void usb_serial_generic_deregister(void)
107{ 108{
108#ifdef CONFIG_USB_SERIAL_GENERIC 109#ifdef CONFIG_USB_SERIAL_GENERIC
109 /* remove our generic driver */ 110 /* remove our generic driver */
110 usb_deregister(&generic_driver); 111 usb_deregister(&generic_driver);
111 usb_serial_deregister (&usb_serial_generic_device); 112 usb_serial_deregister(&usb_serial_generic_device);
112#endif 113#endif
113} 114}
114 115
@@ -121,9 +122,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
121 122
122 dbg("%s - port %d", __func__, port->number); 123 dbg("%s - port %d", __func__, port->number);
123 124
124 /* force low_latency on so that our tty_push actually forces the data through, 125 /* force low_latency on so that our tty_push actually forces the data
125 otherwise it is scheduled, and with high data rates (like with OHCI) data 126 through, otherwise it is scheduled, and with high data rates (like
126 can get lost. */ 127 with OHCI) data can get lost. */
127 if (tty) 128 if (tty)
128 tty->low_latency = 1; 129 tty->low_latency = 1;
129 130
@@ -136,8 +137,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
136 /* if we have a bulk endpoint, start reading from it */ 137 /* if we have a bulk endpoint, start reading from it */
137 if (serial->num_bulk_in) { 138 if (serial->num_bulk_in) {
138 /* Start reading from the device */ 139 /* Start reading from the device */
139 usb_fill_bulk_urb (port->read_urb, serial->dev, 140 usb_fill_bulk_urb(port->read_urb, serial->dev,
140 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), 141 usb_rcvbulkpipe(serial->dev,
142 port->bulk_in_endpointAddress),
141 port->read_urb->transfer_buffer, 143 port->read_urb->transfer_buffer,
142 port->read_urb->transfer_buffer_length, 144 port->read_urb->transfer_buffer_length,
143 ((serial->type->read_bulk_callback) ? 145 ((serial->type->read_bulk_callback) ?
@@ -146,7 +148,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
146 port); 148 port);
147 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 149 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
148 if (result) 150 if (result)
149 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 151 dev_err(&port->dev,
152 "%s - failed resubmitting read urb, error %d\n",
153 __func__, result);
150 } 154 }
151 155
152 return result; 156 return result;
@@ -194,10 +198,10 @@ int usb_serial_generic_resume(struct usb_serial *serial)
194} 198}
195 199
196void usb_serial_generic_close(struct tty_struct *tty, 200void usb_serial_generic_close(struct tty_struct *tty,
197 struct usb_serial_port *port, struct file * filp) 201 struct usb_serial_port *port, struct file *filp)
198{ 202{
199 dbg("%s - port %d", __func__, port->number); 203 dbg("%s - port %d", __func__, port->number);
200 generic_cleanup (port); 204 generic_cleanup(port);
201} 205}
202 206
203int usb_serial_generic_write(struct tty_struct *tty, 207int usb_serial_generic_write(struct tty_struct *tty,
@@ -211,7 +215,7 @@ int usb_serial_generic_write(struct tty_struct *tty,
211 215
212 if (count == 0) { 216 if (count == 0) {
213 dbg("%s - write request of 0 bytes", __func__); 217 dbg("%s - write request of 0 bytes", __func__);
214 return (0); 218 return 0;
215 } 219 }
216 220
217 /* only do something if we have a bulk out endpoint */ 221 /* only do something if we have a bulk out endpoint */
@@ -226,27 +230,32 @@ int usb_serial_generic_write(struct tty_struct *tty,
226 port->write_urb_busy = 1; 230 port->write_urb_busy = 1;
227 spin_unlock_irqrestore(&port->lock, flags); 231 spin_unlock_irqrestore(&port->lock, flags);
228 232
229 count = (count > port->bulk_out_size) ? port->bulk_out_size : count; 233 count = (count > port->bulk_out_size) ?
234 port->bulk_out_size : count;
230 235
231 memcpy (port->write_urb->transfer_buffer, buf, count); 236 memcpy(port->write_urb->transfer_buffer, buf, count);
232 data = port->write_urb->transfer_buffer; 237 data = port->write_urb->transfer_buffer;
233 usb_serial_debug_data(debug, &port->dev, __func__, count, data); 238 usb_serial_debug_data(debug, &port->dev, __func__, count, data);
234 239
235 /* set up our urb */ 240 /* set up our urb */
236 usb_fill_bulk_urb (port->write_urb, serial->dev, 241 usb_fill_bulk_urb(port->write_urb, serial->dev,
237 usb_sndbulkpipe (serial->dev, 242 usb_sndbulkpipe(serial->dev,
238 port->bulk_out_endpointAddress), 243 port->bulk_out_endpointAddress),
239 port->write_urb->transfer_buffer, count, 244 port->write_urb->transfer_buffer, count,
240 ((serial->type->write_bulk_callback) ? 245 ((serial->type->write_bulk_callback) ?
241 serial->type->write_bulk_callback : 246 serial->type->write_bulk_callback :
242 usb_serial_generic_write_bulk_callback), port); 247 usb_serial_generic_write_bulk_callback),
248 port);
243 249
244 /* send the data out the bulk port */ 250 /* send the data out the bulk port */
245 port->write_urb_busy = 1; 251 port->write_urb_busy = 1;
246 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 252 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
247 if (result) { 253 if (result) {
248 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result); 254 dev_err(&port->dev,
249 /* don't have to grab the lock here, as we will retry if != 0 */ 255 "%s - failed submitting write urb, error %d\n",
256 __func__, result);
257 /* don't have to grab the lock here, as we will
258 retry if != 0 */
250 port->write_urb_busy = 0; 259 port->write_urb_busy = 0;
251 } else 260 } else
252 result = count; 261 result = count;
@@ -258,7 +267,7 @@ int usb_serial_generic_write(struct tty_struct *tty,
258 return 0; 267 return 0;
259} 268}
260 269
261int usb_serial_generic_write_room (struct tty_struct *tty) 270int usb_serial_generic_write_room(struct tty_struct *tty)
262{ 271{
263 struct usb_serial_port *port = tty->driver_data; 272 struct usb_serial_port *port = tty->driver_data;
264 struct usb_serial *serial = port->serial; 273 struct usb_serial *serial = port->serial;
@@ -302,17 +311,19 @@ static void resubmit_read_urb(struct usb_serial_port *port, gfp_t mem_flags)
302 int result; 311 int result;
303 312
304 /* Continue reading from device */ 313 /* Continue reading from device */
305 usb_fill_bulk_urb (urb, serial->dev, 314 usb_fill_bulk_urb(urb, serial->dev,
306 usb_rcvbulkpipe (serial->dev, 315 usb_rcvbulkpipe(serial->dev,
307 port->bulk_in_endpointAddress), 316 port->bulk_in_endpointAddress),
308 urb->transfer_buffer, 317 urb->transfer_buffer,
309 urb->transfer_buffer_length, 318 urb->transfer_buffer_length,
310 ((serial->type->read_bulk_callback) ? 319 ((serial->type->read_bulk_callback) ?
311 serial->type->read_bulk_callback : 320 serial->type->read_bulk_callback :
312 usb_serial_generic_read_bulk_callback), port); 321 usb_serial_generic_read_bulk_callback), port);
313 result = usb_submit_urb(urb, mem_flags); 322 result = usb_submit_urb(urb, mem_flags);
314 if (result) 323 if (result)
315 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 324 dev_err(&port->dev,
325 "%s - failed resubmitting read urb, error %d\n",
326 __func__, result);
316} 327}
317 328
318/* Push data to tty layer and resubmit the bulk read URB */ 329/* Push data to tty layer and resubmit the bulk read URB */
@@ -349,16 +360,17 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
349 return; 360 return;
350 } 361 }
351 362
352 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 363 usb_serial_debug_data(debug, &port->dev, __func__,
364 urb->actual_length, data);
353 365
354 /* Throttle the device if requested by tty */ 366 /* Throttle the device if requested by tty */
355 spin_lock_irqsave(&port->lock, flags); 367 spin_lock_irqsave(&port->lock, flags);
356 if (!(port->throttled = port->throttle_req)) { 368 port->throttled = port->throttle_req;
369 if (!port->throttled) {
357 spin_unlock_irqrestore(&port->lock, flags); 370 spin_unlock_irqrestore(&port->lock, flags);
358 flush_and_resubmit_read_urb(port); 371 flush_and_resubmit_read_urb(port);
359 } else { 372 } else
360 spin_unlock_irqrestore(&port->lock, flags); 373 spin_unlock_irqrestore(&port->lock, flags);
361 }
362} 374}
363EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); 375EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
364 376
@@ -413,15 +425,14 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty)
413 } 425 }
414} 426}
415 427
416void usb_serial_generic_shutdown (struct usb_serial *serial) 428void usb_serial_generic_shutdown(struct usb_serial *serial)
417{ 429{
418 int i; 430 int i;
419 431
420 dbg("%s", __func__); 432 dbg("%s", __func__);
421 433
422 /* stop reads and writes on all ports */ 434 /* stop reads and writes on all ports */
423 for (i=0; i < serial->num_ports; ++i) { 435 for (i = 0; i < serial->num_ports; ++i)
424 generic_cleanup(serial->port[i]); 436 generic_cleanup(serial->port[i]);
425 }
426} 437}
427 438