diff options
| author | Tobias Diedrich <ranma+coreboot@tdiedrich.de> | 2010-06-22 10:33:05 +0000 |
|---|---|---|
| committer | Tobias Diedrich <ranma+coreboot@tdiedrich.de> | 2010-06-22 10:33:05 +0000 |
| commit | d5183591519d166486d1500152c5edbce3e72899 (patch) | |
| tree | 6dde354d9764300e30ba1ef9bf7483e435769edf | |
| parent | ef6398827a6386a8c655a0b483946b9aff84ffba (diff) | |
| download | rockbox-d5183591519d166486d1500152c5edbce3e72899.zip rockbox-d5183591519d166486d1500152c5edbce3e72899.tar.gz rockbox-d5183591519d166486d1500152c5edbce3e72899.tar.bz2 rockbox-d5183591519d166486d1500152c5edbce3e72899.tar.xz | |
"lsusb -vv" now works too, but the real bug is probably still in here somewhere.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27048 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/firmware/target/arm/as3525/usb-drv-as3525.c b/firmware/target/arm/as3525/usb-drv-as3525.c index 42e13d7..9b25491 100644 --- a/firmware/target/arm/as3525/usb-drv-as3525.c +++ b/firmware/target/arm/as3525/usb-drv-as3525.c @@ -201,14 +201,14 @@ static void reset_endpoints(int init) USB_IEP_MPS (i) = mps; /* in bytes */ /* We don't care about the 'IN token received' event */ USB_IEP_STS_MASK(i) = USB_EP_STAT_IN; /* OF: 0x840 */ - USB_IEP_TXFSIZE (i) = mps/4; /* in dwords => mps*2 bytes */ + USB_IEP_TXFSIZE (i) = mps/2; /* in dwords => mps*2 bytes */ USB_IEP_STS (i) = 0xffffffff; /* clear status */ USB_IEP_DESC_PTR(i) = 0; if (i != 2) { /* Skip the OUT EP0 alias */ dma_desc_init(i, 1); USB_OEP_CTRL (i) = USB_EP_CTRL_FLUSH|USB_EP_CTRL_SNAK; - USB_OEP_MPS (i) = (mps/4 << 16) | mps; + USB_OEP_MPS (i) = (mps/2 << 16) | mps; USB_OEP_STS_MASK(i) = USB_EP_STAT_BNA; /* OF: 0x1800 */ USB_OEP_RXFR (i) = 0; /* Always 0 in OF trace? */ USB_OEP_STS (i) = 0xffffffff; /* clear status */ @@ -300,6 +300,7 @@ void usb_drv_exit(void) { tick_remove_task(usb_tick); USB_DEV_CTRL |= (1<<10); /* soft disconnect */ + usb_phy_suspend(); /* * mask all interrupts _before_ writing to VIC_INT_EN_CLEAR, * or else the core might latch the interrupt while @@ -410,7 +411,7 @@ int usb_drv_recv(int ep, void *ptr, int len) endpoints[ep][1].buf = ptr; /* remove data buffer from cache */ - invalidate_dcache(); + invalidate_dcache_range(ptr, len); /* DMA setup */ uc_desc->status = USB_DMA_DESC_BS_HST_RDY | @@ -481,7 +482,7 @@ void ep_send(int ep, void *ptr, int len) endpoints[ep][0].rc = -1; /* Make sure data is committed to memory */ - clean_dcache(); + clean_dcache_range(ptr, len); logf("xx%s\n", make_hex(ptr, len)); @@ -609,8 +610,9 @@ static void handle_out_ep(int ep) static struct usb_ctrlrequest req_copy; req_copy = *req; - logf("t%ld:got SETUP packet: type=%d req=%d val=%d ind=%d len=%d\n", + logf("t%ld:got SETUP packet: %s type=%d req=%d val=%d ind=%d len=%d\n", current_tick, + make_hex((void*)req, 8), req->bRequestType, req->bRequest, req->wValue, @@ -669,6 +671,9 @@ static void usb_tick(void) } if (rde_timer > 2) { + logf("usb_tick: flushing EP0 IN\n"); + /* FIXME: flushing EP0 here papers over a bug somewhere */ + USB_IEP_CTRL(0) |= USB_EP_CTRL_FLUSH; logf("usb_tick: re-enabling RDE\n"); USB_DEV_CTRL |= USB_DEV_CTRL_RDE; rde_timer = 0; @@ -778,8 +783,15 @@ void INT_USB(void) USB_OEP_CTRL(0) |= USB_EP_CTRL_ACT; intr &= ~USB_DEV_INTR_ENUM_DONE; } - if (intr) + if (intr & USB_DEV_INTR_MYSTERY) { + logf("got mystery dev intr\n"); + USB_DEV_INTR_MASK |= USB_DEV_INTR_MYSTERY; + intr &= ~USB_DEV_INTR_MYSTERY; + } + if (intr) { + logf("usb devirq 0x%x", intr); panicf("usb devirq 0x%x", intr); + } } } |