Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <davem@davemloft.net>

+137
+69
drivers/net/phy/phy-c45.c
··· 706 706 changed = 1; 707 707 } 708 708 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 + 709 725 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, 710 726 phydev->supported_eee)) { 711 727 val = linkmode_adv_to_mii_10base_t1_t(adv); ··· 761 745 mii_eee_cap1_mod_linkmode_t(adv, val); 762 746 } 763 747 748 + if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) { 749 + /* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2 750 + * (Register 7.62) 751 + */ 752 + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2); 753 + if (val < 0) 754 + return val; 755 + 756 + mii_eee_cap2_mod_linkmode_adv_t(adv, val); 757 + } 758 + 764 759 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, 765 760 phydev->supported_eee)) { 766 761 /* IEEE 802.3cg-2019 45.2.7.25 10BASE-T1 AN control register ··· 806 779 return val; 807 780 808 781 mii_eee_cap1_mod_linkmode_t(lpa, val); 782 + } 783 + 784 + if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) { 785 + /* IEEE 802.3-2022 45.2.7.17 EEE link partner ability 2 786 + * (Register 7.63) 787 + */ 788 + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE2); 789 + if (val < 0) 790 + return val; 791 + 792 + mii_eee_cap2_mod_linkmode_adv_t(lpa, val); 809 793 } 810 794 811 795 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, ··· 869 831 } 870 832 871 833 /** 834 + * genphy_c45_read_eee_cap2 - read supported EEE link modes from register 3.21 835 + * @phydev: target phy_device struct 836 + */ 837 + static int genphy_c45_read_eee_cap2(struct phy_device *phydev) 838 + { 839 + int val; 840 + 841 + /* IEEE 802.3-2022 45.2.3.11 EEE control and capability 2 842 + * (Register 3.21) 843 + */ 844 + val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE2); 845 + if (val < 0) 846 + return val; 847 + 848 + /* IEEE 802.3-2022 45.2.3.11 says 9 bits are reserved. */ 849 + if (val == 0xffff) 850 + return 0; 851 + 852 + mii_eee_cap2_mod_linkmode_sup_t(phydev->supported_eee, val); 853 + 854 + return 0; 855 + } 856 + 857 + /** 872 858 * genphy_c45_read_eee_abilities - read supported EEE link modes 873 859 * @phydev: target phy_device struct 874 860 */ ··· 906 844 */ 907 845 if (linkmode_intersects(phydev->supported, PHY_EEE_CAP1_FEATURES)) { 908 846 val = genphy_c45_read_eee_cap1(phydev); 847 + if (val) 848 + return val; 849 + } 850 + 851 + /* Same for cap2 (3.21) */ 852 + if (linkmode_intersects(phydev->supported, PHY_EEE_CAP2_FEATURES)) { 853 + val = genphy_c45_read_eee_cap2(phydev); 909 854 if (val) 910 855 return val; 911 856 }
+11
drivers/net/phy/phy_device.c
··· 148 148 __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap1_features) __ro_after_init; 149 149 EXPORT_SYMBOL_GPL(phy_eee_cap1_features); 150 150 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 + 151 159 static void features_init(void) 152 160 { 153 161 /* 10/100 half/full*/ ··· 240 232 linkmode_set_bit_array(phy_eee_cap1_features_array, 241 233 ARRAY_SIZE(phy_eee_cap1_features_array), 242 234 phy_eee_cap1_features); 235 + linkmode_set_bit_array(phy_eee_cap2_features_array, 236 + ARRAY_SIZE(phy_eee_cap2_features_array), 237 + phy_eee_cap2_features); 243 238 244 239 } 245 240
+55
include/linux/mdio.h
··· 440 440 } 441 441 442 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 + 478 + /** 443 479 * linkmode_to_mii_eee_cap1_t() 444 480 * @adv: the linkmode advertisement settings 445 481 * ··· 498 462 result |= MDIO_EEE_10GKX4; 499 463 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, adv)) 500 464 result |= MDIO_EEE_10GKR; 465 + 466 + return result; 467 + } 468 + 469 + /** 470 + * linkmode_to_mii_eee_cap2_t() 471 + * @adv: the linkmode advertisement settings 472 + * 473 + * A function that translates linkmode to value for IEEE 802.3-2022 45.2.7.16 474 + * "EEE advertisement 2" register (7.62) 475 + */ 476 + static inline u32 linkmode_to_mii_eee_cap2_t(unsigned long *adv) 477 + { 478 + u32 result = 0; 479 + 480 + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, adv)) 481 + result |= MDIO_EEE_2_5GT; 482 + if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, adv)) 483 + result |= MDIO_EEE_5GT; 501 484 502 485 return result; 503 486 }
+2
include/linux/phy.h
··· 54 54 extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init; 55 55 extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; 56 56 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; 57 58 58 59 #define PHY_BASIC_FEATURES ((unsigned long *)&phy_basic_features) 59 60 #define PHY_BASIC_T1_FEATURES ((unsigned long *)&phy_basic_t1_features) ··· 66 65 #define PHY_10GBIT_FEC_FEATURES ((unsigned long *)&phy_10gbit_fec_features) 67 66 #define PHY_10GBIT_FULL_FEATURES ((unsigned long *)&phy_10gbit_full_features) 68 67 #define PHY_EEE_CAP1_FEATURES ((unsigned long *)&phy_eee_cap1_features) 68 + #define PHY_EEE_CAP2_FEATURES ((unsigned long *)&phy_eee_cap2_features) 69 69 70 70 extern const int phy_basic_ports_array[3]; 71 71 extern const int phy_fibre_port_array[1];