forked from openwrt/openwrt
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bcm4908: fix Ethernet broken state after interface restart
This fixes traffic stalls after ifdown & ifup. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
- Loading branch information
Rafał Miłecki
committed
Jun 22, 2021
1 parent
85ce590
commit f8d5bd2
Showing
1 changed file
with
43 additions
and
0 deletions.
There are no files selected for viewing
43 changes: 43 additions & 0 deletions
43
.../linux/bcm4908/patches-5.4/170-net-broadcom-bcm4908_enet-reset-DMA-rings-sw-indexes.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||
Date: Tue, 22 Jun 2021 07:05:04 +0200 | ||
Subject: [PATCH] net: broadcom: bcm4908_enet: reset DMA rings sw indexes | ||
properly | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
Resetting software indexes in bcm4908_dma_alloc_buf_descs() is not | ||
enough as it's called during device probe only. Driver resets DMA on | ||
every .ndo_open callback and it's required to reset indexes then. | ||
|
||
This fixes inconsistent rings state and stalled traffic after interface | ||
down & up sequence. | ||
|
||
Fixes: 4feffeadbcb2 ("net: broadcom: bcm4908enet: add BCM4908 controller driver") | ||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||
--- | ||
drivers/net/ethernet/broadcom/bcm4908_enet.c | 6 +++--- | ||
1 file changed, 3 insertions(+), 3 deletions(-) | ||
|
||
--- a/drivers/net/ethernet/broadcom/bcm4908_enet.c | ||
+++ b/drivers/net/ethernet/broadcom/bcm4908_enet.c | ||
@@ -174,9 +174,6 @@ static int bcm4908_dma_alloc_buf_descs(s | ||
if (!ring->slots) | ||
goto err_free_buf_descs; | ||
|
||
- ring->read_idx = 0; | ||
- ring->write_idx = 0; | ||
- | ||
return 0; | ||
|
||
err_free_buf_descs: | ||
@@ -303,6 +300,9 @@ static void bcm4908_enet_dma_ring_init(s | ||
|
||
enet_write(enet, ring->st_ram_block + ENET_DMA_CH_STATE_RAM_BASE_DESC_PTR, | ||
(uint32_t)ring->dma_addr); | ||
+ | ||
+ ring->read_idx = 0; | ||
+ ring->write_idx = 0; | ||
} | ||
|
||
static void bcm4908_enet_dma_uninit(struct bcm4908_enet *enet) |