This is a note to let you know that I've just added the patch titled net: phy: Avoid polling PHY with PHY_IGNORE_INTERRUPTS to the 4.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-avoid-polling-phy-with-phy_ignore_interrupts.patch and it can be found in the queue-4.4 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From d5c3d84657db57bd23ecd58b97f1c99dd42a7b80 Mon Sep 17 00:00:00 2001 From: Florian Fainelli <f.fainelli@xxxxxxxxx> Date: Mon, 18 Jan 2016 19:33:06 -0800 Subject: net: phy: Avoid polling PHY with PHY_IGNORE_INTERRUPTS From: Florian Fainelli <f.fainelli@xxxxxxxxx> commit d5c3d84657db57bd23ecd58b97f1c99dd42a7b80 upstream. Commit 2c7b49212a86 ("phy: fix the use of PHY_IGNORE_INTERRUPT") changed a hunk in phy_state_machine() in the PHY_RUNNING case which was not needed. The change essentially makes the PHY library treat PHY devices with PHY_IGNORE_INTERRUPT to keep polling for the PHY device, even though the intent is not to do it. Fix this by reverting that specific hunk, which makes the PHY state machine wait for state changes, and stay in the PHY_RUNNING state for as long as needed. Fixes: 2c7b49212a86 ("phy: fix the use of PHY_IGNORE_INTERRUPT") Signed-off-by: Florian Fainelli <f.fainelli@xxxxxxxxx> Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/net/phy/phy.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -912,10 +912,10 @@ void phy_state_machine(struct work_struc phydev->adjust_link(phydev->attached_dev); break; case PHY_RUNNING: - /* Only register a CHANGE if we are polling or ignoring - * interrupts and link changed since latest checking. + /* Only register a CHANGE if we are polling and link changed + * since latest checking. */ - if (!phy_interrupt_is_valid(phydev)) { + if (phydev->irq == PHY_POLL) { old_link = phydev->link; err = phy_read_status(phydev); if (err) @@ -1015,8 +1015,13 @@ void phy_state_machine(struct work_struc dev_dbg(&phydev->dev, "PHY state change %s -> %s\n", phy_state_to_str(old_state), phy_state_to_str(phydev->state)); - queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, - PHY_STATE_TIME * HZ); + /* Only re-schedule a PHY state machine change if we are polling the + * PHY, if PHY_IGNORE_INTERRUPT is set, then we will be moving + * between states from phy_mac_interrupt() + */ + if (phydev->irq == PHY_POLL) + queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, + PHY_STATE_TIME * HZ); } void phy_mac_interrupt(struct phy_device *phydev, int new_link) Patches currently in stable-queue which might be from f.fainelli@xxxxxxxxx are queue-4.4/net-phy-fix-phy_mac_interrupt.patch queue-4.4/mips-bmips-adjust-mips-hpt-frequency-for-bcm7435.patch queue-4.4/mips-bmips-clear-mips_cache_aliases-earlier.patch queue-4.4/net-phy-bcm7xxx-fix-shadow-mode-2-disabling.patch queue-4.4/mips-bmips-pretty-print-bmips5200-processor-name.patch queue-4.4/phy-fix-device-reference-leaks.patch queue-4.4/mips-bmips-bmips5000-has-i-cache-filing-from-d-cache.patch queue-4.4/mips-bmips-fix-prid_imp_bmips5000-masking-for-bmips5200.patch queue-4.4/mips-smp-update-cpu_foreign_map-on-cpu-disable.patch queue-4.4/mips-bmips-local_r4k___flush_cache_all-needs-to-blast-s-cache.patch queue-4.4/net-phy-avoid-polling-phy-with-phy_ignore_interrupts.patch