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

net: phy: c45: add genphy_c45_pma_read_ext_abilities() function

Move part of the genphy_c45_pma_read_abilities() code to a separate
function.

Some PHYs do not implement PMA/PMD status 2 register (Register 1.8) but
do implement PMA/PMD extended ability register (Register 1.11). To make
use of it, we need to be able to access this part of code separately.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://lore.kernel.org/r/20231212054144.87527-2-o.rempel@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Oleksij Rempel and committed by
Jakub Kicinski
0c476157 a25ebbf3

+75 -55
+74 -55
drivers/net/phy/phy-c45.c
··· 920 920 EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_abilities); 921 921 922 922 /** 923 + * genphy_c45_pma_read_ext_abilities - read supported link modes from PMA 924 + * @phydev: target phy_device struct 925 + * 926 + * Read the supported link modes from the PMA/PMD extended ability register 927 + * (Register 1.11). 928 + */ 929 + int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev) 930 + { 931 + int val; 932 + 933 + val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE); 934 + if (val < 0) 935 + return val; 936 + 937 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT, 938 + phydev->supported, 939 + val & MDIO_PMA_EXTABLE_10GBLRM); 940 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, 941 + phydev->supported, 942 + val & MDIO_PMA_EXTABLE_10GBT); 943 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, 944 + phydev->supported, 945 + val & MDIO_PMA_EXTABLE_10GBKX4); 946 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, 947 + phydev->supported, 948 + val & MDIO_PMA_EXTABLE_10GBKR); 949 + linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, 950 + phydev->supported, 951 + val & MDIO_PMA_EXTABLE_1000BT); 952 + linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT, 953 + phydev->supported, 954 + val & MDIO_PMA_EXTABLE_1000BKX); 955 + 956 + linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, 957 + phydev->supported, 958 + val & MDIO_PMA_EXTABLE_100BTX); 959 + linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, 960 + phydev->supported, 961 + val & MDIO_PMA_EXTABLE_100BTX); 962 + 963 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, 964 + phydev->supported, 965 + val & MDIO_PMA_EXTABLE_10BT); 966 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, 967 + phydev->supported, 968 + val & MDIO_PMA_EXTABLE_10BT); 969 + 970 + if (val & MDIO_PMA_EXTABLE_NBT) { 971 + val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, 972 + MDIO_PMA_NG_EXTABLE); 973 + if (val < 0) 974 + return val; 975 + 976 + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, 977 + phydev->supported, 978 + val & MDIO_PMA_NG_EXTABLE_2_5GBT); 979 + 980 + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, 981 + phydev->supported, 982 + val & MDIO_PMA_NG_EXTABLE_5GBT); 983 + } 984 + 985 + if (val & MDIO_PMA_EXTABLE_BT1) { 986 + val = genphy_c45_pma_baset1_read_abilities(phydev); 987 + if (val < 0) 988 + return val; 989 + } 990 + 991 + return 0; 992 + } 993 + EXPORT_SYMBOL_GPL(genphy_c45_pma_read_ext_abilities); 994 + 995 + /** 923 996 * genphy_c45_pma_read_abilities - read supported link modes from PMA 924 997 * @phydev: target phy_device struct 925 998 * ··· 1035 962 val & MDIO_PMA_STAT2_10GBER); 1036 963 1037 964 if (val & MDIO_PMA_STAT2_EXTABLE) { 1038 - val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE); 965 + val = genphy_c45_pma_read_ext_abilities(phydev); 1039 966 if (val < 0) 1040 967 return val; 1041 - 1042 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT, 1043 - phydev->supported, 1044 - val & MDIO_PMA_EXTABLE_10GBLRM); 1045 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, 1046 - phydev->supported, 1047 - val & MDIO_PMA_EXTABLE_10GBT); 1048 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, 1049 - phydev->supported, 1050 - val & MDIO_PMA_EXTABLE_10GBKX4); 1051 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, 1052 - phydev->supported, 1053 - val & MDIO_PMA_EXTABLE_10GBKR); 1054 - linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, 1055 - phydev->supported, 1056 - val & MDIO_PMA_EXTABLE_1000BT); 1057 - linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT, 1058 - phydev->supported, 1059 - val & MDIO_PMA_EXTABLE_1000BKX); 1060 - 1061 - linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, 1062 - phydev->supported, 1063 - val & MDIO_PMA_EXTABLE_100BTX); 1064 - linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, 1065 - phydev->supported, 1066 - val & MDIO_PMA_EXTABLE_100BTX); 1067 - 1068 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, 1069 - phydev->supported, 1070 - val & MDIO_PMA_EXTABLE_10BT); 1071 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, 1072 - phydev->supported, 1073 - val & MDIO_PMA_EXTABLE_10BT); 1074 - 1075 - if (val & MDIO_PMA_EXTABLE_NBT) { 1076 - val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, 1077 - MDIO_PMA_NG_EXTABLE); 1078 - if (val < 0) 1079 - return val; 1080 - 1081 - linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, 1082 - phydev->supported, 1083 - val & MDIO_PMA_NG_EXTABLE_2_5GBT); 1084 - 1085 - linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, 1086 - phydev->supported, 1087 - val & MDIO_PMA_NG_EXTABLE_5GBT); 1088 - } 1089 - 1090 - if (val & MDIO_PMA_EXTABLE_BT1) { 1091 - val = genphy_c45_pma_baset1_read_abilities(phydev); 1092 - if (val < 0) 1093 - return val; 1094 - } 1095 968 } 1096 969 1097 970 /* This is optional functionality. If not supported, we may get an error
+1
include/linux/phy.h
··· 1866 1866 int genphy_c45_an_disable_aneg(struct phy_device *phydev); 1867 1867 int genphy_c45_read_mdix(struct phy_device *phydev); 1868 1868 int genphy_c45_pma_read_abilities(struct phy_device *phydev); 1869 + int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev); 1869 1870 int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev); 1870 1871 int genphy_c45_read_eee_abilities(struct phy_device *phydev); 1871 1872 int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev);