[PATCH v3 net] net: enetc: do not transmit redirected XDP frames when the link is down

Wei Fang posted 1 patch 5 days, 6 hours ago
drivers/net/ethernet/freescale/enetc/enetc.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH v3 net] net: enetc: do not transmit redirected XDP frames when the link is down
Posted by Wei Fang 5 days, 6 hours ago
In the current implementation, the enetc_xdp_xmit() always transmits
redirected XDP frames even if the link is down, but the frames cannot
be transmitted from TX BD rings when the link is down, so the frames
are still kept in the TX BD rings. If the XDP program is uninstalled,
users will see the following warning logs.

fsl_enetc 0000:00:00.0 eno0: timeout for tx ring #6 clear

More worse, the TX BD ring cannot work properly anymore, because the
HW PIR and CIR are not equal after the re-initialization of the TX
BD ring. At this point, the BDs between CIR and PIR are invalid,
which will cause a hardware malfunction.

Another reason is that there is internal context in the ring prefetch
logic that will retain the state from the first incarnation of the ring
and continue prefetching from the stale location when we re-initialize
the ring. The internal context is only reset by an FLR. That is to say,
for LS1028A ENETC, software cannot set the HW CIR and PIR when
initializing the TX BD ring.

It does not make sense to transmit redirected XDP frames when the link is
down. Add a link status check to prevent transmission in this condition.
This fixes part of the issue, but more complex cases remain. For example,
the TX BD ring may still contain unsent frames when the link goes down.
Those situations require additional patches, which will build on this
one.

Fixes: 9d2b68cc108d ("net: enetc: add support for XDP_REDIRECT")
Signed-off-by: Wei Fang <wei.fang@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>

---
v3 changes:
1. Improve the commit message
2. Collect Reviewed-by tag
v2: https://lore.kernel.org/imx/20251209135445.3443732-1-wei.fang@nxp.com/
v2 changes:
Improve the commit message
v1: https://lore.kernel.org/imx/20251205105307.2756994-1-wei.fang@nxp.com/
---
 drivers/net/ethernet/freescale/enetc/enetc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 0535e92404e3..f410c245ea91 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1778,7 +1778,8 @@ int enetc_xdp_xmit(struct net_device *ndev, int num_frames,
 	int xdp_tx_bd_cnt, i, k;
 	int xdp_tx_frm_cnt = 0;
 
-	if (unlikely(test_bit(ENETC_TX_DOWN, &priv->flags)))
+	if (unlikely(test_bit(ENETC_TX_DOWN, &priv->flags) ||
+		     !netif_carrier_ok(ndev)))
 		return -ENETDOWN;
 
 	enetc_lock_mdio();
-- 
2.34.1
Re: [PATCH v3 net] net: enetc: do not transmit redirected XDP frames when the link is down
Posted by Vladimir Oltean 4 days, 21 hours ago
On Thu, Dec 11, 2025 at 10:09:19AM +0800, Wei Fang wrote:
> In the current implementation, the enetc_xdp_xmit() always transmits
> redirected XDP frames even if the link is down, but the frames cannot
> be transmitted from TX BD rings when the link is down, so the frames
> are still kept in the TX BD rings. If the XDP program is uninstalled,
> users will see the following warning logs.
> 
> fsl_enetc 0000:00:00.0 eno0: timeout for tx ring #6 clear
> 
> More worse, the TX BD ring cannot work properly anymore, because the
> HW PIR and CIR are not equal after the re-initialization of the TX
> BD ring. At this point, the BDs between CIR and PIR are invalid,
> which will cause a hardware malfunction.
> 
> Another reason is that there is internal context in the ring prefetch
> logic that will retain the state from the first incarnation of the ring
> and continue prefetching from the stale location when we re-initialize
> the ring. The internal context is only reset by an FLR. That is to say,
> for LS1028A ENETC, software cannot set the HW CIR and PIR when
> initializing the TX BD ring.
> 
> It does not make sense to transmit redirected XDP frames when the link is
> down. Add a link status check to prevent transmission in this condition.
> This fixes part of the issue, but more complex cases remain. For example,
> the TX BD ring may still contain unsent frames when the link goes down.
> Those situations require additional patches, which will build on this
> one.
> 
> Fixes: 9d2b68cc108d ("net: enetc: add support for XDP_REDIRECT")
> Signed-off-by: Wei Fang <wei.fang@nxp.com>
> Reviewed-by: Frank Li <Frank.Li@nxp.com>
> 
> ---

More patches to fix the other conditions are coming. I can confirm that
they do not render this one useless. xdp_ok_fwd_dev() only tests that
the device is administratively up.

Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Re: [PATCH v3 net] net: enetc: do not transmit redirected XDP frames when the link is down
Posted by Hariprasad Kelam 4 days, 22 hours ago
On 2025-12-11 at 07:39:19, Wei Fang (wei.fang@nxp.com) wrote:
> In the current implementation, the enetc_xdp_xmit() always transmits
> redirected XDP frames even if the link is down, but the frames cannot
> be transmitted from TX BD rings when the link is down, so the frames
> are still kept in the TX BD rings. If the XDP program is uninstalled,
> users will see the following warning logs.
> 
> fsl_enetc 0000:00:00.0 eno0: timeout for tx ring #6 clear
> 
> More worse, the TX BD ring cannot work properly anymore, because the
> HW PIR and CIR are not equal after the re-initialization of the TX
> BD ring. At this point, the BDs between CIR and PIR are invalid,
> which will cause a hardware malfunction.
> 
> Another reason is that there is internal context in the ring prefetch
> logic that will retain the state from the first incarnation of the ring
> and continue prefetching from the stale location when we re-initialize
> the ring. The internal context is only reset by an FLR. That is to say,
> for LS1028A ENETC, software cannot set the HW CIR and PIR when
> initializing the TX BD ring.
> 
> It does not make sense to transmit redirected XDP frames when the link is
> down. Add a link status check to prevent transmission in this condition.
> This fixes part of the issue, but more complex cases remain. For example,
> the TX BD ring may still contain unsent frames when the link goes down.
> Those situations require additional patches, which will build on this
> one.
> 
> Fixes: 9d2b68cc108d ("net: enetc: add support for XDP_REDIRECT")
> Signed-off-by: Wei Fang <wei.fang@nxp.com>
> Reviewed-by: Frank Li <Frank.Li@nxp.com>
> 
> ---
> v3 changes:
> 1. Improve the commit message
> 2. Collect Reviewed-by tag
> v2: https://lore.kernel.org/imx/20251209135445.3443732-1-wei.fang@nxp.com/
> v2 changes:
> Improve the commit message
> v1: https://lore.kernel.org/imx/20251205105307.2756994-1-wei.fang@nxp.com/
> ---
>  drivers/net/ethernet/freescale/enetc/enetc.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
> index 0535e92404e3..f410c245ea91 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc.c
> +++ b/drivers/net/ethernet/freescale/enetc/enetc.c
> @@ -1778,7 +1778,8 @@ int enetc_xdp_xmit(struct net_device *ndev, int num_frames,
>  	int xdp_tx_bd_cnt, i, k;
>  	int xdp_tx_frm_cnt = 0;
>  
> -	if (unlikely(test_bit(ENETC_TX_DOWN, &priv->flags)))
> +	if (unlikely(test_bit(ENETC_TX_DOWN, &priv->flags) ||
> +		     !netif_carrier_ok(ndev)))
>  		return -ENETDOWN;
>  
>  	enetc_lock_mdio();
> -- 
> 2.34.1
> 
Reviewed-by: Hariprasad Kelam <hkelam@marvell.com>