History

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.

Johan Hovold committed 12 years ago

Commit 2a8cdfd1 parent e5452dd2 files · +14 −2Browse files

Unified · Split

2 files
  1. drivers/usb/class/cdc-acm.c +12 −2
  2. drivers/usb/class/cdc-acm.h +2 −0
drivers/usb/class/cdc-acm.c+12−2
@@ -148,8 +148,15 @@ static int acm_ctrl_msg(struct acm *acm, int request, int value, · 147 unmodified lines
148148 /* devices aren't required to support these requests.
149149 * the cdc acm descriptor tells whether they do...
150150 */
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+
153160 #define acm_set_line(acm, line) \
154161 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
155162 #define acm_send_break(acm, ms) \
@@ -1320,6 +1327,7 @@ made_compressed_probe: · 1164 unmodified lines
13201327 tty_port_init(&acm->port);
13211328 acm->port.ops = &acm_port_ops;
13221329 init_usb_anchor(&acm->delayed);
1330+ acm->quirks = quirks;
13231331
13241332 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
13251333 if (!buf) {
@@ -1687,6 +1695,8 @@ static const struct usb_device_id acm_ids[] = { · 361 unmodified lines
16871695 { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
16881696 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
16891697 },
1698+ { USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */
1699+ .driver_info = QUIRK_CONTROL_LINE_STATE, },
16901700 { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
16911701 { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
16921702 },
drivers/usb/class/cdc-acm.h+2−0
@@ -121,6 +121,7 @@ struct acm { · 120 unmodified lines
121121 unsigned int throttle_req:1; /* throttle requested */
122122 u8 bInterval;
123123 struct usb_anchor delayed; /* writes queued for a device about to be woken */
124+ unsigned long quirks;
124125 };
125126
126127 #define CDC_DATA_INTERFACE_TYPE 0x0a
@@ -132,3 +133,4 @@ struct acm { · 5 unmodified lines
132133 #define NOT_A_MODEM BIT(3)
133134 #define NO_DATA_INTERFACE BIT(4)
134135 #define IGNORE_DEVICE BIT(5)
136+#define QUIRK_CONTROL_LINE_STATE BIT(6)