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