forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
generic: 6.6: mtk_eth_soc: reset all TX queues on DMA free
The purpose of resetting the TX queue is to reset the byte and packet count as well as to clear the software flow control XOFF bit. MediaTek developers pointed out that netdev_reset_queue would only resets queue 0 of the network device. Queues that are not reset may cause unexpected issues. Packets may stop being sent after reset and "transmit timeout" log may be displayed. Import fix from MediaTek's SDK to resolve this issue. Link: https://git01.mediatek.com/plugins/gitiles/openwrt/feeds/mtk-openwrt-feeds/+/5746a94456f466446cc0dcdfbd9078df6df31b63 Signed-off-by: Daniel Golle <[email protected]>
- Loading branch information
Showing
2 changed files
with
58 additions
and
9 deletions.
There are no files selected for viewing
49 changes: 49 additions & 0 deletions
49
.../linux/generic/pending-6.6/730-net-ethernet-mtk_eth_soc-reset-all-TX-queues-on-DMA-.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,49 @@ | ||
From 7d41a5a8e9c91cc6bb011dd953570738583dd091 Mon Sep 17 00:00:00 2001 | ||
From: Daniel Golle <[email protected]> | ||
Date: Wed, 18 Sep 2024 02:01:01 +0100 | ||
Subject: [PATCH] net: ethernet: mtk_eth_soc: reset all TX queues on DMA free | ||
|
||
The purpose of resetting the TX queue is to reset the | ||
byte and packet count as well as to clear the software | ||
flow control XOFF bit. | ||
|
||
MediaTek developers pointed out that netdev_reset_queue would only | ||
resets queue 0 of the network device. | ||
Queues that are not reset may cause unexpected issues. | ||
|
||
Packets may stop being sent after reset and "transmit timeout" log may | ||
be displayed. | ||
|
||
Import fix from MediaTek's SDK to resolve this issue. | ||
|
||
Signed-off-by: Daniel Golle <[email protected]> | ||
--- | ||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 18 ++++++++++++++---- | ||
1 file changed, 14 insertions(+), 4 deletions(-) | ||
|
||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||
@@ -3135,11 +3135,19 @@ static int mtk_dma_init(struct mtk_eth * | ||
static void mtk_dma_free(struct mtk_eth *eth) | ||
{ | ||
const struct mtk_soc_data *soc = eth->soc; | ||
- int i; | ||
+ int i, j, txqs = 1; | ||
+ | ||
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) | ||
+ txqs = MTK_QDMA_NUM_QUEUES; | ||
+ | ||
+ for (i = 0; i < MTK_MAX_DEVS; i++) { | ||
+ if (!eth->netdev[i]) | ||
+ continue; | ||
+ | ||
+ for (j = 0; j < txqs; j++) | ||
+ netdev_tx_reset_queue(netdev_get_tx_queue(eth->netdev[i], j)); | ||
+ } | ||
|
||
- for (i = 0; i < MTK_MAX_DEVS; i++) | ||
- if (eth->netdev[i]) | ||
- netdev_reset_queue(eth->netdev[i]); | ||
if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && eth->scratch_ring) { | ||
dma_free_coherent(eth->dma_dev, | ||
MTK_QDMA_RING_SIZE * soc->tx.desc_size, |
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 |
---|---|---|
|
@@ -490,7 +490,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
.mac_finish = mtk_mac_finish, | ||
.mac_link_down = mtk_mac_link_down, | ||
.mac_link_up = mtk_mac_link_up, | ||
@@ -3407,6 +3548,9 @@ static int mtk_open(struct net_device *d | ||
@@ -3415,6 +3556,9 @@ static int mtk_open(struct net_device *d | ||
|
||
ppe_num = eth->soc->ppe_num; | ||
|
||
|
@@ -500,7 +500,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); | ||
if (err) { | ||
netdev_err(dev, "%s: could not attach PHY: %d\n", __func__, | ||
@@ -3557,6 +3701,9 @@ static int mtk_stop(struct net_device *d | ||
@@ -3565,6 +3709,9 @@ static int mtk_stop(struct net_device *d | ||
for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) | ||
mtk_ppe_stop(eth->ppe[i]); | ||
|
||
|
@@ -510,15 +510,15 @@ Signed-off-by: Daniel Golle <[email protected]> | |
return 0; | ||
} | ||
|
||
@@ -4570,6 +4717,7 @@ static const struct net_device_ops mtk_n | ||
@@ -4578,6 +4725,7 @@ static const struct net_device_ops mtk_n | ||
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) | ||
{ | ||
const __be32 *_id = of_get_property(np, "reg", NULL); | ||
+ struct device_node *pcs_np; | ||
phy_interface_t phy_mode; | ||
struct phylink *phylink; | ||
struct mtk_mac *mac; | ||
@@ -4606,16 +4754,41 @@ static int mtk_add_mac(struct mtk_eth *e | ||
@@ -4614,16 +4762,41 @@ static int mtk_add_mac(struct mtk_eth *e | ||
mac->id = id; | ||
mac->hw = eth; | ||
mac->of_node = np; | ||
|
@@ -568,7 +568,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
} | ||
|
||
memset(mac->hwlro_ip, 0, sizeof(mac->hwlro_ip)); | ||
@@ -4698,8 +4871,21 @@ static int mtk_add_mac(struct mtk_eth *e | ||
@@ -4706,8 +4879,21 @@ static int mtk_add_mac(struct mtk_eth *e | ||
phy_interface_zero(mac->phylink_config.supported_interfaces); | ||
__set_bit(PHY_INTERFACE_MODE_INTERNAL, | ||
mac->phylink_config.supported_interfaces); | ||
|
@@ -590,7 +590,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
phylink = phylink_create(&mac->phylink_config, | ||
of_fwnode_handle(mac->of_node), | ||
phy_mode, &mtk_phylink_ops); | ||
@@ -4750,6 +4936,26 @@ free_netdev: | ||
@@ -4758,6 +4944,26 @@ free_netdev: | ||
return err; | ||
} | ||
|
||
|
@@ -617,7 +617,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev) | ||
{ | ||
struct net_device *dev, *tmp; | ||
@@ -4896,7 +5102,8 @@ static int mtk_probe(struct platform_dev | ||
@@ -4904,7 +5110,8 @@ static int mtk_probe(struct platform_dev | ||
regmap_write(cci, 0, 3); | ||
} | ||
|
||
|
@@ -627,7 +627,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
err = mtk_sgmii_init(eth); | ||
|
||
if (err) | ||
@@ -5007,6 +5214,24 @@ static int mtk_probe(struct platform_dev | ||
@@ -5015,6 +5222,24 @@ static int mtk_probe(struct platform_dev | ||
} | ||
} | ||
|
||
|
@@ -652,7 +652,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) { | ||
err = devm_request_irq(eth->dev, eth->irq[0], | ||
mtk_handle_irq, 0, | ||
@@ -5110,6 +5335,11 @@ static int mtk_remove(struct platform_de | ||
@@ -5118,6 +5343,11 @@ static int mtk_remove(struct platform_de | ||
mtk_stop(eth->netdev[i]); | ||
mac = netdev_priv(eth->netdev[i]); | ||
phylink_disconnect_phy(mac->phylink); | ||
|