Skip to content

Commit

Permalink
USB: fix serial gadget ACM breakage
Browse files Browse the repository at this point in the history
Two of the CDC ACM control requests in the serial gadget have never
been correct, and have been reported to cause serious troubles ... as
in, soft lockup and maybe watchdog reset (depending on hardware).

This patch makes those request fail cleanly, rather than misbehaving.
Someone using CDC ACM should fix them according to the FIXME comments
which now replace the previous bugs.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
David Brownell authored and Greg Kroah-Hartman committed Sep 11, 2007
1 parent 8683369 commit 49b4f90
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions drivers/usb/gadget/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -1691,14 +1691,12 @@ static int gs_setup_class(struct usb_gadget *gadget,

switch (ctrl->bRequest) {
case USB_CDC_REQ_SET_LINE_CODING:
ret = min(wLength,
(u16)sizeof(struct usb_cdc_line_coding));
if (port) {
spin_lock(&port->port_lock);
memcpy(&port->port_line_coding, req->buf, ret);
spin_unlock(&port->port_lock);
}
ret = 0;
/* FIXME Submit req to read the data; have its completion
* handler copy that data to port->port_line_coding (iff
* it's valid) and maybe pass it on. Until then, fail.
*/
printk(KERN_WARNING "gs_setup: set_line_coding "
"unuspported\n");
break;

case USB_CDC_REQ_GET_LINE_CODING:
Expand All @@ -1713,11 +1711,18 @@ static int gs_setup_class(struct usb_gadget *gadget,
break;

case USB_CDC_REQ_SET_CONTROL_LINE_STATE:
ret = 0;
/* FIXME Submit req to read the data; have its completion
* handler use that to set the state (iff it's valid) and
* maybe pass it on. Until then, fail.
*/
printk(KERN_WARNING "gs_setup: set_control_line_state "
"unuspported\n");
break;

default:
printk(KERN_ERR "gs_setup: unknown class request, type=%02x, request=%02x, value=%04x, index=%04x, length=%d\n",
printk(KERN_ERR "gs_setup: unknown class request, "
"type=%02x, request=%02x, value=%04x, "
"index=%04x, length=%d\n",
ctrl->bRequestType, ctrl->bRequest,
wValue, wIndex, wLength);
break;
Expand Down

0 comments on commit 49b4f90

Please sign in to comment.