]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ethernet: mtk_eth_soc: support named IRQs
authorFrank Wunderlich <frank-w@public-files.de>
Thu, 19 Jun 2025 13:21:21 +0000 (15:21 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 24 Jun 2025 01:14:00 +0000 (18:14 -0700)
Add named interrupts and keep index based fallback for existing
devicetrees.

Currently only rx and tx IRQs are defined to be used with mt7988, but
later extended with RSS/LRO support.

Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250619132125.78368-2-linux@fw-web.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mediatek/mtk_eth_soc.c

index b38e4f2de6748e6e5a4a2d5a8b555c071731efdd..c5deb8183afe0f48d9d8f120108bec5e2ce46b87 100644 (file)
@@ -3336,6 +3336,37 @@ static void mtk_tx_timeout(struct net_device *dev, unsigned int txqueue)
        schedule_work(&eth->pending_work);
 }
 
+static int mtk_get_irqs(struct platform_device *pdev, struct mtk_eth *eth)
+{
+       int i;
+
+       /* future SoCs beginning with MT7988 should use named IRQs in dts */
+       eth->irq[1] = platform_get_irq_byname(pdev, "fe1");
+       eth->irq[2] = platform_get_irq_byname(pdev, "fe2");
+       if (eth->irq[1] >= 0 && eth->irq[2] >= 0)
+               return 0;
+
+       /* legacy way:
+        * On MTK_SHARED_INT SoCs (MT7621 + MT7628) the first IRQ is taken
+        * from devicetree and used for both RX and TX - it is shared.
+        * On SoCs with non-shared IRQs the first entry is not used,
+        * the second is for TX, and the third is for RX.
+        */
+       for (i = 0; i < 3; i++) {
+               if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT) && i > 0)
+                       eth->irq[i] = eth->irq[0];
+               else
+                       eth->irq[i] = platform_get_irq(pdev, i);
+
+               if (eth->irq[i] < 0) {
+                       dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
+                       return -ENXIO;
+               }
+       }
+
+       return 0;
+}
+
 static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth)
 {
        struct mtk_eth *eth = _eth;
@@ -5105,17 +5136,10 @@ static int mtk_probe(struct platform_device *pdev)
                }
        }
 
-       for (i = 0; i < 3; i++) {
-               if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT) && i > 0)
-                       eth->irq[i] = eth->irq[0];
-               else
-                       eth->irq[i] = platform_get_irq(pdev, i);
-               if (eth->irq[i] < 0) {
-                       dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
-                       err = -ENXIO;
-                       goto err_wed_exit;
-               }
-       }
+       err = mtk_get_irqs(pdev, eth);
+       if (err)
+               goto err_wed_exit;
+
        for (i = 0; i < ARRAY_SIZE(eth->clks); i++) {
                eth->clks[i] = devm_clk_get(eth->dev,
                                            mtk_clks_source_name[i]);