diff options
Diffstat (limited to 'drivers/usb/serial/keyspan.c')
-rw-r--r-- | drivers/usb/serial/keyspan.c | 60 |
1 files changed, 25 insertions, 35 deletions
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 97bc49f68efd..f6d7f68fa43c 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -291,7 +291,6 @@ static void usa26_indat_callback(struct urb *urb) | |||
291 | int i, err; | 291 | int i, err; |
292 | int endpoint; | 292 | int endpoint; |
293 | struct usb_serial_port *port; | 293 | struct usb_serial_port *port; |
294 | struct tty_struct *tty; | ||
295 | unsigned char *data = urb->transfer_buffer; | 294 | unsigned char *data = urb->transfer_buffer; |
296 | int status = urb->status; | 295 | int status = urb->status; |
297 | 296 | ||
@@ -304,8 +303,7 @@ static void usa26_indat_callback(struct urb *urb) | |||
304 | } | 303 | } |
305 | 304 | ||
306 | port = urb->context; | 305 | port = urb->context; |
307 | tty = tty_port_tty_get(&port->port); | 306 | if (urb->actual_length) { |
308 | if (tty && urb->actual_length) { | ||
309 | /* 0x80 bit is error flag */ | 307 | /* 0x80 bit is error flag */ |
310 | if ((data[0] & 0x80) == 0) { | 308 | if ((data[0] & 0x80) == 0) { |
311 | /* no errors on individual bytes, only | 309 | /* no errors on individual bytes, only |
@@ -315,7 +313,7 @@ static void usa26_indat_callback(struct urb *urb) | |||
315 | else | 313 | else |
316 | err = 0; | 314 | err = 0; |
317 | for (i = 1; i < urb->actual_length ; ++i) | 315 | for (i = 1; i < urb->actual_length ; ++i) |
318 | tty_insert_flip_char(tty, data[i], err); | 316 | tty_insert_flip_char(&port->port, data[i], err); |
319 | } else { | 317 | } else { |
320 | /* some bytes had errors, every byte has status */ | 318 | /* some bytes had errors, every byte has status */ |
321 | dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__); | 319 | dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__); |
@@ -328,12 +326,12 @@ static void usa26_indat_callback(struct urb *urb) | |||
328 | if (stat & RXERROR_PARITY) | 326 | if (stat & RXERROR_PARITY) |
329 | flag |= TTY_PARITY; | 327 | flag |= TTY_PARITY; |
330 | /* XXX should handle break (0x10) */ | 328 | /* XXX should handle break (0x10) */ |
331 | tty_insert_flip_char(tty, data[i+1], flag); | 329 | tty_insert_flip_char(&port->port, data[i+1], |
330 | flag); | ||
332 | } | 331 | } |
333 | } | 332 | } |
334 | tty_flip_buffer_push(tty); | 333 | tty_flip_buffer_push(&port->port); |
335 | } | 334 | } |
336 | tty_kref_put(tty); | ||
337 | 335 | ||
338 | /* Resubmit urb so we continue receiving */ | 336 | /* Resubmit urb so we continue receiving */ |
339 | err = usb_submit_urb(urb, GFP_ATOMIC); | 337 | err = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -446,7 +444,6 @@ static void usa28_indat_callback(struct urb *urb) | |||
446 | { | 444 | { |
447 | int err; | 445 | int err; |
448 | struct usb_serial_port *port; | 446 | struct usb_serial_port *port; |
449 | struct tty_struct *tty; | ||
450 | unsigned char *data; | 447 | unsigned char *data; |
451 | struct keyspan_port_private *p_priv; | 448 | struct keyspan_port_private *p_priv; |
452 | int status = urb->status; | 449 | int status = urb->status; |
@@ -469,12 +466,11 @@ static void usa28_indat_callback(struct urb *urb) | |||
469 | p_priv = usb_get_serial_port_data(port); | 466 | p_priv = usb_get_serial_port_data(port); |
470 | data = urb->transfer_buffer; | 467 | data = urb->transfer_buffer; |
471 | 468 | ||
472 | tty = tty_port_tty_get(&port->port); | 469 | if (urb->actual_length) { |
473 | if (tty && urb->actual_length) { | 470 | tty_insert_flip_string(&port->port, data, |
474 | tty_insert_flip_string(tty, data, urb->actual_length); | 471 | urb->actual_length); |
475 | tty_flip_buffer_push(tty); | 472 | tty_flip_buffer_push(&port->port); |
476 | } | 473 | } |
477 | tty_kref_put(tty); | ||
478 | 474 | ||
479 | /* Resubmit urb so we continue receiving */ | 475 | /* Resubmit urb so we continue receiving */ |
480 | err = usb_submit_urb(urb, GFP_ATOMIC); | 476 | err = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -669,7 +665,6 @@ static void usa49_indat_callback(struct urb *urb) | |||
669 | int i, err; | 665 | int i, err; |
670 | int endpoint; | 666 | int endpoint; |
671 | struct usb_serial_port *port; | 667 | struct usb_serial_port *port; |
672 | struct tty_struct *tty; | ||
673 | unsigned char *data = urb->transfer_buffer; | 668 | unsigned char *data = urb->transfer_buffer; |
674 | int status = urb->status; | 669 | int status = urb->status; |
675 | 670 | ||
@@ -682,12 +677,11 @@ static void usa49_indat_callback(struct urb *urb) | |||
682 | } | 677 | } |
683 | 678 | ||
684 | port = urb->context; | 679 | port = urb->context; |
685 | tty = tty_port_tty_get(&port->port); | 680 | if (urb->actual_length) { |
686 | if (tty && urb->actual_length) { | ||
687 | /* 0x80 bit is error flag */ | 681 | /* 0x80 bit is error flag */ |
688 | if ((data[0] & 0x80) == 0) { | 682 | if ((data[0] & 0x80) == 0) { |
689 | /* no error on any byte */ | 683 | /* no error on any byte */ |
690 | tty_insert_flip_string(tty, data + 1, | 684 | tty_insert_flip_string(&port->port, data + 1, |
691 | urb->actual_length - 1); | 685 | urb->actual_length - 1); |
692 | } else { | 686 | } else { |
693 | /* some bytes had errors, every byte has status */ | 687 | /* some bytes had errors, every byte has status */ |
@@ -700,12 +694,12 @@ static void usa49_indat_callback(struct urb *urb) | |||
700 | if (stat & RXERROR_PARITY) | 694 | if (stat & RXERROR_PARITY) |
701 | flag |= TTY_PARITY; | 695 | flag |= TTY_PARITY; |
702 | /* XXX should handle break (0x10) */ | 696 | /* XXX should handle break (0x10) */ |
703 | tty_insert_flip_char(tty, data[i+1], flag); | 697 | tty_insert_flip_char(&port->port, data[i+1], |
698 | flag); | ||
704 | } | 699 | } |
705 | } | 700 | } |
706 | tty_flip_buffer_push(tty); | 701 | tty_flip_buffer_push(&port->port); |
707 | } | 702 | } |
708 | tty_kref_put(tty); | ||
709 | 703 | ||
710 | /* Resubmit urb so we continue receiving */ | 704 | /* Resubmit urb so we continue receiving */ |
711 | err = usb_submit_urb(urb, GFP_ATOMIC); | 705 | err = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -718,7 +712,6 @@ static void usa49wg_indat_callback(struct urb *urb) | |||
718 | int i, len, x, err; | 712 | int i, len, x, err; |
719 | struct usb_serial *serial; | 713 | struct usb_serial *serial; |
720 | struct usb_serial_port *port; | 714 | struct usb_serial_port *port; |
721 | struct tty_struct *tty; | ||
722 | unsigned char *data = urb->transfer_buffer; | 715 | unsigned char *data = urb->transfer_buffer; |
723 | int status = urb->status; | 716 | int status = urb->status; |
724 | 717 | ||
@@ -743,7 +736,6 @@ static void usa49wg_indat_callback(struct urb *urb) | |||
743 | return; | 736 | return; |
744 | } | 737 | } |
745 | port = serial->port[data[i++]]; | 738 | port = serial->port[data[i++]]; |
746 | tty = tty_port_tty_get(&port->port); | ||
747 | len = data[i++]; | 739 | len = data[i++]; |
748 | 740 | ||
749 | /* 0x80 bit is error flag */ | 741 | /* 0x80 bit is error flag */ |
@@ -751,7 +743,8 @@ static void usa49wg_indat_callback(struct urb *urb) | |||
751 | /* no error on any byte */ | 743 | /* no error on any byte */ |
752 | i++; | 744 | i++; |
753 | for (x = 1; x < len ; ++x) | 745 | for (x = 1; x < len ; ++x) |
754 | tty_insert_flip_char(tty, data[i++], 0); | 746 | tty_insert_flip_char(&port->port, |
747 | data[i++], 0); | ||
755 | } else { | 748 | } else { |
756 | /* | 749 | /* |
757 | * some bytes had errors, every byte has status | 750 | * some bytes had errors, every byte has status |
@@ -765,13 +758,12 @@ static void usa49wg_indat_callback(struct urb *urb) | |||
765 | if (stat & RXERROR_PARITY) | 758 | if (stat & RXERROR_PARITY) |
766 | flag |= TTY_PARITY; | 759 | flag |= TTY_PARITY; |
767 | /* XXX should handle break (0x10) */ | 760 | /* XXX should handle break (0x10) */ |
768 | tty_insert_flip_char(tty, | 761 | tty_insert_flip_char(&port->port, |
769 | data[i+1], flag); | 762 | data[i+1], flag); |
770 | i += 2; | 763 | i += 2; |
771 | } | 764 | } |
772 | } | 765 | } |
773 | tty_flip_buffer_push(tty); | 766 | tty_flip_buffer_push(&port->port); |
774 | tty_kref_put(tty); | ||
775 | } | 767 | } |
776 | } | 768 | } |
777 | 769 | ||
@@ -792,7 +784,6 @@ static void usa90_indat_callback(struct urb *urb) | |||
792 | int endpoint; | 784 | int endpoint; |
793 | struct usb_serial_port *port; | 785 | struct usb_serial_port *port; |
794 | struct keyspan_port_private *p_priv; | 786 | struct keyspan_port_private *p_priv; |
795 | struct tty_struct *tty; | ||
796 | unsigned char *data = urb->transfer_buffer; | 787 | unsigned char *data = urb->transfer_buffer; |
797 | int status = urb->status; | 788 | int status = urb->status; |
798 | 789 | ||
@@ -808,12 +799,12 @@ static void usa90_indat_callback(struct urb *urb) | |||
808 | p_priv = usb_get_serial_port_data(port); | 799 | p_priv = usb_get_serial_port_data(port); |
809 | 800 | ||
810 | if (urb->actual_length) { | 801 | if (urb->actual_length) { |
811 | tty = tty_port_tty_get(&port->port); | ||
812 | /* if current mode is DMA, looks like usa28 format | 802 | /* if current mode is DMA, looks like usa28 format |
813 | otherwise looks like usa26 data format */ | 803 | otherwise looks like usa26 data format */ |
814 | 804 | ||
815 | if (p_priv->baud > 57600) | 805 | if (p_priv->baud > 57600) |
816 | tty_insert_flip_string(tty, data, urb->actual_length); | 806 | tty_insert_flip_string(&port->port, data, |
807 | urb->actual_length); | ||
817 | else { | 808 | else { |
818 | /* 0x80 bit is error flag */ | 809 | /* 0x80 bit is error flag */ |
819 | if ((data[0] & 0x80) == 0) { | 810 | if ((data[0] & 0x80) == 0) { |
@@ -824,8 +815,8 @@ static void usa90_indat_callback(struct urb *urb) | |||
824 | else | 815 | else |
825 | err = 0; | 816 | err = 0; |
826 | for (i = 1; i < urb->actual_length ; ++i) | 817 | for (i = 1; i < urb->actual_length ; ++i) |
827 | tty_insert_flip_char(tty, data[i], | 818 | tty_insert_flip_char(&port->port, |
828 | err); | 819 | data[i], err); |
829 | } else { | 820 | } else { |
830 | /* some bytes had errors, every byte has status */ | 821 | /* some bytes had errors, every byte has status */ |
831 | dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__); | 822 | dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__); |
@@ -838,13 +829,12 @@ static void usa90_indat_callback(struct urb *urb) | |||
838 | if (stat & RXERROR_PARITY) | 829 | if (stat & RXERROR_PARITY) |
839 | flag |= TTY_PARITY; | 830 | flag |= TTY_PARITY; |
840 | /* XXX should handle break (0x10) */ | 831 | /* XXX should handle break (0x10) */ |
841 | tty_insert_flip_char(tty, data[i+1], | 832 | tty_insert_flip_char(&port->port, |
842 | flag); | 833 | data[i+1], flag); |
843 | } | 834 | } |
844 | } | 835 | } |
845 | } | 836 | } |
846 | tty_flip_buffer_push(tty); | 837 | tty_flip_buffer_push(&port->port); |
847 | tty_kref_put(tty); | ||
848 | } | 838 | } |
849 | 839 | ||
850 | /* Resubmit urb so we continue receiving */ | 840 | /* Resubmit urb so we continue receiving */ |