RE: [PATCH v4 net 0/2] net: enetc: safely reinitialize TX BD ring when it has unsent frames
From: Wei Fang
Date: Fri Mar 13 2026 - 05:15:57 EST
> Currently the driver does not reset the producer index register (PIR) and
> consumer index register (CIR) when initializing a TX BD ring. The driver
> only reads the PIR and CIR and initializes the software indexes. If the
> TX BD ring is reinitialized when it still contains unsent frames, its PIR
> and CIR will not be equal after the reinitialization. However, the BDs
> between CIR and PIR have been freed and become invalid and this can lead
> to a hardware malfunction, causing the TX BD ring will not work perperly.
>
> Since the PIR and CIR are sofeware-configurable on ENETC v4. Therefore,
> the driver must reset them if they are not equal when reinitializing
> the TX BD ring.
>
> However, resetting the PIR and CIR alone is insufficient, it cannot
> completely solve the problem. When a link-down event occurs while the TX
> BD ring is transmitting frames, subsequent reinitialization of the TX BD
> ring may cause it to malfunction. Because enetc4_pl_mac_link_down() only
> clears PMa_COMMAND_CONFIG[TX_EN] to disable MAC transmit data path. It
> doesn't set PORT[TXDIS] to 1 to flush the TX BD ring. Therefore, it is
> not safe to reinitialize the TX BD ring at this point.
>
> To safely reinitialize the TX BD ring after a link-down event, we checked
> with the NETC IP team, a proper Ethernet MAC graceful stop is necessary.
> Therefore, add the Ethernet MAC graceful stop to the link-down event
> handler enetc4_pl_mac_link_down(). Note that this patch set is not
> applicable to ENETC v1 (LS1028A).
>
> ---
> v4:
> Correct the offset of ENETC4_PSR
> v3 link:
> https://lore.kernel.org/imx/20260311084105.3982037-1-wei.fang@xxxxxxx/
> v3:
> 1. Split the v2 patch into two parts
> 2. Update the comments regarding PIR and CIR in enetc_setup_txbdr()
> 3. Use read_poll_timeout() instead of the while loop
> v2 link:
> https://lore.kernel.org/imx/20260309030412.2716984-1-wei.fang@xxxxxxx/
> v2:
> 1. Remove unused register macros (ENETC_SISR and SISR_TX_BUSY)
> 2. Remove spurious semicolon from enetc4_mac_wait_rx_empty()
> ---
>
> Wei Fang (2):
> net: enetc: reset PIR and CIR if they are not equal when initializing
> TX ring
> net: enetc: add graceful stop to safely reinitialize the TX Ring
>
> drivers/net/ethernet/freescale/enetc/enetc.c | 13 +-
> .../net/ethernet/freescale/enetc/enetc4_hw.h | 11 ++
> .../net/ethernet/freescale/enetc/enetc4_pf.c | 111 +++++++++++++++---
> 3 files changed, 120 insertions(+), 15 deletions(-)
>
> --
> 2.34.1
After communicating with Claudiu, the patch still has a minor flaw: some registers
do not exist on pseudo MAC, and the driver does not prevent access, although it
does not cause any problems.
I will add a new patch to this patch set to fix the issue.
--
pw-bot: cr