]> Git Repo - linux.git/commitdiff
net: stmmac: dwmac4: extend timeout for VLAN Tag register busy bit check
authorShenwei Wang <[email protected]>
Tue, 24 Sep 2024 20:54:24 +0000 (15:54 -0500)
committerPaolo Abeni <[email protected]>
Tue, 1 Oct 2024 10:35:55 +0000 (12:35 +0200)
Increase the timeout for checking the busy bit of the VLAN Tag register
from 10µs to 500ms. This change is necessary to accommodate scenarios
where Energy Efficient Ethernet (EEE) is enabled.

Overnight testing revealed that when EEE is active, the busy bit can
remain set for up to approximately 300ms. The new 500ms timeout provides
a safety margin.

Fixes: ed64639bc1e0 ("net: stmmac: Add support for VLAN Rx filtering")
Reviewed-by: Andrew Lunn <[email protected]>
Signed-off-by: Shenwei Wang <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Paolo Abeni <[email protected]>
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c

index a1858f083eef884a4aac484d39903b2e2efe431f..e65a65666cc1dee57cfe71eb5f7e17373ddb3e42 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/slab.h>
 #include <linux/ethtool.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include "stmmac.h"
 #include "stmmac_pcs.h"
 #include "dwmac4.h"
@@ -471,7 +472,7 @@ static int dwmac4_write_vlan_filter(struct net_device *dev,
                                    u8 index, u32 data)
 {
        void __iomem *ioaddr = (void __iomem *)dev->base_addr;
-       int i, timeout = 10;
+       int ret;
        u32 val;
 
        if (index >= hw->num_vlan)
@@ -487,16 +488,15 @@ static int dwmac4_write_vlan_filter(struct net_device *dev,
 
        writel(val, ioaddr + GMAC_VLAN_TAG);
 
-       for (i = 0; i < timeout; i++) {
-               val = readl(ioaddr + GMAC_VLAN_TAG);
-               if (!(val & GMAC_VLAN_TAG_CTRL_OB))
-                       return 0;
-               udelay(1);
+       ret = readl_poll_timeout(ioaddr + GMAC_VLAN_TAG, val,
+                                !(val & GMAC_VLAN_TAG_CTRL_OB),
+                                1000, 500000);
+       if (ret) {
+               netdev_err(dev, "Timeout accessing MAC_VLAN_Tag_Filter\n");
+               return -EBUSY;
        }
 
-       netdev_err(dev, "Timeout accessing MAC_VLAN_Tag_Filter\n");
-
-       return -EBUSY;
+       return 0;
 }
 
 static int dwmac4_add_hw_vlan_rx_fltr(struct net_device *dev,
This page took 0.057604 seconds and 4 git commands to generate.