aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChunfeng Yun <chunfeng.yun@mediatek.com>2021-03-03 16:07:05 +0800
committerMarek Vasut <marex@denx.de>2021-03-10 11:48:09 +0100
commit044d7003a7118ad4633e619a81d634cd4c35e670 (patch)
tree51b2faad7b99b20cddf95cf2e6bc7900499c23f9
parentb764bf21e60901133fd5eec6a003409c581dd519 (diff)
downloadu-boot-044d7003a7118ad4633e619a81d634cd4c35e670.zip
u-boot-044d7003a7118ad4633e619a81d634cd4c35e670.tar.gz
u-boot-044d7003a7118ad4633e619a81d634cd4c35e670.tar.bz2
usb: mtu3: flush cache for next GPD
When flush cache of the current GPD and resume QMU, the controller will try to access the next GPD after processing the current one, if not flush the next GPD, the controller may get wrong GPD status. Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
-rw-r--r--drivers/usb/mtu3/mtu3_qmu.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/usb/mtu3/mtu3_qmu.c b/drivers/usb/mtu3/mtu3_qmu.c
index 801c2bc..95eaf6d 100644
--- a/drivers/usb/mtu3/mtu3_qmu.c
+++ b/drivers/usb/mtu3/mtu3_qmu.c
@@ -198,6 +198,7 @@ static int mtu3_prepare_tx_gpd(struct mtu3_ep *mep, struct mtu3_request *mreq)
enq->flag &= ~GPD_FLAGS_HWO;
gpd->next_gpd = cpu_to_le32((u32)gpd_virt_to_dma(ring, enq));
+ mtu3_flush_cache((uintptr_t)enq, sizeof(*gpd));
if (req->zero)
gpd->ext_flag |= GPD_EXT_FLAG_ZLP;
@@ -234,6 +235,8 @@ static int mtu3_prepare_rx_gpd(struct mtu3_ep *mep, struct mtu3_request *mreq)
enq->flag &= ~GPD_FLAGS_HWO;
gpd->next_gpd = cpu_to_le32((u32)gpd_virt_to_dma(ring, enq));
+ mtu3_flush_cache((uintptr_t)enq, sizeof(*gpd));
+
gpd->flag |= GPD_FLAGS_IOC | GPD_FLAGS_HWO;
mreq->gpd = gpd;