Skip to content
/ linux Public

Commit ec4445a

Browse files
haokexinSasha Levin
authored andcommitted
net: macb: Fix tx/rx malfunction after phy link down and up
[ Upstream commit bf9cf80 ] In commit 99537d5 ("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: 99537d5 ("net: macb: Relocate mog_init_rings() callback from macb_mac_link_up() to macb_open()") Signed-off-by: Kevin Hao <haokexin@gmail.com> Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260208-macb-init-ring-v1-1-939a32c14635@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 013ac46 commit ec4445a

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

drivers/net/ethernet/cadence/macb_main.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -756,14 +756,12 @@ static void macb_mac_link_up(struct phylink_config *config,
756756
if (rx_pause)
757757
ctrl |= MACB_BIT(PAE);
758758

759-
/* Initialize rings & buffers as clearing MACB_BIT(TE) in link down
760-
* cleared the pipeline and control registers.
761-
*/
762-
macb_init_buffers(bp);
763-
764-
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue)
759+
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
760+
queue->tx_head = 0;
761+
queue->tx_tail = 0;
765762
queue_writel(queue, IER,
766763
bp->rx_intr_mask | MACB_TX_INT_FLAGS | MACB_BIT(HRESP));
764+
}
767765
}
768766

769767
macb_or_gem_writel(bp, NCFGR, ctrl);
@@ -2953,6 +2951,7 @@ static int macb_open(struct net_device *dev)
29532951
}
29542952

29552953
bp->macbgem_ops.mog_init_rings(bp);
2954+
macb_init_buffers(bp);
29562955

29572956
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
29582957
napi_enable(&queue->napi_rx);

0 commit comments

Comments
 (0)