From: Heiner Kallweit Date: Thu, 30 Nov 2017 22:57:00 +0000 (+0100) Subject: net: phy: core: don't disable device interrupts in phy_change X-Git-Tag: v5.15~9522^2~435 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c34bc2b5059c515aebc3dde4c34baba6db3fd43f;p=platform%2Fkernel%2Flinux-starfive.git net: phy: core: don't disable device interrupts in phy_change If state is not PHY_HALTED I see no need to temporarily disable interrupts on the device. As long as the current interrupt isn't acked on the device no new interrupt can happen anyway. In addition remove a unneeded enabling of interrupts in the state machine when handling state PHY_CHANGELINK. Tested on a Odroid-C2 with RTL8211F phy in interrupt mode. Signed-off-by: Heiner Kallweit Signed-off-by: David S. Miller --- diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index b410e0c..944143b 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -730,8 +730,9 @@ void phy_change(struct phy_device *phydev) !phydev->drv->did_interrupt(phydev)) return; - if (phy_disable_interrupts(phydev)) - goto phy_err; + if (phydev->state == PHY_HALTED) + if (phy_disable_interrupts(phydev)) + goto phy_err; } mutex_lock(&phydev->lock); @@ -739,15 +740,11 @@ void phy_change(struct phy_device *phydev) phydev->state = PHY_CHANGELINK; mutex_unlock(&phydev->lock); - if (phy_interrupt_is_valid(phydev)) { - /* Reenable interrupts */ - if (PHY_HALTED != phydev->state && - phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED)) - goto phy_err; - } - /* reschedule state queue work to run as soon as possible */ phy_trigger_machine(phydev, true); + + if (phy_interrupt_is_valid(phydev) && phy_clear_interrupt(phydev)) + goto phy_err; return; phy_err: @@ -987,10 +984,6 @@ void phy_state_machine(struct work_struct *work) phydev->state = PHY_NOLINK; phy_link_down(phydev, true); } - - if (phy_interrupt_is_valid(phydev)) - err = phy_config_interrupt(phydev, - PHY_INTERRUPT_ENABLED); break; case PHY_HALTED: if (phydev->link) {