Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'rework-irq-handling-in-mtk_eth_soc'

Frank Wunderlich says:

====================
rework IRQ handling in mtk_eth_soc

From: Frank Wunderlich <frank-w@public-files.de>

This series introduces named IRQs while keeping the index based way
for older dts.
Further it makes some cleanup like adding consts for index access and
avoids loading first IRQ which was not used on non SHARED_INT SoCs.
====================

Link: https://patch.msgid.link/20250619132125.78368-1-linux@fw-web.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+58 -18
+52 -17
drivers/net/ethernet/mediatek/mtk_eth_soc.c
··· 3336 3336 schedule_work(&eth->pending_work); 3337 3337 } 3338 3338 3339 + static int mtk_get_irqs(struct platform_device *pdev, struct mtk_eth *eth) 3340 + { 3341 + int i; 3342 + 3343 + /* future SoCs beginning with MT7988 should use named IRQs in dts */ 3344 + eth->irq[MTK_FE_IRQ_TX] = platform_get_irq_byname(pdev, "fe1"); 3345 + eth->irq[MTK_FE_IRQ_RX] = platform_get_irq_byname(pdev, "fe2"); 3346 + if (eth->irq[MTK_FE_IRQ_TX] >= 0 && eth->irq[MTK_FE_IRQ_RX] >= 0) 3347 + return 0; 3348 + 3349 + /* only use legacy mode if platform_get_irq_byname returned -ENXIO */ 3350 + if (eth->irq[MTK_FE_IRQ_TX] != -ENXIO) 3351 + return eth->irq[MTK_FE_IRQ_TX]; 3352 + 3353 + if (eth->irq[MTK_FE_IRQ_RX] != -ENXIO) 3354 + return eth->irq[MTK_FE_IRQ_RX]; 3355 + 3356 + /* legacy way: 3357 + * On MTK_SHARED_INT SoCs (MT7621 + MT7628) the first IRQ is taken 3358 + * from devicetree and used for both RX and TX - it is shared. 3359 + * On SoCs with non-shared IRQs the first entry is not used, 3360 + * the second is for TX, and the third is for RX. 3361 + */ 3362 + for (i = 0; i < MTK_FE_IRQ_NUM; i++) { 3363 + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) { 3364 + if (i == MTK_FE_IRQ_SHARED) 3365 + eth->irq[MTK_FE_IRQ_SHARED] = platform_get_irq(pdev, i); 3366 + else 3367 + eth->irq[i] = eth->irq[MTK_FE_IRQ_SHARED]; 3368 + } else { 3369 + eth->irq[i] = platform_get_irq(pdev, i + 1); 3370 + } 3371 + 3372 + if (eth->irq[i] < 0) { 3373 + dev_err(&pdev->dev, "no IRQ%d resource found\n", i); 3374 + return -ENXIO; 3375 + } 3376 + } 3377 + 3378 + return 0; 3379 + } 3380 + 3339 3381 static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth) 3340 3382 { 3341 3383 struct mtk_eth *eth = _eth; ··· 3431 3389 3432 3390 mtk_tx_irq_disable(eth, MTK_TX_DONE_INT); 3433 3391 mtk_rx_irq_disable(eth, eth->soc->rx.irq_done_mask); 3434 - mtk_handle_irq_rx(eth->irq[2], dev); 3392 + mtk_handle_irq_rx(eth->irq[MTK_FE_IRQ_RX], dev); 3435 3393 mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); 3436 3394 mtk_rx_irq_enable(eth, eth->soc->rx.irq_done_mask); 3437 3395 } ··· 4917 4875 eth->netdev[id]->features |= eth->soc->hw_features; 4918 4876 eth->netdev[id]->ethtool_ops = &mtk_ethtool_ops; 4919 4877 4920 - eth->netdev[id]->irq = eth->irq[0]; 4878 + eth->netdev[id]->irq = eth->irq[MTK_FE_IRQ_SHARED]; 4921 4879 eth->netdev[id]->dev.of_node = np; 4922 4880 4923 4881 if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) ··· 5147 5105 } 5148 5106 } 5149 5107 5150 - for (i = 0; i < 3; i++) { 5151 - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT) && i > 0) 5152 - eth->irq[i] = eth->irq[0]; 5153 - else 5154 - eth->irq[i] = platform_get_irq(pdev, i); 5155 - if (eth->irq[i] < 0) { 5156 - dev_err(&pdev->dev, "no IRQ%d resource found\n", i); 5157 - err = -ENXIO; 5158 - goto err_wed_exit; 5159 - } 5160 - } 5108 + err = mtk_get_irqs(pdev, eth); 5109 + if (err) 5110 + goto err_wed_exit; 5111 + 5161 5112 for (i = 0; i < ARRAY_SIZE(eth->clks); i++) { 5162 5113 eth->clks[i] = devm_clk_get(eth->dev, 5163 5114 mtk_clks_source_name[i]); ··· 5194 5159 } 5195 5160 5196 5161 if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) { 5197 - err = devm_request_irq(eth->dev, eth->irq[0], 5162 + err = devm_request_irq(eth->dev, eth->irq[MTK_FE_IRQ_SHARED], 5198 5163 mtk_handle_irq, 0, 5199 5164 dev_name(eth->dev), eth); 5200 5165 } else { 5201 - err = devm_request_irq(eth->dev, eth->irq[1], 5166 + err = devm_request_irq(eth->dev, eth->irq[MTK_FE_IRQ_TX], 5202 5167 mtk_handle_irq_tx, 0, 5203 5168 dev_name(eth->dev), eth); 5204 5169 if (err) 5205 5170 goto err_free_dev; 5206 5171 5207 - err = devm_request_irq(eth->dev, eth->irq[2], 5172 + err = devm_request_irq(eth->dev, eth->irq[MTK_FE_IRQ_RX], 5208 5173 mtk_handle_irq_rx, 0, 5209 5174 dev_name(eth->dev), eth); 5210 5175 } ··· 5250 5215 } else 5251 5216 netif_info(eth, probe, eth->netdev[i], 5252 5217 "mediatek frame engine at 0x%08lx, irq %d\n", 5253 - eth->netdev[i]->base_addr, eth->irq[0]); 5218 + eth->netdev[i]->base_addr, eth->irq[MTK_FE_IRQ_SHARED]); 5254 5219 } 5255 5220 5256 5221 /* we run 2 devices on the same DMA ring so we need a dummy device
+6 -1
drivers/net/ethernet/mediatek/mtk_eth_soc.h
··· 642 642 643 643 #define MTK_MAC_FSM(x) (0x1010C + ((x) * 0x100)) 644 644 645 + #define MTK_FE_IRQ_SHARED 0 646 + #define MTK_FE_IRQ_TX 0 647 + #define MTK_FE_IRQ_RX 1 648 + #define MTK_FE_IRQ_NUM (MTK_FE_IRQ_RX + 1) 649 + 645 650 struct mtk_rx_dma { 646 651 unsigned int rxd1; 647 652 unsigned int rxd2; ··· 1297 1292 struct net_device *dummy_dev; 1298 1293 struct net_device *netdev[MTK_MAX_DEVS]; 1299 1294 struct mtk_mac *mac[MTK_MAX_DEVS]; 1300 - int irq[3]; 1295 + int irq[MTK_FE_IRQ_NUM]; 1301 1296 u32 msg_enable; 1302 1297 unsigned long sysclk; 1303 1298 struct regmap *ethsys;