[PATCH] net: designware: improve ethernet DMA reset
Neil Armstrong
narmstrong at baylibre.com
Mon Jul 26 09:38:18 CEST 2021
Hi,
On 21/07/2021 08:19, Artem Lapkin wrote:
> Problem: uboot ethernet always have "DMA reset timeout" after
> linux usage, detected on VIM2 VIM3 VIM3L amlogic devices,
> mainline uboot and mainline linux > 5.1? .
>
> How-to reproduce:
>
> 1) Poweron device => ethernet uboot work fine.
> 2) Linux start and ethernet interface up and same works.
> 3) Reboot to uboot again and we cant use ethernet anymore.
> uboot always have "DMA reset timeout" inside designware_eth_init()
> only poweroff/poweron cycle can solve this problem.
>
> Solution: add phy_reset() into waiting DMA reset cycle,
> this insertion doesn't break normal behaviour (maybe).
>
> Note: same need explore real problem why its happens! because this
> patch may be just hack.
Interesting, maybe add this phy_reset() call only if the GPIO reset is not available ?
Neil
>
> Signed-off-by: Artem Lapkin <art at khadas.com>
> ---
> drivers/net/designware.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/net/designware.c b/drivers/net/designware.c
> index 5d92257e..6485c46d 100644
> --- a/drivers/net/designware.c
> +++ b/drivers/net/designware.c
> @@ -371,6 +371,7 @@ int designware_eth_init(struct dw_eth_dev *priv, u8 *enetaddr)
> struct eth_dma_regs *dma_p = priv->dma_regs_p;
> unsigned int start;
> int ret;
> + int phy_reset_force = 0;
>
> writel(readl(&dma_p->busmode) | DMAMAC_SRST, &dma_p->busmode);
>
> @@ -389,6 +390,9 @@ int designware_eth_init(struct dw_eth_dev *priv, u8 *enetaddr)
> printf("DMA reset timeout\n");
> return -ETIMEDOUT;
> }
> + // forced phy reset after 0.2s can help with DMAMAC_SRST
> + if (phy_reset_force++ == 2)
> + phy_reset(priv->phydev);
>
> mdelay(100);
> };
>
More information about the U-Boot
mailing list