From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf0-f67.google.com ([209.85.215.67]:34842 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751026AbdAQPQs (ORCPT ); Tue, 17 Jan 2017 10:16:48 -0500 Received: by mail-lf0-f67.google.com with SMTP id v186so16708003lfa.2 for ; Tue, 17 Jan 2017 07:15:57 -0800 (PST) From: Johan Hovold To: Greg Kroah-Hartman Cc: Johan Hovold , stable Subject: [PATCH stable-4.4] USB: serial: ch341: fix resume after reset Date: Tue, 17 Jan 2017 16:15:42 +0100 Message-Id: <20170117151542.18291-1-johan@kernel.org> Sender: stable-owner@vger.kernel.org List-ID: commit ce5e292828117d1b71cbd3edf9e9137cf31acd30 upstream. Fix reset-resume handling which failed to resubmit the read and interrupt URBs, thereby leaving a port that was open before suspend in a broken state until closed and reopened. Fixes: 1ded7ea47b88 ("USB: ch341 serial: fix port number changed after resume") Fixes: 2bfd1c96a9fb ("USB: serial: ch341: remove reset_resume callback") Cc: stable Signed-off-by: Johan Hovold --- This is a backport of ce5e29282811 ("USB: serial: ch341: fix resume after reset") to 4.4 stable. Note that current version of this patch in the stable queue will fail to compile as it depends on patch that went into 4.7. This patch should replace the one currently in the 4.4 stable queue. Johan drivers/usb/serial/ch341.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c index 56e1d2ab5fa5..f20b856d4ab6 100644 --- a/drivers/usb/serial/ch341.c +++ b/drivers/usb/serial/ch341.c @@ -544,14 +544,23 @@ static int ch341_tiocmget(struct tty_struct *tty) static int ch341_reset_resume(struct usb_serial *serial) { - struct ch341_private *priv; - - priv = usb_get_serial_port_data(serial->port[0]); + struct usb_serial_port *port = serial->port[0]; + struct ch341_private *priv = usb_get_serial_port_data(port); + int ret; /* reconfigure ch341 serial port after bus-reset */ ch341_configure(serial->dev, priv); - return 0; + if (test_bit(ASYNCB_INITIALIZED, &port->port.flags)) { + ret = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO); + if (ret) { + dev_err(&port->dev, "failed to submit interrupt urb: %d\n", + ret); + return ret; + } + } + + return usb_serial_generic_resume(serial); } static struct usb_serial_driver ch341_device = { -- 2.10.2