diff options
author | Frank Gevaerts <frank@gevaerts.be> | 2008-04-20 14:46:43 +0000 |
---|---|---|
committer | Frank Gevaerts <frank@gevaerts.be> | 2008-04-20 14:46:43 +0000 |
commit | bcf0b6cfb7c0eb7954ee1344abb28efad4afb4cd (patch) | |
tree | f9ddb75c0110c891940ea4f5862571bda9d40f30 | |
parent | 4b5f0909d1854c314ade444316448bda60a60d7e (diff) | |
download | rockbox-bcf0b6cfb7c0eb7954ee1344abb28efad4afb4cd.tar.gz rockbox-bcf0b6cfb7c0eb7954ee1344abb28efad4afb4cd.zip |
disable irqs during the critical part of prime_transfer(). This improves the behaviour on PP502x when connected through a hub, bit it doesn't totally solve the problems
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17190 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/target/arm/usb-drv-arc.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c index 3093120c83..a2f8819962 100644 --- a/firmware/target/arm/usb-drv-arc.c +++ b/firmware/target/arm/usb-drv-arc.c | |||
@@ -645,6 +645,7 @@ static int prime_transfer(int endpoint, void* ptr, int len, bool send, bool wait | |||
645 | static long last_tick; | 645 | static long last_tick; |
646 | struct transfer_descriptor* new_td; | 646 | struct transfer_descriptor* new_td; |
647 | 647 | ||
648 | int oldlevel = disable_irq_save(); | ||
648 | /* | 649 | /* |
649 | if (send && endpoint > EP_CONTROL) { | 650 | if (send && endpoint > EP_CONTROL) { |
650 | logf("usb: sent %d bytes", len); | 651 | logf("usb: sent %d bytes", len); |
@@ -696,6 +697,8 @@ static int prime_transfer(int endpoint, void* ptr, int len, bool send, bool wait | |||
696 | goto pt_error; | 697 | goto pt_error; |
697 | } | 698 | } |
698 | 699 | ||
700 | restore_irq(oldlevel); | ||
701 | |||
699 | if (wait) { | 702 | if (wait) { |
700 | /* wait for transfer to finish */ | 703 | /* wait for transfer to finish */ |
701 | wakeup_wait(&transfer_completion_signal[pipe], TIMEOUT_BLOCK); | 704 | wakeup_wait(&transfer_completion_signal[pipe], TIMEOUT_BLOCK); |
@@ -708,6 +711,9 @@ static int prime_transfer(int endpoint, void* ptr, int len, bool send, bool wait | |||
708 | } | 711 | } |
709 | 712 | ||
710 | pt_error: | 713 | pt_error: |
714 | if(rc<0) | ||
715 | restore_irq(oldlevel); | ||
716 | |||
711 | /* Error status must make sure an abandoned wakeup signal isn't left */ | 717 | /* Error status must make sure an abandoned wakeup signal isn't left */ |
712 | if (rc < 0 && wait) { | 718 | if (rc < 0 && wait) { |
713 | /* Cancel wait */ | 719 | /* Cancel wait */ |