]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: remove support for lpi_intr_o
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 3 Feb 2026 16:50:41 +0000 (16:50 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 5 Feb 2026 04:55:48 +0000 (20:55 -0800)
The dwmac databook for v3.74a states that lpi_intr_o is a sideband
signal which should be used to ungate the application clock, and this
signal is synchronous to the receive clock. The receive clock can run
at 2.5, 25 or 125MHz depending on the media speed, and can stop under
the control of the link partner. This means that the time it takes to
clear is dependent on the negotiated media speed, and thus can be 8,
40, or 400ns after reading the LPI control and status register.

It has been observed with some aggressive link partners, this clock
can stop while lpi_intr_o is still asserted, meaning that the signal
remains asserted for an indefinite period that the local system has
no direct control over.

The LPI interrupts will still be signalled through the main interrupt
path in any case, and this path is not dependent on the receive clock.

This, since we do not gate the application clock, and the chances of
adding clock gating in the future are slim due to the clocks being
ill-defined, lpi_intr_o serves no useful purpose. Remove the code which
requests the interrupt, and all associated code.

Reported-by: Ovidiu Panait <ovidiu.panait.rb@renesas.com>
Tested-by: Ovidiu Panait <ovidiu.panait.rb@renesas.com> # Renesas RZ/V2H board
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vnJbt-00000007YYN-28nm@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
include/linux/stmmac.h

index 1c5a4af85b589f2a6ef467cfb667b899fc0b02f9..d26e8a06302243fdfd59585330b006e915b38e03 100644 (file)
@@ -394,7 +394,6 @@ enum request_irq_err {
        REQ_IRQ_ERR_SFTY,
        REQ_IRQ_ERR_SFTY_UE,
        REQ_IRQ_ERR_SFTY_CE,
-       REQ_IRQ_ERR_LPI,
        REQ_IRQ_ERR_WOL,
        REQ_IRQ_ERR_MAC,
        REQ_IRQ_ERR_NO,
index aad1be1ec4c11c3da8a1f56cdc200250b7f2d1d9..92d77b0c2f54b62510da59714a1bc84b746dae7d 100644 (file)
@@ -719,7 +719,6 @@ static int intel_mgbe_common_data(struct pci_dev *pdev,
 
        /* Setup MSI vector offset specific to Intel mGbE controller */
        plat->msi_mac_vec = 29;
-       plat->msi_lpi_vec = 28;
        plat->msi_sfty_ce_vec = 27;
        plat->msi_sfty_ue_vec = 26;
        plat->msi_rx_base_vec = 0;
@@ -1177,8 +1176,6 @@ static int stmmac_config_multi_msi(struct pci_dev *pdev,
                res->irq = pci_irq_vector(pdev, plat->msi_mac_vec);
        if (plat->msi_wol_vec < STMMAC_MSI_VEC_MAX)
                res->wol_irq = pci_irq_vector(pdev, plat->msi_wol_vec);
-       if (plat->msi_lpi_vec < STMMAC_MSI_VEC_MAX)
-               res->lpi_irq = pci_irq_vector(pdev, plat->msi_lpi_vec);
        if (plat->msi_sfty_ce_vec < STMMAC_MSI_VEC_MAX)
                res->sfty_ce_irq = pci_irq_vector(pdev, plat->msi_sfty_ce_vec);
        if (plat->msi_sfty_ue_vec < STMMAC_MSI_VEC_MAX)
@@ -1294,7 +1291,6 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
         */
        plat->msi_mac_vec = STMMAC_MSI_VEC_MAX;
        plat->msi_wol_vec = STMMAC_MSI_VEC_MAX;
-       plat->msi_lpi_vec = STMMAC_MSI_VEC_MAX;
        plat->msi_sfty_ce_vec = STMMAC_MSI_VEC_MAX;
        plat->msi_sfty_ue_vec = STMMAC_MSI_VEC_MAX;
        plat->msi_rx_base_vec = STMMAC_MSI_VEC_MAX;
index ed0b534d8d7b04712227e36991b69c9d5ff5011f..d66ae6ea4df5f8211fabf851a0fa8c28d287c565 100644 (file)
@@ -442,13 +442,6 @@ static int loongson_dwmac_dt_config(struct pci_dev *pdev,
                res->wol_irq = res->irq;
        }
 
-       res->lpi_irq = of_irq_get_byname(np, "eth_lpi");
-       if (res->lpi_irq < 0) {
-               dev_err(&pdev->dev, "IRQ eth_lpi not found\n");
-               ret = -ENODEV;
-               goto err_put_node;
-       }
-
        ret = device_get_phy_mode(&pdev->dev);
        if (ret < 0) {
                dev_err(&pdev->dev, "phy_mode not found\n");
index 5bd97aaaba867b3e9b1b08893d9d2d369323b990..51c96a738151b7b0866b257796d1da583011f014 100644 (file)
@@ -31,7 +31,6 @@ struct stmmac_resources {
        void __iomem *addr;
        u8 mac[ETH_ALEN];
        int wol_irq;
-       int lpi_irq;
        int irq;
        int sfty_irq;
        int sfty_ce_irq;
@@ -297,7 +296,6 @@ struct stmmac_priv {
        int wol_irq;
        u32 gmii_address_bus_config;
        struct timer_list eee_ctrl_timer;
-       int lpi_irq;
        u32 tx_lpi_timer;
        bool tx_lpi_clk_stop;
        bool eee_enabled;
index d561b0a0f5ac62677c89776f7cef209e5d4364c4..b756a0f09e1a9d6817e00815a6894850581cf0f7 100644 (file)
@@ -3769,10 +3769,6 @@ static void stmmac_free_irq(struct net_device *dev,
                        free_irq(priv->sfty_ce_irq, dev);
                fallthrough;
        case REQ_IRQ_ERR_SFTY_CE:
-               if (priv->lpi_irq > 0 && priv->lpi_irq != dev->irq)
-                       free_irq(priv->lpi_irq, dev);
-               fallthrough;
-       case REQ_IRQ_ERR_LPI:
                if (priv->wol_irq > 0 && priv->wol_irq != dev->irq)
                        free_irq(priv->wol_irq, dev);
                fallthrough;
@@ -3830,24 +3826,6 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev)
                }
        }
 
-       /* Request the LPI IRQ in case of another line
-        * is used for LPI
-        */
-       if (priv->lpi_irq > 0 && priv->lpi_irq != dev->irq) {
-               int_name = priv->int_name_lpi;
-               sprintf(int_name, "%s:%s", dev->name, "lpi");
-               ret = request_irq(priv->lpi_irq,
-                                 stmmac_mac_interrupt,
-                                 0, int_name, dev);
-               if (unlikely(ret < 0)) {
-                       netdev_err(priv->dev,
-                                  "%s: alloc lpi MSI %d (error: %d)\n",
-                                  __func__, priv->lpi_irq, ret);
-                       irq_err = REQ_IRQ_ERR_LPI;
-                       goto irq_error;
-               }
-       }
-
        /* Request the common Safety Feature Correctible/Uncorrectible
         * Error line in case of another line is used
         */
@@ -3987,19 +3965,6 @@ static int stmmac_request_irq_single(struct net_device *dev)
                }
        }
 
-       /* Request the IRQ lines */
-       if (priv->lpi_irq > 0 && priv->lpi_irq != dev->irq) {
-               ret = request_irq(priv->lpi_irq, stmmac_interrupt,
-                                 IRQF_SHARED, dev->name, dev);
-               if (unlikely(ret < 0)) {
-                       netdev_err(priv->dev,
-                                  "%s: ERROR: allocating the LPI IRQ %d (%d)\n",
-                                  __func__, priv->lpi_irq, ret);
-                       irq_err = REQ_IRQ_ERR_LPI;
-                       goto irq_error;
-               }
-       }
-
        /* Request the common Safety Feature Correctible/Uncorrectible
         * Error line in case of another line is used
         */
@@ -7782,7 +7747,6 @@ static int __stmmac_dvr_probe(struct device *device,
 
        priv->dev->irq = res->irq;
        priv->wol_irq = res->wol_irq;
-       priv->lpi_irq = res->lpi_irq;
        priv->sfty_irq = res->sfty_irq;
        priv->sfty_ce_irq = res->sfty_ce_irq;
        priv->sfty_ue_irq = res->sfty_ue_irq;
index 8979a50b550707ec38ea178a37209b7af9dafc66..5c9fd91a1db9d6f85a18fd997ac4a970157ec59f 100644 (file)
@@ -725,14 +725,6 @@ int stmmac_get_platform_resources(struct platform_device *pdev,
                stmmac_res->wol_irq = stmmac_res->irq;
        }
 
-       stmmac_res->lpi_irq =
-               platform_get_irq_byname_optional(pdev, "eth_lpi");
-       if (stmmac_res->lpi_irq < 0) {
-               if (stmmac_res->lpi_irq == -EPROBE_DEFER)
-                       return -EPROBE_DEFER;
-               dev_info(&pdev->dev, "IRQ eth_lpi not found\n");
-       }
-
        stmmac_res->sfty_irq =
                platform_get_irq_byname_optional(pdev, "sfty");
        if (stmmac_res->sfty_irq < 0) {
index 2ea109bb44610f8f6927aebe51015ea73871ab40..32352a216567e29b6bbfbdf8dc7913812b379247 100644 (file)
@@ -300,7 +300,6 @@ struct plat_stmmacenet_data {
        int int_snapshot_num;
        int msi_mac_vec;
        int msi_wol_vec;
-       int msi_lpi_vec;
        int msi_sfty_ce_vec;
        int msi_sfty_ue_vec;
        int msi_rx_base_vec;