Patch "net: phy: fix IRQ-based wake-on-lan over hibernate / power off" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: phy: fix IRQ-based wake-on-lan over hibernate / power off

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-phy-fix-irq-based-wake-on-lan-over-hibernate-pow.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6196aea3df115e9019bc697b3d07d7f29c3b46a5
Author: Russell King (Oracle) <rmk+kernel@xxxxxxxxxxxxxxx>
Date:   Fri Aug 11 11:26:30 2023 +0100

    net: phy: fix IRQ-based wake-on-lan over hibernate / power off
    
    [ Upstream commit cc941e548bffc01b5816b4edc5cb432a137a58b3 ]
    
    Uwe reports:
    "Most PHYs signal WoL using an interrupt. So disabling interrupts [at
    shutdown] breaks WoL at least on PHYs covered by the marvell driver."
    
    Discussing with Ioana, the problem which was trying to be solved was:
    "The board in question is a LS1021ATSN which has two AR8031 PHYs that
    share an interrupt line. In case only one of the PHYs is probed and
    there are pending interrupts on the PHY#2 an IRQ storm will happen
    since there is no entity to clear the interrupt from PHY#2's registers.
    PHY#1's driver will get stuck in .handle_interrupt() indefinitely."
    
    Further confirmation that "the two AR8031 PHYs are on the same MDIO
    bus."
    
    With WoL using interrupts to wake the system, in such a case, the
    system will begin booting with an asserted interrupt. Thus, we need to
    cope with an interrupt asserted during boot.
    
    Solve this instead by disabling interrupts during PHY probe. This will
    ensure in Ioana's situation that both PHYs of the same type sharing an
    interrupt line on a common MDIO bus will have their interrupt outputs
    disabled when the driver probes the device, but before we hook in any
    interrupt handlers - thus avoiding the interrupt storm.
    
    A better fix would be for platform firmware to disable the interrupting
    devices at source during boot, before control is handed to the kernel.
    
    Fixes: e2f016cf7751 ("net: phy: add a shutdown procedure")
    Link: 20230804071757.383971-1-u.kleine-koenig@xxxxxxxxxxxxxx
    Reported-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@xxxxxxxxxxxxxxx>
    Reviewed-by: Andrew Lunn <andrew@xxxxxxx>
    Reviewed-by: Florian Fainelli <florian.fainelli@xxxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 2c4e6de8f4d9f..7958ea0e8714a 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -3217,6 +3217,8 @@ static int phy_probe(struct device *dev)
 			goto out;
 	}
 
+	phy_disable_interrupts(phydev);
+
 	/* Start out supporting everything. Eventually,
 	 * a controller will attach, and may modify one
 	 * or both of these values
@@ -3334,16 +3336,6 @@ static int phy_remove(struct device *dev)
 	return 0;
 }
 
-static void phy_shutdown(struct device *dev)
-{
-	struct phy_device *phydev = to_phy_device(dev);
-
-	if (phydev->state == PHY_READY || !phydev->attached_dev)
-		return;
-
-	phy_disable_interrupts(phydev);
-}
-
 /**
  * phy_driver_register - register a phy_driver with the PHY layer
  * @new_driver: new phy_driver to register
@@ -3377,7 +3369,6 @@ int phy_driver_register(struct phy_driver *new_driver, struct module *owner)
 	new_driver->mdiodrv.driver.bus = &mdio_bus_type;
 	new_driver->mdiodrv.driver.probe = phy_probe;
 	new_driver->mdiodrv.driver.remove = phy_remove;
-	new_driver->mdiodrv.driver.shutdown = phy_shutdown;
 	new_driver->mdiodrv.driver.owner = owner;
 	new_driver->mdiodrv.driver.probe_type = PROBE_FORCE_SYNCHRONOUS;
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux