tty: usb_serial_mos7720: Fix get_lsr_info
authorKees Schoenmakers <k.schoenmakers@sigmae.nl>
Sat, 19 Sep 2009 20:13:18 +0000 (13:13 -0700)
committerLive-CD User <linux@linux.site>
Sat, 19 Sep 2009 20:13:18 +0000 (13:13 -0700)
I made a correction for get_lsr_info, now it returns some meaningful
information. I tested it with two simultaneous simplex modem channels.

it is attached

Signed-off-by: Kees Schoenmakers <k.schoenmakers@sigmae.nl>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/mos7720.c

index 759cdd5ae74dbf5c789c664667aa21068c85e166..4342a8a0eac9d150feda3df3f7ae588ed3e721b1 100644 (file)
@@ -378,10 +378,14 @@ static int mos7720_open(struct tty_struct *tty,
         /* Initialize MCS7720 -- Write Init values to corresponding Registers
          *
          * Register Index
+         * 0 : THR/RHR
          * 1 : IER
          * 2 : FCR
          * 3 : LCR
          * 4 : MCR
+         * 5 : LSR
+         * 6 : MSR
+         * 7 : SPR
          *
          * 0x08 : SP1/2 Control Reg
          */
@@ -1250,15 +1254,22 @@ static void mos7720_set_termios(struct tty_struct *tty,
 static int get_lsr_info(struct tty_struct *tty,
                struct moschip_port *mos7720_port, unsigned int __user *value)
 {
-       int count;
+       struct usb_serial_port *port = tty->driver_data;
        unsigned int result = 0;
+       unsigned char data = 0;
+       int port_number = port->number - port->serial->minor;
+       int count;
 
        count = mos7720_chars_in_buffer(tty);
        if (count == 0) {
-               dbg("%s -- Empty", __func__);
-               result = TIOCSER_TEMT;
+               send_mos_cmd(port->serial, MOS_READ, port_number,
+                                                       UART_LSR, &data);
+               if ((data & (UART_LSR_TEMT | UART_LSR_THRE))
+                                       == (UART_LSR_TEMT | UART_LSR_THRE)) {
+                       dbg("%s -- Empty", __func__);
+                       result = TIOCSER_TEMT;
+               }
        }
-
        if (copy_to_user(value, &result, sizeof(int)))
                return -EFAULT;
        return 0;