From bcf0b6cfb7c0eb7954ee1344abb28efad4afb4cd Mon Sep 17 00:00:00 2001 From: Frank Gevaerts Date: Sun, 20 Apr 2008 14:46:43 +0000 Subject: [PATCH] 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 --- firmware/target/arm/usb-drv-arc.c | 6 ++++++ 1 file changed, 6 insertions(+) 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 */