diff options
author | Johan Hovold <jhovold@gmail.com> | 2010-05-19 00:01:31 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-20 13:21:49 -0700 |
commit | 12e2e52cc578714d5824a27dd1a131a5418d636b (patch) | |
tree | c191a5a9006fd7a097fc474097e021614dcb20c4 | |
parent | 241c80ea72be4828c63f5dd44b142e54d0a12f5d (diff) | |
download | linux-12e2e52cc578714d5824a27dd1a131a5418d636b.tar.bz2 |
USB: safe_serial: reimplement read using generic framework
Use process_read_urb to implement read processing.
Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/serial/safe_serial.c | 47 |
1 files changed, 8 insertions, 39 deletions
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index 915c094ef92c..d9af5c5ed9e8 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c @@ -213,38 +213,20 @@ static __u16 __inline__ fcs_compute10(unsigned char *sp, int len, __u16 fcs) return fcs; } -static void safe_read_bulk_callback(struct urb *urb) +static void safe_process_read_urb(struct urb *urb) { - struct usb_serial_port *port = urb->context; + struct usb_serial_port *port = urb->context; unsigned char *data = urb->transfer_buffer; unsigned char length = urb->actual_length; struct tty_struct *tty; - int result; - int status = urb->status; - dbg("%s", __func__); - - if (status) { - dbg("%s - nonzero read bulk status received: %d", - __func__, status); + if (!length) return; - } - dbg("safe_read_bulk_callback length: %d", - port->read_urb->actual_length); -#ifdef ECHO_RCV - { - int i; - unsigned char *cp = port->read_urb->transfer_buffer; - for (i = 0; i < port->read_urb->actual_length; i++) { - if ((i % 32) == 0) - printk("\nru[%02x] ", i); - printk("%02x ", *cp++); - } - printk("\n"); - } -#endif tty = tty_port_tty_get(&port->port); + if (!tty) + return; + if (safe) { __u16 fcs; fcs = fcs_compute10(data, length, CRC10_INITFCS); @@ -268,21 +250,8 @@ static void safe_read_bulk_callback(struct urb *urb) tty_insert_flip_string(tty, data, length); tty_flip_buffer_push(tty); } - tty_kref_put(tty); - /* Continue trying to always read */ - usb_fill_bulk_urb(urb, port->serial->dev, - usb_rcvbulkpipe(port->serial->dev, - port->bulk_in_endpointAddress), - urb->transfer_buffer, urb->transfer_buffer_length, - safe_read_bulk_callback, port); - - result = usb_submit_urb(urb, GFP_ATOMIC); - if (result) - dev_err(&port->dev, - "%s - failed resubmitting read urb, error %d\n", - __func__, result); - /* FIXME: Need a mechanism to retry later if this happens */ + tty_kref_put(tty); } static int safe_prepare_write_buffer(struct usb_serial_port *port, @@ -343,7 +312,7 @@ static struct usb_serial_driver safe_device = { .id_table = id_table, .usb_driver = &safe_driver, .num_ports = 1, - .read_bulk_callback = safe_read_bulk_callback, + .process_read_urb = safe_process_read_urb, .prepare_write_buffer = safe_prepare_write_buffer, .attach = safe_startup, }; |