net: phy: fix PHY_RUNNING in phy_state_machine
Currently, if phy state is PHY_RUNNING, we always register a CHANGE when phy works in polling or interrupt ignored, this will make the adjust_link being called even the phy link did Not changed. checking the phy link to make sure the link did changed before we register a CHANGE, if link did not changed, we do nothing. Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5d37852bf7
commit
11e122cbe9
|
@ -811,6 +811,7 @@ void phy_state_machine(struct work_struct *work)
|
|||
bool needs_aneg = false, do_suspend = false;
|
||||
enum phy_state old_state;
|
||||
int err = 0;
|
||||
int old_link;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
|
||||
|
@ -896,11 +897,18 @@ void phy_state_machine(struct work_struct *work)
|
|||
phydev->adjust_link(phydev->attached_dev);
|
||||
break;
|
||||
case PHY_RUNNING:
|
||||
/* Only register a CHANGE if we are
|
||||
* polling or ignoring interrupts
|
||||
/* Only register a CHANGE if we are polling or ignoring
|
||||
* interrupts and link changed since latest checking.
|
||||
*/
|
||||
if (!phy_interrupt_is_valid(phydev))
|
||||
phydev->state = PHY_CHANGELINK;
|
||||
if (!phy_interrupt_is_valid(phydev)) {
|
||||
old_link = phydev->link;
|
||||
err = phy_read_status(phydev);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
if (old_link != phydev->link)
|
||||
phydev->state = PHY_CHANGELINK;
|
||||
}
|
||||
break;
|
||||
case PHY_CHANGELINK:
|
||||
err = phy_read_status(phydev);
|
||||
|
|
Loading…
Reference in New Issue