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

Configure Feed

Select the types of activity you want to include in your feed.

net: phy: mxl-gpy: implement SGMII in-band configuration

SGMII in-band autonegotiation was previously kept untouched (and restored
after switching back from 2500Base-X to SGMII). Now that the kernel offers
a way to announce in-band capabilities and nable/disable in-band AN,
implement the .inband_caps and .config_inband driver ops.
This moves the responsibility to configure SGMII in-band AN from the PHY
driver to phylink.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Link: https://patch.msgid.link/70f07e46dd96e239a9711e6073e8c04c1d8672d4.1767800226.git.daniel@makrotopia.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Daniel Golle and committed by
Jakub Kicinski
9da9633f 72dc4467

+47 -14
+47 -14
drivers/net/phy/mxl-gpy.c
··· 603 603 case SPEED_100: 604 604 case SPEED_10: 605 605 phydev->interface = PHY_INTERFACE_MODE_SGMII; 606 - if (gpy_sgmii_aneg_en(phydev)) 607 - break; 608 - /* Enable and restart SGMII ANEG for 10/100/1000Mbps link speed 609 - * if ANEG is disabled (in 2500-BaseX mode). 610 - */ 611 - ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL, 612 - VSPEC1_SGMII_ANEN_ANRS, 613 - VSPEC1_SGMII_ANEN_ANRS); 614 - if (ret < 0) { 615 - phydev_err(phydev, 616 - "Error: Enable of SGMII ANEG failed: %d\n", 617 - ret); 618 - return ret; 619 - } 620 606 break; 621 607 } 622 608 ··· 1046 1060 return -EINVAL; 1047 1061 } 1048 1062 1063 + static unsigned int gpy_inband_caps(struct phy_device *phydev, 1064 + phy_interface_t interface) 1065 + { 1066 + switch (interface) { 1067 + case PHY_INTERFACE_MODE_SGMII: 1068 + return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE; 1069 + case PHY_INTERFACE_MODE_2500BASEX: 1070 + return LINK_INBAND_DISABLE; 1071 + default: 1072 + return 0; 1073 + } 1074 + } 1075 + 1076 + static int gpy_config_inband(struct phy_device *phydev, unsigned int modes) 1077 + { 1078 + return phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL, 1079 + VSPEC1_SGMII_ANEN_ANRS, 1080 + (modes == LINK_INBAND_DISABLE) ? 0 : 1081 + VSPEC1_SGMII_ANEN_ANRS); 1082 + } 1083 + 1049 1084 static struct phy_driver gpy_drivers[] = { 1050 1085 { 1051 1086 PHY_ID_MATCH_MODEL(PHY_ID_GPY2xx), ··· 1074 1067 .get_features = genphy_c45_pma_read_abilities, 1075 1068 .config_init = gpy_config_init, 1076 1069 .probe = gpy_probe, 1070 + .inband_caps = gpy_inband_caps, 1071 + .config_inband = gpy_config_inband, 1077 1072 .suspend = genphy_suspend, 1078 1073 .resume = genphy_resume, 1079 1074 .config_aneg = gpy_config_aneg, ··· 1099 1090 .get_features = genphy_c45_pma_read_abilities, 1100 1091 .config_init = gpy_config_init, 1101 1092 .probe = gpy_probe, 1093 + .inband_caps = gpy_inband_caps, 1094 + .config_inband = gpy_config_inband, 1102 1095 .suspend = genphy_suspend, 1103 1096 .resume = genphy_resume, 1104 1097 .config_aneg = gpy_config_aneg, ··· 1123 1112 .get_features = genphy_c45_pma_read_abilities, 1124 1113 .config_init = gpy_config_init, 1125 1114 .probe = gpy_probe, 1115 + .inband_caps = gpy_inband_caps, 1116 + .config_inband = gpy_config_inband, 1126 1117 .suspend = genphy_suspend, 1127 1118 .resume = genphy_resume, 1128 1119 .config_aneg = gpy_config_aneg, ··· 1148 1135 .get_features = genphy_c45_pma_read_abilities, 1149 1136 .config_init = gpy21x_config_init, 1150 1137 .probe = gpy_probe, 1138 + .inband_caps = gpy_inband_caps, 1139 + .config_inband = gpy_config_inband, 1151 1140 .suspend = genphy_suspend, 1152 1141 .resume = genphy_resume, 1153 1142 .config_aneg = gpy_config_aneg, ··· 1172 1157 .get_features = genphy_c45_pma_read_abilities, 1173 1158 .config_init = gpy21x_config_init, 1174 1159 .probe = gpy_probe, 1160 + .inband_caps = gpy_inband_caps, 1161 + .config_inband = gpy_config_inband, 1175 1162 .suspend = genphy_suspend, 1176 1163 .resume = genphy_resume, 1177 1164 .config_aneg = gpy_config_aneg, ··· 1196 1179 .name = "Maxlinear Ethernet GPY212B", 1197 1180 .get_features = genphy_c45_pma_read_abilities, 1198 1181 .config_init = gpy21x_config_init, 1182 + .inband_caps = gpy_inband_caps, 1183 + .config_inband = gpy_config_inband, 1199 1184 .probe = gpy_probe, 1200 1185 .suspend = genphy_suspend, 1201 1186 .resume = genphy_resume, ··· 1221 1202 .get_features = genphy_c45_pma_read_abilities, 1222 1203 .config_init = gpy21x_config_init, 1223 1204 .probe = gpy_probe, 1205 + .inband_caps = gpy_inband_caps, 1206 + .config_inband = gpy_config_inband, 1224 1207 .suspend = genphy_suspend, 1225 1208 .resume = genphy_resume, 1226 1209 .config_aneg = gpy_config_aneg, ··· 1246 1225 .get_features = genphy_c45_pma_read_abilities, 1247 1226 .config_init = gpy21x_config_init, 1248 1227 .probe = gpy_probe, 1228 + .inband_caps = gpy_inband_caps, 1229 + .config_inband = gpy_config_inband, 1249 1230 .suspend = genphy_suspend, 1250 1231 .resume = genphy_resume, 1251 1232 .config_aneg = gpy_config_aneg, ··· 1270 1247 .get_features = genphy_c45_pma_read_abilities, 1271 1248 .config_init = gpy21x_config_init, 1272 1249 .probe = gpy_probe, 1250 + .inband_caps = gpy_inband_caps, 1251 + .config_inband = gpy_config_inband, 1273 1252 .suspend = genphy_suspend, 1274 1253 .resume = genphy_resume, 1275 1254 .config_aneg = gpy_config_aneg, ··· 1294 1269 .get_features = genphy_c45_pma_read_abilities, 1295 1270 .config_init = gpy_config_init, 1296 1271 .probe = gpy_probe, 1272 + .inband_caps = gpy_inband_caps, 1273 + .config_inband = gpy_config_inband, 1297 1274 .suspend = genphy_suspend, 1298 1275 .resume = genphy_resume, 1299 1276 .config_aneg = gpy_config_aneg, ··· 1313 1286 .get_features = genphy_c45_pma_read_abilities, 1314 1287 .config_init = gpy_config_init, 1315 1288 .probe = gpy_probe, 1289 + .inband_caps = gpy_inband_caps, 1290 + .config_inband = gpy_config_inband, 1316 1291 .suspend = genphy_suspend, 1317 1292 .resume = genphy_resume, 1318 1293 .config_aneg = gpy_config_aneg, ··· 1332 1303 .get_features = genphy_c45_pma_read_abilities, 1333 1304 .config_init = gpy_config_init, 1334 1305 .probe = gpy_probe, 1306 + .inband_caps = gpy_inband_caps, 1307 + .config_inband = gpy_config_inband, 1335 1308 .suspend = genphy_suspend, 1336 1309 .resume = genphy_resume, 1337 1310 .config_aneg = gpy_config_aneg, ··· 1351 1320 .get_features = genphy_c45_pma_read_abilities, 1352 1321 .config_init = gpy_config_init, 1353 1322 .probe = gpy_probe, 1323 + .inband_caps = gpy_inband_caps, 1324 + .config_inband = gpy_config_inband, 1354 1325 .suspend = genphy_suspend, 1355 1326 .resume = genphy_resume, 1356 1327 .config_aneg = gpy_config_aneg,