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

Merge branch 'qca8081-phy-driver'

Luo Jie says:

====================
net: phy: Add qca8081 ethernet phy driver

This patch series add the qca8081 ethernet phy driver support, which
improve the wol feature, leverage at803x phy driver and add the fast
retrain, master/slave seed and CDT feature.

Changes in v7:
* update Reviewed-by tags.

Changes in v6:
* add Reviewed-by tags on the applicable patches.

Changes in v5:
* rebase the patches on net-next/master.

Changes in v4:
* handle other interrupts in set_wol.
* add genphy_c45_fast_retrain.

Changes in v3:
* correct a typo "excpet".
* remove the suffix "PHY" from phy name.

Changes in v2:
* add definitions of fast retrain related registers in mdio.h.
* break up the patch into small patches.
* improve the at803x legacy code.

Changes in v1:
* merge qca8081 phy driver into at803x.
* add cdt feature.
* leverage at803x phy driver helpers.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+577 -47
+533 -47
drivers/net/phy/at803x.c
··· 33 33 #define AT803X_SFC_DISABLE_JABBER BIT(0) 34 34 35 35 #define AT803X_SPECIFIC_STATUS 0x11 36 - #define AT803X_SS_SPEED_MASK (3 << 14) 37 - #define AT803X_SS_SPEED_1000 (2 << 14) 38 - #define AT803X_SS_SPEED_100 (1 << 14) 39 - #define AT803X_SS_SPEED_10 (0 << 14) 36 + #define AT803X_SS_SPEED_MASK GENMASK(15, 14) 37 + #define AT803X_SS_SPEED_1000 2 38 + #define AT803X_SS_SPEED_100 1 39 + #define AT803X_SS_SPEED_10 0 40 40 #define AT803X_SS_DUPLEX BIT(13) 41 41 #define AT803X_SS_SPEED_DUPLEX_RESOLVED BIT(11) 42 42 #define AT803X_SS_MDIX BIT(6) 43 + 44 + #define QCA808X_SS_SPEED_MASK GENMASK(9, 7) 45 + #define QCA808X_SS_SPEED_2500 4 43 46 44 47 #define AT803X_INTR_ENABLE 0x12 45 48 #define AT803X_INTR_ENABLE_AUTONEG_ERR BIT(15) ··· 73 70 #define AT803X_CDT_STATUS_DELTA_TIME_MASK GENMASK(7, 0) 74 71 #define AT803X_LED_CONTROL 0x18 75 72 76 - #define AT803X_DEVICE_ADDR 0x03 73 + #define AT803X_PHY_MMD3_WOL_CTRL 0x8012 74 + #define AT803X_WOL_EN BIT(5) 77 75 #define AT803X_LOC_MAC_ADDR_0_15_OFFSET 0x804C 78 76 #define AT803X_LOC_MAC_ADDR_16_31_OFFSET 0x804B 79 77 #define AT803X_LOC_MAC_ADDR_32_47_OFFSET 0x804A ··· 161 157 #define ATH8035_PHY_ID 0x004dd072 162 158 #define AT8030_PHY_ID_MASK 0xffffffef 163 159 160 + #define QCA8081_PHY_ID 0x004dd101 161 + 164 162 #define QCA8327_A_PHY_ID 0x004dd033 165 163 #define QCA8327_B_PHY_ID 0x004dd034 166 164 #define QCA8337_PHY_ID 0x004dd036 ··· 178 172 #define AT803X_KEEP_PLL_ENABLED BIT(0) 179 173 #define AT803X_DISABLE_SMARTEEE BIT(1) 180 174 181 - MODULE_DESCRIPTION("Qualcomm Atheros AR803x PHY driver"); 175 + /* ADC threshold */ 176 + #define QCA808X_PHY_DEBUG_ADC_THRESHOLD 0x2c80 177 + #define QCA808X_ADC_THRESHOLD_MASK GENMASK(7, 0) 178 + #define QCA808X_ADC_THRESHOLD_80MV 0 179 + #define QCA808X_ADC_THRESHOLD_100MV 0xf0 180 + #define QCA808X_ADC_THRESHOLD_200MV 0x0f 181 + #define QCA808X_ADC_THRESHOLD_300MV 0xff 182 + 183 + /* CLD control */ 184 + #define QCA808X_PHY_MMD3_ADDR_CLD_CTRL7 0x8007 185 + #define QCA808X_8023AZ_AFE_CTRL_MASK GENMASK(8, 4) 186 + #define QCA808X_8023AZ_AFE_EN 0x90 187 + 188 + /* AZ control */ 189 + #define QCA808X_PHY_MMD3_AZ_TRAINING_CTRL 0x8008 190 + #define QCA808X_MMD3_AZ_TRAINING_VAL 0x1c32 191 + 192 + #define QCA808X_PHY_MMD1_MSE_THRESHOLD_20DB 0x8014 193 + #define QCA808X_MSE_THRESHOLD_20DB_VALUE 0x529 194 + 195 + #define QCA808X_PHY_MMD1_MSE_THRESHOLD_17DB 0x800E 196 + #define QCA808X_MSE_THRESHOLD_17DB_VALUE 0x341 197 + 198 + #define QCA808X_PHY_MMD1_MSE_THRESHOLD_27DB 0x801E 199 + #define QCA808X_MSE_THRESHOLD_27DB_VALUE 0x419 200 + 201 + #define QCA808X_PHY_MMD1_MSE_THRESHOLD_28DB 0x8020 202 + #define QCA808X_MSE_THRESHOLD_28DB_VALUE 0x341 203 + 204 + #define QCA808X_PHY_MMD7_TOP_OPTION1 0x901c 205 + #define QCA808X_TOP_OPTION1_DATA 0x0 206 + 207 + #define QCA808X_PHY_MMD3_DEBUG_1 0xa100 208 + #define QCA808X_MMD3_DEBUG_1_VALUE 0x9203 209 + #define QCA808X_PHY_MMD3_DEBUG_2 0xa101 210 + #define QCA808X_MMD3_DEBUG_2_VALUE 0x48ad 211 + #define QCA808X_PHY_MMD3_DEBUG_3 0xa103 212 + #define QCA808X_MMD3_DEBUG_3_VALUE 0x1698 213 + #define QCA808X_PHY_MMD3_DEBUG_4 0xa105 214 + #define QCA808X_MMD3_DEBUG_4_VALUE 0x8001 215 + #define QCA808X_PHY_MMD3_DEBUG_5 0xa106 216 + #define QCA808X_MMD3_DEBUG_5_VALUE 0x1111 217 + #define QCA808X_PHY_MMD3_DEBUG_6 0xa011 218 + #define QCA808X_MMD3_DEBUG_6_VALUE 0x5f85 219 + 220 + /* master/slave seed config */ 221 + #define QCA808X_PHY_DEBUG_LOCAL_SEED 9 222 + #define QCA808X_MASTER_SLAVE_SEED_ENABLE BIT(1) 223 + #define QCA808X_MASTER_SLAVE_SEED_CFG GENMASK(12, 2) 224 + #define QCA808X_MASTER_SLAVE_SEED_RANGE 0x32 225 + 226 + /* Hibernation yields lower power consumpiton in contrast with normal operation mode. 227 + * when the copper cable is unplugged, the PHY enters into hibernation mode in about 10s. 228 + */ 229 + #define QCA808X_DBG_AN_TEST 0xb 230 + #define QCA808X_HIBERNATION_EN BIT(15) 231 + 232 + #define QCA808X_CDT_ENABLE_TEST BIT(15) 233 + #define QCA808X_CDT_INTER_CHECK_DIS BIT(13) 234 + #define QCA808X_CDT_LENGTH_UNIT BIT(10) 235 + 236 + #define QCA808X_MMD3_CDT_STATUS 0x8064 237 + #define QCA808X_MMD3_CDT_DIAG_PAIR_A 0x8065 238 + #define QCA808X_MMD3_CDT_DIAG_PAIR_B 0x8066 239 + #define QCA808X_MMD3_CDT_DIAG_PAIR_C 0x8067 240 + #define QCA808X_MMD3_CDT_DIAG_PAIR_D 0x8068 241 + #define QCA808X_CDT_DIAG_LENGTH GENMASK(7, 0) 242 + 243 + #define QCA808X_CDT_CODE_PAIR_A GENMASK(15, 12) 244 + #define QCA808X_CDT_CODE_PAIR_B GENMASK(11, 8) 245 + #define QCA808X_CDT_CODE_PAIR_C GENMASK(7, 4) 246 + #define QCA808X_CDT_CODE_PAIR_D GENMASK(3, 0) 247 + #define QCA808X_CDT_STATUS_STAT_FAIL 0 248 + #define QCA808X_CDT_STATUS_STAT_NORMAL 1 249 + #define QCA808X_CDT_STATUS_STAT_OPEN 2 250 + #define QCA808X_CDT_STATUS_STAT_SHORT 3 251 + 252 + MODULE_DESCRIPTION("Qualcomm Atheros AR803x and QCA808X PHY driver"); 182 253 MODULE_AUTHOR("Matus Ujhelyi"); 183 254 MODULE_LICENSE("GPL"); 184 255 ··· 419 336 { 420 337 struct net_device *ndev = phydev->attached_dev; 421 338 const u8 *mac; 422 - int ret; 423 - u32 value; 424 - unsigned int i, offsets[] = { 339 + int ret, irq_enabled; 340 + unsigned int i; 341 + const unsigned int offsets[] = { 425 342 AT803X_LOC_MAC_ADDR_32_47_OFFSET, 426 343 AT803X_LOC_MAC_ADDR_16_31_OFFSET, 427 344 AT803X_LOC_MAC_ADDR_0_15_OFFSET, ··· 437 354 return -EINVAL; 438 355 439 356 for (i = 0; i < 3; i++) 440 - phy_write_mmd(phydev, AT803X_DEVICE_ADDR, offsets[i], 357 + phy_write_mmd(phydev, MDIO_MMD_PCS, offsets[i], 441 358 mac[(i * 2) + 1] | (mac[(i * 2)] << 8)); 442 359 443 - value = phy_read(phydev, AT803X_INTR_ENABLE); 444 - value |= AT803X_INTR_ENABLE_WOL; 445 - ret = phy_write(phydev, AT803X_INTR_ENABLE, value); 360 + /* Enable WOL function */ 361 + ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, AT803X_PHY_MMD3_WOL_CTRL, 362 + 0, AT803X_WOL_EN); 446 363 if (ret) 447 364 return ret; 448 - value = phy_read(phydev, AT803X_INTR_STATUS); 365 + /* Enable WOL interrupt */ 366 + ret = phy_modify(phydev, AT803X_INTR_ENABLE, 0, AT803X_INTR_ENABLE_WOL); 367 + if (ret) 368 + return ret; 449 369 } else { 450 - value = phy_read(phydev, AT803X_INTR_ENABLE); 451 - value &= (~AT803X_INTR_ENABLE_WOL); 452 - ret = phy_write(phydev, AT803X_INTR_ENABLE, value); 370 + /* Disable WoL function */ 371 + ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, AT803X_PHY_MMD3_WOL_CTRL, 372 + AT803X_WOL_EN, 0); 453 373 if (ret) 454 374 return ret; 455 - value = phy_read(phydev, AT803X_INTR_STATUS); 375 + /* Disable WOL interrupt */ 376 + ret = phy_modify(phydev, AT803X_INTR_ENABLE, AT803X_INTR_ENABLE_WOL, 0); 377 + if (ret) 378 + return ret; 456 379 } 457 380 458 - return ret; 381 + /* Clear WOL status */ 382 + ret = phy_read(phydev, AT803X_INTR_STATUS); 383 + if (ret < 0) 384 + return ret; 385 + 386 + /* Check if there are other interrupts except for WOL triggered when PHY is 387 + * in interrupt mode, only the interrupts enabled by AT803X_INTR_ENABLE can 388 + * be passed up to the interrupt PIN. 389 + */ 390 + irq_enabled = phy_read(phydev, AT803X_INTR_ENABLE); 391 + if (irq_enabled < 0) 392 + return irq_enabled; 393 + 394 + irq_enabled &= ~AT803X_INTR_ENABLE_WOL; 395 + if (ret & irq_enabled && !phy_polling_mode(phydev)) 396 + phy_trigger_machine(phydev); 397 + 398 + return 0; 459 399 } 460 400 461 401 static void at803x_get_wol(struct phy_device *phydev, ··· 489 383 wol->supported = WAKE_MAGIC; 490 384 wol->wolopts = 0; 491 385 492 - value = phy_read(phydev, AT803X_INTR_ENABLE); 493 - if (value & AT803X_INTR_ENABLE_WOL) 386 + value = phy_read_mmd(phydev, MDIO_MMD_PCS, AT803X_PHY_MMD3_WOL_CTRL); 387 + if (value < 0) 388 + return; 389 + 390 + if (value & AT803X_WOL_EN) 494 391 wol->wolopts |= WAKE_MAGIC; 495 392 } 496 393 ··· 821 712 if (err) 822 713 return err; 823 714 715 + if (phydev->drv->phy_id == QCA8081_PHY_ID) { 716 + err = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_NG_EXTABLE); 717 + if (err < 0) 718 + return err; 719 + 720 + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->supported, 721 + err & MDIO_PMA_NG_EXTABLE_2_5GBT); 722 + } 723 + 824 724 if (phydev->drv->phy_id != ATH8031_PHY_ID) 825 725 return 0; 826 726 ··· 1048 930 } 1049 931 } 1050 932 1051 - static int at803x_read_status(struct phy_device *phydev) 933 + static int at803x_read_specific_status(struct phy_device *phydev) 1052 934 { 1053 - int ss, err, old_link = phydev->link; 1054 - 1055 - /* Update the link, but return if there was an error */ 1056 - err = genphy_update_link(phydev); 1057 - if (err) 1058 - return err; 1059 - 1060 - /* why bother the PHY if nothing can have changed */ 1061 - if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) 1062 - return 0; 1063 - 1064 - phydev->speed = SPEED_UNKNOWN; 1065 - phydev->duplex = DUPLEX_UNKNOWN; 1066 - phydev->pause = 0; 1067 - phydev->asym_pause = 0; 1068 - 1069 - err = genphy_read_lpa(phydev); 1070 - if (err < 0) 1071 - return err; 935 + int ss; 1072 936 1073 937 /* Read the AT8035 PHY-Specific Status register, which indicates the 1074 938 * speed and duplex that the PHY is actually using, irrespective of ··· 1061 961 return ss; 1062 962 1063 963 if (ss & AT803X_SS_SPEED_DUPLEX_RESOLVED) { 1064 - int sfc; 964 + int sfc, speed; 1065 965 1066 966 sfc = phy_read(phydev, AT803X_SPECIFIC_FUNCTION_CONTROL); 1067 967 if (sfc < 0) 1068 968 return sfc; 1069 969 1070 - switch (ss & AT803X_SS_SPEED_MASK) { 970 + /* qca8081 takes the different bits for speed value from at803x */ 971 + if (phydev->drv->phy_id == QCA8081_PHY_ID) 972 + speed = FIELD_GET(QCA808X_SS_SPEED_MASK, ss); 973 + else 974 + speed = FIELD_GET(AT803X_SS_SPEED_MASK, ss); 975 + 976 + switch (speed) { 1071 977 case AT803X_SS_SPEED_10: 1072 978 phydev->speed = SPEED_10; 1073 979 break; ··· 1082 976 break; 1083 977 case AT803X_SS_SPEED_1000: 1084 978 phydev->speed = SPEED_1000; 979 + break; 980 + case QCA808X_SS_SPEED_2500: 981 + phydev->speed = SPEED_2500; 1085 982 break; 1086 983 } 1087 984 if (ss & AT803X_SS_DUPLEX) ··· 1109 1000 break; 1110 1001 } 1111 1002 } 1003 + 1004 + return 0; 1005 + } 1006 + 1007 + static int at803x_read_status(struct phy_device *phydev) 1008 + { 1009 + int err, old_link = phydev->link; 1010 + 1011 + /* Update the link, but return if there was an error */ 1012 + err = genphy_update_link(phydev); 1013 + if (err) 1014 + return err; 1015 + 1016 + /* why bother the PHY if nothing can have changed */ 1017 + if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) 1018 + return 0; 1019 + 1020 + phydev->speed = SPEED_UNKNOWN; 1021 + phydev->duplex = DUPLEX_UNKNOWN; 1022 + phydev->pause = 0; 1023 + phydev->asym_pause = 0; 1024 + 1025 + err = genphy_read_lpa(phydev); 1026 + if (err < 0) 1027 + return err; 1028 + 1029 + err = at803x_read_specific_status(phydev); 1030 + if (err < 0) 1031 + return err; 1112 1032 1113 1033 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) 1114 1034 phy_resolve_aneg_pause(phydev); ··· 1186 1048 return ret; 1187 1049 } 1188 1050 1189 - return genphy_config_aneg(phydev); 1051 + /* Do not restart auto-negotiation by setting ret to 0 defautly, 1052 + * when calling __genphy_config_aneg later. 1053 + */ 1054 + ret = 0; 1055 + 1056 + if (phydev->drv->phy_id == QCA8081_PHY_ID) { 1057 + int phy_ctrl = 0; 1058 + 1059 + /* The reg MII_BMCR also needs to be configured for force mode, the 1060 + * genphy_config_aneg is also needed. 1061 + */ 1062 + if (phydev->autoneg == AUTONEG_DISABLE) 1063 + genphy_c45_pma_setup_forced(phydev); 1064 + 1065 + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->advertising)) 1066 + phy_ctrl = MDIO_AN_10GBT_CTRL_ADV2_5G; 1067 + 1068 + ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, 1069 + MDIO_AN_10GBT_CTRL_ADV2_5G, phy_ctrl); 1070 + if (ret < 0) 1071 + return ret; 1072 + } 1073 + 1074 + return __genphy_config_aneg(phydev, ret); 1190 1075 } 1191 1076 1192 1077 static int at803x_get_downshift(struct phy_device *phydev, u8 *d) ··· 1345 1184 { 1346 1185 u16 cdt; 1347 1186 1348 - cdt = FIELD_PREP(AT803X_CDT_MDI_PAIR_MASK, pair) | 1349 - AT803X_CDT_ENABLE_TEST; 1187 + /* qca8081 takes the different bit 15 to enable CDT test */ 1188 + if (phydev->drv->phy_id == QCA8081_PHY_ID) 1189 + cdt = QCA808X_CDT_ENABLE_TEST | 1190 + QCA808X_CDT_LENGTH_UNIT | 1191 + QCA808X_CDT_INTER_CHECK_DIS; 1192 + else 1193 + cdt = FIELD_PREP(AT803X_CDT_MDI_PAIR_MASK, pair) | 1194 + AT803X_CDT_ENABLE_TEST; 1350 1195 1351 1196 return phy_write(phydev, AT803X_CDT, cdt); 1352 1197 } ··· 1360 1193 static int at803x_cdt_wait_for_completion(struct phy_device *phydev) 1361 1194 { 1362 1195 int val, ret; 1196 + u16 cdt_en; 1197 + 1198 + if (phydev->drv->phy_id == QCA8081_PHY_ID) 1199 + cdt_en = QCA808X_CDT_ENABLE_TEST; 1200 + else 1201 + cdt_en = AT803X_CDT_ENABLE_TEST; 1363 1202 1364 1203 /* One test run takes about 25ms */ 1365 1204 ret = phy_read_poll_timeout(phydev, AT803X_CDT, val, 1366 - !(val & AT803X_CDT_ENABLE_TEST), 1205 + !(val & cdt_en), 1367 1206 30000, 100000, true); 1368 1207 1369 1208 return ret < 0 ? ret : 0; ··· 1578 1405 return 0; 1579 1406 } 1580 1407 1408 + static int qca808x_phy_fast_retrain_config(struct phy_device *phydev) 1409 + { 1410 + int ret; 1411 + 1412 + /* Enable fast retrain */ 1413 + ret = genphy_c45_fast_retrain(phydev, true); 1414 + if (ret) 1415 + return ret; 1416 + 1417 + phy_write_mmd(phydev, MDIO_MMD_AN, QCA808X_PHY_MMD7_TOP_OPTION1, 1418 + QCA808X_TOP_OPTION1_DATA); 1419 + phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_20DB, 1420 + QCA808X_MSE_THRESHOLD_20DB_VALUE); 1421 + phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_17DB, 1422 + QCA808X_MSE_THRESHOLD_17DB_VALUE); 1423 + phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_27DB, 1424 + QCA808X_MSE_THRESHOLD_27DB_VALUE); 1425 + phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_28DB, 1426 + QCA808X_MSE_THRESHOLD_28DB_VALUE); 1427 + phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_1, 1428 + QCA808X_MMD3_DEBUG_1_VALUE); 1429 + phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_4, 1430 + QCA808X_MMD3_DEBUG_4_VALUE); 1431 + phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_5, 1432 + QCA808X_MMD3_DEBUG_5_VALUE); 1433 + phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_3, 1434 + QCA808X_MMD3_DEBUG_3_VALUE); 1435 + phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_6, 1436 + QCA808X_MMD3_DEBUG_6_VALUE); 1437 + phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_2, 1438 + QCA808X_MMD3_DEBUG_2_VALUE); 1439 + 1440 + return 0; 1441 + } 1442 + 1443 + static int qca808x_phy_ms_random_seed_set(struct phy_device *phydev) 1444 + { 1445 + u16 seed_value = (prandom_u32() % QCA808X_MASTER_SLAVE_SEED_RANGE); 1446 + 1447 + return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_LOCAL_SEED, 1448 + QCA808X_MASTER_SLAVE_SEED_CFG, 1449 + FIELD_PREP(QCA808X_MASTER_SLAVE_SEED_CFG, seed_value)); 1450 + } 1451 + 1452 + static int qca808x_phy_ms_seed_enable(struct phy_device *phydev, bool enable) 1453 + { 1454 + u16 seed_enable = 0; 1455 + 1456 + if (enable) 1457 + seed_enable = QCA808X_MASTER_SLAVE_SEED_ENABLE; 1458 + 1459 + return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_LOCAL_SEED, 1460 + QCA808X_MASTER_SLAVE_SEED_ENABLE, seed_enable); 1461 + } 1462 + 1463 + static int qca808x_config_init(struct phy_device *phydev) 1464 + { 1465 + int ret; 1466 + 1467 + /* Active adc&vga on 802.3az for the link 1000M and 100M */ 1468 + ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_ADDR_CLD_CTRL7, 1469 + QCA808X_8023AZ_AFE_CTRL_MASK, QCA808X_8023AZ_AFE_EN); 1470 + if (ret) 1471 + return ret; 1472 + 1473 + /* Adjust the threshold on 802.3az for the link 1000M */ 1474 + ret = phy_write_mmd(phydev, MDIO_MMD_PCS, 1475 + QCA808X_PHY_MMD3_AZ_TRAINING_CTRL, QCA808X_MMD3_AZ_TRAINING_VAL); 1476 + if (ret) 1477 + return ret; 1478 + 1479 + /* Config the fast retrain for the link 2500M */ 1480 + ret = qca808x_phy_fast_retrain_config(phydev); 1481 + if (ret) 1482 + return ret; 1483 + 1484 + /* Configure lower ramdom seed to make phy linked as slave mode */ 1485 + ret = qca808x_phy_ms_random_seed_set(phydev); 1486 + if (ret) 1487 + return ret; 1488 + 1489 + /* Enable seed */ 1490 + ret = qca808x_phy_ms_seed_enable(phydev, true); 1491 + if (ret) 1492 + return ret; 1493 + 1494 + /* Configure adc threshold as 100mv for the link 10M */ 1495 + return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_ADC_THRESHOLD, 1496 + QCA808X_ADC_THRESHOLD_MASK, QCA808X_ADC_THRESHOLD_100MV); 1497 + } 1498 + 1499 + static int qca808x_read_status(struct phy_device *phydev) 1500 + { 1501 + int ret; 1502 + 1503 + ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT); 1504 + if (ret < 0) 1505 + return ret; 1506 + 1507 + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->lp_advertising, 1508 + ret & MDIO_AN_10GBT_STAT_LP2_5G); 1509 + 1510 + ret = genphy_read_status(phydev); 1511 + if (ret) 1512 + return ret; 1513 + 1514 + ret = at803x_read_specific_status(phydev); 1515 + if (ret < 0) 1516 + return ret; 1517 + 1518 + if (phydev->link && phydev->speed == SPEED_2500) 1519 + phydev->interface = PHY_INTERFACE_MODE_2500BASEX; 1520 + else 1521 + phydev->interface = PHY_INTERFACE_MODE_SMII; 1522 + 1523 + /* generate seed as a lower random value to make PHY linked as SLAVE easily, 1524 + * except for master/slave configuration fault detected. 1525 + * the reason for not putting this code into the function link_change_notify is 1526 + * the corner case where the link partner is also the qca8081 PHY and the seed 1527 + * value is configured as the same value, the link can't be up and no link change 1528 + * occurs. 1529 + */ 1530 + if (!phydev->link) { 1531 + if (phydev->master_slave_state == MASTER_SLAVE_STATE_ERR) { 1532 + qca808x_phy_ms_seed_enable(phydev, false); 1533 + } else { 1534 + qca808x_phy_ms_random_seed_set(phydev); 1535 + qca808x_phy_ms_seed_enable(phydev, true); 1536 + } 1537 + } 1538 + 1539 + return 0; 1540 + } 1541 + 1542 + static int qca808x_soft_reset(struct phy_device *phydev) 1543 + { 1544 + int ret; 1545 + 1546 + ret = genphy_soft_reset(phydev); 1547 + if (ret < 0) 1548 + return ret; 1549 + 1550 + return qca808x_phy_ms_seed_enable(phydev, true); 1551 + } 1552 + 1553 + static bool qca808x_cdt_fault_length_valid(int cdt_code) 1554 + { 1555 + switch (cdt_code) { 1556 + case QCA808X_CDT_STATUS_STAT_SHORT: 1557 + case QCA808X_CDT_STATUS_STAT_OPEN: 1558 + return true; 1559 + default: 1560 + return false; 1561 + } 1562 + } 1563 + 1564 + static int qca808x_cable_test_result_trans(int cdt_code) 1565 + { 1566 + switch (cdt_code) { 1567 + case QCA808X_CDT_STATUS_STAT_NORMAL: 1568 + return ETHTOOL_A_CABLE_RESULT_CODE_OK; 1569 + case QCA808X_CDT_STATUS_STAT_SHORT: 1570 + return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT; 1571 + case QCA808X_CDT_STATUS_STAT_OPEN: 1572 + return ETHTOOL_A_CABLE_RESULT_CODE_OPEN; 1573 + case QCA808X_CDT_STATUS_STAT_FAIL: 1574 + default: 1575 + return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC; 1576 + } 1577 + } 1578 + 1579 + static int qca808x_cdt_fault_length(struct phy_device *phydev, int pair) 1580 + { 1581 + int val; 1582 + u32 cdt_length_reg = 0; 1583 + 1584 + switch (pair) { 1585 + case ETHTOOL_A_CABLE_PAIR_A: 1586 + cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_A; 1587 + break; 1588 + case ETHTOOL_A_CABLE_PAIR_B: 1589 + cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_B; 1590 + break; 1591 + case ETHTOOL_A_CABLE_PAIR_C: 1592 + cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_C; 1593 + break; 1594 + case ETHTOOL_A_CABLE_PAIR_D: 1595 + cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_D; 1596 + break; 1597 + default: 1598 + return -EINVAL; 1599 + } 1600 + 1601 + val = phy_read_mmd(phydev, MDIO_MMD_PCS, cdt_length_reg); 1602 + if (val < 0) 1603 + return val; 1604 + 1605 + return (FIELD_GET(QCA808X_CDT_DIAG_LENGTH, val) * 824) / 10; 1606 + } 1607 + 1608 + static int qca808x_cable_test_start(struct phy_device *phydev) 1609 + { 1610 + int ret; 1611 + 1612 + /* perform CDT with the following configs: 1613 + * 1. disable hibernation. 1614 + * 2. force PHY working in MDI mode. 1615 + * 3. for PHY working in 1000BaseT. 1616 + * 4. configure the threshold. 1617 + */ 1618 + 1619 + ret = at803x_debug_reg_mask(phydev, QCA808X_DBG_AN_TEST, QCA808X_HIBERNATION_EN, 0); 1620 + if (ret < 0) 1621 + return ret; 1622 + 1623 + ret = at803x_config_mdix(phydev, ETH_TP_MDI); 1624 + if (ret < 0) 1625 + return ret; 1626 + 1627 + /* Force 1000base-T needs to configure PMA/PMD and MII_BMCR */ 1628 + phydev->duplex = DUPLEX_FULL; 1629 + phydev->speed = SPEED_1000; 1630 + ret = genphy_c45_pma_setup_forced(phydev); 1631 + if (ret < 0) 1632 + return ret; 1633 + 1634 + ret = genphy_setup_forced(phydev); 1635 + if (ret < 0) 1636 + return ret; 1637 + 1638 + /* configure the thresholds for open, short, pair ok test */ 1639 + phy_write_mmd(phydev, MDIO_MMD_PCS, 0x8074, 0xc040); 1640 + phy_write_mmd(phydev, MDIO_MMD_PCS, 0x8076, 0xc040); 1641 + phy_write_mmd(phydev, MDIO_MMD_PCS, 0x8077, 0xa060); 1642 + phy_write_mmd(phydev, MDIO_MMD_PCS, 0x8078, 0xc050); 1643 + phy_write_mmd(phydev, MDIO_MMD_PCS, 0x807a, 0xc060); 1644 + phy_write_mmd(phydev, MDIO_MMD_PCS, 0x807e, 0xb060); 1645 + 1646 + return 0; 1647 + } 1648 + 1649 + static int qca808x_cable_test_get_status(struct phy_device *phydev, bool *finished) 1650 + { 1651 + int ret, val; 1652 + int pair_a, pair_b, pair_c, pair_d; 1653 + 1654 + *finished = false; 1655 + 1656 + ret = at803x_cdt_start(phydev, 0); 1657 + if (ret) 1658 + return ret; 1659 + 1660 + ret = at803x_cdt_wait_for_completion(phydev); 1661 + if (ret) 1662 + return ret; 1663 + 1664 + val = phy_read_mmd(phydev, MDIO_MMD_PCS, QCA808X_MMD3_CDT_STATUS); 1665 + if (val < 0) 1666 + return val; 1667 + 1668 + pair_a = FIELD_GET(QCA808X_CDT_CODE_PAIR_A, val); 1669 + pair_b = FIELD_GET(QCA808X_CDT_CODE_PAIR_B, val); 1670 + pair_c = FIELD_GET(QCA808X_CDT_CODE_PAIR_C, val); 1671 + pair_d = FIELD_GET(QCA808X_CDT_CODE_PAIR_D, val); 1672 + 1673 + ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A, 1674 + qca808x_cable_test_result_trans(pair_a)); 1675 + ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_B, 1676 + qca808x_cable_test_result_trans(pair_b)); 1677 + ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_C, 1678 + qca808x_cable_test_result_trans(pair_c)); 1679 + ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_D, 1680 + qca808x_cable_test_result_trans(pair_d)); 1681 + 1682 + if (qca808x_cdt_fault_length_valid(pair_a)) 1683 + ethnl_cable_test_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_A, 1684 + qca808x_cdt_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_A)); 1685 + if (qca808x_cdt_fault_length_valid(pair_b)) 1686 + ethnl_cable_test_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_B, 1687 + qca808x_cdt_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_B)); 1688 + if (qca808x_cdt_fault_length_valid(pair_c)) 1689 + ethnl_cable_test_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_C, 1690 + qca808x_cdt_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_C)); 1691 + if (qca808x_cdt_fault_length_valid(pair_d)) 1692 + ethnl_cable_test_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_D, 1693 + qca808x_cdt_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_D)); 1694 + 1695 + *finished = true; 1696 + 1697 + return 0; 1698 + } 1699 + 1581 1700 static struct phy_driver at803x_driver[] = { 1582 1701 { 1583 1702 /* Qualcomm Atheros AR8035 */ ··· 2029 1564 .get_stats = at803x_get_stats, 2030 1565 .suspend = qca83xx_suspend, 2031 1566 .resume = qca83xx_resume, 1567 + }, { 1568 + /* Qualcomm QCA8081 */ 1569 + PHY_ID_MATCH_EXACT(QCA8081_PHY_ID), 1570 + .name = "Qualcomm QCA8081", 1571 + .flags = PHY_POLL_CABLE_TEST, 1572 + .config_intr = at803x_config_intr, 1573 + .handle_interrupt = at803x_handle_interrupt, 1574 + .get_tunable = at803x_get_tunable, 1575 + .set_tunable = at803x_set_tunable, 1576 + .set_wol = at803x_set_wol, 1577 + .get_wol = at803x_get_wol, 1578 + .get_features = at803x_get_features, 1579 + .config_aneg = at803x_config_aneg, 1580 + .suspend = genphy_suspend, 1581 + .resume = genphy_resume, 1582 + .read_status = qca808x_read_status, 1583 + .config_init = qca808x_config_init, 1584 + .soft_reset = qca808x_soft_reset, 1585 + .cable_test_start = qca808x_cable_test_start, 1586 + .cable_test_get_status = qca808x_cable_test_get_status, 2032 1587 }, }; 2033 1588 2034 1589 module_phy_driver(at803x_driver); ··· 2063 1578 { PHY_ID_MATCH_EXACT(QCA8327_A_PHY_ID) }, 2064 1579 { PHY_ID_MATCH_EXACT(QCA8327_B_PHY_ID) }, 2065 1580 { PHY_ID_MATCH_EXACT(QCA9561_PHY_ID) }, 1581 + { PHY_ID_MATCH_EXACT(QCA8081_PHY_ID) }, 2066 1582 { } 2067 1583 }; 2068 1584
+34
drivers/net/phy/phy-c45.c
··· 611 611 } 612 612 EXPORT_SYMBOL_GPL(genphy_c45_loopback); 613 613 614 + /** 615 + * genphy_c45_fast_retrain - configure fast retrain registers 616 + * @phydev: target phy_device struct 617 + * 618 + * Description: If fast-retrain is enabled, we configure PHY as 619 + * advertising fast retrain capable and THP Bypass Request, then 620 + * enable fast retrain. If it is not enabled, we configure fast 621 + * retrain disabled. 622 + */ 623 + int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable) 624 + { 625 + int ret; 626 + 627 + if (!enable) 628 + return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FSRT_CSR, 629 + MDIO_PMA_10GBR_FSRT_ENABLE); 630 + 631 + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->supported)) { 632 + ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, 633 + MDIO_AN_10GBT_CTRL_ADVFSRT2_5G); 634 + if (ret) 635 + return ret; 636 + 637 + ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_CTRL2, 638 + MDIO_AN_THP_BP2_5GT); 639 + if (ret) 640 + return ret; 641 + } 642 + 643 + return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FSRT_CSR, 644 + MDIO_PMA_10GBR_FSRT_ENABLE); 645 + } 646 + EXPORT_SYMBOL_GPL(genphy_c45_fast_retrain); 647 + 614 648 struct phy_driver genphy_c45_driver = { 615 649 .phy_id = 0xffffffff, 616 650 .phy_id_mask = 0xffffffff,
+1
include/linux/phy.h
··· 1584 1584 int genphy_c45_loopback(struct phy_device *phydev, bool enable); 1585 1585 int genphy_c45_pma_resume(struct phy_device *phydev); 1586 1586 int genphy_c45_pma_suspend(struct phy_device *phydev); 1587 + int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable); 1587 1588 1588 1589 /* Generic C45 PHY driver */ 1589 1590 extern struct phy_driver genphy_c45_driver;
+9
include/uapi/linux/mdio.h
··· 53 53 #define MDIO_AN_EEE_LPABLE 61 /* EEE link partner ability */ 54 54 #define MDIO_AN_EEE_ADV2 62 /* EEE advertisement 2 */ 55 55 #define MDIO_AN_EEE_LPABLE2 63 /* EEE link partner ability 2 */ 56 + #define MDIO_AN_CTRL2 64 /* AN THP bypass request control */ 56 57 57 58 /* Media-dependent registers. */ 58 59 #define MDIO_PMA_10GBT_SWAPPOL 130 /* 10GBASE-T pair swap & polarity */ 59 60 #define MDIO_PMA_10GBT_TXPWR 131 /* 10GBASE-T TX power control */ 60 61 #define MDIO_PMA_10GBT_SNR 133 /* 10GBASE-T SNR margin, lane A. 61 62 * Lanes B-D are numbered 134-136. */ 63 + #define MDIO_PMA_10GBR_FSRT_CSR 147 /* 10GBASE-R fast retrain status and control */ 62 64 #define MDIO_PMA_10GBR_FECABLE 170 /* 10GBASE-R FEC ability */ 63 65 #define MDIO_PCS_10GBX_STAT1 24 /* 10GBASE-X PCS status 1 */ 64 66 #define MDIO_PCS_10GBRT_STAT1 32 /* 10GBASE-R/-T PCS status 1 */ ··· 241 239 #define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001 /* FEC ability */ 242 240 #define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002 /* FEC error indic. ability */ 243 241 242 + /* PMA 10GBASE-R Fast Retrain status and control register. */ 243 + #define MDIO_PMA_10GBR_FSRT_ENABLE 0x0001 /* Fast retrain enable */ 244 + 244 245 /* PCS 10GBASE-R/-T status register 1. */ 245 246 #define MDIO_PCS_10GBRT_STAT1_BLKLK 0x0001 /* Block lock attained */ 246 247 ··· 252 247 #define MDIO_PCS_10GBRT_STAT2_BER 0x3f00 253 248 254 249 /* AN 10GBASE-T control register. */ 250 + #define MDIO_AN_10GBT_CTRL_ADVFSRT2_5G 0x0020 /* Advertise 2.5GBASE-T fast retrain */ 255 251 #define MDIO_AN_10GBT_CTRL_ADV2_5G 0x0080 /* Advertise 2.5GBASE-T */ 256 252 #define MDIO_AN_10GBT_CTRL_ADV5G 0x0100 /* Advertise 5GBASE-T */ 257 253 #define MDIO_AN_10GBT_CTRL_ADV10G 0x1000 /* Advertise 10GBASE-T */ ··· 294 288 295 289 #define MDIO_EEE_2_5GT 0x0001 /* 2.5GT EEE cap */ 296 290 #define MDIO_EEE_5GT 0x0002 /* 5GT EEE cap */ 291 + 292 + /* AN MultiGBASE-T AN control 2 */ 293 + #define MDIO_AN_THP_BP2_5GT 0x0008 /* 2.5GT THP bypass request */ 297 294 298 295 /* 2.5G/5G Extended abilities register. */ 299 296 #define MDIO_PMA_NG_EXTABLE_2_5GBT 0x0001 /* 2.5GBASET ability */