Skip to content

Commit a6e0cb1

Browse files
committed
Merge branch 'net-phy-eee-2'
Heiner Kallweit says: ==================== net: phy: add support for the EEE 2 registers This series adds support for the EEE 2 registers. Most relevant and for now the only supported modes are 2500baseT and 5000baseT. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 71b605d + 9a1e312 commit a6e0cb1

File tree

4 files changed

+137
-0
lines changed

4 files changed

+137
-0
lines changed

drivers/net/phy/phy-c45.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,22 @@ int genphy_c45_write_eee_adv(struct phy_device *phydev, unsigned long *adv)
706706
changed = 1;
707707
}
708708

709+
if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
710+
val = linkmode_to_mii_eee_cap2_t(adv);
711+
712+
/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
713+
* (Register 7.62)
714+
*/
715+
val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
716+
MDIO_AN_EEE_ADV2,
717+
MDIO_EEE_2_5GT | MDIO_EEE_5GT,
718+
val);
719+
if (val < 0)
720+
return val;
721+
if (val > 0)
722+
changed = 1;
723+
}
724+
709725
if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
710726
phydev->supported_eee)) {
711727
val = linkmode_adv_to_mii_10base_t1_t(adv);
@@ -745,6 +761,17 @@ int genphy_c45_read_eee_adv(struct phy_device *phydev, unsigned long *adv)
745761
mii_eee_cap1_mod_linkmode_t(adv, val);
746762
}
747763

764+
if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
765+
/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
766+
* (Register 7.62)
767+
*/
768+
val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
769+
if (val < 0)
770+
return val;
771+
772+
mii_eee_cap2_mod_linkmode_adv_t(adv, val);
773+
}
774+
748775
if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
749776
phydev->supported_eee)) {
750777
/* IEEE 802.3cg-2019 45.2.7.25 10BASE-T1 AN control register
@@ -781,6 +808,17 @@ static int genphy_c45_read_eee_lpa(struct phy_device *phydev,
781808
mii_eee_cap1_mod_linkmode_t(lpa, val);
782809
}
783810

811+
if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
812+
/* IEEE 802.3-2022 45.2.7.17 EEE link partner ability 2
813+
* (Register 7.63)
814+
*/
815+
val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE2);
816+
if (val < 0)
817+
return val;
818+
819+
mii_eee_cap2_mod_linkmode_adv_t(lpa, val);
820+
}
821+
784822
if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
785823
phydev->supported_eee)) {
786824
/* IEEE 802.3cg-2019 45.2.7.26 10BASE-T1 AN status register
@@ -830,6 +868,30 @@ static int genphy_c45_read_eee_cap1(struct phy_device *phydev)
830868
return 0;
831869
}
832870

871+
/**
872+
* genphy_c45_read_eee_cap2 - read supported EEE link modes from register 3.21
873+
* @phydev: target phy_device struct
874+
*/
875+
static int genphy_c45_read_eee_cap2(struct phy_device *phydev)
876+
{
877+
int val;
878+
879+
/* IEEE 802.3-2022 45.2.3.11 EEE control and capability 2
880+
* (Register 3.21)
881+
*/
882+
val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE2);
883+
if (val < 0)
884+
return val;
885+
886+
/* IEEE 802.3-2022 45.2.3.11 says 9 bits are reserved. */
887+
if (val == 0xffff)
888+
return 0;
889+
890+
mii_eee_cap2_mod_linkmode_sup_t(phydev->supported_eee, val);
891+
892+
return 0;
893+
}
894+
833895
/**
834896
* genphy_c45_read_eee_abilities - read supported EEE link modes
835897
* @phydev: target phy_device struct
@@ -848,6 +910,13 @@ int genphy_c45_read_eee_abilities(struct phy_device *phydev)
848910
return val;
849911
}
850912

913+
/* Same for cap2 (3.21) */
914+
if (linkmode_intersects(phydev->supported, PHY_EEE_CAP2_FEATURES)) {
915+
val = genphy_c45_read_eee_cap2(phydev);
916+
if (val)
917+
return val;
918+
}
919+
851920
if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
852921
phydev->supported)) {
853922
/* IEEE 802.3cg-2019 45.2.1.186b 10BASE-T1L PMA status register

drivers/net/phy/phy_device.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,14 @@ static const int phy_eee_cap1_features_array[] = {
148148
__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap1_features) __ro_after_init;
149149
EXPORT_SYMBOL_GPL(phy_eee_cap1_features);
150150

151+
static const int phy_eee_cap2_features_array[] = {
152+
ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
153+
ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
154+
};
155+
156+
__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap2_features) __ro_after_init;
157+
EXPORT_SYMBOL_GPL(phy_eee_cap2_features);
158+
151159
static void features_init(void)
152160
{
153161
/* 10/100 half/full*/
@@ -232,6 +240,9 @@ static void features_init(void)
232240
linkmode_set_bit_array(phy_eee_cap1_features_array,
233241
ARRAY_SIZE(phy_eee_cap1_features_array),
234242
phy_eee_cap1_features);
243+
linkmode_set_bit_array(phy_eee_cap2_features_array,
244+
ARRAY_SIZE(phy_eee_cap2_features_array),
245+
phy_eee_cap2_features);
235246

236247
}
237248

