Skip to content

Commit 59ed446

Browse files
committed
Merge branch 'net-phy-improve-and-simplify-eee-handling-in-phylib'
Heiner Kallweit says: ==================== net: phy: improve and simplify EEE handling in phylib This series improves and simplifies phylib's EEE handling. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents fabcfd6 + 809265f commit 59ed446

File tree

4 files changed

+35
-50
lines changed

4 files changed

+35
-50
lines changed

drivers/net/phy/phy-c45.c

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -683,13 +683,10 @@ EXPORT_SYMBOL_GPL(genphy_c45_read_mdix);
683683
static int genphy_c45_write_eee_adv(struct phy_device *phydev,
684684
unsigned long *adv)
685685
{
686-
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
687686
int val, changed = 0;
688687

689-
linkmode_andnot(tmp, adv, phydev->eee_disabled_modes);
690-
691688
if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
692-
val = linkmode_to_mii_eee_cap1_t(tmp);
689+
val = linkmode_to_mii_eee_cap1_t(adv);
693690

694691
/* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
695692
* (Register 7.60)
@@ -707,7 +704,7 @@ static int genphy_c45_write_eee_adv(struct phy_device *phydev,
707704
}
708705

709706
if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
710-
val = linkmode_to_mii_eee_cap2_t(tmp);
707+
val = linkmode_to_mii_eee_cap2_t(adv);
711708

712709
/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
713710
* (Register 7.62)
@@ -1467,42 +1464,29 @@ EXPORT_SYMBOL_GPL(genphy_c45_plca_get_status);
14671464
/**
14681465
* genphy_c45_eee_is_active - get EEE status
14691466
* @phydev: target phy_device struct
1470-
* @adv: variable to store advertised linkmodes
14711467
* @lp: variable to store LP advertised linkmodes
14721468
*
1473-
* Description: this function will read local and link partner PHY
1474-
* advertisements. Compare them return current EEE state.
1469+
* Description: this function will read link partner PHY advertisement
1470+
* and compare it to local advertisement to return current EEE state.
14751471
*/
1476-
int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *adv,
1477-
unsigned long *lp)
1472+
int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *lp)
14781473
{
1479-
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp_adv) = {};
14801474
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp_lp) = {};
14811475
__ETHTOOL_DECLARE_LINK_MODE_MASK(common);
1482-
bool eee_active;
14831476
int ret;
14841477

1485-
ret = genphy_c45_read_eee_adv(phydev, tmp_adv);
1486-
if (ret)
1487-
return ret;
1488-
14891478
ret = genphy_c45_read_eee_lpa(phydev, tmp_lp);
14901479
if (ret)
14911480
return ret;
14921481

1493-
linkmode_and(common, tmp_adv, tmp_lp);
1494-
if (!linkmode_empty(tmp_adv) && !linkmode_empty(common))
1495-
eee_active = phy_check_valid(phydev->speed, phydev->duplex,
1496-
common);
1497-
else
1498-
eee_active = false;
1499-
1500-
if (adv)
1501-
linkmode_copy(adv, tmp_adv);
15021482
if (lp)
15031483
linkmode_copy(lp, tmp_lp);
15041484

1505-
return eee_active;
1485+
linkmode_and(common, phydev->advertising_eee, tmp_lp);
1486+
if (linkmode_empty(common))
1487+
return 0;
1488+
1489+
return phy_check_valid(phydev->speed, phydev->duplex, common);
15061490
}
15071491
EXPORT_SYMBOL(genphy_c45_eee_is_active);
15081492

