Re: [PATCH v7 00/24] usb: dwc3: part 2, make the resynced code work
Anshul Dalal <[email protected]>
| Newsgroups | org.u-boot-project.lists.u-boot |
|---|---|
| Message-ID | <[email protected]> |
On Wed Aug 26, 2026 at 1:59 PM IST, Anders Roxell wrote: > 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. Thanks for the fix Anders, the block device shows up properly now. However the 'dwc3-generic-peripheral usb@31000000: unknown endpoint event 0' error log remains, is this expected? Regards, Anshul > > > 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);