From 2768412599f0721a0d63b2ba29318bd8cc404022 Mon Sep 17 00:00:00 2001 From: gaojuxin Date: Thu, 20 Feb 2025 10:42:10 +0800 Subject: [PATCH] anolis: net: stmmac: dwmac-loongson: fix Mac DMA reset ANBZ: #18967 DMA reset of Loongson's Mac may take over a second Signed-off-by: Zhao Qunqin Signed-off-by: gaojuxin --- .../net/ethernet/stmicro/stmmac/dwmac-loongson.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c index f03d78385ed9..357d09656a7a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c @@ -443,6 +443,19 @@ static struct mac_device_info *loongson_dwmac_setup(void *apriv) return mac; } +static int loongson_fix_soc_reset(void *priv, void __iomem *ioaddr) +{ + u32 value = readl(ioaddr + DMA_BUS_MODE); + + /* DMA SW reset */ + value |= DMA_BUS_MODE_SFT_RESET; + writel(value, ioaddr + DMA_BUS_MODE); + + return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value, + !(value & DMA_BUS_MODE_SFT_RESET), + 10000, 2000000); +} + static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct plat_stmmacenet_data *plat; @@ -518,6 +531,7 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id plat->bsp_priv = ld; plat->setup = loongson_dwmac_setup; + plat->fix_soc_reset = loongson_fix_soc_reset; ld->dev = &pdev->dev; memset(&res, 0, sizeof(res)); -- Gitee