Commit 2a8cdfde9237c4e1bd7c2e68c415b006491d23cc

Authored by Johan Hovold
Committed by Greg Kroah-Hartman
1 parent e5452dd4cb

USB: cdc-acm: add quirk for control-line state requests

Add new quirk for devices that cannot handle control-line state
requests.

Note that we currently send these requests to all devices, regardless of
whether they claim to support it, but that errors are only logged if
support is claimed.

Since commit 0943d8ead30e ("USB: cdc-acm: use tty-port dtr_rts"), which
only changed the timings for these requests slightly, this has been
reported to cause occasional firmware crashes on Simtec Electronics
Entropy Key devices after re-enumeration. Enable the quirk for this
device.

Reported-by: Nix <nix@esperi.org.uk>
Tested-by: Nix <nix@esperi.org.uk>
Cc: stable <stable@vger.kernel.org>	# v3.16
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 2 changed files with 14 additions and 2 deletions Side-by-side Diff

drivers/usb/class/cdc-acm.c
... ... @@ -148,8 +148,15 @@
148 148 /* devices aren't required to support these requests.
149 149 * the cdc acm descriptor tells whether they do...
150 150 */
151   -#define acm_set_control(acm, control) \
152   - acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0)
  151 +static inline int acm_set_control(struct acm *acm, int control)
  152 +{
  153 + if (acm->quirks & QUIRK_CONTROL_LINE_STATE)
  154 + return -EOPNOTSUPP;
  155 +
  156 + return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE,
  157 + control, NULL, 0);
  158 +}
  159 +
153 160 #define acm_set_line(acm, line) \
154 161 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
155 162 #define acm_send_break(acm, ms) \
... ... @@ -1320,6 +1327,7 @@
1320 1327 tty_port_init(&acm->port);
1321 1328 acm->port.ops = &acm_port_ops;
1322 1329 init_usb_anchor(&acm->delayed);
  1330 + acm->quirks = quirks;
1323 1331  
1324 1332 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
1325 1333 if (!buf) {
... ... @@ -1687,6 +1695,8 @@
1687 1695 { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
1688 1696 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1689 1697 },
  1698 + { USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */
  1699 + .driver_info = QUIRK_CONTROL_LINE_STATE, },
1690 1700 { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
1691 1701 { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
1692 1702 },
drivers/usb/class/cdc-acm.h
... ... @@ -121,6 +121,7 @@
121 121 unsigned int throttle_req:1; /* throttle requested */
122 122 u8 bInterval;
123 123 struct usb_anchor delayed; /* writes queued for a device about to be woken */
  124 + unsigned long quirks;
124 125 };
125 126  
126 127 #define CDC_DATA_INTERFACE_TYPE 0x0a
... ... @@ -132,4 +133,5 @@
132 133 #define NOT_A_MODEM BIT(3)
133 134 #define NO_DATA_INTERFACE BIT(4)
134 135 #define IGNORE_DEVICE BIT(5)
  136 +#define QUIRK_CONTROL_LINE_STATE BIT(6)