tty-usb-generic: Code cleanup
Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
af6d780b57
commit
ae64387a54
1 changed files with 49 additions and 38 deletions
|
@ -18,7 +18,7 @@
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include <linux/usb/serial.h>
|
#include <linux/usb/serial.h>
|
||||||
#include <asm/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
@ -81,7 +81,7 @@ static int generic_probe(struct usb_interface *interface,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int usb_serial_generic_register (int _debug)
|
int usb_serial_generic_register(int _debug)
|
||||||
{
|
{
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
|
@ -89,10 +89,11 @@ int usb_serial_generic_register (int _debug)
|
||||||
#ifdef CONFIG_USB_SERIAL_GENERIC
|
#ifdef CONFIG_USB_SERIAL_GENERIC
|
||||||
generic_device_ids[0].idVendor = vendor;
|
generic_device_ids[0].idVendor = vendor;
|
||||||
generic_device_ids[0].idProduct = product;
|
generic_device_ids[0].idProduct = product;
|
||||||
generic_device_ids[0].match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
|
generic_device_ids[0].match_flags =
|
||||||
|
USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
|
||||||
|
|
||||||
/* register our generic driver with ourselves */
|
/* register our generic driver with ourselves */
|
||||||
retval = usb_serial_register (&usb_serial_generic_device);
|
retval = usb_serial_register(&usb_serial_generic_device);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto exit;
|
goto exit;
|
||||||
retval = usb_register(&generic_driver);
|
retval = usb_register(&generic_driver);
|
||||||
|
@ -103,12 +104,12 @@ int usb_serial_generic_register (int _debug)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usb_serial_generic_deregister (void)
|
void usb_serial_generic_deregister(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_USB_SERIAL_GENERIC
|
#ifdef CONFIG_USB_SERIAL_GENERIC
|
||||||
/* remove our generic driver */
|
/* remove our generic driver */
|
||||||
usb_deregister(&generic_driver);
|
usb_deregister(&generic_driver);
|
||||||
usb_serial_deregister (&usb_serial_generic_device);
|
usb_serial_deregister(&usb_serial_generic_device);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,9 +122,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
|
||||||
|
|
||||||
dbg("%s - port %d", __func__, port->number);
|
dbg("%s - port %d", __func__, port->number);
|
||||||
|
|
||||||
/* force low_latency on so that our tty_push actually forces the data through,
|
/* force low_latency on so that our tty_push actually forces the data
|
||||||
otherwise it is scheduled, and with high data rates (like with OHCI) data
|
through, otherwise it is scheduled, and with high data rates (like
|
||||||
can get lost. */
|
with OHCI) data can get lost. */
|
||||||
if (tty)
|
if (tty)
|
||||||
tty->low_latency = 1;
|
tty->low_latency = 1;
|
||||||
|
|
||||||
|
@ -136,8 +137,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
|
||||||
/* if we have a bulk endpoint, start reading from it */
|
/* if we have a bulk endpoint, start reading from it */
|
||||||
if (serial->num_bulk_in) {
|
if (serial->num_bulk_in) {
|
||||||
/* Start reading from the device */
|
/* Start reading from the device */
|
||||||
usb_fill_bulk_urb (port->read_urb, serial->dev,
|
usb_fill_bulk_urb(port->read_urb, serial->dev,
|
||||||
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
|
usb_rcvbulkpipe(serial->dev,
|
||||||
|
port->bulk_in_endpointAddress),
|
||||||
port->read_urb->transfer_buffer,
|
port->read_urb->transfer_buffer,
|
||||||
port->read_urb->transfer_buffer_length,
|
port->read_urb->transfer_buffer_length,
|
||||||
((serial->type->read_bulk_callback) ?
|
((serial->type->read_bulk_callback) ?
|
||||||
|
@ -146,7 +148,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
|
||||||
port);
|
port);
|
||||||
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
|
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
|
||||||
if (result)
|
if (result)
|
||||||
dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result);
|
dev_err(&port->dev,
|
||||||
|
"%s - failed resubmitting read urb, error %d\n",
|
||||||
|
__func__, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -194,10 +198,10 @@ int usb_serial_generic_resume(struct usb_serial *serial)
|
||||||
}
|
}
|
||||||
|
|
||||||
void usb_serial_generic_close(struct tty_struct *tty,
|
void usb_serial_generic_close(struct tty_struct *tty,
|
||||||
struct usb_serial_port *port, struct file * filp)
|
struct usb_serial_port *port, struct file *filp)
|
||||||
{
|
{
|
||||||
dbg("%s - port %d", __func__, port->number);
|
dbg("%s - port %d", __func__, port->number);
|
||||||
generic_cleanup (port);
|
generic_cleanup(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_serial_generic_write(struct tty_struct *tty,
|
int usb_serial_generic_write(struct tty_struct *tty,
|
||||||
|
@ -211,7 +215,7 @@ int usb_serial_generic_write(struct tty_struct *tty,
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
dbg("%s - write request of 0 bytes", __func__);
|
dbg("%s - write request of 0 bytes", __func__);
|
||||||
return (0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* only do something if we have a bulk out endpoint */
|
/* only do something if we have a bulk out endpoint */
|
||||||
|
@ -226,27 +230,32 @@ int usb_serial_generic_write(struct tty_struct *tty,
|
||||||
port->write_urb_busy = 1;
|
port->write_urb_busy = 1;
|
||||||
spin_unlock_irqrestore(&port->lock, flags);
|
spin_unlock_irqrestore(&port->lock, flags);
|
||||||
|
|
||||||
count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
|
count = (count > port->bulk_out_size) ?
|
||||||
|
port->bulk_out_size : count;
|
||||||
|
|
||||||
memcpy (port->write_urb->transfer_buffer, buf, count);
|
memcpy(port->write_urb->transfer_buffer, buf, count);
|
||||||
data = port->write_urb->transfer_buffer;
|
data = port->write_urb->transfer_buffer;
|
||||||
usb_serial_debug_data(debug, &port->dev, __func__, count, data);
|
usb_serial_debug_data(debug, &port->dev, __func__, count, data);
|
||||||
|
|
||||||
/* set up our urb */
|
/* set up our urb */
|
||||||
usb_fill_bulk_urb (port->write_urb, serial->dev,
|
usb_fill_bulk_urb(port->write_urb, serial->dev,
|
||||||
usb_sndbulkpipe (serial->dev,
|
usb_sndbulkpipe(serial->dev,
|
||||||
port->bulk_out_endpointAddress),
|
port->bulk_out_endpointAddress),
|
||||||
port->write_urb->transfer_buffer, count,
|
port->write_urb->transfer_buffer, count,
|
||||||
((serial->type->write_bulk_callback) ?
|
((serial->type->write_bulk_callback) ?
|
||||||
serial->type->write_bulk_callback :
|
serial->type->write_bulk_callback :
|
||||||
usb_serial_generic_write_bulk_callback), port);
|
usb_serial_generic_write_bulk_callback),
|
||||||
|
port);
|
||||||
|
|
||||||
/* send the data out the bulk port */
|
/* send the data out the bulk port */
|
||||||
port->write_urb_busy = 1;
|
port->write_urb_busy = 1;
|
||||||
result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
|
result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
|
||||||
if (result) {
|
if (result) {
|
||||||
dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result);
|
dev_err(&port->dev,
|
||||||
/* don't have to grab the lock here, as we will retry if != 0 */
|
"%s - failed submitting write urb, error %d\n",
|
||||||
|
__func__, result);
|
||||||
|
/* don't have to grab the lock here, as we will
|
||||||
|
retry if != 0 */
|
||||||
port->write_urb_busy = 0;
|
port->write_urb_busy = 0;
|
||||||
} else
|
} else
|
||||||
result = count;
|
result = count;
|
||||||
|
@ -258,7 +267,7 @@ int usb_serial_generic_write(struct tty_struct *tty,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_serial_generic_write_room (struct tty_struct *tty)
|
int usb_serial_generic_write_room(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct usb_serial_port *port = tty->driver_data;
|
struct usb_serial_port *port = tty->driver_data;
|
||||||
struct usb_serial *serial = port->serial;
|
struct usb_serial *serial = port->serial;
|
||||||
|
@ -302,17 +311,19 @@ static void resubmit_read_urb(struct usb_serial_port *port, gfp_t mem_flags)
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
/* Continue reading from device */
|
/* Continue reading from device */
|
||||||
usb_fill_bulk_urb (urb, serial->dev,
|
usb_fill_bulk_urb(urb, serial->dev,
|
||||||
usb_rcvbulkpipe (serial->dev,
|
usb_rcvbulkpipe(serial->dev,
|
||||||
port->bulk_in_endpointAddress),
|
port->bulk_in_endpointAddress),
|
||||||
urb->transfer_buffer,
|
urb->transfer_buffer,
|
||||||
urb->transfer_buffer_length,
|
urb->transfer_buffer_length,
|
||||||
((serial->type->read_bulk_callback) ?
|
((serial->type->read_bulk_callback) ?
|
||||||
serial->type->read_bulk_callback :
|
serial->type->read_bulk_callback :
|
||||||
usb_serial_generic_read_bulk_callback), port);
|
usb_serial_generic_read_bulk_callback), port);
|
||||||
result = usb_submit_urb(urb, mem_flags);
|
result = usb_submit_urb(urb, mem_flags);
|
||||||
if (result)
|
if (result)
|
||||||
dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result);
|
dev_err(&port->dev,
|
||||||
|
"%s - failed resubmitting read urb, error %d\n",
|
||||||
|
__func__, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Push data to tty layer and resubmit the bulk read URB */
|
/* 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)
|
||||||
return;
|
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);
|
||||||
|
|
||||||
/* Throttle the device if requested by tty */
|
/* Throttle the device if requested by tty */
|
||||||
spin_lock_irqsave(&port->lock, flags);
|
spin_lock_irqsave(&port->lock, flags);
|
||||||
if (!(port->throttled = port->throttle_req)) {
|
port->throttled = port->throttle_req;
|
||||||
|
if (!port->throttled) {
|
||||||
spin_unlock_irqrestore(&port->lock, flags);
|
spin_unlock_irqrestore(&port->lock, flags);
|
||||||
flush_and_resubmit_read_urb(port);
|
flush_and_resubmit_read_urb(port);
|
||||||
} else {
|
} else
|
||||||
spin_unlock_irqrestore(&port->lock, flags);
|
spin_unlock_irqrestore(&port->lock, flags);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
|
EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
|
||||||
|
|
||||||
|
@ -413,15 +425,14 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void usb_serial_generic_shutdown (struct usb_serial *serial)
|
void usb_serial_generic_shutdown(struct usb_serial *serial)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dbg("%s", __func__);
|
dbg("%s", __func__);
|
||||||
|
|
||||||
/* stop reads and writes on all ports */
|
/* stop reads and writes on all ports */
|
||||||
for (i=0; i < serial->num_ports; ++i) {
|
for (i = 0; i < serial->num_ports; ++i)
|
||||||
generic_cleanup(serial->port[i]);
|
generic_cleanup(serial->port[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue