net: phy: Make sure phy_start() always re-enables the phy interrupts
authorTim Beale <tim.beale@alliedtelesis.co.nz>
Mon, 18 May 2015 03:38:38 +0000 (15:38 +1200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 20 May 2015 16:22:08 +0000 (12:22 -0400)
commitc15e10e71ce3b4ee78d85d80102a9621cde1edbd
tree51f55dc4cd4bd6e6f082f36ec6b9d081deb4ecad
parent7764b9dd38f31ce58e6f764e2d7d8399d9b62486
net: phy: Make sure phy_start() always re-enables the phy interrupts

This is an alternative way of fixing:
 commit db9683fb412d ("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: Tim Beale <tim.beale@alliedtelesis.co.nz>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy.c