summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2007-11-27 13:42:47 +0000
committerBjörn Stenberg <bjorn@haxx.se>2007-11-27 13:42:47 +0000
commita0224590d45a0249160bb2ebd167ed3a1cac0176 (patch)
tree67479adb61b089a2faec2c7a6c251c528dbe69ed
parentf666a7e8c682f499b0af030e3d7503d041528cd7 (diff)
downloadrockbox-a0224590d45a0249160bb2ebd167ed3a1cac0176.zip
rockbox-a0224590d45a0249160bb2ebd167ed3a1cac0176.tar.gz
rockbox-a0224590d45a0249160bb2ebd167ed3a1cac0176.tar.bz2
rockbox-a0224590d45a0249160bb2ebd167ed3a1cac0176.tar.xz
Added some error returns
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15834 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/export/usb_drv.h4
-rw-r--r--firmware/target/arm/usb-drv-pp502x.c22
2 files changed, 15 insertions, 11 deletions
diff --git a/firmware/export/usb_drv.h b/firmware/export/usb_drv.h
index 264b5d1..c503a84 100644
--- a/firmware/export/usb_drv.h
+++ b/firmware/export/usb_drv.h
@@ -25,8 +25,8 @@ void usb_drv_init(void);
void usb_drv_exit(void);
void usb_drv_int(void);
void usb_drv_stall(int endpoint, bool stall);
-void usb_drv_send(int endpoint, void* ptr, int length);
-void usb_drv_recv(int endpoint, void* ptr, int length);
+int usb_drv_send(int endpoint, void* ptr, int length);
+int usb_drv_recv(int endpoint, void* ptr, int length);
void usb_drv_ack(struct usb_ctrlrequest* req);
void usb_drv_set_address(int address);
void usb_drv_reset_endpoint(int endpoint, bool send);
diff --git a/firmware/target/arm/usb-drv-pp502x.c b/firmware/target/arm/usb-drv-pp502x.c
index c77b881..1db3ebd 100644
--- a/firmware/target/arm/usb-drv-pp502x.c
+++ b/firmware/target/arm/usb-drv-pp502x.c
@@ -319,7 +319,7 @@ static const unsigned int pipe2mask[NUM_ENDPOINTS*2] = {
/*-------------------------------------------------------------------------*/
static void transfer_completed(void);
-static void prime_transfer(int endpoint, void* ptr, int len, bool send);
+static int prime_transfer(int endpoint, void* ptr, int len, bool send);
static void bus_reset(void);
static void init_queue_heads(void);
static void init_endpoints(void);
@@ -445,15 +445,15 @@ void usb_drv_stall(int endpoint, bool stall)
}
}
-void usb_drv_send(int endpoint, void* ptr, int length)
+int usb_drv_send(int endpoint, void* ptr, int length)
{
- prime_transfer(endpoint, ptr, length, true);
+ return prime_transfer(endpoint, ptr, length, true);
}
-void usb_drv_recv(int endpoint, void* ptr, int length)
+int usb_drv_recv(int endpoint, void* ptr, int length)
{
//logf("usbrecv(%x, %d)", ptr, length);
- prime_transfer(endpoint, ptr, length, false);
+ return prime_transfer(endpoint, ptr, length, false);
}
void usb_drv_wait(int endpoint, bool send)
@@ -485,7 +485,7 @@ void usb_drv_reset_endpoint(int endpoint, bool send)
/*-------------------------------------------------------------------------*/
/* manual: 32.14.5.2 */
-static void prime_transfer(int endpoint, void* ptr, int len, bool send)
+static int prime_transfer(int endpoint, void* ptr, int len, bool send)
{
int timeout;
int pipe = endpoint * 2 + (send ? 1 : 0);
@@ -515,14 +515,16 @@ static void prime_transfer(int endpoint, void* ptr, int len, bool send)
timeout = 10000;
while ((REG_ENDPTPRIME & mask) && --timeout) {
if (REG_USBSTS & USBSTS_RESET)
- break;
+ return -1;
}
if (!timeout) {
logf("prime timeout");
+ return -2;
}
if (!(REG_ENDPTSTATUS & mask)) {
logf("no prime! %d %d %x", endpoint, pipe, qh->dtd.size_ioc_sts & 0xff );
+ return -3;
}
if (send) {
@@ -533,13 +535,15 @@ static void prime_transfer(int endpoint, void* ptr, int len, bool send)
REG_ENDPTCOMPLETE |= mask;
if (REG_USBSTS & USBSTS_RESET)
- return;
+ return -4;
}
if (!timeout) {
logf("td never finished");
- return;
+ return -5;
}
}
+
+ return 0;
}
static void transfer_completed(void)