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 24e1d52..168a969 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -1547,9 +1547,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)
@@ -1558,11 +1561,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;
 }
 
 
-- 
2.9.0

Reply via email to