aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/serial/empeg.c203
1 files changed, 107 insertions, 96 deletions
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
index 47ebdf5fad8e..a6ab5b58d9ca 100644
--- a/drivers/usb/serial/empeg.c
+++ b/drivers/usb/serial/empeg.c
@@ -11,36 +11,39 @@
11 * it under the terms of the GNU General Public License, as published by 11 * it under the terms of the GNU General Public License, as published by
12 * the Free Software Foundation, version 2. 12 * the Free Software Foundation, version 2.
13 * 13 *
14 * See Documentation/usb/usb-serial.txt for more information on using this driver 14 * See Documentation/usb/usb-serial.txt for more information on using this
15 * 15 * driver
16 *
16 * (07/16/2001) gb 17 * (07/16/2001) gb
17 * remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this 18 * remove unused code in empeg_close() (thanks to Oliver Neukum for
18 * out) and rewrote empeg_set_termios(). 19 * pointing this out) and rewrote empeg_set_termios().
19 * 20 *
20 * (05/30/2001) gkh 21 * (05/30/2001) gkh
21 * switched from using spinlock to a semaphore, which fixes lots of problems. 22 * switched from using spinlock to a semaphore, which fixes lots of
23 * problems.
22 * 24 *
23 * (04/08/2001) gb 25 * (04/08/2001) gb
24 * Identify version on module load. 26 * Identify version on module load.
25 * 27 *
26 * (01/22/2001) gb 28 * (01/22/2001) gb
27 * Added write_room() and chars_in_buffer() support. 29 * Added write_room() and chars_in_buffer() support.
28 * 30 *
29 * (12/21/2000) gb 31 * (12/21/2000) gb
30 * Moved termio stuff inside the port->active check. 32 * Moved termio stuff inside the port->active check.
31 * Moved MOD_DEC_USE_COUNT to end of empeg_close(). 33 * Moved MOD_DEC_USE_COUNT to end of empeg_close().
32 * 34 *
33 * (12/03/2000) gb 35 * (12/03/2000) gb
34 * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to empeg_open() 36 * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to
35 * This notifies the tty driver that the termios have changed. 37 * empeg_open(). This notifies the tty driver that the termios have
36 * 38 * changed.
39 *
37 * (11/13/2000) gb 40 * (11/13/2000) gb
38 * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to empeg_open() 41 * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to
39 * (It only needs to be set once - Doh!) 42 * empeg_open() (It only needs to be set once - Doh!)
40 * 43 *
41 * (11/11/2000) gb 44 * (11/11/2000) gb
42 * Updated to work with id_table structure. 45 * Updated to work with id_table structure.
43 * 46 *
44 * (11/04/2000) gb 47 * (11/04/2000) gb
45 * Forked this from visor.c, and hacked it up to work with an 48 * Forked this from visor.c, and hacked it up to work with an
46 * Empeg ltd. empeg-car player. Constructive criticism welcomed. 49 * Empeg ltd. empeg-car player. Constructive criticism welcomed.
@@ -48,7 +51,7 @@
48 * use of his code, and for his guidance, advice and patience. :) 51 * use of his code, and for his guidance, advice and patience. :)
49 * A 'Thank You' is in order for John Ripley of Empeg ltd for his 52 * A 'Thank You' is in order for John Ripley of Empeg ltd for his
50 * advice, and patience too. 53 * advice, and patience too.
51 * 54 *
52 */ 55 */
53 56
54#include <linux/kernel.h> 57#include <linux/kernel.h>
@@ -60,7 +63,7 @@
60#include <linux/tty_flip.h> 63#include <linux/tty_flip.h>
61#include <linux/module.h> 64#include <linux/module.h>
62#include <linux/spinlock.h> 65#include <linux/spinlock.h>
63#include <asm/uaccess.h> 66#include <linux/uaccess.h>
64#include <linux/usb.h> 67#include <linux/usb.h>
65#include <linux/usb/serial.h> 68#include <linux/usb/serial.h>
66 69
@@ -77,27 +80,30 @@ static int debug;
77#define EMPEG_PRODUCT_ID 0x0001 80#define EMPEG_PRODUCT_ID 0x0001
78 81
79/* function prototypes for an empeg-car player */ 82/* function prototypes for an empeg-car player */
80static int empeg_open (struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); 83static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
81static void empeg_close (struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); 84 struct file *filp);
82static int empeg_write (struct tty_struct *tty, struct usb_serial_port *port, 85static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port,
83 const unsigned char *buf, 86 struct file *filp);
84 int count); 87static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port,
85static int empeg_write_room (struct tty_struct *tty); 88 const unsigned char *buf,
86static int empeg_chars_in_buffer (struct tty_struct *tty); 89 int count);
87static void empeg_throttle (struct tty_struct *tty); 90static int empeg_write_room(struct tty_struct *tty);
88static void empeg_unthrottle (struct tty_struct *tty); 91static int empeg_chars_in_buffer(struct tty_struct *tty);
89static int empeg_startup (struct usb_serial *serial); 92static void empeg_throttle(struct tty_struct *tty);
90static void empeg_shutdown (struct usb_serial *serial); 93static void empeg_unthrottle(struct tty_struct *tty);
91static void empeg_set_termios (struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); 94static int empeg_startup(struct usb_serial *serial);
92static void empeg_write_bulk_callback (struct urb *urb); 95static void empeg_shutdown(struct usb_serial *serial);
93static void empeg_read_bulk_callback (struct urb *urb); 96static void empeg_set_termios(struct tty_struct *tty,
97 struct usb_serial_port *port, struct ktermios *old_termios);
98static void empeg_write_bulk_callback(struct urb *urb);
99static void empeg_read_bulk_callback(struct urb *urb);
94 100
95static struct usb_device_id id_table [] = { 101static struct usb_device_id id_table [] = {
96 { USB_DEVICE(EMPEG_VENDOR_ID, EMPEG_PRODUCT_ID) }, 102 { USB_DEVICE(EMPEG_VENDOR_ID, EMPEG_PRODUCT_ID) },
97 { } /* Terminating entry */ 103 { } /* Terminating entry */
98}; 104};
99 105
100MODULE_DEVICE_TABLE (usb, id_table); 106MODULE_DEVICE_TABLE(usb, id_table);
101 107
102static struct usb_driver empeg_driver = { 108static struct usb_driver empeg_driver = {
103 .name = "empeg", 109 .name = "empeg",
@@ -149,7 +155,7 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
149 dbg("%s - port %d", __func__, port->number); 155 dbg("%s - port %d", __func__, port->number);
150 156
151 /* Force default termio settings */ 157 /* Force default termio settings */
152 empeg_set_termios (tty, port, NULL) ; 158 empeg_set_termios(tty, port, NULL) ;
153 159
154 bytes_in = 0; 160 bytes_in = 0;
155 bytes_out = 0; 161 bytes_out = 0;
@@ -157,7 +163,7 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
157 /* Start reading from the device */ 163 /* Start reading from the device */
158 usb_fill_bulk_urb( 164 usb_fill_bulk_urb(
159 port->read_urb, 165 port->read_urb,
160 serial->dev, 166 serial->dev,
161 usb_rcvbulkpipe(serial->dev, 167 usb_rcvbulkpipe(serial->dev,
162 port->bulk_in_endpointAddress), 168 port->bulk_in_endpointAddress),
163 port->read_urb->transfer_buffer, 169 port->read_urb->transfer_buffer,
@@ -168,14 +174,16 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
168 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 174 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
169 175
170 if (result) 176 if (result)
171 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 177 dev_err(&port->dev,
178 "%s - failed submitting read urb, error %d\n",
179 __func__, result);
172 180
173 return result; 181 return result;
174} 182}
175 183
176 184
177static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port, 185static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port,
178 struct file * filp) 186 struct file *filp)
179{ 187{
180 dbg("%s - port %d", __func__, port->number); 188 dbg("%s - port %d", __func__, port->number);
181 189
@@ -186,7 +194,8 @@ static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port,
186} 194}
187 195
188 196
189static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count) 197static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port,
198 const unsigned char *buf, int count)
190{ 199{
191 struct usb_serial *serial = port->serial; 200 struct usb_serial *serial = port->serial;
192 struct urb *urb; 201 struct urb *urb;
@@ -203,7 +212,7 @@ static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, con
203 /* try to find a free urb in our list of them */ 212 /* try to find a free urb in our list of them */
204 urb = NULL; 213 urb = NULL;
205 214
206 spin_lock_irqsave (&write_urb_pool_lock, flags); 215 spin_lock_irqsave(&write_urb_pool_lock, flags);
207 216
208 for (i = 0; i < NUM_URBS; ++i) { 217 for (i = 0; i < NUM_URBS; ++i) {
209 if (write_urb_pool[i]->status != -EINPROGRESS) { 218 if (write_urb_pool[i]->status != -EINPROGRESS) {
@@ -212,7 +221,7 @@ static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, con
212 } 221 }
213 } 222 }
214 223
215 spin_unlock_irqrestore (&write_urb_pool_lock, flags); 224 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
216 225
217 if (urb == NULL) { 226 if (urb == NULL) {
218 dbg("%s - no more free urbs", __func__); 227 dbg("%s - no more free urbs", __func__);
@@ -220,25 +229,27 @@ static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, con
220 } 229 }
221 230
222 if (urb->transfer_buffer == NULL) { 231 if (urb->transfer_buffer == NULL) {
223 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC); 232 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
224 if (urb->transfer_buffer == NULL) { 233 if (urb->transfer_buffer == NULL) {
225 dev_err(&port->dev, "%s no more kernel memory...\n", __func__); 234 dev_err(&port->dev,
235 "%s no more kernel memory...\n",
236 __func__);
226 goto exit; 237 goto exit;
227 } 238 }
228 } 239 }
229 240
230 transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE); 241 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
231 242
232 memcpy (urb->transfer_buffer, current_position, transfer_size); 243 memcpy(urb->transfer_buffer, current_position, transfer_size);
233 244
234 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size, urb->transfer_buffer); 245 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size, urb->transfer_buffer);
235 246
236 /* build up our urb */ 247 /* build up our urb */
237 usb_fill_bulk_urb ( 248 usb_fill_bulk_urb(
238 urb, 249 urb,
239 serial->dev, 250 serial->dev,
240 usb_sndbulkpipe(serial->dev, 251 usb_sndbulkpipe(serial->dev,
241 port->bulk_out_endpointAddress), 252 port->bulk_out_endpointAddress),
242 urb->transfer_buffer, 253 urb->transfer_buffer,
243 transfer_size, 254 transfer_size,
244 empeg_write_bulk_callback, 255 empeg_write_bulk_callback,
@@ -260,7 +271,7 @@ static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, con
260 } 271 }
261exit: 272exit:
262 return bytes_sent; 273 return bytes_sent;
263} 274}
264 275
265 276
266static int empeg_write_room(struct tty_struct *tty) 277static int empeg_write_room(struct tty_struct *tty)
@@ -272,14 +283,13 @@ static int empeg_write_room(struct tty_struct *tty)
272 283
273 dbg("%s - port %d", __func__, port->number); 284 dbg("%s - port %d", __func__, port->number);
274 285
275 spin_lock_irqsave (&write_urb_pool_lock, flags); 286 spin_lock_irqsave(&write_urb_pool_lock, flags);
276 /* tally up the number of bytes available */ 287 /* tally up the number of bytes available */
277 for (i = 0; i < NUM_URBS; ++i) { 288 for (i = 0; i < NUM_URBS; ++i) {
278 if (write_urb_pool[i]->status != -EINPROGRESS) { 289 if (write_urb_pool[i]->status != -EINPROGRESS)
279 room += URB_TRANSFER_BUFFER_SIZE; 290 room += URB_TRANSFER_BUFFER_SIZE;
280 } 291 }
281 } 292 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
282 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
283 dbg("%s - returns %d", __func__, room); 293 dbg("%s - returns %d", __func__, room);
284 return room; 294 return room;
285 295
@@ -295,25 +305,21 @@ static int empeg_chars_in_buffer(struct tty_struct *tty)
295 305
296 dbg("%s - port %d", __func__, port->number); 306 dbg("%s - port %d", __func__, port->number);
297 307
298 spin_lock_irqsave (&write_urb_pool_lock, flags); 308 spin_lock_irqsave(&write_urb_pool_lock, flags);
299 309
300 /* tally up the number of bytes waiting */ 310 /* tally up the number of bytes waiting */
301 for (i = 0; i < NUM_URBS; ++i) { 311 for (i = 0; i < NUM_URBS; ++i) {
302 if (write_urb_pool[i]->status == -EINPROGRESS) { 312 if (write_urb_pool[i]->status == -EINPROGRESS)
303 chars += URB_TRANSFER_BUFFER_SIZE; 313 chars += URB_TRANSFER_BUFFER_SIZE;
304 }
305 } 314 }
306 315
307 spin_unlock_irqrestore (&write_urb_pool_lock, flags); 316 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
308
309 dbg("%s - returns %d", __func__, chars); 317 dbg("%s - returns %d", __func__, chars);
310 318 return chars;
311 return (chars);
312
313} 319}
314 320
315 321
316static void empeg_write_bulk_callback (struct urb *urb) 322static void empeg_write_bulk_callback(struct urb *urb)
317{ 323{
318 struct usb_serial_port *port = urb->context; 324 struct usb_serial_port *port = urb->context;
319 int status = urb->status; 325 int status = urb->status;
@@ -330,7 +336,7 @@ static void empeg_write_bulk_callback (struct urb *urb)
330} 336}
331 337
332 338
333static void empeg_read_bulk_callback (struct urb *urb) 339static void empeg_read_bulk_callback(struct urb *urb)
334{ 340{
335 struct usb_serial_port *port = urb->context; 341 struct usb_serial_port *port = urb->context;
336 struct tty_struct *tty; 342 struct tty_struct *tty;
@@ -346,8 +352,8 @@ static void empeg_read_bulk_callback (struct urb *urb)
346 return; 352 return;
347 } 353 }
348 354
349 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 355 usb_serial_debug_data(debug, &port->dev, __func__,
350 356 urb->actual_length, data);
351 tty = port->port.tty; 357 tty = port->port.tty;
352 358
353 if (urb->actual_length) { 359 if (urb->actual_length) {
@@ -360,7 +366,7 @@ static void empeg_read_bulk_callback (struct urb *urb)
360 /* Continue trying to always read */ 366 /* Continue trying to always read */
361 usb_fill_bulk_urb( 367 usb_fill_bulk_urb(
362 port->read_urb, 368 port->read_urb,
363 port->serial->dev, 369 port->serial->dev,
364 usb_rcvbulkpipe(port->serial->dev, 370 usb_rcvbulkpipe(port->serial->dev,
365 port->bulk_in_endpointAddress), 371 port->bulk_in_endpointAddress),
366 port->read_urb->transfer_buffer, 372 port->read_urb->transfer_buffer,
@@ -371,7 +377,9 @@ static void empeg_read_bulk_callback (struct urb *urb)
371 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 377 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
372 378
373 if (result) 379 if (result)
374 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 380 dev_err(&urb->dev->dev,
381 "%s - failed resubmitting read urb, error %d\n",
382 __func__, result);
375 383
376 return; 384 return;
377 385
@@ -395,11 +403,13 @@ static void empeg_unthrottle(struct tty_struct *tty)
395 port->read_urb->dev = port->serial->dev; 403 port->read_urb->dev = port->serial->dev;
396 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 404 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
397 if (result) 405 if (result)
398 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 406 dev_err(&port->dev,
407 "%s - failed submitting read urb, error %d\n",
408 __func__, result);
399} 409}
400 410
401 411
402static int empeg_startup (struct usb_serial *serial) 412static int empeg_startup(struct usb_serial *serial)
403{ 413{
404 int r; 414 int r;
405 415
@@ -411,7 +421,7 @@ static int empeg_startup (struct usb_serial *serial)
411 return -ENODEV; 421 return -ENODEV;
412 } 422 }
413 dbg("%s - reset config", __func__); 423 dbg("%s - reset config", __func__);
414 r = usb_reset_configuration (serial->dev); 424 r = usb_reset_configuration(serial->dev);
415 425
416 /* continue on with initialization */ 426 /* continue on with initialization */
417 return r; 427 return r;
@@ -419,9 +429,9 @@ static int empeg_startup (struct usb_serial *serial)
419} 429}
420 430
421 431
422static void empeg_shutdown (struct usb_serial *serial) 432static void empeg_shutdown(struct usb_serial *serial)
423{ 433{
424 dbg ("%s", __func__); 434 dbg("%s", __func__);
425} 435}
426 436
427 437
@@ -432,14 +442,14 @@ static void empeg_set_termios(struct tty_struct *tty,
432 dbg("%s - port %d", __func__, port->number); 442 dbg("%s - port %d", __func__, port->number);
433 443
434 /* 444 /*
435 * The empeg-car player wants these particular tty settings. 445 * The empeg-car player wants these particular tty settings.
436 * You could, for example, change the baud rate, however the 446 * You could, for example, change the baud rate, however the
437 * player only supports 115200 (currently), so there is really 447 * player only supports 115200 (currently), so there is really
438 * no point in support for changes to the tty settings. 448 * no point in support for changes to the tty settings.
439 * (at least for now) 449 * (at least for now)
440 * 450 *
441 * The default requirements for this device are: 451 * The default requirements for this device are:
442 */ 452 */
443 termios->c_iflag 453 termios->c_iflag
444 &= ~(IGNBRK /* disable ignore break */ 454 &= ~(IGNBRK /* disable ignore break */
445 | BRKINT /* disable break causes interrupt */ 455 | BRKINT /* disable break causes interrupt */
@@ -478,13 +488,13 @@ static void empeg_set_termios(struct tty_struct *tty,
478} 488}
479 489
480 490
481static int __init empeg_init (void) 491static int __init empeg_init(void)
482{ 492{
483 struct urb *urb; 493 struct urb *urb;
484 int i, retval; 494 int i, retval;
485 495
486 /* create our write urb pool and transfer buffers */ 496 /* create our write urb pool and transfer buffers */
487 spin_lock_init (&write_urb_pool_lock); 497 spin_lock_init(&write_urb_pool_lock);
488 for (i = 0; i < NUM_URBS; ++i) { 498 for (i = 0; i < NUM_URBS; ++i) {
489 urb = usb_alloc_urb(0, GFP_KERNEL); 499 urb = usb_alloc_urb(0, GFP_KERNEL);
490 write_urb_pool[i] = urb; 500 write_urb_pool[i] = urb;
@@ -493,9 +503,10 @@ static int __init empeg_init (void)
493 continue; 503 continue;
494 } 504 }
495 505
496 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); 506 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
507 GFP_KERNEL);
497 if (!urb->transfer_buffer) { 508 if (!urb->transfer_buffer) {
498 err("%s - out of memory for urb buffers.", 509 err("%s - out of memory for urb buffers.",
499 __func__); 510 __func__);
500 continue; 511 continue;
501 } 512 }
@@ -524,36 +535,36 @@ failed_usb_serial_register:
524} 535}
525 536
526 537
527static void __exit empeg_exit (void) 538static void __exit empeg_exit(void)
528{ 539{
529 int i; 540 int i;
530 unsigned long flags; 541 unsigned long flags;
531 542
532 usb_deregister(&empeg_driver); 543 usb_deregister(&empeg_driver);
533 usb_serial_deregister (&empeg_device); 544 usb_serial_deregister(&empeg_device);
534 545
535 spin_lock_irqsave (&write_urb_pool_lock, flags); 546 spin_lock_irqsave(&write_urb_pool_lock, flags);
536 547
537 for (i = 0; i < NUM_URBS; ++i) { 548 for (i = 0; i < NUM_URBS; ++i) {
538 if (write_urb_pool[i]) { 549 if (write_urb_pool[i]) {
539 /* FIXME - uncomment the following usb_kill_urb call when 550 /* FIXME - uncomment the following usb_kill_urb call
540 * the host controllers get fixed to set urb->dev = NULL after 551 * when the host controllers get fixed to set urb->dev
541 * the urb is finished. Otherwise this call oopses. */ 552 * = NULL after the urb is finished. Otherwise this
553 * call oopses. */
542 /* usb_kill_urb(write_urb_pool[i]); */ 554 /* usb_kill_urb(write_urb_pool[i]); */
543 kfree(write_urb_pool[i]->transfer_buffer); 555 kfree(write_urb_pool[i]->transfer_buffer);
544 usb_free_urb (write_urb_pool[i]); 556 usb_free_urb(write_urb_pool[i]);
545 } 557 }
546 } 558 }
547 559 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
548 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
549} 560}
550 561
551 562
552module_init(empeg_init); 563module_init(empeg_init);
553module_exit(empeg_exit); 564module_exit(empeg_exit);
554 565
555MODULE_AUTHOR( DRIVER_AUTHOR ); 566MODULE_AUTHOR(DRIVER_AUTHOR);
556MODULE_DESCRIPTION( DRIVER_DESC ); 567MODULE_DESCRIPTION(DRIVER_DESC);
557MODULE_LICENSE("GPL"); 568MODULE_LICENSE("GPL");
558 569
559module_param(debug, bool, S_IRUGO | S_IWUSR); 570module_param(debug, bool, S_IRUGO | S_IWUSR);