diff options
Diffstat (limited to 'drivers/net/wimax/i2400m/usb-fw.c')
-rw-r--r-- | drivers/net/wimax/i2400m/usb-fw.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/net/wimax/i2400m/usb-fw.c b/drivers/net/wimax/i2400m/usb-fw.c index 8ec8b6d56a1..d8f6ce29eff 100644 --- a/drivers/net/wimax/i2400m/usb-fw.c +++ b/drivers/net/wimax/i2400m/usb-fw.c | |||
@@ -113,6 +113,28 @@ retry: | |||
113 | } | 113 | } |
114 | result = len; | 114 | result = len; |
115 | break; | 115 | break; |
116 | case -EPIPE: | ||
117 | /* | ||
118 | * Stall -- maybe the device is choking with our | ||
119 | * requests. Clear it and give it some time. If they | ||
120 | * happen to often, it might be another symptom, so we | ||
121 | * reset. | ||
122 | * | ||
123 | * No error handling for usb_clear_halt(0; if it | ||
124 | * works, the retry works; if it fails, this switch | ||
125 | * does the error handling for us. | ||
126 | */ | ||
127 | if (edc_inc(&i2400mu->urb_edc, | ||
128 | 10 * EDC_MAX_ERRORS, EDC_ERROR_TIMEFRAME)) { | ||
129 | dev_err(dev, "BM-CMD: too many stalls in " | ||
130 | "URB; resetting device\n"); | ||
131 | usb_queue_reset_device(i2400mu->usb_iface); | ||
132 | /* fallthrough */ | ||
133 | } else { | ||
134 | usb_clear_halt(i2400mu->usb_dev, pipe); | ||
135 | msleep(10); /* give the device some time */ | ||
136 | goto retry; | ||
137 | } | ||
116 | case -EINVAL: /* while removing driver */ | 138 | case -EINVAL: /* while removing driver */ |
117 | case -ENODEV: /* dev disconnect ... */ | 139 | case -ENODEV: /* dev disconnect ... */ |
118 | case -ENOENT: /* just ignore it */ | 140 | case -ENOENT: /* just ignore it */ |