Transfer initiation and completion for the non-zero Endpoints are
handled by cdns3_ep_run_transfer() and cdns3_transfer_completed()
respectively.

Failing to flush the cache associated with the TRB Pool within
cdns3_ep_run_transfer() results in the transfers never being initiated.
Similarly, failing to invalidate the cache associated with the TRB pool
within cdns3_transfer_completed() results in the transfers never being
completed.

Fix this.

Fixes: 7e91f6ccdc84 ("usb: Add Cadence USB3 host and gadget driver")
Signed-off-by: Siddharth Vadapalli <s-vadapa...@ti.com>
---

Hello,

This patch is based on commit
56b47b8b6a Merge tag 'u-boot-stm32-20240926' of 
https://source.denx.de/u-boot/custodians/u-boot-stm
of the master branch of U-Boot.

This patch has been validated on AM642-EVM in the context of Fastboot.
Fastboot is non-functional without this patch. EP1 is configured in
Bulk Mode for Fastboot and is non-responsive. This patch addresses the
issue, thereby enabling Fastboot.

Regards,
Siddharth.

 drivers/usb/cdns3/gadget.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
index 32b2c41206..ac7e469469 100644
--- a/drivers/usb/cdns3/gadget.c
+++ b/drivers/usb/cdns3/gadget.c
@@ -965,6 +965,12 @@ int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
        if (priv_dev->dev_ver <= DEV_VER_V2)
                cdns3_wa1_tray_restore_cycle_bit(priv_dev, priv_ep);
 
+       /* Flush TRBs */
+       flush_dcache_range((unsigned long)priv_ep->trb_pool,
+                          (unsigned long)priv_ep->trb_pool +
+                          ROUND(sizeof(struct cdns3_trb) * priv_ep->num_trbs,
+                                CONFIG_SYS_CACHELINE_SIZE));
+
        trace_cdns3_prepare_trb(priv_ep, priv_req->trb);
 
        /*
@@ -1153,6 +1159,13 @@ static void cdns3_transfer_completed(struct cdns3_device 
*priv_dev,
                                priv_ep->endpoint.desc->bEndpointAddress);
 #endif
 
+               /* Invalidate TRBs */
+               invalidate_dcache_range((unsigned long)priv_ep->trb_pool,
+                                       (unsigned long)priv_ep->trb_pool +
+                                       ROUND(sizeof(struct cdns3_trb) *
+                                             priv_ep->num_trbs,
+                                             CONFIG_SYS_CACHELINE_SIZE));
+
                if (!cdns3_request_handled(priv_ep, priv_req))
                        goto prepare_next_td;
 
-- 
2.40.1

Reply via email to