USB: safe_serial: straighten out read processing
authorJohan Hovold <jhovold@gmail.com>
Tue, 18 May 2010 22:01:32 +0000 (00:01 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 20 May 2010 20:21:49 +0000 (13:21 -0700)
Clean up read processing logic.

Tested using a cp210x device in a loopback setup.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/safe_serial.c

index d9af5c5..a36e231 100644 (file)
@@ -218,7 +218,9 @@ static void safe_process_read_urb(struct urb *urb)
        struct usb_serial_port *port = urb->context;
        unsigned char *data = urb->transfer_buffer;
        unsigned char length = urb->actual_length;
        struct usb_serial_port *port = urb->context;
        unsigned char *data = urb->transfer_buffer;
        unsigned char length = urb->actual_length;
+       int actual_length;
        struct tty_struct *tty;
        struct tty_struct *tty;
+       __u16 fcs;
 
        if (!length)
                return;
 
        if (!length)
                return;
@@ -227,30 +229,27 @@ static void safe_process_read_urb(struct urb *urb)
        if (!tty)
                return;
 
        if (!tty)
                return;
 
-       if (safe) {
-               __u16 fcs;
-               fcs = fcs_compute10(data, length, CRC10_INITFCS);
-               if (!fcs) {
-                       int actual_length = data[length - 2] >> 2;
-                       if (actual_length <= (length - 2)) {
-                               dev_info(&urb->dev->dev, "%s - actual: %d\n",
-                                        __func__, actual_length);
-                               tty_insert_flip_string(tty,
-                                                       data, actual_length);
-                               tty_flip_buffer_push(tty);
-                       } else {
-                               dev_err(&port->dev,
-                                       "%s - inconsistent lengths %d:%d\n",
-                                       __func__, actual_length, length);
-                       }
-               } else {
-                       dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs);
-               }
-       } else {
-               tty_insert_flip_string(tty, data, length);
-               tty_flip_buffer_push(tty);
+       if (!safe)
+               goto out;
+
+       fcs = fcs_compute10(data, length, CRC10_INITFCS);
+       if (fcs) {
+               dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs);
+               goto err;
        }
 
        }
 
+       actual_length = data[length - 2] >> 2;
+       if (actual_length > (length - 2)) {
+               dev_err(&port->dev, "%s - inconsistent lengths %d:%d\n",
+                               __func__, actual_length, length);
+               goto err;
+       }
+       dev_info(&urb->dev->dev, "%s - actual: %d\n", __func__, actual_length);
+       length = actual_length;
+out:
+       tty_insert_flip_string(tty, data, length);
+       tty_flip_buffer_push(tty);
+err:
        tty_kref_put(tty);
 }
 
        tty_kref_put(tty);
 }