USB: cypress_m8: fix potential scheduling while atomic
Remove erroneous call to usb_clear_halt which is blocking and cannot be used in interrupt context. This code has possibly never been executed as it would cause an oops if it was. Simply treat a stalled-endpoint error as any other error condition. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
This commit is contained in:
parent
f61a7669f3
commit
d7c933ae7d
|
@ -1224,7 +1224,6 @@ static void cypress_write_int_callback(struct urb *urb)
|
|||
struct usb_serial_port *port = urb->context;
|
||||
struct cypress_private *priv = usb_get_serial_port_data(port);
|
||||
struct device *dev = &urb->dev->dev;
|
||||
int result;
|
||||
int status = urb->status;
|
||||
|
||||
switch (status) {
|
||||
|
@ -1239,21 +1238,9 @@ static void cypress_write_int_callback(struct urb *urb)
|
|||
__func__, status);
|
||||
priv->write_urb_in_use = 0;
|
||||
return;
|
||||
case -EPIPE: /* no break needed; clear halt and resubmit */
|
||||
if (!priv->comm_is_ok)
|
||||
break;
|
||||
usb_clear_halt(port->serial->dev, 0x02);
|
||||
/* error in the urb, so we have to resubmit it */
|
||||
dev_dbg(dev, "%s - nonzero write bulk status received: %d\n",
|
||||
__func__, status);
|
||||
port->interrupt_out_urb->transfer_buffer_length = 1;
|
||||
result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC);
|
||||
if (!result)
|
||||
return;
|
||||
dev_err(dev, "%s - failed resubmitting write urb, error %d\n",
|
||||
__func__, result);
|
||||
cypress_set_dead(port);
|
||||
break;
|
||||
case -EPIPE:
|
||||
/* Cannot call usb_clear_halt while in_interrupt */
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
dev_err(dev, "%s - unexpected nonzero write status received: %d\n",
|
||||
__func__, status);
|
||||
|
|
Loading…
Reference in a new issue