]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: stmmac: dwmac-loongson: Add fix_soc_reset() callback
authorQunqin Zhao <zhaoqunqin@loongson.cn>
Wed, 19 Feb 2025 02:07:01 +0000 (10:07 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Mar 2025 17:25:40 +0000 (18:25 +0100)
commit f06e4bfd010faefa637689d2df2c727dbf6e1d27 upstream.

Loongson's DWMAC device may take nearly two seconds to complete DMA reset,
however, the default waiting time for reset is 200 milliseconds.
Therefore, the following error message may appear:

[14.427169] dwmac-loongson-pci 0000:00:03.2: Failed to reset the dma

Fixes: 803fc61df261 ("net: stmmac: dwmac-loongson: Add Loongson Multi-channels GMAC support")
Cc: stable@vger.kernel.org
Signed-off-by: Qunqin Zhao <zhaoqunqin@loongson.cn>
Reviewed-by: Huacai Chen <chenhuacai@loongson.cn>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Acked-by: Yanteng Si <si.yanteng@linux.dev>
Link: https://patch.msgid.link/20250219020701.15139-1-zhaoqunqin@loongson.cn
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c

index bfe6e2d631bdf53e71d182e1759d2e413f8a2348..f5acfb7d4ff655088ab4a9795726e82a4c7b0cd4 100644 (file)
@@ -516,6 +516,19 @@ static int loongson_dwmac_acpi_config(struct pci_dev *pdev,
        return 0;
 }
 
+/* Loongson's DWMAC device may take nearly two seconds to complete DMA reset */
+static int loongson_dwmac_fix_reset(void *priv, void __iomem *ioaddr)
+{
+       u32 value = readl(ioaddr + DMA_BUS_MODE);
+
+       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;
@@ -566,6 +579,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_dwmac_fix_reset;
        ld->dev = &pdev->dev;
        ld->loongson_id = readl(res.addr + GMAC_VERSION) & 0xff;