USB: ark3116: reimplement read processing

Use process_read_urb to implement read processing.

Compile-only tested.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Acked-by: Bart Hartgers <bart.hartgers@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
index 0ae610e..4e41a2a 100644
--- a/drivers/usb/serial/ark3116.c
+++ b/drivers/usb/serial/ark3116.c
@@ -42,7 +42,7 @@
  * Version information
  */
 
-#define DRIVER_VERSION "v0.5"
+#define DRIVER_VERSION "v0.6"
 #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>"
 #define DRIVER_DESC "USB ARK3116 serial/IrDA driver"
 #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA"
@@ -672,87 +672,45 @@
  * error for the next block of data as well...
  * For now, let's pretend this can't happen.
  */
-
-static void send_to_tty(struct tty_struct *tty,
-			const unsigned char *chars,
-			size_t size, char flag)
+static void ark3116_process_read_urb(struct urb *urb)
 {
-	if (size == 0)
-		return;
-	if (flag == TTY_NORMAL) {
-		tty_insert_flip_string(tty, chars, size);
-	} else {
-		int i;
-		for (i = 0; i < size; ++i)
-			tty_insert_flip_char(tty, chars[i], flag);
-	}
-}
-
-static void ark3116_read_bulk_callback(struct urb *urb)
-{
-	struct usb_serial_port *port =  urb->context;
+	struct usb_serial_port *port = urb->context;
 	struct ark3116_private *priv = usb_get_serial_port_data(port);
-	const __u8 *data = urb->transfer_buffer;
-	int status = urb->status;
 	struct tty_struct *tty;
+	unsigned char *data = urb->transfer_buffer;
+	char tty_flag = TTY_NORMAL;
 	unsigned long flags;
-	int result;
-	char flag;
 	__u32 lsr;
 
-	switch (status) {
-	case -ECONNRESET:
-	case -ENOENT:
-	case -ESHUTDOWN:
-		/* this urb is terminated, clean up */
-		dbg("%s - urb shutting down with status: %d",
-		    __func__, status);
+	/* update line status */
+	spin_lock_irqsave(&priv->status_lock, flags);
+	lsr = priv->lsr;
+	priv->lsr &= ~UART_LSR_BRK_ERROR_BITS;
+	spin_unlock_irqrestore(&priv->status_lock, flags);
+
+	if (!urb->actual_length)
 		return;
-	default:
-		dbg("%s - nonzero urb status received: %d",
-		    __func__, status);
-		break;
-	case 0: /* success */
 
-		spin_lock_irqsave(&priv->status_lock, flags);
-		lsr = priv->lsr;
-		/* clear error bits */
-		priv->lsr &= ~UART_LSR_BRK_ERROR_BITS;
-		spin_unlock_irqrestore(&priv->status_lock, flags);
+	tty = tty_port_tty_get(&port->port);
+	if (!tty)
+		return;
 
-		if (unlikely(lsr & UART_LSR_BI))
-			flag = TTY_BREAK;
-		else if (unlikely(lsr & UART_LSR_PE))
-			flag = TTY_PARITY;
-		else if (unlikely(lsr & UART_LSR_FE))
-			flag = TTY_FRAME;
-		else
-			flag = TTY_NORMAL;
+	if (lsr & UART_LSR_BRK_ERROR_BITS) {
+		if (lsr & UART_LSR_BI)
+			tty_flag = TTY_BREAK;
+		else if (lsr & UART_LSR_PE)
+			tty_flag = TTY_PARITY;
+		else if (lsr & UART_LSR_FE)
+			tty_flag = TTY_FRAME;
 
-		tty = tty_port_tty_get(&port->port);
-		if (tty) {
-			/* overrun is special, not associated with a char */
-			if (unlikely(lsr & UART_LSR_OE))
-				tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-			send_to_tty(tty, data, urb->actual_length, flag);
-			tty_flip_buffer_push(tty);
-			tty_kref_put(tty);
-		}
-
-		/* Throttle the device if requested by tty */
-		spin_lock_irqsave(&port->lock, flags);
-		port->throttled = port->throttle_req;
-		if (port->throttled) {
-			spin_unlock_irqrestore(&port->lock, flags);
-			return;
-		} else
-			spin_unlock_irqrestore(&port->lock, flags);
+		/* overrun is special, not associated with a char */
+		if (lsr & UART_LSR_OE)
+			tty_insert_flip_char(tty, 0, TTY_OVERRUN);
 	}
-	/* Continue reading from device */
-	result = usb_submit_urb(urb, GFP_ATOMIC);
-	if (result)
-		dev_err(&urb->dev->dev, "%s - failed resubmitting"
-			" read urb, error %d\n", __func__, result);
+	tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
+							urb->actual_length);
+	tty_flip_buffer_push(tty);
+	tty_kref_put(tty);
 }
 
 static struct usb_driver ark3116_driver = {
@@ -782,7 +740,7 @@
 	.close =		ark3116_close,
 	.break_ctl = 		ark3116_break_ctl,
 	.read_int_callback = 	ark3116_read_int_callback,
-	.read_bulk_callback =	ark3116_read_bulk_callback,
+	.process_read_urb =	ark3116_process_read_urb,
 };
 
 static int __init ark3116_init(void)