include/linux/mdio.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,42 @@ static inline void mii_eee_cap1_mod_linkmode_t(unsigned long *adv, u32 val)
439439
adv, val & MDIO_EEE_10GKR);
440440
}
441441

442+
/**
443+
* mii_eee_cap2_mod_linkmode_sup_t()
444+
* @adv: target the linkmode settings
445+
* @val: register value
446+
*
447+
* A function that translates value of following registers to the linkmode:
448+
* IEEE 802.3-2022 45.2.3.11 "EEE control and capability 2" register (3.21)
449+
*/
450+
static inline void mii_eee_cap2_mod_linkmode_sup_t(unsigned long *adv, u32 val)
451+
{
452+
linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
453+
adv, val & MDIO_EEE_2_5GT);
454+
linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
455+
adv, val & MDIO_EEE_5GT);
456+
}
457+
458+
/**
459+
* mii_eee_cap2_mod_linkmode_adv_t()
460+
* @adv: target the linkmode advertisement settings
461+
* @val: register value
462+
*
463+
* A function that translates value of following registers to the linkmode:
464+
* IEEE 802.3-2022 45.2.7.16 "EEE advertisement 2" register (7.62)
465+
* IEEE 802.3-2022 45.2.7.17 "EEE link partner ability 2" register (7.63)
466+
* Note: Currently this function is the same as mii_eee_cap2_mod_linkmode_sup_t.
467+
* For certain, not yet supported, modes however the bits differ.
468+
* Therefore create separate functions already.
469+
*/
470+
static inline void mii_eee_cap2_mod_linkmode_adv_t(unsigned long *adv, u32 val)
471+
{
472+
linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
473+
adv, val & MDIO_EEE_2_5GT);
474+
linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
475+
adv, val & MDIO_EEE_5GT);
476+
}
477+
442478
/**
443479
* linkmode_to_mii_eee_cap1_t()
444480
* @adv: the linkmode advertisement settings
@@ -466,6 +502,25 @@ static inline u32 linkmode_to_mii_eee_cap1_t(unsigned long *adv)
466502
return result;
467503
}
468504

505+
/**
506+
* linkmode_to_mii_eee_cap2_t()
507+
* @adv: the linkmode advertisement settings
508+
*
509+
* A function that translates linkmode to value for IEEE 802.3-2022 45.2.7.16
510+
* "EEE advertisement 2" register (7.62)
511+
*/
512+
static inline u32 linkmode_to_mii_eee_cap2_t(unsigned long *adv)
513+
{
514+
u32 result = 0;
515+
516+
if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, adv))
517+
result |= MDIO_EEE_2_5GT;
518+
if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, adv))
519+
result |= MDIO_EEE_5GT;
520+
521+
return result;
522+
}
523+
469524
/**
470525
* mii_10base_t1_adv_mod_linkmode_t()
471526
* @adv: linkmode advertisement settings

include/linux/phy.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init;
5454
extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init;
5555
extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init;
5656
extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap1_features) __ro_after_init;
57+
extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap2_features) __ro_after_init;
5758

5859
#define PHY_BASIC_FEATURES ((unsigned long *)&phy_basic_features)
5960
#define PHY_BASIC_T1_FEATURES ((unsigned long *)&phy_basic_t1_features)
@@ -65,6 +66,7 @@ extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap1_features) __ro_after_init;
6566
#define PHY_10GBIT_FEC_FEATURES ((unsigned long *)&phy_10gbit_fec_features)
6667
#define PHY_10GBIT_FULL_FEATURES ((unsigned long *)&phy_10gbit_full_features)
6768
#define PHY_EEE_CAP1_FEATURES ((unsigned long *)&phy_eee_cap1_features)
69+
#define PHY_EEE_CAP2_FEATURES ((unsigned long *)&phy_eee_cap2_features)
6870

6971
extern const int phy_basic_ports_array[3];
7072
extern const int phy_fibre_port_array[1];

0 commit comments

Comments
 (0)