hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/net/phy/phy.c
....@@ -56,6 +56,18 @@
5656 return NULL;
5757 }
5858
59
+static void phy_process_state_change(struct phy_device *phydev,
60
+ enum phy_state old_state)
61
+{
62
+ if (old_state != phydev->state) {
63
+ phydev_dbg(phydev, "PHY state change %s -> %s\n",
64
+ phy_state_to_str(old_state),
65
+ phy_state_to_str(phydev->state));
66
+ if (phydev->drv && phydev->drv->link_change_notify)
67
+ phydev->drv->link_change_notify(phydev);
68
+ }
69
+}
70
+
5971 static void phy_link_up(struct phy_device *phydev)
6072 {
6173 phydev->phy_link_change(phydev, true);
....@@ -1110,6 +1122,7 @@
11101122 void phy_stop(struct phy_device *phydev)
11111123 {
11121124 struct net_device *dev = phydev->attached_dev;
1125
+ enum phy_state old_state;
11131126
11141127 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN) {
11151128 WARN(1, "called from state %s\n",
....@@ -1118,6 +1131,7 @@
11181131 }
11191132
11201133 mutex_lock(&phydev->lock);
1134
+ old_state = phydev->state;
11211135
11221136 if (phydev->state == PHY_CABLETEST) {
11231137 phy_abort_cable_test(phydev);
....@@ -1128,6 +1142,7 @@
11281142 sfp_upstream_stop(phydev->sfp_bus);
11291143
11301144 phydev->state = PHY_HALTED;
1145
+ phy_process_state_change(phydev, old_state);
11311146
11321147 mutex_unlock(&phydev->lock);
11331148
....@@ -1242,13 +1257,7 @@
12421257 if (err < 0)
12431258 phy_error(phydev);
12441259
1245
- if (old_state != phydev->state) {
1246
- phydev_dbg(phydev, "PHY state change %s -> %s\n",
1247
- phy_state_to_str(old_state),
1248
- phy_state_to_str(phydev->state));
1249
- if (phydev->drv && phydev->drv->link_change_notify)
1250
- phydev->drv->link_change_notify(phydev);
1251
- }
1260
+ phy_process_state_change(phydev, old_state);
12521261
12531262 /* Only re-schedule a PHY state machine change if we are polling the
12541263 * PHY, if PHY_IGNORE_INTERRUPT is set, then we will be moving