Save msr before testing the delta and waking up any waiters.
Also use port directly instead of tport->tp_port.

Signed-off-by: Mathieu OTHACEHE <m.othac...@gmail.com>
---
 drivers/usb/serial/ti_usb_3410_5052.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/serial/ti_usb_3410_5052.c 
b/drivers/usb/serial/ti_usb_3410_5052.c
index 72cb675..1d8d8ef 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -1240,9 +1240,12 @@ static void ti_handle_new_msr(struct usb_serial_port 
*port, u8 msr)
 
        dev_dbg(&port->dev, "%s - msr 0x%02X\n", __func__, msr);
 
+       spin_lock_irqsave(&tport->tp_lock, flags);
+       tport->tp_msr = msr & TI_MSR_MASK;
+       spin_unlock_irqrestore(&tport->tp_lock, flags);
+
        if (msr & TI_MSR_DELTA_MASK) {
-               spin_lock_irqsave(&tport->tp_lock, flags);
-               icount = &tport->tp_port->icount;
+               icount = &port->icount;
                if (msr & TI_MSR_DELTA_CTS)
                        icount->cts++;
                if (msr & TI_MSR_DELTA_DSR)
@@ -1251,11 +1254,9 @@ static void ti_handle_new_msr(struct usb_serial_port 
*port, u8 msr)
                        icount->dcd++;
                if (msr & TI_MSR_DELTA_RI)
                        icount->rng++;
+
                wake_up_interruptible(&port->port.delta_msr_wait);
-               spin_unlock_irqrestore(&tport->tp_lock, flags);
        }
-
-       tport->tp_msr = msr & TI_MSR_MASK;
 }
 
 static int ti_do_download(struct usb_serial *serial,
-- 
2.8.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to