[][MAC80211][hnat][Fix ETH bring up issue for the mt7622]
[Description]
Fix ETH bring up issue for the mt7622.
The mtk_probe() function cannot request an interrupt because some
legacy platforms do not have individual PDMA interrupts.
Therefore, we add an MTK_PDMA_INT flag to bypass requesting the PDMA
interrupt in this case.
Without this patch, the ETH cannot be brought up on the MT7622.
[Release-log]
N/A
Change-Id: Ib88e7744b004dfadf6738ab20a3d012157d9c34d
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8187283
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3003-add-wed.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3003-add-wed.patch
index ae4e9c1..09502e9 100644
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3003-add-wed.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3003-add-wed.patch
@@ -206,8 +206,8 @@
+ mtk_wed_add_hw(np, eth, wdma, i);
+ }
+
- for (i = 0; i < MTK_PDMA_IRQ_NUM; i++)
- eth->irq_pdma[i] = platform_get_irq(pdev, i);
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_PDMA_INT)) {
+ for (i = 0; i < MTK_PDMA_IRQ_NUM; i++)
@@ -5170,10 +5200,11 @@ static int mtk_probe(struct platform_device *pdev)
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index c679247..6cf9fc5 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3898,7 +3898,12 @@
/* FE int grouping */
mtk_w32(eth, MTK_TX_DONE_INT, reg_map->qdma.int_grp);
mtk_w32(eth, MTK_RX_DONE_INT(0), reg_map->qdma.int_grp2);
- mtk_w32(eth, 0x210FFFF2, MTK_FE_INT_GRP);
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_PDMA_INT))
+ mtk_w32(eth, 0x210FFFF2, MTK_FE_INT_GRP);
+ else {
+ mtk_w32(eth, MTK_RX_DONE_INT(0), reg_map->pdma.int_grp);
+ mtk_w32(eth, 0x210F2FF3, MTK_FE_INT_GRP);
+ }
mtk_w32(eth, MTK_FE_INT_TSO_FAIL |
MTK_FE_INT_TSO_ILLEGAL | MTK_FE_INT_TSO_ALIGN |
MTK_FE_INT_RFIFO_OV | MTK_FE_INT_RFIFO_UF, MTK_FE_INT_ENABLE);
@@ -5035,15 +5040,19 @@
}
}
- for (i = 0; i < MTK_PDMA_IRQ_NUM; i++)
- eth->irq_pdma[i] = platform_get_irq(pdev, i);
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_PDMA_INT)) {
+ for (i = 0; i < MTK_PDMA_IRQ_NUM; i++)
+ eth->irq_pdma[i] = platform_get_irq(pdev, i);
+ }
for (i = 0; i < MTK_FE_IRQ_NUM; i++) {
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT) && i > 0)
eth->irq_fe[i] = eth->irq_fe[0];
- else
+ else if (MTK_HAS_CAPS(eth->soc->caps, MTK_PDMA_INT))
eth->irq_fe[i] =
platform_get_irq(pdev, i + MTK_PDMA_IRQ_NUM);
+ else
+ eth->irq_fe[i] = platform_get_irq(pdev, i);
if (eth->irq_fe[i] < 0) {
dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
@@ -5125,39 +5134,55 @@
if (err)
goto err_free_dev;
- err = devm_request_irq(eth->dev, eth->irq_fe[2],
- mtk_handle_fe_irq, 0,
- dev_name(eth->dev), eth);
- if (err)
- goto err_free_dev;
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_PDMA_INT)) {
+ err = devm_request_irq(eth->dev, eth->irq_fe[2],
+ mtk_handle_fe_irq, 0,
+ dev_name(eth->dev), eth);
+ if (err)
+ goto err_free_dev;
- err = devm_request_irq(eth->dev, eth->irq_pdma[0],
- mtk_handle_irq_rx, IRQF_SHARED,
- dev_name(eth->dev), ð->rx_napi[0]);
- if (err)
- goto err_free_dev;
+ err = devm_request_irq(eth->dev, eth->irq_pdma[0],
+ mtk_handle_irq_rx, IRQF_SHARED,
+ dev_name(eth->dev), ð->rx_napi[0]);
+ if (err)
+ goto err_free_dev;
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSS)) {
- for (i = 0; i < MTK_RX_RSS_NUM; i++) {
- err = devm_request_irq(eth->dev,
- eth->irq_pdma[MTK_RSS_RING(i)],
- mtk_handle_irq_rx, IRQF_SHARED,
- dev_name(eth->dev),
- ð->rx_napi[MTK_RSS_RING(i)]);
- if (err)
- goto err_free_dev;
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSS)) {
+ for (i = 0; i < MTK_RX_RSS_NUM; i++) {
+ err = devm_request_irq(eth->dev,
+ eth->irq_pdma[MTK_RSS_RING(i)],
+ mtk_handle_irq_rx, IRQF_SHARED,
+ dev_name(eth->dev),
+ ð->rx_napi[MTK_RSS_RING(i)]);
+ if (err)
+ goto err_free_dev;
+ }
}
- }
+
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO)) {
+ i = (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_RX_V2) ||
+ MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3)) ? 0 : 1;
+ for (; i < MTK_HW_LRO_RING_NUM; i++) {
+ err = devm_request_irq(eth->dev,
+ eth->irq_pdma[i],
+ mtk_handle_irq_rx, IRQF_SHARED,
+ dev_name(eth->dev),
+ ð->rx_napi[MTK_HW_LRO_RING(i)]);
+ if (err)
+ goto err_free_dev;
+ }
+ }
+ } else {
+ err = devm_request_irq(eth->dev, eth->irq_fe[2],
+ mtk_handle_irq_rx, 0,
+ dev_name(eth->dev), ð->rx_napi[0]);
+ if (err)
+ goto err_free_dev;
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO)) {
- i = (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_RX_V2) ||
- MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3)) ? 0 : 1;
- for (; i < MTK_HW_LRO_RING_NUM; i++) {
- err = devm_request_irq(eth->dev,
- eth->irq_pdma[i],
- mtk_handle_irq_rx, IRQF_SHARED,
- dev_name(eth->dev),
- ð->rx_napi[MTK_HW_LRO_RING(i)]);
+ if (MTK_FE_IRQ_NUM > 3) {
+ err = devm_request_irq(eth->dev, eth->irq_fe[3],
+ mtk_handle_fe_irq, 0,
+ dev_name(eth->dev), eth);
if (err)
goto err_free_dev;
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h
index 0e658b0..7811de7 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -92,7 +92,11 @@
#define MTK_FE_INT_RFIFO_UF BIT(19)
#define MTK_GDM1_AF BIT(28)
#define MTK_GDM2_AF BIT(29)
+#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
#define MTK_FE_IRQ_NUM (4)
+#else
+#define MTK_FE_IRQ_NUM (3)
+#endif
#define MTK_PDMA_IRQ_NUM (4)
#define MTK_MAX_IRQ_NUM (MTK_FE_IRQ_NUM + MTK_PDMA_IRQ_NUM)
@@ -1396,6 +1400,7 @@
MTK_HWLRO_BIT,
MTK_RSS_BIT,
MTK_SHARED_INT_BIT,
+ MTK_PDMA_INT_BIT,
MTK_TRGMII_MT7621_CLK_BIT,
MTK_QDMA_BIT,
MTK_NETSYS_V1_BIT,
@@ -1447,6 +1452,7 @@
#define MTK_HWLRO BIT_ULL(MTK_HWLRO_BIT)
#define MTK_RSS BIT_ULL(MTK_RSS_BIT)
#define MTK_SHARED_INT BIT_ULL(MTK_SHARED_INT_BIT)
+#define MTK_PDMA_INT BIT_ULL(MTK_PDMA_INT_BIT)
#define MTK_TRGMII_MT7621_CLK BIT_ULL(MTK_TRGMII_MT7621_CLK_BIT)
#define MTK_QDMA BIT_ULL(MTK_QDMA_BIT)
#define MTK_NETSYS_V1 BIT_ULL(MTK_NETSYS_V1_BIT)
@@ -1556,17 +1562,17 @@
MTK_MUX_U3_GMAC2_TO_QPHY | MTK_NETSYS_V1 | \
MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA)
-#define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \
+#define MT7986_CAPS (MTK_PDMA_INT | MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \
MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
- MTK_NETSYS_V2 | MTK_RSS)
+ MTK_NETSYS_V2 | MTK_RSS)
-#define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \
- MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
- MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \
- MTK_NETSYS_V2 | MTK_RSS)
+#define MT7981_CAPS (MTK_PDMA_INT | MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \
+ MTK_GMAC2_GEPHY | MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
+ MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \
+ MTK_NETSYS_V2 | MTK_RSS)
#define MT7988_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC3_SGMII | \
- MTK_MUX_GMAC123_TO_GEPHY_SGMII | MTK_QDMA | \
+ MTK_PDMA_INT | MTK_MUX_GMAC123_TO_GEPHY_SGMII | MTK_QDMA | \
MTK_NETSYS_V3 | MTK_RSTCTRL_PPE1 | MTK_RSTCTRL_PPE2 | \
MTK_GMAC1_USXGMII | MTK_GMAC2_USXGMII | \
MTK_GMAC3_USXGMII | MTK_MUX_GMAC123_TO_USXGMII | \