diff -uprN -X linux-2.6.32.3/Documentation/dontdiff linux-2.6.32.3-vanilla/drivers/usb/serial/option.c linux-2.6.32.3/drivers/usb/serial/option.c --- linux-2.6.32.3-vanilla/drivers/usb/serial/option.c 2010-01-06 17:07:45.000000000 -0600 +++ linux-2.6.32.3/drivers/usb/serial/option.c 2010-09-02 13:24:59.000000000 -0500 @@ -913,33 +913,46 @@ static void option_indat_callback(struct dbg("%s: %p", __func__, urb); endpoint = usb_pipeendpoint(urb->pipe); - port = urb->context; + port = urb->context; - if (status) { + 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 { + __func__, status, endpoint); + goto exit; + } + + usb_serial_debug_data(debug, &port->dev, __func__, + urb->actual_length, data); + + if (urb->actual_length) { tty = tty_port_tty_get(&port->port); - if (urb->actual_length) { - tty_buffer_request_room(tty, 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_kref_put(tty); - /* Resubmit urb so we continue receiving */ - if (port->port.count && status != -ESHUTDOWN) { - err = usb_submit_urb(urb, GFP_ATOMIC); - if (err) - printk(KERN_ERR "%s: resubmit read urb failed. " - "(%d)", __func__, err); - else - usb_mark_last_busy(port->serial->dev); - } + tty_buffer_request_room(tty, urb->actual_length); + tty_insert_flip_string(tty, data, urb->actual_length); + tty_flip_buffer_push(tty); + tty_kref_put(tty); } - return; + +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); } static void option_outdat_callback(struct urb *urb)