Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 104658
b: refs/heads/master
c: ae64387
h: refs/heads/master
v: v3
  • Loading branch information
Alan Cox authored and Linus Torvalds committed Jul 22, 2008
1 parent d113dce commit dcf1536
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 39 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: af6d780b578778d442278ac4894ff10847bebae2
refs/heads/master: ae64387a54fd519d68aa7d1aacba095140f1a647
87 changes: 49 additions & 38 deletions trunk/drivers/usb/serial/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include <linux/moduleparam.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
#include <asm/uaccess.h>
#include <linux/uaccess.h>


static int debug;
Expand Down Expand Up @@ -81,18 +81,19 @@ static int generic_probe(struct usb_interface *interface,
}
#endif

int usb_serial_generic_register (int _debug)
int usb_serial_generic_register(int _debug)
{
int retval = 0;

debug = _debug;
#ifdef CONFIG_USB_SERIAL_GENERIC
generic_device_ids[0].idVendor = vendor;
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 */
retval = usb_serial_register (&usb_serial_generic_device);
retval = usb_serial_register(&usb_serial_generic_device);
if (retval)
goto exit;
retval = usb_register(&generic_driver);
Expand All @@ -103,12 +104,12 @@ int usb_serial_generic_register (int _debug)
return retval;
}

void usb_serial_generic_deregister (void)
void usb_serial_generic_deregister(void)
{
#ifdef CONFIG_USB_SERIAL_GENERIC
/* remove our generic driver */
usb_deregister(&generic_driver);
usb_serial_deregister (&usb_serial_generic_device);
usb_serial_deregister(&usb_serial_generic_device);
#endif
}

Expand All @@ -121,9 +122,9 @@ int usb_serial_generic_open(struct tty_struct *tty,

dbg("%s - port %d", __func__, port->number);

/* force low_latency on so that our tty_push actually forces the data through,
otherwise it is scheduled, and with high data rates (like with OHCI) data
can get lost. */
/* force low_latency on so that our tty_push actually forces the data
through, otherwise it is scheduled, and with high data rates (like
with OHCI) data can get lost. */
if (tty)
tty->low_latency = 1;

Expand All @@ -136,8 +137,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
/* if we have a bulk endpoint, start reading from it */
if (serial->num_bulk_in) {
/* Start reading from the device */
usb_fill_bulk_urb (port->read_urb, serial->dev,
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
usb_fill_bulk_urb(port->read_urb, serial->dev,
usb_rcvbulkpipe(serial->dev,
port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
((serial->type->read_bulk_callback) ?
Expand All @@ -146,7 +148,9 @@ int usb_serial_generic_open(struct tty_struct *tty,
port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
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;
Expand Down Expand Up @@ -194,10 +198,10 @@ int usb_serial_generic_resume(struct usb_serial *serial)
}

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);
generic_cleanup (port);
generic_cleanup(port);
}

int usb_serial_generic_write(struct tty_struct *tty,
Expand All @@ -211,7 +215,7 @@ int usb_serial_generic_write(struct tty_struct *tty,

if (count == 0) {
dbg("%s - write request of 0 bytes", __func__);
return (0);
return 0;
}

/* only do something if we have a bulk out endpoint */
Expand All @@ -226,27 +230,32 @@ int usb_serial_generic_write(struct tty_struct *tty,
port->write_urb_busy = 1;
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;
usb_serial_debug_data(debug, &port->dev, __func__, count, data);

/* set up our urb */
usb_fill_bulk_urb (port->write_urb, serial->dev,
usb_sndbulkpipe (serial->dev,
port->bulk_out_endpointAddress),
usb_fill_bulk_urb(port->write_urb, serial->dev,
usb_sndbulkpipe(serial->dev,
port->bulk_out_endpointAddress),
port->write_urb->transfer_buffer, count,
((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 */
port->write_urb_busy = 1;
result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) {
dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result);
/* don't have to grab the lock here, as we will retry if != 0 */
dev_err(&port->dev,
"%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;
} else
result = count;
Expand All @@ -258,7 +267,7 @@ int usb_serial_generic_write(struct tty_struct *tty,
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 *serial = port->serial;
Expand Down Expand Up @@ -302,17 +311,19 @@ static void resubmit_read_urb(struct usb_serial_port *port, gfp_t mem_flags)
int result;

/* Continue reading from device */
usb_fill_bulk_urb (urb, serial->dev,
usb_rcvbulkpipe (serial->dev,
port->bulk_in_endpointAddress),
usb_fill_bulk_urb(urb, serial->dev,
usb_rcvbulkpipe(serial->dev,
port->bulk_in_endpointAddress),
urb->transfer_buffer,
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);
result = usb_submit_urb(urb, mem_flags);
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 */
Expand Down Expand Up @@ -349,16 +360,17 @@ void usb_serial_generic_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);

/* Throttle the device if requested by tty */
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);
flush_and_resubmit_read_urb(port);
} else {
} else
spin_unlock_irqrestore(&port->lock, flags);
}
}
EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);

Expand Down Expand Up @@ -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;

dbg("%s", __func__);

/* 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]);
}
}

0 comments on commit dcf1536

Please sign in to comment.