diff options
-rw-r--r-- | drivers/usb/early/ehci-dbgp.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index f0a41c647bef..1206a26ef893 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c | |||
@@ -245,16 +245,9 @@ static inline void dbgp_get_data(void *buf, int size) | |||
245 | bytes[i] = (hi >> (8*(i - 4))) & 0xff; | 245 | bytes[i] = (hi >> (8*(i - 4))) & 0xff; |
246 | } | 246 | } |
247 | 247 | ||
248 | static int dbgp_bulk_write(unsigned devnum, unsigned endpoint, | 248 | static int dbgp_out(u32 addr, const char *bytes, int size) |
249 | const char *bytes, int size) | ||
250 | { | 249 | { |
251 | u32 pids, addr, ctrl; | 250 | u32 pids, ctrl; |
252 | int ret; | ||
253 | |||
254 | if (size > DBGP_MAX_PACKET) | ||
255 | return -1; | ||
256 | |||
257 | addr = DBGP_EPADDR(devnum, endpoint); | ||
258 | 251 | ||
259 | pids = readl(&ehci_debug->pids); | 252 | pids = readl(&ehci_debug->pids); |
260 | pids = dbgp_pid_update(pids, USB_PID_OUT); | 253 | pids = dbgp_pid_update(pids, USB_PID_OUT); |
@@ -267,10 +260,34 @@ static int dbgp_bulk_write(unsigned devnum, unsigned endpoint, | |||
267 | dbgp_set_data(bytes, size); | 260 | dbgp_set_data(bytes, size); |
268 | writel(addr, &ehci_debug->address); | 261 | writel(addr, &ehci_debug->address); |
269 | writel(pids, &ehci_debug->pids); | 262 | writel(pids, &ehci_debug->pids); |
263 | return dbgp_wait_until_done(ctrl); | ||
264 | } | ||
270 | 265 | ||
271 | ret = dbgp_wait_until_done(ctrl); | 266 | static int dbgp_bulk_write(unsigned devnum, unsigned endpoint, |
272 | if (ret < 0) | 267 | const char *bytes, int size) |
273 | return ret; | 268 | { |
269 | int ret; | ||
270 | int loops = 5; | ||
271 | u32 addr; | ||
272 | if (size > DBGP_MAX_PACKET) | ||
273 | return -1; | ||
274 | |||
275 | addr = DBGP_EPADDR(devnum, endpoint); | ||
276 | try_again: | ||
277 | if (loops--) { | ||
278 | ret = dbgp_out(addr, bytes, size); | ||
279 | if (ret == -DBGP_ERR_BAD) { | ||
280 | int try_loops = 3; | ||
281 | do { | ||
282 | /* Emit a dummy packet to re-sync communication | ||
283 | * with the debug device */ | ||
284 | if (dbgp_out(addr, "12345678", 8) >= 0) { | ||
285 | udelay(2); | ||
286 | goto try_again; | ||
287 | } | ||
288 | } while (try_loops--); | ||
289 | } | ||
290 | } | ||
274 | 291 | ||
275 | return ret; | 292 | return ret; |
276 | } | 293 | } |