USB: safe_serial: reimplement read using generic framework
authorJohan Hovold <jhovold@gmail.com>
Tue, 18 May 2010 22:01:31 +0000 (00:01 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 20 May 2010 20:21:49 +0000 (13:21 -0700)
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>
drivers/usb/serial/safe_serial.c

index 915c094..d9af5c5 100644 (file)
@@ -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,
 };