diff options
Diffstat (limited to 'drivers/net/phy/phy.c')
-rw-r--r-- | drivers/net/phy/phy.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index b2197b506acb..1e1fbb049ec6 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -811,6 +811,7 @@ void phy_state_machine(struct work_struct *work) | |||
811 | bool needs_aneg = false, do_suspend = false; | 811 | bool needs_aneg = false, do_suspend = false; |
812 | enum phy_state old_state; | 812 | enum phy_state old_state; |
813 | int err = 0; | 813 | int err = 0; |
814 | int old_link; | ||
814 | 815 | ||
815 | mutex_lock(&phydev->lock); | 816 | mutex_lock(&phydev->lock); |
816 | 817 | ||
@@ -896,11 +897,18 @@ void phy_state_machine(struct work_struct *work) | |||
896 | phydev->adjust_link(phydev->attached_dev); | 897 | phydev->adjust_link(phydev->attached_dev); |
897 | break; | 898 | break; |
898 | case PHY_RUNNING: | 899 | case PHY_RUNNING: |
899 | /* Only register a CHANGE if we are | 900 | /* Only register a CHANGE if we are polling or ignoring |
900 | * polling or ignoring interrupts | 901 | * interrupts and link changed since latest checking. |
901 | */ | 902 | */ |
902 | if (!phy_interrupt_is_valid(phydev)) | 903 | if (!phy_interrupt_is_valid(phydev)) { |
903 | phydev->state = PHY_CHANGELINK; | 904 | old_link = phydev->link; |
905 | err = phy_read_status(phydev); | ||
906 | if (err) | ||
907 | break; | ||
908 | |||
909 | if (old_link != phydev->link) | ||
910 | phydev->state = PHY_CHANGELINK; | ||
911 | } | ||
904 | break; | 912 | break; |
905 | case PHY_CHANGELINK: | 913 | case PHY_CHANGELINK: |
906 | err = phy_read_status(phydev); | 914 | err = phy_read_status(phydev); |