]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: mtu3: flush cache for next GPD
authorChunfeng Yun <chunfeng.yun@mediatek.com>
Wed, 3 Mar 2021 08:07:05 +0000 (16:07 +0800)
committerMarek Vasut <marex@denx.de>
Wed, 10 Mar 2021 10:48:09 +0000 (11:48 +0100)
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>
drivers/usb/mtu3/mtu3_qmu.c

index 801c2bc416dff1f40c8f12203ba00f1dc69df92b..95eaf6d23659967498fb2b3c48e5eb92b9c974af 100644 (file)
@@ -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;