In commit 99537d5c476c ("net: macb: Relocate mog_init_rings() callback
from macb_mac_link_up() to macb_open()"), the mog_init_rings() callback
was moved from macb_mac_link_up() to macb_open() to resolve a deadlock
issue. However, this change introduced a tx/rx malfunction following
phy link down and up events. The issue arises from a mismatch between
the software queue->tx_head, queue->tx_tail, queue->rx_prepared_head,
and queue->rx_tail values and the hardware's internal tx/rx queue
pointers.

According to the Zynq UltraScale TRM [1], when tx/rx is disabled, the
internal tx queue pointer resets to the value in the tx queue base
address register, while the internal rx queue pointer remains unchanged.
The following is quoted from the Zynq UltraScale TRM:
  When transmit is disabled, with bit [3] of the network control register
  set low, the transmit-buffer queue pointer resets to point to the address
  indicated by the transmit-buffer queue base address register. Disabling
  receive does not have the same effect on the receive-buffer queue
  pointer.

Additionally, there is no need to reset the RBQP and TBQP registers in a
phy event callback. Therefore, move macb_init_buffers() to macb_open().
In a phy link up event, the only required action is to reset the tx
software head and tail pointers to align with the hardware's behavior.

[1] https://docs.amd.com/v/u/en-US/ug1085-zynq-ultrascale-trm

Fixes: 99537d5c476c ("net: macb: Relocate mog_init_rings() callback from 
macb_mac_link_up() to macb_open()")
Signed-off-by: Kevin Hao <[email protected]>
Cc: [email protected]
---
Hi Bruce,

Could you please help merge this patch into the following linux-yocto branches?
  v6.12/standard/base
  v6.6/standard/base
  v6.1/standard/base

This patch fixes a critical bug that can halt the MACB Ethernet controller’s 
TX/RX
during a simple PHY link down‑up sequence. It affects multiple boards (including
Raspberry Pi 4/5, Xilinx Zynq, ZynqMP, and Versal) and is currently blocking
testing and release for several related BSPs supported by linux-yocto kernel.

I submitted the fix [1] upstream two days ago but have not yet received 
feedback.
Given the broad impact, I propose we merge it into linux-yocto now to unblock
affected BSPs. If the community requests changes later, I am prepared to follow
up with additional patches.

[1] 
https://lore.kernel.org/r/[email protected]
---
 drivers/net/ethernet/cadence/macb_main.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cadence/macb_main.c 
b/drivers/net/ethernet/cadence/macb_main.c
index 
095c1cfcc9a1d4158ca614119f9fdaba069e7939..f258c4b82c74d7d25aeaa1f2b3b61d671a1befce
 100644
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
@@ -756,14 +756,12 @@ static void macb_mac_link_up(struct phylink_config 
*config,
                if (rx_pause)
                        ctrl |= MACB_BIT(PAE);
 
-               /* Initialize rings & buffers as clearing MACB_BIT(TE) in link 
down
-                * cleared the pipeline and control registers.
-                */
-               macb_init_buffers(bp);
-
-               for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, 
++queue)
+               for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, 
++queue) {
+                       queue->tx_head = 0;
+                       queue->tx_tail = 0;
                        queue_writel(queue, IER,
                                     bp->rx_intr_mask | MACB_TX_INT_FLAGS | 
MACB_BIT(HRESP));
+               }
        }
 
        macb_or_gem_writel(bp, NCFGR, ctrl);
@@ -2985,6 +2983,7 @@ static int macb_open(struct net_device *dev)
        }
 
        bp->macbgem_ops.mog_init_rings(bp);
+       macb_init_buffers(bp);
 
        for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
                napi_enable(&queue->napi_rx);

---
base-commit: a7fbaf7533ae7ebc35f56c0dfb86970eda4d721c
change-id: 20260210-yocto-v6-12-macb-688d0359c94d

Best regards,
-- 
Kevin Hao <[email protected]>

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#16293): 
https://lists.yoctoproject.org/g/linux-yocto/message/16293
Mute This Topic: https://lists.yoctoproject.org/mt/117731832/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to