@@ -1519,14 +1503,14 @@ int genphy_c45_ethtool_get_eee(struct phy_device *phydev,
15191503
{
15201504
int ret;
15211505

1522-
ret = genphy_c45_eee_is_active(phydev, data->advertised,
1523-
data->lp_advertised);
1506+
ret = genphy_c45_eee_is_active(phydev, data->lp_advertised);
15241507
if (ret < 0)
15251508
return ret;
15261509

15271510
data->eee_active = phydev->eee_active;
15281511
linkmode_andnot(data->supported, phydev->supported_eee,
15291512
phydev->eee_disabled_modes);
1513+
linkmode_copy(data->advertised, phydev->advertising_eee);
15301514
return 0;
15311515
}
15321516
EXPORT_SYMBOL(genphy_c45_ethtool_get_eee);

drivers/net/phy/phy.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ static int phy_check_link_status(struct phy_device *phydev)
10311031
if (phydev->link && phydev->state != PHY_RUNNING) {
10321032
phy_check_downshift(phydev);
10331033
phydev->state = PHY_RUNNING;
1034-
err = genphy_c45_eee_is_active(phydev, NULL, NULL);
1034+
err = genphy_c45_eee_is_active(phydev, NULL);
10351035
phydev->eee_active = err > 0;
10361036
phydev->enable_tx_lpi = phydev->eee_cfg.tx_lpi_enabled &&
10371037
phydev->eee_active;
@@ -1780,7 +1780,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
17801780
if (!phydev->drv)
17811781
return -EIO;
17821782

1783-
ret = genphy_c45_eee_is_active(phydev, NULL, NULL);
1783+
ret = genphy_c45_eee_is_active(phydev, NULL);
17841784
if (ret < 0)
17851785
return ret;
17861786
if (!ret)

drivers/net/phy/phy_device.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3580,22 +3580,21 @@ static int phy_probe(struct device *dev)
35803580
if (err)
35813581
goto out;
35823582

3583-
/* There is no "enabled" flag. If PHY is advertising, assume it is
3584-
* kind of enabled.
3585-
*/
3586-
phydev->eee_cfg.eee_enabled = !linkmode_empty(phydev->advertising_eee);
3583+
/* Get the EEE modes we want to prohibit. */
3584+
of_set_phy_eee_broken(phydev);
35873585

35883586
/* Some PHYs may advertise, by default, not support EEE modes. So,
3589-
* we need to clean them.
3587+
* we need to clean them. In addition remove all disabled EEE modes.
35903588
*/
3591-
if (phydev->eee_cfg.eee_enabled)
3592-
linkmode_and(phydev->advertising_eee, phydev->supported_eee,
3593-
phydev->advertising_eee);
3589+
linkmode_and(phydev->advertising_eee, phydev->supported_eee,
3590+
phydev->advertising_eee);
3591+
linkmode_andnot(phydev->advertising_eee, phydev->advertising_eee,
3592+
phydev->eee_disabled_modes);
35943593

3595-
/* Get the EEE modes we want to prohibit. We will ask
3596-
* the PHY stop advertising these mode later on
3594+
/* There is no "enabled" flag. If PHY is advertising, assume it is
3595+
* kind of enabled.
35973596
*/
3598-
of_set_phy_eee_broken(phydev);
3597+
phydev->eee_cfg.eee_enabled = !linkmode_empty(phydev->advertising_eee);
35993598

36003599
/* Get master/slave strap overrides */
36013600
of_set_phy_timing_role(phydev);

include/linux/phy.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,22 +1340,25 @@ void of_set_phy_timing_role(struct phy_device *phydev);
13401340
int phy_speed_down_core(struct phy_device *phydev);
13411341

13421342
/**
1343-
* phy_disable_eee_mode - Don't advertise an EEE mode.
1343+
* phy_is_started - Convenience function to check whether PHY is started
13441344
* @phydev: The phy_device struct
1345-
* @link_mode: The EEE mode to be disabled
13461345
*/
1347-
static inline void phy_disable_eee_mode(struct phy_device *phydev, u32 link_mode)
1346+
static inline bool phy_is_started(struct phy_device *phydev)
13481347
{
1349-
linkmode_set_bit(link_mode, phydev->eee_disabled_modes);
1348+
return phydev->state >= PHY_UP;
13501349
}
13511350

13521351
/**
1353-
* phy_is_started - Convenience function to check whether PHY is started
1352+
* phy_disable_eee_mode - Don't advertise an EEE mode.
13541353
* @phydev: The phy_device struct
1354+
* @link_mode: The EEE mode to be disabled
13551355
*/
1356-
static inline bool phy_is_started(struct phy_device *phydev)
1356+
static inline void phy_disable_eee_mode(struct phy_device *phydev, u32 link_mode)
13571357
{
1358-
return phydev->state >= PHY_UP;
1358+
WARN_ON(phy_is_started(phydev));
1359+
1360+
linkmode_set_bit(link_mode, phydev->eee_disabled_modes);
1361+
linkmode_clear_bit(link_mode, phydev->advertising_eee);
13591362
}
13601363

13611364
void phy_resolve_aneg_pause(struct phy_device *phydev);
@@ -2029,8 +2032,7 @@ int genphy_c45_plca_set_cfg(struct phy_device *phydev,
20292032
const struct phy_plca_cfg *plca_cfg);
20302033
int genphy_c45_plca_get_status(struct phy_device *phydev,
20312034
struct phy_plca_status *plca_st);
2032-
int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *adv,
2033-
unsigned long *lp);
2035+
int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *lp);
20342036
int genphy_c45_ethtool_get_eee(struct phy_device *phydev,
20352037
struct ethtool_keee *data);
20362038
int genphy_c45_ethtool_set_eee(struct phy_device *phydev,

0 commit comments

Comments
 (0)