Re: [PATCH v7 00/24] usb: dwc3: part 2, make the resynced code work
Anders Roxell <[email protected]>
| Newsgroups | org.u-boot-project.lists.u-boot |
|---|---|
| Message-ID | <ao6kAOgauISZ1-dx@monster> |
On 2026-08-25 15:12, Anshul Dalal wrote: > On Mon, 24 Aug 2026 17:41:09 +0200, Anders Roxell <[email protected]> wrote: > > [...] > > dwc2 with and without DM_USB_GADGET, at91_udc, atmel_usba_udc, ci_udc, > > musb-new and mtu3. 17 boards in total. > > > > DFU is tested on hardware on BeagleBoard-X15, and on BeaglePlay by > > Anshul. ci_udc is tested on an i.MX93 board with ums. The rest is build > > tested only. > > Hi Anders, > > Thanks for reworking the series, I was able to get DFU boot to work properly > and the usb devices are being discovered properly too. > > Though I ran into an issue while using ums with your patches as the host isn't > able to detect the connected device. With default logs I only see a > '\dwc3-generic-peripheral usb@31000000: unknown endpoint event 0'. > > Further debug logs are below on TI's AM62p EVM: > > @ => ums mmc 1 > @ UMS: LUN 0, dev mmc 1, hwpart 0, sector 0x0, count 0x3b72400 > @ g_dnl_register: g_dnl_driver.name = usb_dnl_ums > @ g_dnl_bind: gadget: 0x00000000fde7fb68 cdev: 0x00000000fde5cdd0 > @ usb_add_config: adding config #1 'usb_dnload'/00000000fde83cc0 > @ g_dnl_do_config: configuration: 0x00000000fde83cc0 composite dev: 0x00000000fde5cdd0 > @ adding 'Mass Storage Function'/00000000fde5c110 to config 'usb_dnload'/00000000fde83cc0 > @ cfg 1/00000000fde83cc0 speeds: high full > @ usb_add_config: interface 0 = Mass Storage Function/00000000fde5c110 > @ g_dnl_bind: calling usb_gadget_connect for controller 'dwc3-gadget' > @ usb_dnl_ums: ready > @ -dwc3-generic-peripheral usb@31000000: unknown endpoint event 0 > @ |set_config: high speed config #1: usb_dnload > @ \non-core control reqa1.fe v0000 i0000 l1 > > I observed a similar issue on the beagleplay too. Regards! Hi Anshul, I could reproduce it on my BeagleBoard-X15. First I only saw it connect and got happy, so I forgot to look for the disk. It never shows up, and the host gives up after 20 seconds. The resync dropped the cache maintenance in dwc3 gadget.c. The controller reads a stale trb and nothing moves, that is your "unknown endpoint event 0". DFU still worked because it only uses ep0. With the diff below the disk shows up and 64 MiB reads back correctly. It applies on v7. Can you try ums on AM62p and BeaglePlay? Please let me know how it goes before I send the next version. Cheers, Anders diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 028ebd9b9c79..fd0ae9e3e092 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -228,6 +228,10 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, dwc3_gadget_del_and_unmap_request(dep, req, status); req->status = DWC3_REQUEST_STATUS_COMPLETED; + if (req->request.dma && req->request.length) + dwc3_invalidate_cache((uintptr_t)req->request.dma, + req->request.length); + spin_unlock(&dwc->lock); usb_gadget_giveback_request(&dep->endpoint, &req->request); spin_lock(&dwc->lock); @@ -1382,9 +1386,12 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, * controller to observe the HWO bit set prematurely. * Add a write memory barrier to prevent CPU re-ordering. */ - // FIXME wmb(); + wmb(); trb->ctrl |= DWC3_TRB_CTRL_HWO; + dwc3_flush_cache((uintptr_t)dma, trb_length); + dwc3_flush_cache((uintptr_t)trb, sizeof(*trb)); + dwc3_ep_inc_enq(dep); } @@ -3153,6 +3160,8 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep, { unsigned int count; + dwc3_invalidate_cache((uintptr_t)trb, sizeof(*trb)); + dwc3_ep_inc_deq(dep); req->num_trbs--; @@ -4181,7 +4190,7 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt) * Add an explicit write memory barrier to make sure that the update of * clearing DWC3_EVENT_PENDING is observed in dwc3_check_event_buf() */ - // FIXME wmb(); + wmb(); if (dwc->imod_interval) { dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB);