• Tim Beale's avatar
    net: phy: Make sure phy_start() always re-enables the phy interrupts · c15e10e7
    Tim Beale authored
    This is an alternative way of fixing:
     commit db9683fb ("net: phy: Make sure PHY_RESUMING state change
                          is always processed")
    
    When the PHY state transitions from PHY_HALTED to PHY_RESUMING, there are
    two things we need to do:
    1). Re-enable interrupts (and power up the physical link, if powered down)
    2). Update the PHY state and net-device based on the link status.
    
    There's no strict reason why #1 has to be done from within the main
    phy_state_machine() function. There is a risk that other changes to the
    PHY (e.g. setting speed/duplex, which calls phy_start_aneg()) could cause
    a subsequent state transition before phy_state_machine() has processed
    the PHY_RESUMING state change. This would leave the PHY with interrupts
    disabled and/or still in the BMCR_PDOWN/low-power mode.
    
    Moving enabling the interrupts and phy_resume() into phy_start() will
    guarantee this work always gets done. As the PHY is already in the HALTED
    state and interrupts are disabled, it shouldn't conflict with any work
    being done in phy_state_machine(). The downside of this change is that if
    the PHY_RESUMING state is ever entered from anywhere else, it'll also have
    to repeat this work.
    Signed-off-by: default avatarTim Beale <tim.beale@alliedtelesis.co.nz>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c15e10e7
phy.c 30.4 KB