diff options
Diffstat (limited to 'firmware/target/arm/as3525')
-rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525v2.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/firmware/target/arm/as3525/usb-drv-as3525v2.c b/firmware/target/arm/as3525/usb-drv-as3525v2.c index a507f54355..dc9e0b3949 100644 --- a/firmware/target/arm/as3525/usb-drv-as3525v2.c +++ b/firmware/target/arm/as3525/usb-drv-as3525v2.c | |||
@@ -276,8 +276,10 @@ static void reset_endpoints(void) | |||
276 | endpoints[ep][DIR_IN].busy = false; | 276 | endpoints[ep][DIR_IN].busy = false; |
277 | endpoints[ep][DIR_IN].status = -1; | 277 | endpoints[ep][DIR_IN].status = -1; |
278 | if(endpoints[ep][DIR_IN].wait) | 278 | if(endpoints[ep][DIR_IN].wait) |
279 | { | ||
280 | endpoints[ep][DIR_IN].wait = false; | ||
279 | wakeup_signal(&endpoints[ep][DIR_IN].complete); | 281 | wakeup_signal(&endpoints[ep][DIR_IN].complete); |
280 | endpoints[ep][DIR_IN].wait = false; | 282 | } |
281 | if(DIEPCTL(ep) & DEPCTL_epena) | 283 | if(DIEPCTL(ep) & DEPCTL_epena) |
282 | DIEPCTL(ep) = DEPCTL_snak; | 284 | DIEPCTL(ep) = DEPCTL_snak; |
283 | else | 285 | else |
@@ -290,8 +292,10 @@ static void reset_endpoints(void) | |||
290 | endpoints[ep][DIR_OUT].busy = false; | 292 | endpoints[ep][DIR_OUT].busy = false; |
291 | endpoints[ep][DIR_OUT].status = -1; | 293 | endpoints[ep][DIR_OUT].status = -1; |
292 | if(endpoints[ep][DIR_OUT].wait) | 294 | if(endpoints[ep][DIR_OUT].wait) |
295 | { | ||
296 | endpoints[ep][DIR_OUT].wait = false; | ||
293 | wakeup_signal(&endpoints[ep][DIR_OUT].complete); | 297 | wakeup_signal(&endpoints[ep][DIR_OUT].complete); |
294 | endpoints[ep][DIR_OUT].wait = false; | 298 | } |
295 | if(DOEPCTL(ep) & DEPCTL_epena) | 299 | if(DOEPCTL(ep) & DEPCTL_epena) |
296 | DOEPCTL(ep) = DEPCTL_snak; | 300 | DOEPCTL(ep) = DEPCTL_snak; |
297 | else | 301 | else |
@@ -318,17 +322,23 @@ static void cancel_all_transfers(bool cancel_ep0) | |||
318 | FOR_EACH_IN_EP_EX(cancel_ep0, i, ep) | 322 | FOR_EACH_IN_EP_EX(cancel_ep0, i, ep) |
319 | { | 323 | { |
320 | endpoints[ep][DIR_IN].status = -1; | 324 | endpoints[ep][DIR_IN].status = -1; |
321 | endpoints[ep][DIR_IN].wait = false; | ||
322 | endpoints[ep][DIR_IN].busy = false; | 325 | endpoints[ep][DIR_IN].busy = false; |
323 | wakeup_signal(&endpoints[ep][DIR_IN].complete); | 326 | if(endpoints[ep][DIR_IN].wait) |
327 | { | ||
328 | endpoints[ep][DIR_IN].wait = false; | ||
329 | wakeup_signal(&endpoints[ep][DIR_IN].complete); | ||
330 | } | ||
324 | DIEPCTL(ep) = (DIEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak; | 331 | DIEPCTL(ep) = (DIEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak; |
325 | } | 332 | } |
326 | FOR_EACH_OUT_EP_EX(cancel_ep0, i, ep) | 333 | FOR_EACH_OUT_EP_EX(cancel_ep0, i, ep) |
327 | { | 334 | { |
328 | endpoints[ep][DIR_OUT].status = -1; | 335 | endpoints[ep][DIR_OUT].status = -1; |
329 | endpoints[ep][DIR_OUT].wait = false; | ||
330 | endpoints[ep][DIR_OUT].busy = false; | 336 | endpoints[ep][DIR_OUT].busy = false; |
331 | wakeup_signal(&endpoints[ep][DIR_OUT].complete); | 337 | if(endpoints[ep][DIR_OUT].wait) |
338 | { | ||
339 | endpoints[ep][DIR_OUT].wait = false; | ||
340 | wakeup_signal(&endpoints[ep][DIR_OUT].complete); | ||
341 | } | ||
332 | DOEPCTL(ep) = (DOEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak; | 342 | DOEPCTL(ep) = (DOEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak; |
333 | } | 343 | } |
334 | 344 | ||
@@ -482,7 +492,11 @@ static void handle_ep_in_int(int ep) | |||
482 | handle_ep0_complete(endpoint->len == 0); | 492 | handle_ep0_complete(endpoint->len == 0); |
483 | endpoint->len = size; | 493 | endpoint->len = size; |
484 | usb_core_transfer_complete(ep, USB_DIR_IN, 0, transfered); | 494 | usb_core_transfer_complete(ep, USB_DIR_IN, 0, transfered); |
485 | wakeup_signal(&endpoint->complete); | 495 | if(endpoint->wait) |
496 | { | ||
497 | endpoint->wait = false; | ||
498 | wakeup_signal(&endpoint->complete); | ||
499 | } | ||
486 | } | 500 | } |
487 | } | 501 | } |
488 | if(sts & DIEPINT_timeout) | 502 | if(sts & DIEPINT_timeout) |
@@ -495,7 +509,11 @@ static void handle_ep_in_int(int ep) | |||
495 | /* for safety, act as if no bytes as been transfered */ | 509 | /* for safety, act as if no bytes as been transfered */ |
496 | endpoint->len = 0; | 510 | endpoint->len = 0; |
497 | usb_core_transfer_complete(ep, USB_DIR_IN, 1, 0); | 511 | usb_core_transfer_complete(ep, USB_DIR_IN, 1, 0); |
498 | wakeup_signal(&endpoint->complete); | 512 | if(endpoint->wait) |
513 | { | ||
514 | endpoint->wait = false; | ||
515 | wakeup_signal(&endpoint->complete); | ||
516 | } | ||
499 | } | 517 | } |
500 | } | 518 | } |
501 | /* clear interrupts */ | 519 | /* clear interrupts */ |
@@ -525,7 +543,11 @@ static void handle_ep_out_int(int ep) | |||
525 | if(ep == 0) | 543 | if(ep == 0) |
526 | handle_ep0_complete(endpoint->len == 0); | 544 | handle_ep0_complete(endpoint->len == 0); |
527 | usb_core_transfer_complete(ep, USB_DIR_OUT, 0, transfered); | 545 | usb_core_transfer_complete(ep, USB_DIR_OUT, 0, transfered); |
528 | wakeup_signal(&endpoint->complete); | 546 | if(endpoint->wait) |
547 | { | ||
548 | endpoint->wait = false; | ||
549 | wakeup_signal(&endpoint->complete); | ||
550 | } | ||
529 | } | 551 | } |
530 | } | 552 | } |
531 | if(sts & DOEPINT_setup) | 553 | if(sts & DOEPINT_setup) |