Message ID | 20240924205424.573913-1-shenwei.wang@nxp.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v4,net] net: stmmac: dwmac4: extend timeout for VLAN Tag register busy bit check | expand |
On Tue, Sep 24, 2024 at 03:54:24PM GMT, Shenwei Wang wrote: > 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 <andrew@lunn.ch> > Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com> Looking good now. Thanks! Reviewed-by: Serge Semin <fancer.lancer@gmail.com> -Serge(y) > --- > Changes in V4: > - fixed the comments and R-b. > > Changes in V3: > - re-org the error-check flow per Serge's review. > > Changes in v2: > - replace the udelay with readl_poll_timeout per Simon's review. > > --- > .../net/ethernet/stmicro/stmmac/dwmac4_core.c | 18 +++++++++--------- > 1 file changed, 9 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > index a1858f083eef..e65a65666cc1 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > @@ -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, > -- > 2.34.1 >
On Tue, 24 Sep 2024 15:54:24 -0500 Shenwei Wang wrote: > 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 <andrew@lunn.ch> > Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com> FTR this was merged to net as commit 4c1b56671b6.
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c index a1858f083eef..e65a65666cc1 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c @@ -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,