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