summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-01-24 15:03:56 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-01-24 15:03:56 +0000
commit297ca4b1af2c595832e46ff7b0cd6072333cae66 (patch)
tree6e873e54c28278281b58a6e15c09458449e6724a
parent01313d5039609c34b2b56ec8ba7a3a6c48ddaf3c (diff)
downloadrockbox-297ca4b1af2c595832e46ff7b0cd6072333cae66.tar.gz
rockbox-297ca4b1af2c595832e46ff7b0cd6072333cae66.zip
as3525v2-usb: only call wakeup_signal when a thread is actually waiting
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29129 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/as3525/usb-drv-as3525v2.c40
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)