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 /firmware | |
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
Diffstat (limited to 'firmware')
-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 static long last_tick; struct transfer_descriptor* new_td; + int oldlevel = disable_irq_save(); /* if (send && endpoint > EP_CONTROL) { logf("usb: sent %d bytes", len); @@ -696,6 +697,8 @@ static int prime_transfer(int endpoint, void* ptr, int len, bool send, bool wait goto pt_error; } + restore_irq(oldlevel); + if (wait) { /* wait for transfer to finish */ 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 } pt_error: + if(rc<0) + restore_irq(oldlevel); + /* Error status must make sure an abandoned wakeup signal isn't left */ if (rc < 0 && wait) { /* Cancel wait */ |