]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: sun8i_emac: Fix MAC soft reset
authorAndre Przywara <andre.przywara@arm.com>
Mon, 6 Jul 2020 00:40:42 +0000 (01:40 +0100)
committerJagan Teki <jagan@amarulasolutions.com>
Wed, 21 Oct 2020 18:14:52 +0000 (23:44 +0530)
The EMAC soft reset routine was subtly broken, using an open coded
timeout routine without any actual delay.
Remove the unneeded initial reset bit read, and call wait_for_bit_le32()
to handle the timeout correctly.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Tested-by: Amit Singh Tomar <amittomer25@gmail.com> # Pine64+
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
drivers/net/sun8i_emac.c

index 1ae5bfd38832d3e1c55d21d7853a67a10769bca5..f7c55b3c961ae25813c1fa582809574e829c246c 100644 (file)
@@ -447,22 +447,15 @@ static void tx_descs_init(struct emac_eth_dev *priv)
 static int sun8i_emac_eth_start(struct udevice *dev)
 {
        struct emac_eth_dev *priv = dev_get_priv(dev);
-       u32 reg;
-       int timeout = 100;
        int ret;
 
-       reg = readl((priv->mac_reg + EMAC_CTL1));
-
-       if (!(reg & 0x1)) {
-               /* Soft reset MAC */
-               setbits_le32((priv->mac_reg + EMAC_CTL1), 0x1);
-               do {
-                       reg = readl(priv->mac_reg + EMAC_CTL1);
-               } while ((reg & 0x01) != 0 &&  (--timeout));
-               if (!timeout) {
-                       printf("%s: Timeout\n", __func__);
-                       return -1;
-               }
+       /* Soft reset MAC */
+       writel(EMAC_CTL1_SOFT_RST, priv->mac_reg + EMAC_CTL1);
+       ret = wait_for_bit_le32(priv->mac_reg + EMAC_CTL1,
+                               EMAC_CTL1_SOFT_RST, false, 10, true);
+       if (ret) {
+               printf("%s: Timeout\n", __func__);
+               return ret;
        }
 
        /* Rewrite mac address after reset */