Re: [PATCH] USB: ark3116: reimplement read processing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2010/5/7 Johan Hovold <jhovold@xxxxxxxxx>:
> Use process_read_urb to implement read processing.
>
> Compile-only tested.
>
> CC: Bart Hartgers <bart.hartgers@xxxxxxxxx>
> Signed-off-by: Johan Hovold <jhovold@xxxxxxxxx>

Acked-by: Bart Hartgers <bart.hartgers@xxxxxxxxx>

The patch looks fine to me.
Unfortunately, most of my hardware (including the ark3116) is in
storage, so I couldn't test it.

> ---
>  drivers/usb/serial/ark3116.c |  104 ++++++++++++-----------------------------
>  1 files changed, 31 insertions(+), 73 deletions(-)
>
> 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 @@ static int debug;
>  * Version information
>  */
>
> -#define DRIVER_VERSION "v0.5"
> +#define DRIVER_VERSION "v0.6"
>  #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@xxxxxxxxx>"
>  #define DRIVER_DESC "USB ARK3116 serial/IrDA driver"
>  #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA"
> @@ -672,87 +672,45 @@ static void ark3116_read_int_callback(struct urb *urb)
>  * 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);
> -
> -               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;
> -
> -               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);
> -               }
> +       tty = tty_port_tty_get(&port->port);
> +       if (!tty)
> +               return;
> +
> +       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;
>
> -               /* 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 @@ static struct usb_serial_driver ark3116_device = {
>        .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)
> --
> 1.7.0.4
>
>



-- 
Bart Hartgers - New e-mail: bart.hartgers@xxxxxxxxx
��.n��������+%������w��{.n�����{���)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux