aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/keyspan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/keyspan.c')
-rw-r--r--drivers/usb/serial/keyspan.c60
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 */