diff options
author | Johan Hovold <jhovold@gmail.com> | 2010-05-07 14:45:34 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-20 16:21:43 -0400 |
commit | 82b71cfdf36d568c7a2e44efd705471c3c2caaa2 (patch) | |
tree | 1a71a5901db475393666af99da410e6429127e15 /drivers/usb/serial/ark3116.c | |
parent | 70ced221cc9f041481f129e63cc5b1dedb0ff959 (diff) |
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>
Diffstat (limited to 'drivers/usb/serial/ark3116.c')
-rw-r--r-- | 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 0ae610efa23d..4e41a2a39422 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -42,7 +42,7 @@ static int debug; | |||
42 | * Version information | 42 | * Version information |
43 | */ | 43 | */ |
44 | 44 | ||
45 | #define DRIVER_VERSION "v0.5" | 45 | #define DRIVER_VERSION "v0.6" |
46 | #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>" | 46 | #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>" |
47 | #define DRIVER_DESC "USB ARK3116 serial/IrDA driver" | 47 | #define DRIVER_DESC "USB ARK3116 serial/IrDA driver" |
48 | #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA" | 48 | #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA" |
@@ -672,87 +672,45 @@ static void ark3116_read_int_callback(struct urb *urb) | |||
672 | * error for the next block of data as well... | 672 | * error for the next block of data as well... |
673 | * For now, let's pretend this can't happen. | 673 | * For now, let's pretend this can't happen. |
674 | */ | 674 | */ |
675 | 675 | static void ark3116_process_read_urb(struct urb *urb) | |
676 | static void send_to_tty(struct tty_struct *tty, | ||
677 | const unsigned char *chars, | ||
678 | size_t size, char flag) | ||
679 | { | 676 | { |
680 | if (size == 0) | 677 | struct usb_serial_port *port = urb->context; |
681 | return; | ||
682 | if (flag == TTY_NORMAL) { | ||
683 | tty_insert_flip_string(tty, chars, size); | ||
684 | } else { | ||
685 | int i; | ||
686 | for (i = 0; i < size; ++i) | ||
687 | tty_insert_flip_char(tty, chars[i], flag); | ||
688 | } | ||
689 | } | ||
690 | |||
691 | static void ark3116_read_bulk_callback(struct urb *urb) | ||
692 | { | ||
693 | struct usb_serial_port *port = urb->context; | ||
694 | struct ark3116_private *priv = usb_get_serial_port_data(port); | 678 | struct ark3116_private *priv = usb_get_serial_port_data(port); |
695 | const __u8 *data = urb->transfer_buffer; | ||
696 | int status = urb->status; | ||
697 | struct tty_struct *tty; | 679 | struct tty_struct *tty; |
680 | unsigned char *data = urb->transfer_buffer; | ||
681 | char tty_flag = TTY_NORMAL; | ||
698 | unsigned long flags; | 682 | unsigned long flags; |
699 | int result; | ||
700 | char flag; | ||
701 | __u32 lsr; | 683 | __u32 lsr; |
702 | 684 | ||
703 | switch (status) { | 685 | /* update line status */ |
704 | case -ECONNRESET: | 686 | spin_lock_irqsave(&priv->status_lock, flags); |
705 | case -ENOENT: | 687 | lsr = priv->lsr; |
706 | case -ESHUTDOWN: | 688 | priv->lsr &= ~UART_LSR_BRK_ERROR_BITS; |
707 | /* this urb is terminated, clean up */ | 689 | spin_unlock_irqrestore(&priv->status_lock, flags); |
708 | dbg("%s - urb shutting down with status: %d", | 690 | |
709 | __func__, status); | 691 | if (!urb->actual_length) |
710 | return; | 692 | return; |
711 | default: | ||
712 | dbg("%s - nonzero urb status received: %d", | ||
713 | __func__, status); | ||
714 | break; | ||
715 | case 0: /* success */ | ||
716 | 693 | ||
717 | spin_lock_irqsave(&priv->status_lock, flags); | 694 | tty = tty_port_tty_get(&port->port); |
718 | lsr = priv->lsr; | 695 | if (!tty) |
719 | /* clear error bits */ | 696 | return; |
720 | priv->lsr &= ~UART_LSR_BRK_ERROR_BITS; | 697 | |
721 | spin_unlock_irqrestore(&priv->status_lock, flags); | 698 | if (lsr & UART_LSR_BRK_ERROR_BITS) { |
722 | 699 | if (lsr & UART_LSR_BI) | |
723 | if (unlikely(lsr & UART_LSR_BI)) | 700 | tty_flag = TTY_BREAK; |
724 | flag = TTY_BREAK; | 701 | else if (lsr & UART_LSR_PE) |
725 | else if (unlikely(lsr & UART_LSR_PE)) | 702 | tty_flag = TTY_PARITY; |
726 | flag = TTY_PARITY; | 703 | else if (lsr & UART_LSR_FE) |
727 | else if (unlikely(lsr & UART_LSR_FE)) | 704 | tty_flag = TTY_FRAME; |
728 | flag = TTY_FRAME; | ||
729 | else | ||
730 | flag = TTY_NORMAL; | ||
731 | |||
732 | tty = tty_port_tty_get(&port->port); | ||
733 | if (tty) { | ||
734 | /* overrun is special, not associated with a char */ | ||
735 | if (unlikely(lsr & UART_LSR_OE)) | ||
736 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
737 | send_to_tty(tty, data, urb->actual_length, flag); | ||
738 | tty_flip_buffer_push(tty); | ||
739 | tty_kref_put(tty); | ||
740 | } | ||
741 | 705 | ||
742 | /* Throttle the device if requested by tty */ | 706 | /* overrun is special, not associated with a char */ |
743 | spin_lock_irqsave(&port->lock, flags); | 707 | if (lsr & UART_LSR_OE) |
744 | port->throttled = port->throttle_req; | 708 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); |
745 | if (port->throttled) { | ||
746 | spin_unlock_irqrestore(&port->lock, flags); | ||
747 | return; | ||
748 | } else | ||
749 | spin_unlock_irqrestore(&port->lock, flags); | ||
750 | } | 709 | } |
751 | /* Continue reading from device */ | 710 | tty_insert_flip_string_fixed_flag(tty, data, tty_flag, |
752 | result = usb_submit_urb(urb, GFP_ATOMIC); | 711 | urb->actual_length); |
753 | if (result) | 712 | tty_flip_buffer_push(tty); |
754 | dev_err(&urb->dev->dev, "%s - failed resubmitting" | 713 | tty_kref_put(tty); |
755 | " read urb, error %d\n", __func__, result); | ||
756 | } | 714 | } |
757 | 715 | ||
758 | static struct usb_driver ark3116_driver = { | 716 | static struct usb_driver ark3116_driver = { |
@@ -782,7 +740,7 @@ static struct usb_serial_driver ark3116_device = { | |||
782 | .close = ark3116_close, | 740 | .close = ark3116_close, |
783 | .break_ctl = ark3116_break_ctl, | 741 | .break_ctl = ark3116_break_ctl, |
784 | .read_int_callback = ark3116_read_int_callback, | 742 | .read_int_callback = ark3116_read_int_callback, |
785 | .read_bulk_callback = ark3116_read_bulk_callback, | 743 | .process_read_urb = ark3116_process_read_urb, |
786 | }; | 744 | }; |
787 | 745 | ||
788 | static int __init ark3116_init(void) | 746 | static int __init ark3116_init(void) |