forked from immortalwrt/immortalwrt
-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
airoha: an7581: backport 2 fix for airoha ethernet driver
Backport 2 fix for airoha ethernet driver merged upstream. Signed-off-by: Christian Marangi <[email protected]>
- Loading branch information
Showing
2 changed files
with
137 additions
and
0 deletions.
There are no files selected for viewing
35 changes: 35 additions & 0 deletions
35
...x/airoha/patches-6.6/036-v6.13-net-airoha-Fix-typo-in-REG_CDM2_FWD_CFG-configuratio.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,35 @@ | ||
From 30d9d8f6a2d7e44a9f91737dd409dbc87ac6f6b7 Mon Sep 17 00:00:00 2001 | ||
From: Lorenzo Bianconi <[email protected]> | ||
Date: Tue, 15 Oct 2024 09:58:09 +0200 | ||
Subject: [PATCH] net: airoha: Fix typo in REG_CDM2_FWD_CFG configuration | ||
|
||
Fix typo in airoha_fe_init routine configuring CDM2_OAM_QSEL_MASK field | ||
of REG_CDM2_FWD_CFG register. | ||
This bug is not introducing any user visible problem since Frame Engine | ||
CDM2 port is used just by the second QDMA block and we currently enable | ||
just QDMA1 block connected to the MT7530 dsa switch via CDM1 port. | ||
|
||
Introduced by commit 23020f049327 ("net: airoha: Introduce ethernet | ||
support for EN7581 SoC") | ||
|
||
Reported-by: ChihWei Cheng <[email protected]> | ||
Signed-off-by: Lorenzo Bianconi <[email protected]> | ||
Reviewed-by: Simon Horman <[email protected]> | ||
Message-ID: <[email protected]> | ||
Signed-off-by: Andrew Lunn <[email protected]> | ||
--- | ||
drivers/net/ethernet/mediatek/airoha_eth.c | 3 ++- | ||
1 file changed, 2 insertions(+), 1 deletion(-) | ||
|
||
--- a/drivers/net/ethernet/mediatek/airoha_eth.c | ||
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c | ||
@@ -1369,7 +1369,8 @@ static int airoha_fe_init(struct airoha_ | ||
airoha_fe_set(eth, REG_GDM_MISC_CFG, | ||
GDM2_RDM_ACK_WAIT_PREF_MASK | | ||
GDM2_CHN_VLD_MODE_MASK); | ||
- airoha_fe_rmw(eth, REG_CDM2_FWD_CFG, CDM2_OAM_QSEL_MASK, 15); | ||
+ airoha_fe_rmw(eth, REG_CDM2_FWD_CFG, CDM2_OAM_QSEL_MASK, | ||
+ FIELD_PREP(CDM2_OAM_QSEL_MASK, 15)); | ||
|
||
/* init fragment and assemble Force Port */ | ||
/* NPU Core-3, NPU Bridge Channel-3 */ |
102 changes: 102 additions & 0 deletions
102
target/linux/airoha/patches-6.6/037-v6.14-net-airoha-Fix-error-path-in-airoha_probe.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,102 @@ | ||
From 0c7469ee718e1dd929f52bfb142a7f6fb68f0765 Mon Sep 17 00:00:00 2001 | ||
From: Lorenzo Bianconi <[email protected]> | ||
Date: Mon, 16 Dec 2024 18:47:33 +0100 | ||
Subject: [PATCH] net: airoha: Fix error path in airoha_probe() | ||
|
||
Do not run napi_disable() if airoha_hw_init() fails since Tx/Rx napi | ||
has not been started yet. In order to fix the issue, introduce | ||
airoha_qdma_stop_napi routine and remove napi_disable in | ||
airoha_hw_cleanup(). | ||
|
||
Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC") | ||
Reviewed-by: Michal Swiatkowski <[email protected]> | ||
Signed-off-by: Lorenzo Bianconi <[email protected]> | ||
Link: https://patch.msgid.link/20241216-airoha_probe-error-path-fix-v2-1-6b10e04e9a5c@kernel.org | ||
Signed-off-by: Jakub Kicinski <[email protected]> | ||
--- | ||
drivers/net/ethernet/mediatek/airoha_eth.c | 33 ++++++++++++++++------ | ||
1 file changed, 25 insertions(+), 8 deletions(-) | ||
|
||
--- a/drivers/net/ethernet/mediatek/airoha_eth.c | ||
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c | ||
@@ -2139,17 +2139,14 @@ static void airoha_hw_cleanup(struct air | ||
if (!qdma->q_rx[i].ndesc) | ||
continue; | ||
|
||
- napi_disable(&qdma->q_rx[i].napi); | ||
netif_napi_del(&qdma->q_rx[i].napi); | ||
airoha_qdma_cleanup_rx_queue(&qdma->q_rx[i]); | ||
if (qdma->q_rx[i].page_pool) | ||
page_pool_destroy(qdma->q_rx[i].page_pool); | ||
} | ||
|
||
- for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++) { | ||
- napi_disable(&qdma->q_tx_irq[i].napi); | ||
+ for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++) | ||
netif_napi_del(&qdma->q_tx_irq[i].napi); | ||
- } | ||
|
||
for (i = 0; i < ARRAY_SIZE(qdma->q_tx); i++) { | ||
if (!qdma->q_tx[i].ndesc) | ||
@@ -2174,6 +2171,21 @@ static void airoha_qdma_start_napi(struc | ||
} | ||
} | ||
|
||
+static void airoha_qdma_stop_napi(struct airoha_qdma *qdma) | ||
+{ | ||
+ int i; | ||
+ | ||
+ for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++) | ||
+ napi_disable(&qdma->q_tx_irq[i].napi); | ||
+ | ||
+ for (i = 0; i < ARRAY_SIZE(qdma->q_rx); i++) { | ||
+ if (!qdma->q_rx[i].ndesc) | ||
+ continue; | ||
+ | ||
+ napi_disable(&qdma->q_rx[i].napi); | ||
+ } | ||
+} | ||
+ | ||
static void airoha_update_hw_stats(struct airoha_gdm_port *port) | ||
{ | ||
struct airoha_eth *eth = port->qdma->eth; | ||
@@ -2731,7 +2743,7 @@ static int airoha_probe(struct platform_ | ||
|
||
err = airoha_hw_init(pdev, eth); | ||
if (err) | ||
- goto error; | ||
+ goto error_hw_cleanup; | ||
|
||
for (i = 0; i < ARRAY_SIZE(eth->qdma); i++) | ||
airoha_qdma_start_napi(ð->qdma[i]); | ||
@@ -2746,13 +2758,16 @@ static int airoha_probe(struct platform_ | ||
err = airoha_alloc_gdm_port(eth, np); | ||
if (err) { | ||
of_node_put(np); | ||
- goto error; | ||
+ goto error_napi_stop; | ||
} | ||
} | ||
|
||
return 0; | ||
|
||
-error: | ||
+error_napi_stop: | ||
+ for (i = 0; i < ARRAY_SIZE(eth->qdma); i++) | ||
+ airoha_qdma_stop_napi(ð->qdma[i]); | ||
+error_hw_cleanup: | ||
for (i = 0; i < ARRAY_SIZE(eth->qdma); i++) | ||
airoha_hw_cleanup(ð->qdma[i]); | ||
|
||
@@ -2773,8 +2788,10 @@ static void airoha_remove(struct platfor | ||
struct airoha_eth *eth = platform_get_drvdata(pdev); | ||
int i; | ||
|
||
- for (i = 0; i < ARRAY_SIZE(eth->qdma); i++) | ||
+ for (i = 0; i < ARRAY_SIZE(eth->qdma); i++) { | ||
+ airoha_qdma_stop_napi(ð->qdma[i]); | ||
airoha_hw_cleanup(ð->qdma[i]); | ||
+ } | ||
|
||
for (i = 0; i < ARRAY_SIZE(eth->ports); i++) { | ||
struct airoha_gdm_port *port = eth->ports[i]; |