staging/serqt_usb2: refactor qt_read_bulk_callback() in serqt_usb2.c
authorYAMANE Toshiaki <yamanetoshi@gmail.com>
Fri, 9 Nov 2012 21:33:56 +0000 (06:33 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Nov 2012 21:15:25 +0000 (13:15 -0800)
Modified to eliminate the deep nesting and redundant description.

Signed-off-by: YAMANE Toshiaki <yamanetoshi@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/serqt_usb2/serqt_usb2.c

index 9bc8923f79575765a8e64e8326ac575734cde01b..0395bdfeab10b48d17d2a7aa13f3bc7ffcc1fd2c 100644 (file)
@@ -291,22 +291,89 @@ static void qt_interrupt_callback(struct urb *urb)
        /* FIXME */
 }
 
+static int qt_status_change(unsigned int limit,
+                           unsigned char *data,
+                           int i,
+                           struct quatech_port *qt_port,
+                           struct usb_serial_port *port)
+{
+       void (*fn)(struct quatech_port *, unsigned char);
+
+       if (0x00 == data[i + 2]) {
+               dev_dbg(&port->dev, "Line status status.\n");
+               fn = ProcessLineStatus;
+       } else {
+               dev_dbg(&port->dev, "Modem status status.\n");
+               fn = ProcessModemStatus;
+       }
+
+       if (i > limit) {
+               dev_dbg(&port->dev,
+                       "Illegal escape seuences in received data\n");
+               return 0;
+       }
+
+       (*fn)(qt_port, data[i + 3]);
+
+       return 1;
+}
+
+static void qt_status_change_check(struct tty_struct *tty,
+                                  struct urb *urb,
+                                  struct quatech_port *qt_port,
+                                  struct usb_serial_port *port)
+{
+       int flag, i;
+       unsigned char *data = urb->transfer_buffer;
+       unsigned int RxCount = urb->actual_length;
+
+       for (i = 0; i < RxCount; ++i) {
+               /* Look ahead code here */
+               if ((i <= (RxCount - 3)) && (data[i] == 0x1b)
+                   && (data[i + 1] == 0x1b)) {
+                       flag = 0;
+                       switch (data[i + 2]) {
+                       case 0x00:
+                       case 0x01:
+                               flag = qt_status_change((RxCount - 4), data, i,
+                                                       qt_port, port);
+                               if (flag == 1)
+                                       i += 3;
+                               break;
+
+                       case 0xff:
+                               dev_dbg(&port->dev, "No status sequence.\n");
+
+                               ProcessRxChar(tty, port, data[i]);
+                               ProcessRxChar(tty, port, data[i + 1]);
+
+                               i += 2;
+                               break;
+                       }
+                       if (flag == 1)
+                               continue;
+               }
+
+               if (tty && urb->actual_length)
+                       tty_insert_flip_char(tty, data[i], TTY_NORMAL);
+
+       }
+       tty_flip_buffer_push(tty);
+}
+
 static void qt_read_bulk_callback(struct urb *urb)
 {
 
        struct usb_serial_port *port = urb->context;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        struct quatech_port *qt_port = qt_get_port_private(port);
-       unsigned char *data;
        struct tty_struct *tty;
-       unsigned int index;
-       unsigned int RxCount;
-       int i, result;
-       int flag, flag_data;
+       int result;
 
        if (urb->status) {
                qt_port->ReadBulkStopped = 1;
-               dev_dbg(&urb->dev->dev, "%s - nonzero write bulk status received: %d\n",
+               dev_dbg(&urb->dev->dev,
+                       "%s - nonzero write bulk status received: %d\n",
                        __func__, urb->status);
                return;
        }
@@ -315,13 +382,6 @@ static void qt_read_bulk_callback(struct urb *urb)
        if (!tty)
                return;
 
-       data = urb->transfer_buffer;
-
-       RxCount = urb->actual_length;
-
-       /* index = MINOR(port->tty->device) - serial->minor; */
-       index = tty->index - serial->minor;
-
        dev_dbg(&port->dev,
                "%s - port->RxHolding = %d\n", __func__, qt_port->RxHolding);
 
@@ -354,62 +414,14 @@ static void qt_read_bulk_callback(struct urb *urb)
        if (urb->status) {
                qt_port->ReadBulkStopped = 1;
 
-               dev_dbg(&port->dev, "%s - nonzero read bulk status received: %d\n",
+               dev_dbg(&port->dev,
+                       "%s - nonzero read bulk status received: %d\n",
                        __func__, urb->status);
                goto exit;
        }
 
-       if (RxCount) {
-               flag_data = 0;
-               for (i = 0; i < RxCount; ++i) {
-                       /* Look ahead code here */
-                       if ((i <= (RxCount - 3)) && (data[i] == 0x1b)
-                           && (data[i + 1] == 0x1b)) {
-                               flag = 0;
-                               switch (data[i + 2]) {
-                               case 0x00:
-                                       /* line status change 4th byte must follow */
-                                       if (i > (RxCount - 4)) {
-                                               dev_dbg(&port->dev, "Illegal escape seuences in received data\n");
-                                               break;
-                                       }
-                                       ProcessLineStatus(qt_port, data[i + 3]);
-                                       i += 3;
-                                       flag = 1;
-                                       break;
-
-                               case 0x01:
-                                       /* Modem status status change 4th byte must follow */
-                                       dev_dbg(&port->dev, "Modem status status.\n");
-                                       if (i > (RxCount - 4)) {
-                                               dev_dbg(&port->dev, "Illegal escape sequences in received data\n");
-                                               break;
-                                       }
-                                       ProcessModemStatus(qt_port,
-                                                          data[i + 3]);
-                                       i += 3;
-                                       flag = 1;
-                                       break;
-                               case 0xff:
-                                       dev_dbg(&port->dev, "No status sequence.\n");
-
-                                       if (tty) {
-                                               ProcessRxChar(tty, port, data[i]);
-                                               ProcessRxChar(tty, port, data[i + 1]);
-                                       }
-                                       i += 2;
-                                       break;
-                               }
-                               if (flag == 1)
-                                       continue;
-                       }
-
-                       if (tty && urb->actual_length)
-                               tty_insert_flip_char(tty, data[i], TTY_NORMAL);
-
-               }
-               tty_flip_buffer_push(tty);
-       }
+       if (urb->actual_length)
+               qt_status_change_check(tty, urb, qt_port, port);
 
        /* Continue trying to always read  */
        usb_fill_bulk_urb(port->read_urb, serial->dev,
@@ -420,10 +432,11 @@ static void qt_read_bulk_callback(struct urb *urb)
                          qt_read_bulk_callback, port);
        result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
        if (result)
-               dev_dbg(&port->dev, "%s - failed resubmitting read urb, error %d",
+               dev_dbg(&port->dev,
+                       "%s - failed resubmitting read urb, error %d",
                        __func__, result);
        else {
-               if (RxCount) {
+               if (urb->actual_length) {
                        tty_flip_buffer_push(tty);
                        tty_schedule_flip(tty);
                }