Skip to content

Commit

Permalink
USB: option.c: option_indat_callback: Resubmit some unsuccessful URBs
Browse files Browse the repository at this point in the history
All unsuccessful (non-zero status) URBs were being dropped. After N_IN_URBs are
dropped you will no longer be able to receive data.

This patch resubmits unsuccessful URBs unless the status indicates that it should
be terminated. The statuses that indicate the URB should be terminated was
gathered from other similar drivers.

Signed-off-by: James Maki <jamescmaki@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
James Maki authored and Greg Kroah-Hartman committed May 20, 2010
1 parent 71adf11 commit e618834
Showing 1 changed file with 30 additions and 19 deletions.
49 changes: 30 additions & 19 deletions drivers/usb/serial/option.c
Original file line number Diff line number Diff line change
Expand Up @@ -1019,31 +1019,42 @@ static void option_indat_callback(struct urb *urb)
dbg("%s: %p", __func__, urb);

endpoint = usb_pipeendpoint(urb->pipe);
port = urb->context;

if (status) {
port = urb->context;

switch (status) {
case 0:
/* success */
break;
case -ECONNRESET:
case -ENOENT:
case -ESHUTDOWN:
/* this urb is terminated, clean up */
dbg("%s: urb shutting down with status: %d on endpoint %02x.",
__func__, status, endpoint);
return;
default:
dbg("%s: nonzero status: %d on endpoint %02x.",
__func__, status, endpoint);
} else {
goto exit;
}

if (urb->actual_length) {
tty = tty_port_tty_get(&port->port);
if (urb->actual_length) {
tty_insert_flip_string(tty, data, urb->actual_length);
tty_flip_buffer_push(tty);
} else
dbg("%s: empty read urb received", __func__);
tty_insert_flip_string(tty, data, urb->actual_length);
tty_flip_buffer_push(tty);
tty_kref_put(tty);
} else
dbg("%s: empty read urb received", __func__);

/* Resubmit urb so we continue receiving */
if (status != -ESHUTDOWN) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err && err != -EPERM)
printk(KERN_ERR "%s: resubmit read urb failed. "
"(%d)", __func__, err);
else
usb_mark_last_busy(port->serial->dev);
}
exit:
/* Resubmit urb so we continue receiving */
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err && err != -EPERM)
printk(KERN_ERR "%s: resubmit read urb failed. "
"(%d)", __func__, err);
else
usb_mark_last_busy(port->serial->dev);

}
return;
}

Expand Down

0 comments on commit e618834

Please sign in to comment.