phy-c45.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Clause 45 PHY support
  4. */
  5. #include <linux/ethtool.h>
  6. #include <linux/export.h>
  7. #include <linux/mdio.h>
  8. #include <linux/mii.h>
  9. #include <linux/phy.h>
  10. /**
  11. * genphy_c45_setup_forced - configures a forced speed
  12. * @phydev: target phy_device struct
  13. */
  14. int genphy_c45_pma_setup_forced(struct phy_device *phydev)
  15. {
  16. int ctrl1, ctrl2, ret;
  17. /* Half duplex is not supported */
  18. if (phydev->duplex != DUPLEX_FULL)
  19. return -EINVAL;
  20. ctrl1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
  21. if (ctrl1 < 0)
  22. return ctrl1;
  23. ctrl2 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2);
  24. if (ctrl2 < 0)
  25. return ctrl2;
  26. ctrl1 &= ~MDIO_CTRL1_SPEEDSEL;
  27. /*
  28. * PMA/PMD type selection is 1.7.5:0 not 1.7.3:0. See 45.2.1.6.1
  29. * in 802.3-2012 and 802.3-2015.
  30. */
  31. ctrl2 &= ~(MDIO_PMA_CTRL2_TYPE | 0x30);
  32. switch (phydev->speed) {
  33. case SPEED_10:
  34. ctrl2 |= MDIO_PMA_CTRL2_10BT;
  35. break;
  36. case SPEED_100:
  37. ctrl1 |= MDIO_PMA_CTRL1_SPEED100;
  38. ctrl2 |= MDIO_PMA_CTRL2_100BTX;
  39. break;
  40. case SPEED_1000:
  41. ctrl1 |= MDIO_PMA_CTRL1_SPEED1000;
  42. /* Assume 1000base-T */
  43. ctrl2 |= MDIO_PMA_CTRL2_1000BT;
  44. break;
  45. case SPEED_2500:
  46. ctrl1 |= MDIO_CTRL1_SPEED2_5G;
  47. /* Assume 2.5Gbase-T */
  48. ctrl2 |= MDIO_PMA_CTRL2_2_5GBT;
  49. break;
  50. case SPEED_5000:
  51. ctrl1 |= MDIO_CTRL1_SPEED5G;
  52. /* Assume 5Gbase-T */
  53. ctrl2 |= MDIO_PMA_CTRL2_5GBT;
  54. break;
  55. case SPEED_10000:
  56. ctrl1 |= MDIO_CTRL1_SPEED10G;
  57. /* Assume 10Gbase-T */
  58. ctrl2 |= MDIO_PMA_CTRL2_10GBT;
  59. break;
  60. default:
  61. return -EINVAL;
  62. }
  63. ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, ctrl1);
  64. if (ret < 0)
  65. return ret;
  66. ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2, ctrl2);
  67. if (ret < 0)
  68. return ret;
  69. return genphy_c45_an_disable_aneg(phydev);
  70. }
  71. EXPORT_SYMBOL_GPL(genphy_c45_pma_setup_forced);
  72. /**
  73. * genphy_c45_an_config_aneg - configure advertisement registers
  74. * @phydev: target phy_device struct
  75. *
  76. * Configure advertisement registers based on modes set in phydev->advertising
  77. *
  78. * Returns negative errno code on failure, 0 if advertisement didn't change,
  79. * or 1 if advertised modes changed.
  80. */
  81. int genphy_c45_an_config_aneg(struct phy_device *phydev)
  82. {
  83. int changed, ret;
  84. u32 adv;
  85. linkmode_and(phydev->advertising, phydev->advertising,
  86. phydev->supported);
  87. changed = genphy_config_eee_advert(phydev);
  88. adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
  89. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE,
  90. ADVERTISE_ALL | ADVERTISE_100BASE4 |
  91. ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
  92. adv);
  93. if (ret < 0)
  94. return ret;
  95. if (ret > 0)
  96. changed = 1;
  97. adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
  98. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
  99. MDIO_AN_10GBT_CTRL_ADV10G |
  100. MDIO_AN_10GBT_CTRL_ADV5G |
  101. MDIO_AN_10GBT_CTRL_ADV2_5G, adv);
  102. if (ret < 0)
  103. return ret;
  104. if (ret > 0)
  105. changed = 1;
  106. return changed;
  107. }
  108. EXPORT_SYMBOL_GPL(genphy_c45_an_config_aneg);
  109. /**
  110. * genphy_c45_an_disable_aneg - disable auto-negotiation
  111. * @phydev: target phy_device struct
  112. *
  113. * Disable auto-negotiation in the Clause 45 PHY. The link parameters
  114. * parameters are controlled through the PMA/PMD MMD registers.
  115. *
  116. * Returns zero on success, negative errno code on failure.
  117. */
  118. int genphy_c45_an_disable_aneg(struct phy_device *phydev)
  119. {
  120. return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1,
  121. MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
  122. }
  123. EXPORT_SYMBOL_GPL(genphy_c45_an_disable_aneg);
  124. /**
  125. * genphy_c45_restart_aneg - Enable and restart auto-negotiation
  126. * @phydev: target phy_device struct
  127. *
  128. * This assumes that the auto-negotiation MMD is present.
  129. *
  130. * Enable and restart auto-negotiation.
  131. */
  132. int genphy_c45_restart_aneg(struct phy_device *phydev)
  133. {
  134. return phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1,
  135. MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
  136. }
  137. EXPORT_SYMBOL_GPL(genphy_c45_restart_aneg);
  138. /**
  139. * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation
  140. * @phydev: target phy_device struct
  141. * @restart: whether aneg restart is requested
  142. *
  143. * This assumes that the auto-negotiation MMD is present.
  144. *
  145. * Check, and restart auto-negotiation if needed.
  146. */
  147. int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart)
  148. {
  149. int ret = 0;
  150. if (!restart) {
  151. /* Configure and restart aneg if it wasn't set before */
  152. ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
  153. if (ret < 0)
  154. return ret;
  155. if (!(ret & MDIO_AN_CTRL1_ENABLE))
  156. restart = true;
  157. }
  158. if (restart)
  159. ret = genphy_c45_restart_aneg(phydev);
  160. return ret;
  161. }
  162. EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg);
  163. /**
  164. * genphy_c45_aneg_done - return auto-negotiation complete status
  165. * @phydev: target phy_device struct
  166. *
  167. * This assumes that the auto-negotiation MMD is present.
  168. *
  169. * Reads the status register from the auto-negotiation MMD, returning:
  170. * - positive if auto-negotiation is complete
  171. * - negative errno code on error
  172. * - zero otherwise
  173. */
  174. int genphy_c45_aneg_done(struct phy_device *phydev)
  175. {
  176. int val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
  177. return val < 0 ? val : val & MDIO_AN_STAT1_COMPLETE ? 1 : 0;
  178. }
  179. EXPORT_SYMBOL_GPL(genphy_c45_aneg_done);
  180. /**
  181. * genphy_c45_read_link - read the overall link status from the MMDs
  182. * @phydev: target phy_device struct
  183. *
  184. * Read the link status from the specified MMDs, and if they all indicate
  185. * that the link is up, set phydev->link to 1. If an error is encountered,
  186. * a negative errno will be returned, otherwise zero.
  187. */
  188. int genphy_c45_read_link(struct phy_device *phydev)
  189. {
  190. u32 mmd_mask = MDIO_DEVS_PMAPMD;
  191. int val, devad;
  192. bool link = true;
  193. if (phydev->c45_ids.devices_in_package & MDIO_DEVS_AN) {
  194. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
  195. if (val < 0)
  196. return val;
  197. /* Autoneg is being started, therefore disregard current
  198. * link status and report link as down.
  199. */
  200. if (val & MDIO_AN_CTRL1_RESTART) {
  201. phydev->link = 0;
  202. return 0;
  203. }
  204. }
  205. while (mmd_mask && link) {
  206. devad = __ffs(mmd_mask);
  207. mmd_mask &= ~BIT(devad);
  208. /* The link state is latched low so that momentary link
  209. * drops can be detected. Do not double-read the status
  210. * in polling mode to detect such short link drops except
  211. * the link was already down.
  212. */
  213. if (!phy_polling_mode(phydev) || !phydev->link) {
  214. val = phy_read_mmd(phydev, devad, MDIO_STAT1);
  215. if (val < 0)
  216. return val;
  217. else if (val & MDIO_STAT1_LSTATUS)
  218. continue;
  219. }
  220. val = phy_read_mmd(phydev, devad, MDIO_STAT1);
  221. if (val < 0)
  222. return val;
  223. if (!(val & MDIO_STAT1_LSTATUS))
  224. link = false;
  225. }
  226. phydev->link = link;
  227. return 0;
  228. }
  229. EXPORT_SYMBOL_GPL(genphy_c45_read_link);
  230. /**
  231. * genphy_c45_read_lpa - read the link partner advertisement and pause
  232. * @phydev: target phy_device struct
  233. *
  234. * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers,
  235. * filling in the link partner advertisement, pause and asym_pause members
  236. * in @phydev. This assumes that the auto-negotiation MMD is present, and
  237. * the backplane bit (7.48.0) is clear. Clause 45 PHY drivers are expected
  238. * to fill in the remainder of the link partner advert from vendor registers.
  239. */
  240. int genphy_c45_read_lpa(struct phy_device *phydev)
  241. {
  242. int val;
  243. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
  244. if (val < 0)
  245. return val;
  246. if (!(val & MDIO_AN_STAT1_COMPLETE)) {
  247. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
  248. phydev->lp_advertising);
  249. mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
  250. mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, 0);
  251. phydev->pause = 0;
  252. phydev->asym_pause = 0;
  253. return 0;
  254. }
  255. linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising,
  256. val & MDIO_AN_STAT1_LPABLE);
  257. /* Read the link partner's base page advertisement */
  258. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_LPA);
  259. if (val < 0)
  260. return val;
  261. mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, val);
  262. phydev->pause = val & LPA_PAUSE_CAP ? 1 : 0;
  263. phydev->asym_pause = val & LPA_PAUSE_ASYM ? 1 : 0;
  264. /* Read the link partner's 10G advertisement */
  265. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
  266. if (val < 0)
  267. return val;
  268. mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, val);
  269. return 0;
  270. }
  271. EXPORT_SYMBOL_GPL(genphy_c45_read_lpa);
  272. /**
  273. * genphy_c45_read_pma - read link speed etc from PMA
  274. * @phydev: target phy_device struct
  275. */
  276. int genphy_c45_read_pma(struct phy_device *phydev)
  277. {
  278. int val;
  279. linkmode_zero(phydev->lp_advertising);
  280. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
  281. if (val < 0)
  282. return val;
  283. switch (val & MDIO_CTRL1_SPEEDSEL) {
  284. case 0:
  285. phydev->speed = SPEED_10;
  286. break;
  287. case MDIO_PMA_CTRL1_SPEED100:
  288. phydev->speed = SPEED_100;
  289. break;
  290. case MDIO_PMA_CTRL1_SPEED1000:
  291. phydev->speed = SPEED_1000;
  292. break;
  293. case MDIO_CTRL1_SPEED2_5G:
  294. phydev->speed = SPEED_2500;
  295. break;
  296. case MDIO_CTRL1_SPEED5G:
  297. phydev->speed = SPEED_5000;
  298. break;
  299. case MDIO_CTRL1_SPEED10G:
  300. phydev->speed = SPEED_10000;
  301. break;
  302. default:
  303. phydev->speed = SPEED_UNKNOWN;
  304. break;
  305. }
  306. phydev->duplex = DUPLEX_FULL;
  307. return 0;
  308. }
  309. EXPORT_SYMBOL_GPL(genphy_c45_read_pma);
  310. /**
  311. * genphy_c45_read_mdix - read mdix status from PMA
  312. * @phydev: target phy_device struct
  313. */
  314. int genphy_c45_read_mdix(struct phy_device *phydev)
  315. {
  316. int val;
  317. if (phydev->speed == SPEED_10000) {
  318. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
  319. MDIO_PMA_10GBT_SWAPPOL);
  320. if (val < 0)
  321. return val;
  322. switch (val) {
  323. case MDIO_PMA_10GBT_SWAPPOL_ABNX | MDIO_PMA_10GBT_SWAPPOL_CDNX:
  324. phydev->mdix = ETH_TP_MDI;
  325. break;
  326. case 0:
  327. phydev->mdix = ETH_TP_MDI_X;
  328. break;
  329. default:
  330. phydev->mdix = ETH_TP_MDI_INVALID;
  331. break;
  332. }
  333. }
  334. return 0;
  335. }
  336. EXPORT_SYMBOL_GPL(genphy_c45_read_mdix);
  337. /**
  338. * genphy_c45_pma_read_abilities - read supported link modes from PMA
  339. * @phydev: target phy_device struct
  340. *
  341. * Read the supported link modes from the PMA Status 2 (1.8) register. If bit
  342. * 1.8.9 is set, the list of supported modes is build using the values in the
  343. * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related
  344. * modes. If bit 1.11.14 is set, then the list is also extended with the modes
  345. * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and
  346. * 5GBASET are supported.
  347. */
  348. int genphy_c45_pma_read_abilities(struct phy_device *phydev)
  349. {
  350. int val;
  351. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
  352. if (phydev->c45_ids.devices_in_package & MDIO_DEVS_AN) {
  353. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
  354. if (val < 0)
  355. return val;
  356. if (val & MDIO_AN_STAT1_ABLE)
  357. linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
  358. phydev->supported);
  359. }
  360. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT2);
  361. if (val < 0)
  362. return val;
  363. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
  364. phydev->supported,
  365. val & MDIO_PMA_STAT2_10GBSR);
  366. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
  367. phydev->supported,
  368. val & MDIO_PMA_STAT2_10GBLR);
  369. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT,
  370. phydev->supported,
  371. val & MDIO_PMA_STAT2_10GBER);
  372. if (val & MDIO_PMA_STAT2_EXTABLE) {
  373. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
  374. if (val < 0)
  375. return val;
  376. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
  377. phydev->supported,
  378. val & MDIO_PMA_EXTABLE_10GBLRM);
  379. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
  380. phydev->supported,
  381. val & MDIO_PMA_EXTABLE_10GBT);
  382. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
  383. phydev->supported,
  384. val & MDIO_PMA_EXTABLE_10GBKX4);
  385. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
  386. phydev->supported,
  387. val & MDIO_PMA_EXTABLE_10GBKR);
  388. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  389. phydev->supported,
  390. val & MDIO_PMA_EXTABLE_1000BT);
  391. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
  392. phydev->supported,
  393. val & MDIO_PMA_EXTABLE_1000BKX);
  394. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
  395. phydev->supported,
  396. val & MDIO_PMA_EXTABLE_100BTX);
  397. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
  398. phydev->supported,
  399. val & MDIO_PMA_EXTABLE_100BTX);
  400. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
  401. phydev->supported,
  402. val & MDIO_PMA_EXTABLE_10BT);
  403. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
  404. phydev->supported,
  405. val & MDIO_PMA_EXTABLE_10BT);
  406. if (val & MDIO_PMA_EXTABLE_NBT) {
  407. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
  408. MDIO_PMA_NG_EXTABLE);
  409. if (val < 0)
  410. return val;
  411. linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  412. phydev->supported,
  413. val & MDIO_PMA_NG_EXTABLE_2_5GBT);
  414. linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
  415. phydev->supported,
  416. val & MDIO_PMA_NG_EXTABLE_5GBT);
  417. }
  418. }
  419. return 0;
  420. }
  421. EXPORT_SYMBOL_GPL(genphy_c45_pma_read_abilities);
  422. /**
  423. * genphy_c45_read_status - read PHY status
  424. * @phydev: target phy_device struct
  425. *
  426. * Reads status from PHY and sets phy_device members accordingly.
  427. */
  428. int genphy_c45_read_status(struct phy_device *phydev)
  429. {
  430. int ret;
  431. ret = genphy_c45_read_link(phydev);
  432. if (ret)
  433. return ret;
  434. phydev->speed = SPEED_UNKNOWN;
  435. phydev->duplex = DUPLEX_UNKNOWN;
  436. phydev->pause = 0;
  437. phydev->asym_pause = 0;
  438. if (phydev->autoneg == AUTONEG_ENABLE) {
  439. ret = genphy_c45_read_lpa(phydev);
  440. if (ret)
  441. return ret;
  442. phy_resolve_aneg_linkmode(phydev);
  443. } else {
  444. ret = genphy_c45_read_pma(phydev);
  445. }
  446. return ret;
  447. }
  448. EXPORT_SYMBOL_GPL(genphy_c45_read_status);
  449. /**
  450. * genphy_c45_config_aneg - restart auto-negotiation or forced setup
  451. * @phydev: target phy_device struct
  452. *
  453. * Description: If auto-negotiation is enabled, we configure the
  454. * advertising, and then restart auto-negotiation. If it is not
  455. * enabled, then we force a configuration.
  456. */
  457. int genphy_c45_config_aneg(struct phy_device *phydev)
  458. {
  459. bool changed = false;
  460. int ret;
  461. if (phydev->autoneg == AUTONEG_DISABLE)
  462. return genphy_c45_pma_setup_forced(phydev);
  463. ret = genphy_c45_an_config_aneg(phydev);
  464. if (ret < 0)
  465. return ret;
  466. if (ret > 0)
  467. changed = true;
  468. return genphy_c45_check_and_restart_aneg(phydev, changed);
  469. }
  470. EXPORT_SYMBOL_GPL(genphy_c45_config_aneg);
  471. /* The gen10g_* functions are the old Clause 45 stub */
  472. int gen10g_config_aneg(struct phy_device *phydev)
  473. {
  474. return 0;
  475. }
  476. EXPORT_SYMBOL_GPL(gen10g_config_aneg);
  477. struct phy_driver genphy_c45_driver = {
  478. .phy_id = 0xffffffff,
  479. .phy_id_mask = 0xffffffff,
  480. .name = "Generic Clause 45 PHY",
  481. .soft_reset = genphy_no_soft_reset,
  482. .read_status = genphy_c45_read_status,
  483. };