]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/serial/keyspan.c
Merge tag 'usb-3.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[~andy/linux] / drivers / usb / serial / keyspan.c
index b011478d2e5f43cffc8923f3264d69d9a4facceb..eb30d7b01f3681bd00c7fe73827533a613f162b6 100644 (file)
@@ -712,45 +712,45 @@ static void usa49wg_indat_callback(struct urb *urb)
        i = 0;
        len = 0;
 
-       if (urb->actual_length) {
-               while (i < urb->actual_length) {
+       while (i < urb->actual_length) {
 
-                       /* Check port number from message*/
-                       if (data[i] >= serial->num_ports) {
-                               dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
-                                       __func__, data[i]);
-                               return;
-                       }
-                       port = serial->port[data[i++]];
-                       len = data[i++];
+               /* Check port number from message */
+               if (data[i] >= serial->num_ports) {
+                       dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
+                               __func__, data[i]);
+                       return;
+               }
+               port = serial->port[data[i++]];
+               len = data[i++];
 
-                       /* 0x80 bit is error flag */
-                       if ((data[i] & 0x80) == 0) {
-                               /* no error on any byte */
-                               i++;
-                               for (x = 1; x < len ; ++x)
-                                       tty_insert_flip_char(&port->port,
-                                                       data[i++], 0);
-                       } else {
-                               /*
-                                * some bytes had errors, every byte has status
-                                */
-                               for (x = 0; x + 1 < len; x += 2) {
-                                       int stat = data[i], flag = 0;
-                                       if (stat & RXERROR_OVERRUN)
-                                               flag |= TTY_OVERRUN;
-                                       if (stat & RXERROR_FRAMING)
-                                               flag |= TTY_FRAME;
-                                       if (stat & RXERROR_PARITY)
-                                               flag |= TTY_PARITY;
-                                       /* XXX should handle break (0x10) */
-                                       tty_insert_flip_char(&port->port,
-                                                       data[i+1], flag);
-                                       i += 2;
-                               }
+               /* 0x80 bit is error flag */
+               if ((data[i] & 0x80) == 0) {
+                       /* no error on any byte */
+                       i++;
+                       for (x = 1; x < len && i < urb->actual_length; ++x)
+                               tty_insert_flip_char(&port->port,
+                                               data[i++], 0);
+               } else {
+                       /*
+                        * some bytes had errors, every byte has status
+                        */
+                       for (x = 0; x + 1 < len &&
+                                   i + 1 < urb->actual_length; x += 2) {
+                               int stat = data[i], flag = 0;
+
+                               if (stat & RXERROR_OVERRUN)
+                                       flag |= TTY_OVERRUN;
+                               if (stat & RXERROR_FRAMING)
+                                       flag |= TTY_FRAME;
+                               if (stat & RXERROR_PARITY)
+                                       flag |= TTY_PARITY;
+                               /* XXX should handle break (0x10) */
+                               tty_insert_flip_char(&port->port, data[i+1],
+                                                    flag);
+                               i += 2;
                        }
-                       tty_flip_buffer_push(&port->port);
                }
+               tty_flip_buffer_push(&port->port);
        }
 
        /* Resubmit urb so we continue receiving */
@@ -1092,7 +1092,6 @@ static void keyspan_dtr_rts(struct usb_serial_port *port, int on)
 static void keyspan_close(struct usb_serial_port *port)
 {
        int                     i;
-       struct usb_serial       *serial = port->serial;
        struct keyspan_port_private     *p_priv;
 
        p_priv = usb_get_serial_port_data(port);
@@ -1100,28 +1099,17 @@ static void keyspan_close(struct usb_serial_port *port)
        p_priv->rts_state = 0;
        p_priv->dtr_state = 0;
 
-       if (serial->dev) {
-               keyspan_send_setup(port, 2);
-               /* pilot-xfer seems to work best with this delay */
-               mdelay(100);
-               /* keyspan_set_termios(port, NULL); */
-       }
-
-       /*while (p_priv->outcont_urb->status == -EINPROGRESS) {
-               dev_dbg(&port->dev, "%s - urb in progress\n", __func__);
-       }*/
+       keyspan_send_setup(port, 2);
+       /* pilot-xfer seems to work best with this delay */
+       mdelay(100);
 
        p_priv->out_flip = 0;
        p_priv->in_flip = 0;
 
-       if (serial->dev) {
-               /* Stop reading/writing urbs */
-               stop_urb(p_priv->inack_urb);
-               /* stop_urb(p_priv->outcont_urb); */
-               for (i = 0; i < 2; i++) {
-                       stop_urb(p_priv->in_urbs[i]);
-                       stop_urb(p_priv->out_urbs[i]);
-               }
+       stop_urb(p_priv->inack_urb);
+       for (i = 0; i < 2; i++) {
+               stop_urb(p_priv->in_urbs[i]);
+               stop_urb(p_priv->out_urbs[i]);
        }
 }