Skip to content

Commit

Permalink
USB: serial: continue to write on errors
Browse files Browse the repository at this point in the history
Do not discard buffered data and make sure to try to resubmit the write
urbs on errors.

Currently a recoverable error would lead to more data than necessary
being dropped.

Also upgrade error messages from debug to error log level.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
  • Loading branch information
Johan Hovold authored and Greg Kroah-Hartman committed Mar 12, 2014
1 parent fc11efe commit bd58c7b
Showing 1 changed file with 19 additions and 10 deletions.
29 changes: 19 additions & 10 deletions drivers/usb/serial/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,6 @@ void usb_serial_generic_write_bulk_callback(struct urb *urb)
{
unsigned long flags;
struct usb_serial_port *port = urb->context;
int status = urb->status;
int i;

for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
Expand All @@ -409,17 +408,27 @@ void usb_serial_generic_write_bulk_callback(struct urb *urb)
set_bit(i, &port->write_urbs_free);
spin_unlock_irqrestore(&port->lock, flags);

if (status) {
dev_dbg(&port->dev, "%s - non-zero urb status: %d\n",
__func__, status);

spin_lock_irqsave(&port->lock, flags);
kfifo_reset_out(&port->write_fifo);
spin_unlock_irqrestore(&port->lock, flags);
} else {
usb_serial_generic_write_start(port, GFP_ATOMIC);
switch (urb->status) {
case 0:
break;
case -ENOENT:
case -ECONNRESET:
case -ESHUTDOWN:
dev_dbg(&port->dev, "%s - urb stopped: %d\n",
__func__, urb->status);
return;
case -EPIPE:
dev_err_console(port, "%s - urb stopped: %d\n",
__func__, urb->status);
return;
default:
dev_err_console(port, "%s - nonzero urb status: %d\n",
__func__, urb->status);
goto resubmit;
}

resubmit:
usb_serial_generic_write_start(port, GFP_ATOMIC);
usb_serial_port_softint(port);
}
EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
Expand Down

0 comments on commit bd58c7b

Please sign in to comment.