]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.8.16/usb-serial-kl5kusb105-fix-open-error-path.patch
Drop watchdog patch
[thirdparty/kernel/stable-queue.git] / releases / 4.8.16 / usb-serial-kl5kusb105-fix-open-error-path.patch
1 From 6774d5f53271d5f60464f824748995b71da401ab Mon Sep 17 00:00:00 2001
2 From: Johan Hovold <johan@kernel.org>
3 Date: Tue, 29 Nov 2016 16:55:01 +0100
4 Subject: USB: serial: kl5kusb105: fix open error path
5
6 From: Johan Hovold <johan@kernel.org>
7
8 commit 6774d5f53271d5f60464f824748995b71da401ab upstream.
9
10 Kill urbs and disable read before returning from open on failure to
11 retrieve the line state.
12
13 Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
14 Signed-off-by: Johan Hovold <johan@kernel.org>
15 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
16
17 ---
18 drivers/usb/serial/kl5kusb105.c | 33 ++++++++++++++++++++++++---------
19 1 file changed, 24 insertions(+), 9 deletions(-)
20
21 --- a/drivers/usb/serial/kl5kusb105.c
22 +++ b/drivers/usb/serial/kl5kusb105.c
23 @@ -296,7 +296,7 @@ static int klsi_105_open(struct tty_str
24 rc = usb_serial_generic_open(tty, port);
25 if (rc) {
26 retval = rc;
27 - goto exit;
28 + goto err_free_cfg;
29 }
30
31 rc = usb_control_msg(port->serial->dev,
32 @@ -315,17 +315,32 @@ static int klsi_105_open(struct tty_str
33 dev_dbg(&port->dev, "%s - enabled reading\n", __func__);
34
35 rc = klsi_105_get_line_state(port, &line_state);
36 - if (rc >= 0) {
37 - spin_lock_irqsave(&priv->lock, flags);
38 - priv->line_state = line_state;
39 - spin_unlock_irqrestore(&priv->lock, flags);
40 - dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__, line_state);
41 - retval = 0;
42 - } else
43 + if (rc < 0) {
44 retval = rc;
45 + goto err_disable_read;
46 + }
47 +
48 + spin_lock_irqsave(&priv->lock, flags);
49 + priv->line_state = line_state;
50 + spin_unlock_irqrestore(&priv->lock, flags);
51 + dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__,
52 + line_state);
53 +
54 + return 0;
55
56 -exit:
57 +err_disable_read:
58 + usb_control_msg(port->serial->dev,
59 + usb_sndctrlpipe(port->serial->dev, 0),
60 + KL5KUSB105A_SIO_CONFIGURE,
61 + USB_TYPE_VENDOR | USB_DIR_OUT,
62 + KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
63 + 0, /* index */
64 + NULL, 0,
65 + KLSI_TIMEOUT);
66 + usb_serial_generic_close(port);
67 +err_free_cfg:
68 kfree(cfg);
69 +
70 return retval;
71 }
72