Commit 38e2bfc9 authored by Pete Zaitcev's avatar Pete Zaitcev Committed by Greg Kroah-Hartman

USB: Dealias -110 code (more complete)

The purpose of this patch is to split off the case when a device does
not reply on the lower level (which is reported by HC hardware), and
a case when the device accepted the request, but does not reply at
upper level. This redefinition allows to diagnose issues easier,
without asking the user if the -110 happened "immediately".

The usbmon splits such cases already thanks to its timestamp, but
it's not always available.

I adjusted all drivers which I found affected (by searching for "urb").
Out of tree drivers may suffer a little bit, but I do not expect much
breakage. At worst they may print a few messages.
Signed-off-by: default avatarPete Zaitcev <zaitcev@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent ec17cf1c
...@@ -98,13 +98,13 @@ one or more packets could finish before an error stops further endpoint I/O. ...@@ -98,13 +98,13 @@ one or more packets could finish before an error stops further endpoint I/O.
error, a failure to respond (often caused by error, a failure to respond (often caused by
device disconnect), or some other fault. device disconnect), or some other fault.
-ETIMEDOUT (**) No response packet received within the prescribed -ETIME (**) No response packet received within the prescribed
bus turn-around time. This error may instead be bus turn-around time. This error may instead be
reported as -EPROTO or -EILSEQ. reported as -EPROTO or -EILSEQ.
Note that the synchronous USB message functions -ETIMEDOUT Synchronous USB message functions use this code
also use this code to indicate timeout expired to indicate timeout expired before the transfer
before the transfer completed. completed, and no other error was reported by HC.
-EPIPE (**) Endpoint stalled. For non-control endpoints, -EPIPE (**) Endpoint stalled. For non-control endpoints,
reset this status with usb_clear_halt(). reset this status with usb_clear_halt().
...@@ -163,6 +163,3 @@ usb_get_*/usb_set_*(): ...@@ -163,6 +163,3 @@ usb_get_*/usb_set_*():
usb_control_msg(): usb_control_msg():
usb_bulk_msg(): usb_bulk_msg():
-ETIMEDOUT Timeout expired before the transfer completed. -ETIMEDOUT Timeout expired before the transfer completed.
In the future this code may change to -ETIME,
whose definition is a closer match to this sort
of error.
...@@ -192,7 +192,7 @@ static char *get_usb_statmsg(int status) ...@@ -192,7 +192,7 @@ static char *get_usb_statmsg(int status)
return "bit stuffing error, timeout, or unknown USB error"; return "bit stuffing error, timeout, or unknown USB error";
case -EILSEQ: case -EILSEQ:
return "CRC mismatch, timeout, or unknown USB error"; return "CRC mismatch, timeout, or unknown USB error";
case -ETIMEDOUT: case -ETIME:
return "timed out"; return "timed out";
case -EPIPE: case -EPIPE:
return "endpoint stalled"; return "endpoint stalled";
......
...@@ -137,11 +137,11 @@ static struct hfcusb_symbolic_list urb_errlist[] = { ...@@ -137,11 +137,11 @@ static struct hfcusb_symbolic_list urb_errlist[] = {
{-ENXIO, "URB already queued"}, {-ENXIO, "URB already queued"},
{-EFBIG, "Too much ISO frames requested"}, {-EFBIG, "Too much ISO frames requested"},
{-ENOSR, "Buffer error (overrun)"}, {-ENOSR, "Buffer error (overrun)"},
{-EPIPE, "Specified endpoint is stalled (device not responding)"}, {-EPIPE, "Specified endpoint is stalled"},
{-EOVERFLOW, "Babble (bad cable?)"}, {-EOVERFLOW, "Babble (bad cable?)"},
{-EPROTO, "Bit-stuff error (bad cable?)"}, {-EPROTO, "Bit-stuff error (bad cable?)"},
{-EILSEQ, "CRC/Timeout"}, {-EILSEQ, "CRC or missing token"},
{-ETIMEDOUT, "NAK (device does not respond)"}, {-ETIME, "Device did not respond"},
{-ESHUTDOWN, "Device unplugged"}, {-ESHUTDOWN, "Device unplugged"},
{-1, NULL} {-1, NULL}
}; };
......
...@@ -80,7 +80,6 @@ static void dvb_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs) ...@@ -80,7 +80,6 @@ static void dvb_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs)
switch (urb->status) { switch (urb->status) {
case 0: /* success */ case 0: /* success */
case -ETIMEDOUT: /* NAK */
break; break;
case -ECONNRESET: /* kill */ case -ECONNRESET: /* kill */
case -ENOENT: case -ENOENT:
......
...@@ -215,7 +215,7 @@ static void ttusb_dec_handle_irq( struct urb *urb, struct pt_regs *regs) ...@@ -215,7 +215,7 @@ static void ttusb_dec_handle_irq( struct urb *urb, struct pt_regs *regs)
case -ECONNRESET: case -ECONNRESET:
case -ENOENT: case -ENOENT:
case -ESHUTDOWN: case -ESHUTDOWN:
case -ETIMEDOUT: case -ETIME:
/* this urb is dead, cleanup */ /* this urb is dead, cleanup */
dprintk("%s:urb shutting down with status: %d\n", dprintk("%s:urb shutting down with status: %d\n",
__FUNCTION__, urb->status); __FUNCTION__, urb->status);
......
...@@ -301,10 +301,11 @@ static struct symbolic_list senlist[] = { ...@@ -301,10 +301,11 @@ static struct symbolic_list senlist[] = {
static struct symbolic_list urb_errlist[] = { static struct symbolic_list urb_errlist[] = {
{ -ENOSR, "Buffer error (overrun)" }, { -ENOSR, "Buffer error (overrun)" },
{ -EPIPE, "Stalled (device not responding)" }, { -EPIPE, "Stalled (device not responding)" },
{ -EOVERFLOW, "Babble (bad cable?)" }, { -EOVERFLOW, "Babble (device sends too much data)" },
{ -EPROTO, "Bit-stuff error (bad cable?)" }, { -EPROTO, "Bit-stuff error (bad cable?)" },
{ -EILSEQ, "CRC/Timeout" }, { -EILSEQ, "CRC/Timeout (bad cable?)" },
{ -ETIMEDOUT, "NAK (device does not respond)" }, { -ETIME, "Device does not respond to token" },
{ -ETIMEDOUT, "Device does not respond to command" },
{ -1, NULL } { -1, NULL }
}; };
......
...@@ -711,7 +711,7 @@ static void pwc_isoc_handler(struct urb *urb, struct pt_regs *regs) ...@@ -711,7 +711,7 @@ static void pwc_isoc_handler(struct urb *urb, struct pt_regs *regs)
case -EOVERFLOW: errmsg = "Babble (bad cable?)"; break; case -EOVERFLOW: errmsg = "Babble (bad cable?)"; break;
case -EPROTO: errmsg = "Bit-stuff error (bad cable?)"; break; case -EPROTO: errmsg = "Bit-stuff error (bad cable?)"; break;
case -EILSEQ: errmsg = "CRC/Timeout (could be anything)"; break; case -EILSEQ: errmsg = "CRC/Timeout (could be anything)"; break;
case -ETIMEDOUT: errmsg = "NAK (device does not respond)"; break; case -ETIME: errmsg = "Device does not respond"; break;
} }
PWC_DEBUG_FLOW("pwc_isoc_handler() called with status %d [%s].\n", urb->status, errmsg); PWC_DEBUG_FLOW("pwc_isoc_handler() called with status %d [%s].\n", urb->status, errmsg);
/* Give up after a number of contiguous errors on the USB bus. /* Give up after a number of contiguous errors on the USB bus.
......
...@@ -586,15 +586,14 @@ static struct w9968cf_symbolic_list urb_errlist[] = { ...@@ -586,15 +586,14 @@ static struct w9968cf_symbolic_list urb_errlist[] = {
{ -EFBIG, "Too much ISO frames requested" }, { -EFBIG, "Too much ISO frames requested" },
{ -ENOSR, "Buffer error (overrun)" }, { -ENOSR, "Buffer error (overrun)" },
{ -EPIPE, "Specified endpoint is stalled (device not responding)"}, { -EPIPE, "Specified endpoint is stalled (device not responding)"},
{ -EOVERFLOW, "Babble (bad cable?)" }, { -EOVERFLOW, "Babble (too much data)" },
{ -EPROTO, "Bit-stuff error (bad cable?)" }, { -EPROTO, "Bit-stuff error (bad cable?)" },
{ -EILSEQ, "CRC/Timeout" }, { -EILSEQ, "CRC/Timeout" },
{ -ETIMEDOUT, "NAK (device does not respond)" }, { -ETIME, "Device does not respond to token" },
{ -ETIMEDOUT, "Device does not respond to command" },
{ -1, NULL } { -1, NULL }
}; };
/**************************************************************************** /****************************************************************************
* Memory management functions * * Memory management functions *
****************************************************************************/ ****************************************************************************/
......
...@@ -671,10 +671,8 @@ static void irda_usb_net_timeout(struct net_device *netdev) ...@@ -671,10 +671,8 @@ static void irda_usb_net_timeout(struct net_device *netdev)
* Jean II */ * Jean II */
done = 1; done = 1;
break; break;
case -ECONNABORTED: /* -103 */ case -ECONNRESET:
case -ECONNRESET: /* -104 */ case -ENOENT: /* urb unlinked by us */
case -ETIMEDOUT: /* -110 */
case -ENOENT: /* -2 (urb unlinked by us) */
default: /* ??? - Play safe */ default: /* ??? - Play safe */
urb->status = 0; urb->status = 0;
netif_wake_queue(self->netdev); netif_wake_queue(self->netdev);
...@@ -712,10 +710,8 @@ static void irda_usb_net_timeout(struct net_device *netdev) ...@@ -712,10 +710,8 @@ static void irda_usb_net_timeout(struct net_device *netdev)
* Jean II */ * Jean II */
done = 1; done = 1;
break; break;
case -ECONNABORTED: /* -103 */ case -ECONNRESET:
case -ECONNRESET: /* -104 */ case -ENOENT: /* urb unlinked by us */
case -ETIMEDOUT: /* -110 */
case -ENOENT: /* -2 (urb unlinked by us) */
default: /* ??? - Play safe */ default: /* ??? - Play safe */
if(skb != NULL) { if(skb != NULL) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
...@@ -845,14 +841,14 @@ static void irda_usb_receive(struct urb *urb, struct pt_regs *regs) ...@@ -845,14 +841,14 @@ static void irda_usb_receive(struct urb *urb, struct pt_regs *regs)
self->stats.rx_crc_errors++; self->stats.rx_crc_errors++;
/* Also precursor to a hot-unplug on UHCI. */ /* Also precursor to a hot-unplug on UHCI. */
/* Fallthrough... */ /* Fallthrough... */
case -ECONNRESET: /* -104 */ case -ECONNRESET:
/* Random error, if I remember correctly */ /* Random error, if I remember correctly */
/* uhci_cleanup_unlink() is going to kill the Rx /* uhci_cleanup_unlink() is going to kill the Rx
* URB just after we return. No problem, at this * URB just after we return. No problem, at this
* point the URB will be idle ;-) - Jean II */ * point the URB will be idle ;-) - Jean II */
case -ESHUTDOWN: /* -108 */ case -ESHUTDOWN:
/* That's usually a hot-unplug. Submit will fail... */ /* That's usually a hot-unplug. Submit will fail... */
case -ETIMEDOUT: /* -110 */ case -ETIME:
/* Usually precursor to a hot-unplug on OHCI. */ /* Usually precursor to a hot-unplug on OHCI. */
default: default:
self->stats.rx_errors++; self->stats.rx_errors++;
......
...@@ -119,7 +119,7 @@ static void zd1201_usbfree(struct urb *urb, struct pt_regs *regs) ...@@ -119,7 +119,7 @@ static void zd1201_usbfree(struct urb *urb, struct pt_regs *regs)
switch(urb->status) { switch(urb->status) {
case -EILSEQ: case -EILSEQ:
case -ENODEV: case -ENODEV:
case -ETIMEDOUT: case -ETIME:
case -ENOENT: case -ENOENT:
case -EPIPE: case -EPIPE:
case -EOVERFLOW: case -EOVERFLOW:
...@@ -201,7 +201,7 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs) ...@@ -201,7 +201,7 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
switch(urb->status) { switch(urb->status) {
case -EILSEQ: case -EILSEQ:
case -ENODEV: case -ENODEV:
case -ETIMEDOUT: case -ETIME:
case -ENOENT: case -ENOENT:
case -EPIPE: case -EPIPE:
case -EOVERFLOW: case -EOVERFLOW:
......
...@@ -233,7 +233,7 @@ static const int cc_to_error[16] = { ...@@ -233,7 +233,7 @@ static const int cc_to_error[16] = {
/* Bit Stuff */ -EPROTO, /* Bit Stuff */ -EPROTO,
/* Data Togg */ -EILSEQ, /* Data Togg */ -EILSEQ,
/* Stall */ -EPIPE, /* Stall */ -EPIPE,
/* DevNotResp */ -ETIMEDOUT, /* DevNotResp */ -ETIME,
/* PIDCheck */ -EPROTO, /* PIDCheck */ -EPROTO,
/* UnExpPID */ -EPROTO, /* UnExpPID */ -EPROTO,
/* DataOver */ -EOVERFLOW, /* DataOver */ -EOVERFLOW,
......
...@@ -159,7 +159,7 @@ static const int cc_to_error [16] = { ...@@ -159,7 +159,7 @@ static const int cc_to_error [16] = {
/* Bit Stuff */ -EPROTO, /* Bit Stuff */ -EPROTO,
/* Data Togg */ -EILSEQ, /* Data Togg */ -EILSEQ,
/* Stall */ -EPIPE, /* Stall */ -EPIPE,
/* DevNotResp */ -ETIMEDOUT, /* DevNotResp */ -ETIME,
/* PIDCheck */ -EPROTO, /* PIDCheck */ -EPROTO,
/* UnExpPID */ -EPROTO, /* UnExpPID */ -EPROTO,
/* DataOver */ -EOVERFLOW, /* DataOver */ -EOVERFLOW,
......
...@@ -597,7 +597,7 @@ done(struct sl811 *sl811, struct sl811h_ep *ep, u8 bank, struct pt_regs *regs) ...@@ -597,7 +597,7 @@ done(struct sl811 *sl811, struct sl811h_ep *ep, u8 bank, struct pt_regs *regs)
/* error? retry, until "3 strikes" */ /* error? retry, until "3 strikes" */
} else if (++ep->error_count >= 3) { } else if (++ep->error_count >= 3) {
if (status & SL11H_STATMASK_TMOUT) if (status & SL11H_STATMASK_TMOUT)
urbstat = -ETIMEDOUT; urbstat = -ETIME;
else if (status & SL11H_STATMASK_OVF) else if (status & SL11H_STATMASK_OVF)
urbstat = -EOVERFLOW; urbstat = -EOVERFLOW;
else else
......
...@@ -1023,7 +1023,8 @@ static void hid_irq_in(struct urb *urb, struct pt_regs *regs) ...@@ -1023,7 +1023,8 @@ static void hid_irq_in(struct urb *urb, struct pt_regs *regs)
return; return;
case -EILSEQ: /* protocol error or unplug */ case -EILSEQ: /* protocol error or unplug */
case -EPROTO: /* protocol error or unplug */ case -EPROTO: /* protocol error or unplug */
case -ETIMEDOUT: /* NAK */ case -ETIME: /* protocol error or unplug */
case -ETIMEDOUT: /* Should never happen, but... */
clear_bit(HID_IN_RUNNING, &hid->iofl); clear_bit(HID_IN_RUNNING, &hid->iofl);
hid_io_error(hid); hid_io_error(hid);
return; return;
......
...@@ -87,7 +87,7 @@ static void itmtouch_irq(struct urb *urb, struct pt_regs *regs) ...@@ -87,7 +87,7 @@ static void itmtouch_irq(struct urb *urb, struct pt_regs *regs)
case 0: case 0:
/* success */ /* success */
break; break;
case -ETIMEDOUT: case -ETIME:
/* this urb is timing out */ /* this urb is timing out */
dbg("%s - urb timed out - was the device unplugged?", dbg("%s - urb timed out - was the device unplugged?",
__FUNCTION__); __FUNCTION__);
......
...@@ -107,7 +107,7 @@ static void mtouchusb_irq(struct urb *urb, struct pt_regs *regs) ...@@ -107,7 +107,7 @@ static void mtouchusb_irq(struct urb *urb, struct pt_regs *regs)
case 0: case 0:
/* success */ /* success */
break; break;
case -ETIMEDOUT: case -ETIME:
/* this urb is timing out */ /* this urb is timing out */
dbg("%s - urb timed out - was the device unplugged?", dbg("%s - urb timed out - was the device unplugged?",
__FUNCTION__); __FUNCTION__);
......
...@@ -201,7 +201,7 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs) ...@@ -201,7 +201,7 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
case 0: case 0:
/* success */ /* success */
break; break;
case -ETIMEDOUT: case -ETIME:
/* this urb is timing out */ /* this urb is timing out */
dbg("%s - urb timed out - was the device unplugged?", dbg("%s - urb timed out - was the device unplugged?",
__FUNCTION__); __FUNCTION__);
......
...@@ -508,7 +508,7 @@ static void usbtouch_irq(struct urb *urb, struct pt_regs *regs) ...@@ -508,7 +508,7 @@ static void usbtouch_irq(struct urb *urb, struct pt_regs *regs)
case 0: case 0:
/* success */ /* success */
break; break;
case -ETIMEDOUT: case -ETIME:
/* this urb is timing out */ /* this urb is timing out */
dbg("%s - urb timed out - was the device unplugged?", dbg("%s - urb timed out - was the device unplugged?",
__FUNCTION__); __FUNCTION__);
......
...@@ -806,7 +806,7 @@ static void auerbuf_releasebuf( pauerbuf_t bp) ...@@ -806,7 +806,7 @@ static void auerbuf_releasebuf( pauerbuf_t bp)
0 Initial, OK 0 Initial, OK
-EINPROGRESS during submission until end -EINPROGRESS during submission until end
-ENOENT if urb is unlinked -ENOENT if urb is unlinked
-ETIMEDOUT Transfer timed out, NAK -ETIME Device did not respond
-ENOMEM Memory Overflow -ENOMEM Memory Overflow
-ENODEV Specified USB-device or bus doesn't exist -ENODEV Specified USB-device or bus doesn't exist
-ENXIO URB already queued -ENXIO URB already queued
...@@ -832,7 +832,7 @@ static int auerswald_status_retry (int status) ...@@ -832,7 +832,7 @@ static int auerswald_status_retry (int status)
{ {
switch (status) { switch (status) {
case 0: case 0:
case -ETIMEDOUT: case -ETIME:
case -EOVERFLOW: case -EOVERFLOW:
case -EAGAIN: case -EAGAIN:
case -EPIPE: case -EPIPE:
......
...@@ -619,7 +619,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) ...@@ -619,7 +619,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs)
switch (urb->status) { switch (urb->status) {
case 0: case 0:
break; break;
case -ETIMEDOUT: case -ETIME:
if (netif_msg_rx_err(pegasus)) if (netif_msg_rx_err(pegasus))
pr_debug("%s: reset MAC\n", net->name); pr_debug("%s: reset MAC\n", net->name);
pegasus->flags &= ~PEGASUS_RX_BUSY; pegasus->flags &= ~PEGASUS_RX_BUSY;
......
...@@ -438,7 +438,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) ...@@ -438,7 +438,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs)
break; break;
case -ENOENT: case -ENOENT:
return; /* the urb is in unlink state */ return; /* the urb is in unlink state */
case -ETIMEDOUT: case -ETIME:
warn("may be reset is needed?.."); warn("may be reset is needed?..");
goto goon; goto goon;
default: default:
......
...@@ -425,9 +425,9 @@ static void rx_complete (struct urb *urb, struct pt_regs *regs) ...@@ -425,9 +425,9 @@ static void rx_complete (struct urb *urb, struct pt_regs *regs)
// we get controller i/o faults during khubd disconnect() delays. // we get controller i/o faults during khubd disconnect() delays.
// throttle down resubmits, to avoid log floods; just temporarily, // throttle down resubmits, to avoid log floods; just temporarily,
// so we still recover when the fault isn't a khubd delay. // so we still recover when the fault isn't a khubd delay.
case -EPROTO: // ehci case -EPROTO:
case -ETIMEDOUT: // ohci case -ETIME:
case -EILSEQ: // uhci case -EILSEQ:
dev->stats.rx_errors++; dev->stats.rx_errors++;
if (!timer_pending (&dev->delay)) { if (!timer_pending (&dev->delay)) {
mod_timer (&dev->delay, jiffies + THROTTLE_JIFFIES); mod_timer (&dev->delay, jiffies + THROTTLE_JIFFIES);
...@@ -821,9 +821,9 @@ static void tx_complete (struct urb *urb, struct pt_regs *regs) ...@@ -821,9 +821,9 @@ static void tx_complete (struct urb *urb, struct pt_regs *regs)
// like rx, tx gets controller i/o faults during khubd delays // like rx, tx gets controller i/o faults during khubd delays
// and so it uses the same throttling mechanism. // and so it uses the same throttling mechanism.
case -EPROTO: // ehci case -EPROTO:
case -ETIMEDOUT: // ohci case -ETIME:
case -EILSEQ: // uhci case -EILSEQ:
if (!timer_pending (&dev->delay)) { if (!timer_pending (&dev->delay)) {
mod_timer (&dev->delay, mod_timer (&dev->delay,
jiffies + THROTTLE_JIFFIES); jiffies + THROTTLE_JIFFIES);
......
...@@ -294,11 +294,6 @@ static int interpret_urb_result(struct us_data *us, unsigned int pipe, ...@@ -294,11 +294,6 @@ static int interpret_urb_result(struct us_data *us, unsigned int pipe,
return USB_STOR_XFER_ERROR; return USB_STOR_XFER_ERROR;
return USB_STOR_XFER_STALLED; return USB_STOR_XFER_STALLED;
/* timeout or excessively long NAK */
case -ETIMEDOUT:
US_DEBUGP("-- timeout or NAK\n");
return USB_STOR_XFER_ERROR;
/* babble - the device tried to send more than we wanted to read */ /* babble - the device tried to send more than we wanted to read */
case -EOVERFLOW: case -EOVERFLOW:
US_DEBUGP("-- babble\n"); US_DEBUGP("-- babble\n");
......
...@@ -181,9 +181,9 @@ static int snd_usbmidi_urb_error(int status) ...@@ -181,9 +181,9 @@ static int snd_usbmidi_urb_error(int status)
case -ENODEV: case -ENODEV:
return -ENODEV; return -ENODEV;
/* errors that might occur during unplugging */ /* errors that might occur during unplugging */
case -EPROTO: /* EHCI */ case -EPROTO:
case -ETIMEDOUT: /* OHCI */ case -ETIME:
case -EILSEQ: /* UHCI */ case -EILSEQ:
return -EIO; return -EIO;
default: default:
snd_printk(KERN_ERR "urb status %d\n", status); snd_printk(KERN_ERR "urb status %d\n", status);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment