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 'eth-common-fault-irq-support'

Suraj Jaiswal says:

====================
Ethernet common fault IRQ support

Changes since v13:
- Update correct sender email

Changes since v12:
- Update correct sender email

Changes since v11:
- Update debug message print

Changes since v10:
- Update commit message

Changes since v9:
- prevent race condition of safety IRQ handling

Changes since v8:
- Use shared IRQ for sfty
- update error message

Changes since v7:
- Add support of common sfty irq on stmmac_request_irq_multi_msi.
- Remove uncecessary blank line.

Changes since v6:
- use name sfty_irq instead of safety_common_irq.

Changes since v5:
- Add description of ECC, DPP, FSM

Changes since v4:
- Fix DT_CHECKER warning
- use name safety for the IRQ.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+61 -7
+6 -3
Documentation/devicetree/bindings/net/qcom,ethqos.yaml
··· 37 37 items: 38 38 - description: Combined signal for various interrupt events 39 39 - description: The interrupt that occurs when Rx exits the LPI state 40 + - description: The interrupt that occurs when HW safety error triggered 40 41 41 42 interrupt-names: 42 43 minItems: 1 43 44 items: 44 45 - const: macirq 45 - - const: eth_lpi 46 + - enum: [eth_lpi, sfty] 47 + - const: sfty 46 48 47 49 clocks: 48 50 maxItems: 4 ··· 91 89 <&gcc GCC_ETH_PTP_CLK>, 92 90 <&gcc GCC_ETH_RGMII_CLK>; 93 91 interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>, 94 - <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>; 95 - interrupt-names = "macirq", "eth_lpi"; 92 + <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>, 93 + <GIC_SPI 782 IRQ_TYPE_LEVEL_HIGH>; 94 + interrupt-names = "macirq", "eth_lpi", "sfty"; 96 95 97 96 rx-fifo-depth = <4096>; 98 97 tx-fifo-depth = <4096>;
+4 -2
Documentation/devicetree/bindings/net/snps,dwmac.yaml
··· 108 108 - description: Combined signal for various interrupt events 109 109 - description: The interrupt to manage the remote wake-up packet detection 110 110 - description: The interrupt that occurs when Rx exits the LPI state 111 + - description: The interrupt that occurs when HW safety error triggered 111 112 112 113 interrupt-names: 113 114 minItems: 1 114 115 items: 115 116 - const: macirq 116 - - enum: [eth_wake_irq, eth_lpi] 117 - - const: eth_lpi 117 + - enum: [eth_wake_irq, eth_lpi, sfty] 118 + - enum: [eth_wake_irq, eth_lpi, sfty] 119 + - enum: [eth_wake_irq, eth_lpi, sfty] 118 120 119 121 clocks: 120 122 minItems: 1
+1
drivers/net/ethernet/stmicro/stmmac/common.h
··· 371 371 REQ_IRQ_ERR_ALL, 372 372 REQ_IRQ_ERR_TX, 373 373 REQ_IRQ_ERR_RX, 374 + REQ_IRQ_ERR_SFTY, 374 375 REQ_IRQ_ERR_SFTY_UE, 375 376 REQ_IRQ_ERR_SFTY_CE, 376 377 REQ_IRQ_ERR_LPI,
+3
drivers/net/ethernet/stmicro/stmmac/stmmac.h
··· 31 31 int wol_irq; 32 32 int lpi_irq; 33 33 int irq; 34 + int sfty_irq; 34 35 int sfty_ce_irq; 35 36 int sfty_ue_irq; 36 37 int rx_irq[MTL_MAX_RX_QUEUES]; ··· 299 298 void __iomem *ptpaddr; 300 299 void __iomem *estaddr; 301 300 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 301 + int sfty_irq; 302 302 int sfty_ce_irq; 303 303 int sfty_ue_irq; 304 304 int rx_irq[MTL_MAX_RX_QUEUES]; ··· 308 306 char int_name_mac[IFNAMSIZ + 9]; 309 307 char int_name_wol[IFNAMSIZ + 9]; 310 308 char int_name_lpi[IFNAMSIZ + 9]; 309 + char int_name_sfty[IFNAMSIZ + 10]; 311 310 char int_name_sfty_ce[IFNAMSIZ + 10]; 312 311 char int_name_sfty_ue[IFNAMSIZ + 10]; 313 312 char int_name_rx_irq[MTL_MAX_TX_QUEUES][IFNAMSIZ + 14];
+39 -2
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 3597 3597 if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) 3598 3598 free_irq(priv->wol_irq, dev); 3599 3599 fallthrough; 3600 + case REQ_IRQ_ERR_SFTY: 3601 + if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) 3602 + free_irq(priv->sfty_irq, dev); 3603 + fallthrough; 3600 3604 case REQ_IRQ_ERR_WOL: 3601 3605 free_irq(dev->irq, dev); 3602 3606 fallthrough; ··· 3667 3663 "%s: alloc lpi MSI %d (error: %d)\n", 3668 3664 __func__, priv->lpi_irq, ret); 3669 3665 irq_err = REQ_IRQ_ERR_LPI; 3666 + goto irq_error; 3667 + } 3668 + } 3669 + 3670 + /* Request the common Safety Feature Correctible/Uncorrectible 3671 + * Error line in case of another line is used 3672 + */ 3673 + if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) { 3674 + int_name = priv->int_name_sfty; 3675 + sprintf(int_name, "%s:%s", dev->name, "safety"); 3676 + ret = request_irq(priv->sfty_irq, stmmac_safety_interrupt, 3677 + 0, int_name, dev); 3678 + if (unlikely(ret < 0)) { 3679 + netdev_err(priv->dev, 3680 + "%s: alloc sfty MSI %d (error: %d)\n", 3681 + __func__, priv->sfty_irq, ret); 3682 + irq_err = REQ_IRQ_ERR_SFTY; 3670 3683 goto irq_error; 3671 3684 } 3672 3685 } ··· 3821 3800 "%s: ERROR: allocating the LPI IRQ %d (%d)\n", 3822 3801 __func__, priv->lpi_irq, ret); 3823 3802 irq_err = REQ_IRQ_ERR_LPI; 3803 + goto irq_error; 3804 + } 3805 + } 3806 + 3807 + /* Request the common Safety Feature Correctible/Uncorrectible 3808 + * Error line in case of another line is used 3809 + */ 3810 + if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) { 3811 + ret = request_irq(priv->sfty_irq, stmmac_safety_interrupt, 3812 + IRQF_SHARED, dev->name, dev); 3813 + if (unlikely(ret < 0)) { 3814 + netdev_err(priv->dev, 3815 + "%s: ERROR: allocating the sfty IRQ %d (%d)\n", 3816 + __func__, priv->sfty_irq, ret); 3817 + irq_err = REQ_IRQ_ERR_SFTY; 3824 3818 goto irq_error; 3825 3819 } 3826 3820 } ··· 6099 6063 if (test_bit(STMMAC_DOWN, &priv->state)) 6100 6064 return IRQ_HANDLED; 6101 6065 6102 - /* Check if a fatal error happened */ 6103 - if (stmmac_safety_feat_interrupt(priv)) 6066 + /* Check ASP error if it isn't delivered via an individual IRQ */ 6067 + if (priv->sfty_irq <= 0 && stmmac_safety_feat_interrupt(priv)) 6104 6068 return IRQ_HANDLED; 6105 6069 6106 6070 /* To handle Common interrupts */ ··· 7549 7513 priv->dev->irq = res->irq; 7550 7514 priv->wol_irq = res->wol_irq; 7551 7515 priv->lpi_irq = res->lpi_irq; 7516 + priv->sfty_irq = res->sfty_irq; 7552 7517 priv->sfty_ce_irq = res->sfty_ce_irq; 7553 7518 priv->sfty_ue_irq = res->sfty_ue_irq; 7554 7519 for (i = 0; i < MTL_MAX_RX_QUEUES; i++)
+8
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
··· 743 743 dev_info(&pdev->dev, "IRQ eth_lpi not found\n"); 744 744 } 745 745 746 + stmmac_res->sfty_irq = 747 + platform_get_irq_byname_optional(pdev, "sfty"); 748 + if (stmmac_res->sfty_irq < 0) { 749 + if (stmmac_res->sfty_irq == -EPROBE_DEFER) 750 + return -EPROBE_DEFER; 751 + dev_info(&pdev->dev, "IRQ sfty not found\n"); 752 + } 753 + 746 754 stmmac_res->addr = devm_platform_ioremap_resource(pdev, 0); 747 755 748 756 return PTR_ERR_OR_ZERO(stmmac_res->addr);