Loading drivers/usb/serial/empeg.c +107 −96 Original line number Diff line number Diff line Loading @@ -11,14 +11,16 @@ * it under the terms of the GNU General Public License, as published by * the Free Software Foundation, version 2. * * See Documentation/usb/usb-serial.txt for more information on using this driver * See Documentation/usb/usb-serial.txt for more information on using this * driver * * (07/16/2001) gb * remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this * out) and rewrote empeg_set_termios(). * remove unused code in empeg_close() (thanks to Oliver Neukum for * pointing this out) and rewrote empeg_set_termios(). * * (05/30/2001) gkh * switched from using spinlock to a semaphore, which fixes lots of problems. * switched from using spinlock to a semaphore, which fixes lots of * problems. * * (04/08/2001) gb * Identify version on module load. Loading @@ -31,12 +33,13 @@ * Moved MOD_DEC_USE_COUNT to end of empeg_close(). * * (12/03/2000) gb * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to empeg_open() * This notifies the tty driver that the termios have changed. * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to * empeg_open(). This notifies the tty driver that the termios have * changed. * * (11/13/2000) gb * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to empeg_open() * (It only needs to be set once - Doh!) * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to * empeg_open() (It only needs to be set once - Doh!) * * (11/11/2000) gb * Updated to work with id_table structure. Loading @@ -60,7 +63,7 @@ #include <linux/tty_flip.h> #include <linux/module.h> #include <linux/spinlock.h> #include <asm/uaccess.h> #include <linux/uaccess.h> #include <linux/usb.h> #include <linux/usb/serial.h> Loading @@ -77,8 +80,10 @@ static int debug; #define EMPEG_PRODUCT_ID 0x0001 /* function prototypes for an empeg-car player */ static int empeg_open (struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static void empeg_close (struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count); Loading @@ -88,7 +93,8 @@ static void empeg_throttle (struct tty_struct *tty); static void empeg_unthrottle(struct tty_struct *tty); static int empeg_startup(struct usb_serial *serial); static void empeg_shutdown(struct usb_serial *serial); static void empeg_set_termios (struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static void empeg_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static void empeg_write_bulk_callback(struct urb *urb); static void empeg_read_bulk_callback(struct urb *urb); Loading Loading @@ -168,7 +174,9 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port, result = usb_submit_urb(port->read_urb, GFP_KERNEL); if (result) dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); return result; } Loading @@ -186,7 +194,8 @@ static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port, } static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count) static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count) { struct usb_serial *serial = port->serial; struct urb *urb; Loading Loading @@ -222,7 +231,9 @@ static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, con if (urb->transfer_buffer == NULL) { urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC); if (urb->transfer_buffer == NULL) { dev_err(&port->dev, "%s no more kernel memory...\n", __func__); dev_err(&port->dev, "%s no more kernel memory...\n", __func__); goto exit; } } Loading Loading @@ -275,10 +286,9 @@ static int empeg_write_room(struct tty_struct *tty) spin_lock_irqsave(&write_urb_pool_lock, flags); /* tally up the number of bytes available */ for (i = 0; i < NUM_URBS; ++i) { if (write_urb_pool[i]->status != -EINPROGRESS) { if (write_urb_pool[i]->status != -EINPROGRESS) room += URB_TRANSFER_BUFFER_SIZE; } } spin_unlock_irqrestore(&write_urb_pool_lock, flags); dbg("%s - returns %d", __func__, room); return room; Loading @@ -299,17 +309,13 @@ static int empeg_chars_in_buffer(struct tty_struct *tty) /* tally up the number of bytes waiting */ for (i = 0; i < NUM_URBS; ++i) { if (write_urb_pool[i]->status == -EINPROGRESS) { if (write_urb_pool[i]->status == -EINPROGRESS) chars += URB_TRANSFER_BUFFER_SIZE; } } spin_unlock_irqrestore(&write_urb_pool_lock, flags); dbg("%s - returns %d", __func__, chars); return (chars); return chars; } Loading Loading @@ -346,8 +352,8 @@ static void empeg_read_bulk_callback (struct urb *urb) return; } usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); tty = port->port.tty; if (urb->actual_length) { Loading @@ -371,7 +377,9 @@ static void empeg_read_bulk_callback (struct urb *urb) result = usb_submit_urb(port->read_urb, GFP_ATOMIC); if (result) dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); return; Loading @@ -395,7 +403,9 @@ static void empeg_unthrottle(struct tty_struct *tty) port->read_urb->dev = port->serial->dev; result = usb_submit_urb(port->read_urb, GFP_ATOMIC); if (result) dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); } Loading Loading @@ -493,7 +503,8 @@ static int __init empeg_init (void) continue; } urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); if (!urb->transfer_buffer) { err("%s - out of memory for urb buffers.", __func__); Loading Loading @@ -536,15 +547,15 @@ static void __exit empeg_exit (void) for (i = 0; i < NUM_URBS; ++i) { if (write_urb_pool[i]) { /* FIXME - uncomment the following usb_kill_urb call when * the host controllers get fixed to set urb->dev = NULL after * the urb is finished. Otherwise this call oopses. */ /* FIXME - uncomment the following usb_kill_urb call * when the host controllers get fixed to set urb->dev * = NULL after the urb is finished. Otherwise this * call oopses. */ /* usb_kill_urb(write_urb_pool[i]); */ kfree(write_urb_pool[i]->transfer_buffer); usb_free_urb(write_urb_pool[i]); } } spin_unlock_irqrestore(&write_urb_pool_lock, flags); } Loading Loading
drivers/usb/serial/empeg.c +107 −96 Original line number Diff line number Diff line Loading @@ -11,14 +11,16 @@ * it under the terms of the GNU General Public License, as published by * the Free Software Foundation, version 2. * * See Documentation/usb/usb-serial.txt for more information on using this driver * See Documentation/usb/usb-serial.txt for more information on using this * driver * * (07/16/2001) gb * remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this * out) and rewrote empeg_set_termios(). * remove unused code in empeg_close() (thanks to Oliver Neukum for * pointing this out) and rewrote empeg_set_termios(). * * (05/30/2001) gkh * switched from using spinlock to a semaphore, which fixes lots of problems. * switched from using spinlock to a semaphore, which fixes lots of * problems. * * (04/08/2001) gb * Identify version on module load. Loading @@ -31,12 +33,13 @@ * Moved MOD_DEC_USE_COUNT to end of empeg_close(). * * (12/03/2000) gb * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to empeg_open() * This notifies the tty driver that the termios have changed. * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to * empeg_open(). This notifies the tty driver that the termios have * changed. * * (11/13/2000) gb * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to empeg_open() * (It only needs to be set once - Doh!) * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to * empeg_open() (It only needs to be set once - Doh!) * * (11/11/2000) gb * Updated to work with id_table structure. Loading @@ -60,7 +63,7 @@ #include <linux/tty_flip.h> #include <linux/module.h> #include <linux/spinlock.h> #include <asm/uaccess.h> #include <linux/uaccess.h> #include <linux/usb.h> #include <linux/usb/serial.h> Loading @@ -77,8 +80,10 @@ static int debug; #define EMPEG_PRODUCT_ID 0x0001 /* function prototypes for an empeg-car player */ static int empeg_open (struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static void empeg_close (struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count); Loading @@ -88,7 +93,8 @@ static void empeg_throttle (struct tty_struct *tty); static void empeg_unthrottle(struct tty_struct *tty); static int empeg_startup(struct usb_serial *serial); static void empeg_shutdown(struct usb_serial *serial); static void empeg_set_termios (struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static void empeg_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static void empeg_write_bulk_callback(struct urb *urb); static void empeg_read_bulk_callback(struct urb *urb); Loading Loading @@ -168,7 +174,9 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port, result = usb_submit_urb(port->read_urb, GFP_KERNEL); if (result) dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); return result; } Loading @@ -186,7 +194,8 @@ static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port, } static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count) static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count) { struct usb_serial *serial = port->serial; struct urb *urb; Loading Loading @@ -222,7 +231,9 @@ static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port, con if (urb->transfer_buffer == NULL) { urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC); if (urb->transfer_buffer == NULL) { dev_err(&port->dev, "%s no more kernel memory...\n", __func__); dev_err(&port->dev, "%s no more kernel memory...\n", __func__); goto exit; } } Loading Loading @@ -275,10 +286,9 @@ static int empeg_write_room(struct tty_struct *tty) spin_lock_irqsave(&write_urb_pool_lock, flags); /* tally up the number of bytes available */ for (i = 0; i < NUM_URBS; ++i) { if (write_urb_pool[i]->status != -EINPROGRESS) { if (write_urb_pool[i]->status != -EINPROGRESS) room += URB_TRANSFER_BUFFER_SIZE; } } spin_unlock_irqrestore(&write_urb_pool_lock, flags); dbg("%s - returns %d", __func__, room); return room; Loading @@ -299,17 +309,13 @@ static int empeg_chars_in_buffer(struct tty_struct *tty) /* tally up the number of bytes waiting */ for (i = 0; i < NUM_URBS; ++i) { if (write_urb_pool[i]->status == -EINPROGRESS) { if (write_urb_pool[i]->status == -EINPROGRESS) chars += URB_TRANSFER_BUFFER_SIZE; } } spin_unlock_irqrestore(&write_urb_pool_lock, flags); dbg("%s - returns %d", __func__, chars); return (chars); return chars; } Loading Loading @@ -346,8 +352,8 @@ static void empeg_read_bulk_callback (struct urb *urb) return; } usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); tty = port->port.tty; if (urb->actual_length) { Loading @@ -371,7 +377,9 @@ static void empeg_read_bulk_callback (struct urb *urb) result = usb_submit_urb(port->read_urb, GFP_ATOMIC); if (result) dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); return; Loading @@ -395,7 +403,9 @@ static void empeg_unthrottle(struct tty_struct *tty) port->read_urb->dev = port->serial->dev; result = usb_submit_urb(port->read_urb, GFP_ATOMIC); if (result) dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); } Loading Loading @@ -493,7 +503,8 @@ static int __init empeg_init (void) continue; } urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); if (!urb->transfer_buffer) { err("%s - out of memory for urb buffers.", __func__); Loading Loading @@ -536,15 +547,15 @@ static void __exit empeg_exit (void) for (i = 0; i < NUM_URBS; ++i) { if (write_urb_pool[i]) { /* FIXME - uncomment the following usb_kill_urb call when * the host controllers get fixed to set urb->dev = NULL after * the urb is finished. Otherwise this call oopses. */ /* FIXME - uncomment the following usb_kill_urb call * when the host controllers get fixed to set urb->dev * = NULL after the urb is finished. Otherwise this * call oopses. */ /* usb_kill_urb(write_urb_pool[i]); */ kfree(write_urb_pool[i]->transfer_buffer); usb_free_urb(write_urb_pool[i]); } } spin_unlock_irqrestore(&write_urb_pool_lock, flags); } Loading