phy-c45.c 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834
  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. #include <linux/ethtool_netlink.h>
  11. #include "mdio-open-alliance.h"
  12. #include "phylib-internal.h"
  13. /**
  14. * genphy_c45_baset1_able - checks if the PMA has BASE-T1 extended abilities
  15. * @phydev: target phy_device struct
  16. */
  17. static bool genphy_c45_baset1_able(struct phy_device *phydev)
  18. {
  19. int val;
  20. if (phydev->pma_extable == -ENODATA) {
  21. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
  22. if (val < 0)
  23. return false;
  24. phydev->pma_extable = val;
  25. }
  26. return !!(phydev->pma_extable & MDIO_PMA_EXTABLE_BT1);
  27. }
  28. /**
  29. * genphy_c45_pma_can_sleep - checks if the PMA have sleep support
  30. * @phydev: target phy_device struct
  31. */
  32. static bool genphy_c45_pma_can_sleep(struct phy_device *phydev)
  33. {
  34. int stat1;
  35. stat1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
  36. if (stat1 < 0)
  37. return false;
  38. return !!(stat1 & MDIO_STAT1_LPOWERABLE);
  39. }
  40. /**
  41. * genphy_c45_pma_resume - wakes up the PMA module
  42. * @phydev: target phy_device struct
  43. */
  44. int genphy_c45_pma_resume(struct phy_device *phydev)
  45. {
  46. if (!genphy_c45_pma_can_sleep(phydev))
  47. return -EOPNOTSUPP;
  48. return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1,
  49. MDIO_CTRL1_LPOWER);
  50. }
  51. EXPORT_SYMBOL_GPL(genphy_c45_pma_resume);
  52. /**
  53. * genphy_c45_pma_suspend - suspends the PMA module
  54. * @phydev: target phy_device struct
  55. */
  56. int genphy_c45_pma_suspend(struct phy_device *phydev)
  57. {
  58. if (!genphy_c45_pma_can_sleep(phydev))
  59. return -EOPNOTSUPP;
  60. return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1,
  61. MDIO_CTRL1_LPOWER);
  62. }
  63. EXPORT_SYMBOL_GPL(genphy_c45_pma_suspend);
  64. /**
  65. * genphy_c45_pma_baset1_setup_master_slave - configures forced master/slave
  66. * role of BaseT1 devices.
  67. * @phydev: target phy_device struct
  68. */
  69. int genphy_c45_pma_baset1_setup_master_slave(struct phy_device *phydev)
  70. {
  71. int ctl = 0;
  72. switch (phydev->master_slave_set) {
  73. case MASTER_SLAVE_CFG_MASTER_PREFERRED:
  74. case MASTER_SLAVE_CFG_MASTER_FORCE:
  75. ctl = MDIO_PMA_PMD_BT1_CTRL_CFG_MST;
  76. break;
  77. case MASTER_SLAVE_CFG_SLAVE_FORCE:
  78. case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
  79. break;
  80. case MASTER_SLAVE_CFG_UNKNOWN:
  81. case MASTER_SLAVE_CFG_UNSUPPORTED:
  82. return 0;
  83. default:
  84. phydev_warn(phydev, "Unsupported Master/Slave mode\n");
  85. return -EOPNOTSUPP;
  86. }
  87. return phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL,
  88. MDIO_PMA_PMD_BT1_CTRL_CFG_MST, ctl);
  89. }
  90. EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_setup_master_slave);
  91. /**
  92. * genphy_c45_pma_setup_forced - configures a forced speed
  93. * @phydev: target phy_device struct
  94. */
  95. int genphy_c45_pma_setup_forced(struct phy_device *phydev)
  96. {
  97. int bt1_ctrl, ctrl1, ctrl2, ret;
  98. /* Half duplex is not supported */
  99. if (phydev->duplex != DUPLEX_FULL)
  100. return -EINVAL;
  101. ctrl1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
  102. if (ctrl1 < 0)
  103. return ctrl1;
  104. ctrl2 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2);
  105. if (ctrl2 < 0)
  106. return ctrl2;
  107. ctrl1 &= ~MDIO_CTRL1_SPEEDSEL;
  108. /*
  109. * PMA/PMD type selection is 1.7.5:0 not 1.7.3:0. See 45.2.1.6.1
  110. * in 802.3-2012 and 802.3-2015.
  111. */
  112. ctrl2 &= ~(MDIO_PMA_CTRL2_TYPE | 0x30);
  113. switch (phydev->speed) {
  114. case SPEED_10:
  115. if (genphy_c45_baset1_able(phydev))
  116. ctrl2 |= MDIO_PMA_CTRL2_BASET1;
  117. else
  118. ctrl2 |= MDIO_PMA_CTRL2_10BT;
  119. break;
  120. case SPEED_100:
  121. ctrl1 |= MDIO_PMA_CTRL1_SPEED100;
  122. ctrl2 |= MDIO_PMA_CTRL2_100BTX;
  123. break;
  124. case SPEED_1000:
  125. ctrl1 |= MDIO_PMA_CTRL1_SPEED1000;
  126. /* Assume 1000base-T */
  127. ctrl2 |= MDIO_PMA_CTRL2_1000BT;
  128. break;
  129. case SPEED_2500:
  130. ctrl1 |= MDIO_PMA_CTRL1_SPEED2_5G;
  131. /* Assume 2.5Gbase-T */
  132. ctrl2 |= MDIO_PMA_CTRL2_2_5GBT;
  133. break;
  134. case SPEED_5000:
  135. ctrl1 |= MDIO_PMA_CTRL1_SPEED5G;
  136. /* Assume 5Gbase-T */
  137. ctrl2 |= MDIO_PMA_CTRL2_5GBT;
  138. break;
  139. case SPEED_10000:
  140. ctrl1 |= MDIO_CTRL1_SPEED10G;
  141. /* Assume 10Gbase-T */
  142. ctrl2 |= MDIO_PMA_CTRL2_10GBT;
  143. break;
  144. default:
  145. return -EINVAL;
  146. }
  147. ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, ctrl1);
  148. if (ret < 0)
  149. return ret;
  150. ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2, ctrl2);
  151. if (ret < 0)
  152. return ret;
  153. if (genphy_c45_baset1_able(phydev)) {
  154. ret = genphy_c45_pma_baset1_setup_master_slave(phydev);
  155. if (ret < 0)
  156. return ret;
  157. bt1_ctrl = 0;
  158. if (phydev->speed == SPEED_1000)
  159. bt1_ctrl = MDIO_PMA_PMD_BT1_CTRL_STRAP_B1000;
  160. ret = phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL,
  161. MDIO_PMA_PMD_BT1_CTRL_STRAP, bt1_ctrl);
  162. if (ret < 0)
  163. return ret;
  164. }
  165. return genphy_c45_an_disable_aneg(phydev);
  166. }
  167. EXPORT_SYMBOL_GPL(genphy_c45_pma_setup_forced);
  168. /* Sets master/slave preference and supported technologies.
  169. * The preference is set in the BIT(4) of BASE-T1 AN
  170. * advertisement register 7.515 and whether the status
  171. * is forced or not, it is set in the BIT(12) of BASE-T1
  172. * AN advertisement register 7.514.
  173. * Sets 10BASE-T1L Ability BIT(14) in BASE-T1 autonegotiation
  174. * advertisement register [31:16] if supported.
  175. */
  176. static int genphy_c45_baset1_an_config_aneg(struct phy_device *phydev)
  177. {
  178. u16 adv_l_mask, adv_l = 0;
  179. u16 adv_m_mask, adv_m = 0;
  180. int changed = 0;
  181. int ret;
  182. adv_l_mask = MDIO_AN_T1_ADV_L_FORCE_MS | MDIO_AN_T1_ADV_L_PAUSE_CAP |
  183. MDIO_AN_T1_ADV_L_PAUSE_ASYM;
  184. adv_m_mask = MDIO_AN_T1_ADV_M_1000BT1 | MDIO_AN_T1_ADV_M_100BT1 |
  185. MDIO_AN_T1_ADV_M_MST | MDIO_AN_T1_ADV_M_B10L;
  186. switch (phydev->master_slave_set) {
  187. case MASTER_SLAVE_CFG_MASTER_FORCE:
  188. adv_m |= MDIO_AN_T1_ADV_M_MST;
  189. fallthrough;
  190. case MASTER_SLAVE_CFG_SLAVE_FORCE:
  191. adv_l |= MDIO_AN_T1_ADV_L_FORCE_MS;
  192. break;
  193. case MASTER_SLAVE_CFG_MASTER_PREFERRED:
  194. adv_m |= MDIO_AN_T1_ADV_M_MST;
  195. fallthrough;
  196. case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
  197. break;
  198. case MASTER_SLAVE_CFG_UNKNOWN:
  199. case MASTER_SLAVE_CFG_UNSUPPORTED:
  200. /* if master/slave role is not specified, do not overwrite it */
  201. adv_l_mask &= ~MDIO_AN_T1_ADV_L_FORCE_MS;
  202. adv_m_mask &= ~MDIO_AN_T1_ADV_M_MST;
  203. break;
  204. default:
  205. phydev_warn(phydev, "Unsupported Master/Slave mode\n");
  206. return -EOPNOTSUPP;
  207. }
  208. adv_l |= linkmode_adv_to_mii_t1_adv_l_t(phydev->advertising);
  209. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_L,
  210. adv_l_mask, adv_l);
  211. if (ret < 0)
  212. return ret;
  213. if (ret > 0)
  214. changed = 1;
  215. adv_m |= linkmode_adv_to_mii_t1_adv_m_t(phydev->advertising);
  216. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_M,
  217. adv_m_mask, adv_m);
  218. if (ret < 0)
  219. return ret;
  220. if (ret > 0)
  221. changed = 1;
  222. return changed;
  223. }
  224. /**
  225. * genphy_c45_an_config_aneg - configure advertisement registers
  226. * @phydev: target phy_device struct
  227. *
  228. * Configure advertisement registers based on modes set in phydev->advertising
  229. *
  230. * Returns negative errno code on failure, 0 if advertisement didn't change,
  231. * or 1 if advertised modes changed.
  232. */
  233. int genphy_c45_an_config_aneg(struct phy_device *phydev)
  234. {
  235. int changed = 0, ret;
  236. u32 adv;
  237. linkmode_and(phydev->advertising, phydev->advertising,
  238. phydev->supported);
  239. ret = genphy_c45_an_config_eee_aneg(phydev);
  240. if (ret < 0)
  241. return ret;
  242. else if (ret)
  243. changed = true;
  244. if (genphy_c45_baset1_able(phydev))
  245. return genphy_c45_baset1_an_config_aneg(phydev);
  246. adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
  247. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE,
  248. ADVERTISE_ALL | ADVERTISE_100BASE4 |
  249. ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
  250. adv);
  251. if (ret < 0)
  252. return ret;
  253. if (ret > 0)
  254. changed = 1;
  255. adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
  256. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
  257. MDIO_AN_10GBT_CTRL_ADV10G |
  258. MDIO_AN_10GBT_CTRL_ADV5G |
  259. MDIO_AN_10GBT_CTRL_ADV2_5G, adv);
  260. if (ret < 0)
  261. return ret;
  262. if (ret > 0)
  263. changed = 1;
  264. return changed;
  265. }
  266. EXPORT_SYMBOL_GPL(genphy_c45_an_config_aneg);
  267. /**
  268. * genphy_c45_an_disable_aneg - disable auto-negotiation
  269. * @phydev: target phy_device struct
  270. *
  271. * Disable auto-negotiation in the Clause 45 PHY. The link parameters
  272. * are controlled through the PMA/PMD MMD registers.
  273. *
  274. * Returns zero on success, negative errno code on failure.
  275. */
  276. int genphy_c45_an_disable_aneg(struct phy_device *phydev)
  277. {
  278. u16 reg = MDIO_CTRL1;
  279. if (genphy_c45_baset1_able(phydev))
  280. reg = MDIO_AN_T1_CTRL;
  281. return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, reg,
  282. MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
  283. }
  284. EXPORT_SYMBOL_GPL(genphy_c45_an_disable_aneg);
  285. /**
  286. * genphy_c45_restart_aneg - Enable and restart auto-negotiation
  287. * @phydev: target phy_device struct
  288. *
  289. * This assumes that the auto-negotiation MMD is present.
  290. *
  291. * Enable and restart auto-negotiation.
  292. */
  293. int genphy_c45_restart_aneg(struct phy_device *phydev)
  294. {
  295. u16 reg = MDIO_CTRL1;
  296. if (genphy_c45_baset1_able(phydev))
  297. reg = MDIO_AN_T1_CTRL;
  298. return phy_set_bits_mmd(phydev, MDIO_MMD_AN, reg,
  299. MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
  300. }
  301. EXPORT_SYMBOL_GPL(genphy_c45_restart_aneg);
  302. /**
  303. * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation
  304. * @phydev: target phy_device struct
  305. * @restart: whether aneg restart is requested
  306. *
  307. * This assumes that the auto-negotiation MMD is present.
  308. *
  309. * Check, and restart auto-negotiation if needed.
  310. */
  311. int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart)
  312. {
  313. u16 reg = MDIO_CTRL1;
  314. int ret;
  315. if (genphy_c45_baset1_able(phydev))
  316. reg = MDIO_AN_T1_CTRL;
  317. if (!restart) {
  318. /* Configure and restart aneg if it wasn't set before */
  319. ret = phy_read_mmd(phydev, MDIO_MMD_AN, reg);
  320. if (ret < 0)
  321. return ret;
  322. if (!(ret & MDIO_AN_CTRL1_ENABLE))
  323. restart = true;
  324. }
  325. if (restart)
  326. return genphy_c45_restart_aneg(phydev);
  327. return 0;
  328. }
  329. EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg);
  330. /**
  331. * genphy_c45_aneg_done - return auto-negotiation complete status
  332. * @phydev: target phy_device struct
  333. *
  334. * This assumes that the auto-negotiation MMD is present.
  335. *
  336. * Reads the status register from the auto-negotiation MMD, returning:
  337. * - positive if auto-negotiation is complete
  338. * - negative errno code on error
  339. * - zero otherwise
  340. */
  341. int genphy_c45_aneg_done(struct phy_device *phydev)
  342. {
  343. int reg = MDIO_STAT1;
  344. int val;
  345. if (genphy_c45_baset1_able(phydev))
  346. reg = MDIO_AN_T1_STAT;
  347. val = phy_read_mmd(phydev, MDIO_MMD_AN, reg);
  348. return val < 0 ? val : val & MDIO_AN_STAT1_COMPLETE ? 1 : 0;
  349. }
  350. EXPORT_SYMBOL_GPL(genphy_c45_aneg_done);
  351. /**
  352. * genphy_c45_read_link - read the overall link status from the MMDs
  353. * @phydev: target phy_device struct
  354. *
  355. * Read the link status from the specified MMDs, and if they all indicate
  356. * that the link is up, set phydev->link to 1. If an error is encountered,
  357. * a negative errno will be returned, otherwise zero.
  358. */
  359. int genphy_c45_read_link(struct phy_device *phydev)
  360. {
  361. u32 mmd_mask = MDIO_DEVS_PMAPMD;
  362. int val, devad;
  363. bool link = true;
  364. if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
  365. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
  366. if (val < 0)
  367. return val;
  368. /* Autoneg is being started, therefore disregard current
  369. * link status and report link as down.
  370. */
  371. if (val & MDIO_AN_CTRL1_RESTART) {
  372. phydev->link = 0;
  373. return 0;
  374. }
  375. }
  376. while (mmd_mask && link) {
  377. devad = __ffs(mmd_mask);
  378. mmd_mask &= ~BIT(devad);
  379. /* The link state is latched low so that momentary link
  380. * drops can be detected. Do not double-read the status
  381. * in polling mode to detect such short link drops except
  382. * the link was already down.
  383. */
  384. if (!phy_polling_mode(phydev) || !phydev->link) {
  385. val = phy_read_mmd(phydev, devad, MDIO_STAT1);
  386. if (val < 0)
  387. return val;
  388. else if (val & MDIO_STAT1_LSTATUS)
  389. continue;
  390. }
  391. val = phy_read_mmd(phydev, devad, MDIO_STAT1);
  392. if (val < 0)
  393. return val;
  394. if (!(val & MDIO_STAT1_LSTATUS))
  395. link = false;
  396. }
  397. phydev->link = link;
  398. return 0;
  399. }
  400. EXPORT_SYMBOL_GPL(genphy_c45_read_link);
  401. /* Read the Clause 45 defined BASE-T1 AN (7.513) status register to check
  402. * if autoneg is complete. If so read the BASE-T1 Autonegotiation
  403. * Advertisement registers filling in the link partner advertisement,
  404. * pause and asym_pause members in phydev.
  405. */
  406. static int genphy_c45_baset1_read_lpa(struct phy_device *phydev)
  407. {
  408. int val;
  409. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_STAT);
  410. if (val < 0)
  411. return val;
  412. if (!(val & MDIO_AN_STAT1_COMPLETE)) {
  413. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising);
  414. mii_t1_adv_l_mod_linkmode_t(phydev->lp_advertising, 0);
  415. mii_t1_adv_m_mod_linkmode_t(phydev->lp_advertising, 0);
  416. phydev->pause = false;
  417. phydev->asym_pause = false;
  418. return 0;
  419. }
  420. linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising, 1);
  421. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_LP_L);
  422. if (val < 0)
  423. return val;
  424. mii_t1_adv_l_mod_linkmode_t(phydev->lp_advertising, val);
  425. phydev->pause = val & MDIO_AN_T1_ADV_L_PAUSE_CAP;
  426. phydev->asym_pause = val & MDIO_AN_T1_ADV_L_PAUSE_ASYM;
  427. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_LP_M);
  428. if (val < 0)
  429. return val;
  430. mii_t1_adv_m_mod_linkmode_t(phydev->lp_advertising, val);
  431. return 0;
  432. }
  433. /**
  434. * genphy_c45_read_lpa - read the link partner advertisement and pause
  435. * @phydev: target phy_device struct
  436. *
  437. * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers,
  438. * filling in the link partner advertisement, pause and asym_pause members
  439. * in @phydev. This assumes that the auto-negotiation MMD is present, and
  440. * the backplane bit (7.48.0) is clear. Clause 45 PHY drivers are expected
  441. * to fill in the remainder of the link partner advert from vendor registers.
  442. */
  443. int genphy_c45_read_lpa(struct phy_device *phydev)
  444. {
  445. int val;
  446. if (genphy_c45_baset1_able(phydev))
  447. return genphy_c45_baset1_read_lpa(phydev);
  448. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
  449. if (val < 0)
  450. return val;
  451. if (!(val & MDIO_AN_STAT1_COMPLETE)) {
  452. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
  453. phydev->lp_advertising);
  454. mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
  455. mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, 0);
  456. phydev->pause = false;
  457. phydev->asym_pause = false;
  458. return 0;
  459. }
  460. linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising,
  461. val & MDIO_AN_STAT1_LPABLE);
  462. /* Read the link partner's base page advertisement */
  463. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_LPA);
  464. if (val < 0)
  465. return val;
  466. mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, val);
  467. phydev->pause = val & LPA_PAUSE_CAP;
  468. phydev->asym_pause = val & LPA_PAUSE_ASYM;
  469. /* Read the link partner's 10G advertisement */
  470. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
  471. if (val < 0)
  472. return val;
  473. mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, val);
  474. return 0;
  475. }
  476. EXPORT_SYMBOL_GPL(genphy_c45_read_lpa);
  477. /**
  478. * genphy_c45_pma_baset1_read_master_slave - read forced master/slave
  479. * configuration
  480. * @phydev: target phy_device struct
  481. */
  482. int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev)
  483. {
  484. int val;
  485. phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
  486. phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
  487. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL);
  488. if (val < 0)
  489. return val;
  490. if (val & MDIO_PMA_PMD_BT1_CTRL_CFG_MST) {
  491. phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
  492. phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
  493. } else {
  494. phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
  495. phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
  496. }
  497. return 0;
  498. }
  499. EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_master_slave);
  500. /**
  501. * genphy_c45_read_pma - read link speed etc from PMA
  502. * @phydev: target phy_device struct
  503. */
  504. int genphy_c45_read_pma(struct phy_device *phydev)
  505. {
  506. int val;
  507. linkmode_zero(phydev->lp_advertising);
  508. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
  509. if (val < 0)
  510. return val;
  511. switch (val & MDIO_CTRL1_SPEEDSEL) {
  512. case 0:
  513. phydev->speed = SPEED_10;
  514. break;
  515. case MDIO_PMA_CTRL1_SPEED100:
  516. phydev->speed = SPEED_100;
  517. break;
  518. case MDIO_PMA_CTRL1_SPEED1000:
  519. phydev->speed = SPEED_1000;
  520. break;
  521. case MDIO_PMA_CTRL1_SPEED2_5G:
  522. phydev->speed = SPEED_2500;
  523. break;
  524. case MDIO_PMA_CTRL1_SPEED5G:
  525. phydev->speed = SPEED_5000;
  526. break;
  527. case MDIO_CTRL1_SPEED10G:
  528. phydev->speed = SPEED_10000;
  529. break;
  530. default:
  531. phydev->speed = SPEED_UNKNOWN;
  532. break;
  533. }
  534. phydev->duplex = DUPLEX_FULL;
  535. if (genphy_c45_baset1_able(phydev)) {
  536. val = genphy_c45_pma_baset1_read_master_slave(phydev);
  537. if (val < 0)
  538. return val;
  539. }
  540. return 0;
  541. }
  542. EXPORT_SYMBOL_GPL(genphy_c45_read_pma);
  543. /**
  544. * genphy_c45_read_mdix - read mdix status from PMA
  545. * @phydev: target phy_device struct
  546. */
  547. int genphy_c45_read_mdix(struct phy_device *phydev)
  548. {
  549. int val;
  550. if (phydev->speed == SPEED_10000) {
  551. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
  552. MDIO_PMA_10GBT_SWAPPOL);
  553. if (val < 0)
  554. return val;
  555. switch (val) {
  556. case MDIO_PMA_10GBT_SWAPPOL_ABNX | MDIO_PMA_10GBT_SWAPPOL_CDNX:
  557. phydev->mdix = ETH_TP_MDI;
  558. break;
  559. case 0:
  560. phydev->mdix = ETH_TP_MDI_X;
  561. break;
  562. default:
  563. phydev->mdix = ETH_TP_MDI_INVALID;
  564. break;
  565. }
  566. }
  567. return 0;
  568. }
  569. EXPORT_SYMBOL_GPL(genphy_c45_read_mdix);
  570. /**
  571. * genphy_c45_write_eee_adv - write advertised EEE link modes
  572. * @phydev: target phy_device struct
  573. * @adv: the linkmode advertisement settings
  574. */
  575. static int genphy_c45_write_eee_adv(struct phy_device *phydev,
  576. unsigned long *adv)
  577. {
  578. int val, changed = 0;
  579. if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
  580. val = linkmode_to_mii_eee_cap1_t(adv);
  581. /* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
  582. * (Register 7.60)
  583. */
  584. val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
  585. MDIO_AN_EEE_ADV,
  586. MDIO_EEE_100TX | MDIO_EEE_1000T |
  587. MDIO_EEE_10GT | MDIO_EEE_1000KX |
  588. MDIO_EEE_10GKX4 | MDIO_EEE_10GKR,
  589. val);
  590. if (val < 0)
  591. return val;
  592. if (val > 0)
  593. changed = 1;
  594. }
  595. if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
  596. val = linkmode_to_mii_eee_cap2_t(adv);
  597. /* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
  598. * (Register 7.62)
  599. */
  600. val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
  601. MDIO_AN_EEE_ADV2,
  602. MDIO_EEE_2_5GT | MDIO_EEE_5GT,
  603. val);
  604. if (val < 0)
  605. return val;
  606. if (val > 0)
  607. changed = 1;
  608. }
  609. if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
  610. phydev->supported_eee)) {
  611. val = linkmode_adv_to_mii_10base_t1_t(adv);
  612. /* IEEE 802.3cg-2019 45.2.7.25 10BASE-T1 AN control register
  613. * (Register 7.526)
  614. */
  615. val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
  616. MDIO_AN_10BT1_AN_CTRL,
  617. MDIO_AN_10BT1_AN_CTRL_ADV_EEE_T1L,
  618. val);
  619. if (val < 0)
  620. return val;
  621. if (val > 0)
  622. changed = 1;
  623. }
  624. return changed;
  625. }
  626. /**
  627. * genphy_c45_read_eee_adv - read advertised EEE link modes
  628. * @phydev: target phy_device struct
  629. * @adv: the linkmode advertisement status
  630. */
  631. int genphy_c45_read_eee_adv(struct phy_device *phydev, unsigned long *adv)
  632. {
  633. int val;
  634. if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
  635. /* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
  636. * (Register 7.60)
  637. */
  638. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
  639. if (val < 0)
  640. return val;
  641. mii_eee_cap1_mod_linkmode_t(adv, val);
  642. }
  643. if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
  644. /* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
  645. * (Register 7.62)
  646. */
  647. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
  648. if (val < 0)
  649. return val;
  650. mii_eee_cap2_mod_linkmode_adv_t(adv, val);
  651. }
  652. if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
  653. phydev->supported_eee)) {
  654. /* IEEE 802.3cg-2019 45.2.7.25 10BASE-T1 AN control register
  655. * (Register 7.526)
  656. */
  657. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10BT1_AN_CTRL);
  658. if (val < 0)
  659. return val;
  660. mii_10base_t1_adv_mod_linkmode_t(adv, val);
  661. }
  662. return 0;
  663. }
  664. /**
  665. * genphy_c45_read_eee_lpa - read advertised LP EEE link modes
  666. * @phydev: target phy_device struct
  667. * @lpa: the linkmode LP advertisement status
  668. */
  669. static int genphy_c45_read_eee_lpa(struct phy_device *phydev,
  670. unsigned long *lpa)
  671. {
  672. int val;
  673. if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
  674. /* IEEE 802.3-2018 45.2.7.14 EEE link partner ability 1
  675. * (Register 7.61)
  676. */
  677. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE);
  678. if (val < 0)
  679. return val;
  680. mii_eee_cap1_mod_linkmode_t(lpa, val);
  681. }
  682. if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
  683. /* IEEE 802.3-2022 45.2.7.17 EEE link partner ability 2
  684. * (Register 7.63)
  685. */
  686. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE2);
  687. if (val < 0)
  688. return val;
  689. mii_eee_cap2_mod_linkmode_adv_t(lpa, val);
  690. }
  691. if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
  692. phydev->supported_eee)) {
  693. /* IEEE 802.3cg-2019 45.2.7.26 10BASE-T1 AN status register
  694. * (Register 7.527)
  695. */
  696. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10BT1_AN_STAT);
  697. if (val < 0)
  698. return val;
  699. mii_10base_t1_adv_mod_linkmode_t(lpa, val);
  700. }
  701. return 0;
  702. }
  703. /**
  704. * genphy_c45_read_eee_cap1 - read supported EEE link modes from register 3.20
  705. * @phydev: target phy_device struct
  706. */
  707. static int genphy_c45_read_eee_cap1(struct phy_device *phydev)
  708. {
  709. int val;
  710. /* IEEE 802.3-2018 45.2.3.10 EEE control and capability 1
  711. * (Register 3.20)
  712. */
  713. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
  714. if (val < 0)
  715. return val;
  716. /* The 802.3 2018 standard says the top 2 bits are reserved and should
  717. * read as 0. Also, it seems unlikely anybody will build a PHY which
  718. * supports 100GBASE-R deep sleep all the way down to 100BASE-TX EEE.
  719. * If MDIO_PCS_EEE_ABLE is 0xffff assume EEE is not supported.
  720. */
  721. if (val == 0xffff)
  722. return 0;
  723. mii_eee_cap1_mod_linkmode_t(phydev->supported_eee, val);
  724. /* Some buggy devices indicate EEE link modes in MDIO_PCS_EEE_ABLE
  725. * which they don't support as indicated by BMSR, ESTATUS etc.
  726. */
  727. linkmode_and(phydev->supported_eee, phydev->supported_eee,
  728. phydev->supported);
  729. return 0;
  730. }
  731. /**
  732. * genphy_c45_read_eee_cap2 - read supported EEE link modes from register 3.21
  733. * @phydev: target phy_device struct
  734. */
  735. static int genphy_c45_read_eee_cap2(struct phy_device *phydev)
  736. {
  737. int val;
  738. /* IEEE 802.3-2022 45.2.3.11 EEE control and capability 2
  739. * (Register 3.21)
  740. */
  741. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE2);
  742. if (val < 0)
  743. return val;
  744. /* IEEE 802.3-2022 45.2.3.11 says 9 bits are reserved. */
  745. if (val == 0xffff)
  746. return 0;
  747. mii_eee_cap2_mod_linkmode_sup_t(phydev->supported_eee, val);
  748. return 0;
  749. }
  750. /**
  751. * genphy_c45_read_eee_abilities - read supported EEE link modes
  752. * @phydev: target phy_device struct
  753. */
  754. int genphy_c45_read_eee_abilities(struct phy_device *phydev)
  755. {
  756. int val;
  757. /* There is not indicator whether optional register
  758. * "EEE control and capability 1" (3.20) is supported. Read it only
  759. * on devices with appropriate linkmodes.
  760. */
  761. if (linkmode_intersects(phydev->supported, PHY_EEE_CAP1_FEATURES)) {
  762. val = genphy_c45_read_eee_cap1(phydev);
  763. if (val)
  764. return val;
  765. }
  766. /* Same for cap2 (3.21) */
  767. if (linkmode_intersects(phydev->supported, PHY_EEE_CAP2_FEATURES)) {
  768. val = genphy_c45_read_eee_cap2(phydev);
  769. if (val)
  770. return val;
  771. }
  772. if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
  773. phydev->supported)) {
  774. /* IEEE 802.3cg-2019 45.2.1.186b 10BASE-T1L PMA status register
  775. * (Register 1.2295)
  776. */
  777. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10T1L_STAT);
  778. if (val < 0)
  779. return val;
  780. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
  781. phydev->supported_eee,
  782. val & MDIO_PMA_10T1L_STAT_EEE);
  783. }
  784. return 0;
  785. }
  786. EXPORT_SYMBOL_GPL(genphy_c45_read_eee_abilities);
  787. /**
  788. * genphy_c45_an_config_eee_aneg - configure EEE advertisement
  789. * @phydev: target phy_device struct
  790. */
  791. int genphy_c45_an_config_eee_aneg(struct phy_device *phydev)
  792. {
  793. if (!phydev->eee_cfg.eee_enabled) {
  794. __ETHTOOL_DECLARE_LINK_MODE_MASK(adv) = {};
  795. return genphy_c45_write_eee_adv(phydev, adv);
  796. }
  797. return genphy_c45_write_eee_adv(phydev, phydev->advertising_eee);
  798. }
  799. EXPORT_SYMBOL_GPL(genphy_c45_an_config_eee_aneg);
  800. /**
  801. * genphy_c45_pma_baset1_read_abilities - read supported baset1 link modes from PMA
  802. * @phydev: target phy_device struct
  803. *
  804. * Read the supported link modes from the extended BASE-T1 ability register
  805. */
  806. int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev)
  807. {
  808. int val;
  809. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1);
  810. if (val < 0)
  811. return val;
  812. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
  813. phydev->supported,
  814. val & MDIO_PMA_PMD_BT1_B10L_ABLE);
  815. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT1_Full_BIT,
  816. phydev->supported,
  817. val & MDIO_PMA_PMD_BT1_B100_ABLE);
  818. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT1_Full_BIT,
  819. phydev->supported,
  820. val & MDIO_PMA_PMD_BT1_B1000_ABLE);
  821. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_STAT);
  822. if (val < 0)
  823. return val;
  824. linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
  825. phydev->supported,
  826. val & MDIO_AN_STAT1_ABLE);
  827. return 0;
  828. }
  829. EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_abilities);
  830. /**
  831. * genphy_c45_pma_read_ext_abilities - read supported link modes from PMA
  832. * @phydev: target phy_device struct
  833. *
  834. * Read the supported link modes from the PMA/PMD extended ability register
  835. * (Register 1.11).
  836. */
  837. int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev)
  838. {
  839. int val;
  840. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
  841. if (val < 0)
  842. return val;
  843. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
  844. phydev->supported,
  845. val & MDIO_PMA_EXTABLE_10GBLRM);
  846. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
  847. phydev->supported,
  848. val & MDIO_PMA_EXTABLE_10GBT);
  849. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
  850. phydev->supported,
  851. val & MDIO_PMA_EXTABLE_10GBKX4);
  852. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
  853. phydev->supported,
  854. val & MDIO_PMA_EXTABLE_10GBKR);
  855. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  856. phydev->supported,
  857. val & MDIO_PMA_EXTABLE_1000BT);
  858. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
  859. phydev->supported,
  860. val & MDIO_PMA_EXTABLE_1000BKX);
  861. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
  862. phydev->supported,
  863. val & MDIO_PMA_EXTABLE_100BTX);
  864. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
  865. phydev->supported,
  866. val & MDIO_PMA_EXTABLE_100BTX);
  867. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
  868. phydev->supported,
  869. val & MDIO_PMA_EXTABLE_10BT);
  870. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
  871. phydev->supported,
  872. val & MDIO_PMA_EXTABLE_10BT);
  873. if (val & MDIO_PMA_EXTABLE_NBT) {
  874. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
  875. MDIO_PMA_NG_EXTABLE);
  876. if (val < 0)
  877. return val;
  878. linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  879. phydev->supported,
  880. val & MDIO_PMA_NG_EXTABLE_2_5GBT);
  881. linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
  882. phydev->supported,
  883. val & MDIO_PMA_NG_EXTABLE_5GBT);
  884. }
  885. if (val & MDIO_PMA_EXTABLE_BT1) {
  886. val = genphy_c45_pma_baset1_read_abilities(phydev);
  887. if (val < 0)
  888. return val;
  889. }
  890. return 0;
  891. }
  892. EXPORT_SYMBOL_GPL(genphy_c45_pma_read_ext_abilities);
  893. /**
  894. * genphy_c45_pma_read_abilities - read supported link modes from PMA
  895. * @phydev: target phy_device struct
  896. *
  897. * Read the supported link modes from the PMA Status 2 (1.8) register. If bit
  898. * 1.8.9 is set, the list of supported modes is build using the values in the
  899. * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related
  900. * modes. If bit 1.11.14 is set, then the list is also extended with the modes
  901. * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and
  902. * 5GBASET are supported.
  903. */
  904. int genphy_c45_pma_read_abilities(struct phy_device *phydev)
  905. {
  906. int val;
  907. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
  908. if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
  909. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
  910. if (val < 0)
  911. return val;
  912. if (val & MDIO_AN_STAT1_ABLE)
  913. linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
  914. phydev->supported);
  915. }
  916. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT2);
  917. if (val < 0)
  918. return val;
  919. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
  920. phydev->supported,
  921. val & MDIO_PMA_STAT2_10GBSR);
  922. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
  923. phydev->supported,
  924. val & MDIO_PMA_STAT2_10GBLR);
  925. linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT,
  926. phydev->supported,
  927. val & MDIO_PMA_STAT2_10GBER);
  928. if (val & MDIO_PMA_STAT2_EXTABLE) {
  929. val = genphy_c45_pma_read_ext_abilities(phydev);
  930. if (val < 0)
  931. return val;
  932. }
  933. /* This is optional functionality. If not supported, we may get an error
  934. * which should be ignored.
  935. */
  936. genphy_c45_read_eee_abilities(phydev);
  937. return 0;
  938. }
  939. EXPORT_SYMBOL_GPL(genphy_c45_pma_read_abilities);
  940. /* Read master/slave preference from registers.
  941. * The preference is read from the BIT(4) of BASE-T1 AN
  942. * advertisement register 7.515 and whether the preference
  943. * is forced or not, it is read from BASE-T1 AN advertisement
  944. * register 7.514.
  945. */
  946. int genphy_c45_baset1_read_status(struct phy_device *phydev)
  947. {
  948. int ret;
  949. int cfg;
  950. phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
  951. phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
  952. ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_L);
  953. if (ret < 0)
  954. return ret;
  955. cfg = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_M);
  956. if (cfg < 0)
  957. return cfg;
  958. if (ret & MDIO_AN_T1_ADV_L_FORCE_MS) {
  959. if (cfg & MDIO_AN_T1_ADV_M_MST)
  960. phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
  961. else
  962. phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
  963. } else {
  964. if (cfg & MDIO_AN_T1_ADV_M_MST)
  965. phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_PREFERRED;
  966. else
  967. phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_PREFERRED;
  968. }
  969. return 0;
  970. }
  971. EXPORT_SYMBOL_GPL(genphy_c45_baset1_read_status);
  972. /**
  973. * genphy_c45_read_status - read PHY status
  974. * @phydev: target phy_device struct
  975. *
  976. * Reads status from PHY and sets phy_device members accordingly.
  977. */
  978. int genphy_c45_read_status(struct phy_device *phydev)
  979. {
  980. int ret;
  981. ret = genphy_c45_read_link(phydev);
  982. if (ret)
  983. return ret;
  984. phydev->speed = SPEED_UNKNOWN;
  985. phydev->duplex = DUPLEX_UNKNOWN;
  986. phydev->pause = false;
  987. phydev->asym_pause = false;
  988. if (phydev->autoneg == AUTONEG_ENABLE) {
  989. ret = genphy_c45_read_lpa(phydev);
  990. if (ret)
  991. return ret;
  992. if (genphy_c45_baset1_able(phydev)) {
  993. ret = genphy_c45_baset1_read_status(phydev);
  994. if (ret < 0)
  995. return ret;
  996. }
  997. phy_resolve_aneg_linkmode(phydev);
  998. } else {
  999. ret = genphy_c45_read_pma(phydev);
  1000. }
  1001. return ret;
  1002. }
  1003. EXPORT_SYMBOL_GPL(genphy_c45_read_status);
  1004. /**
  1005. * genphy_c45_config_aneg - restart auto-negotiation or forced setup
  1006. * @phydev: target phy_device struct
  1007. *
  1008. * Description: If auto-negotiation is enabled, we configure the
  1009. * advertising, and then restart auto-negotiation. If it is not
  1010. * enabled, then we force a configuration.
  1011. */
  1012. int genphy_c45_config_aneg(struct phy_device *phydev)
  1013. {
  1014. bool changed = false;
  1015. int ret;
  1016. if (phydev->autoneg == AUTONEG_DISABLE)
  1017. return genphy_c45_pma_setup_forced(phydev);
  1018. ret = genphy_c45_an_config_aneg(phydev);
  1019. if (ret < 0)
  1020. return ret;
  1021. if (ret > 0)
  1022. changed = true;
  1023. return genphy_c45_check_and_restart_aneg(phydev, changed);
  1024. }
  1025. EXPORT_SYMBOL_GPL(genphy_c45_config_aneg);
  1026. /* The gen10g_* functions are the old Clause 45 stub */
  1027. int gen10g_config_aneg(struct phy_device *phydev)
  1028. {
  1029. return 0;
  1030. }
  1031. EXPORT_SYMBOL_GPL(gen10g_config_aneg);
  1032. int genphy_c45_loopback(struct phy_device *phydev, bool enable, int speed)
  1033. {
  1034. if (enable && speed)
  1035. return -EOPNOTSUPP;
  1036. return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1,
  1037. MDIO_PCS_CTRL1_LOOPBACK,
  1038. enable ? MDIO_PCS_CTRL1_LOOPBACK : 0);
  1039. }
  1040. EXPORT_SYMBOL_GPL(genphy_c45_loopback);
  1041. /**
  1042. * genphy_c45_fast_retrain - configure fast retrain registers
  1043. * @phydev: target phy_device struct
  1044. * @enable: enable fast retrain or not
  1045. *
  1046. * Description: If fast-retrain is enabled, we configure PHY as
  1047. * advertising fast retrain capable and THP Bypass Request, then
  1048. * enable fast retrain. If it is not enabled, we configure fast
  1049. * retrain disabled.
  1050. */
  1051. int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable)
  1052. {
  1053. int ret;
  1054. if (!enable)
  1055. return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FSRT_CSR,
  1056. MDIO_PMA_10GBR_FSRT_ENABLE);
  1057. if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->supported)) {
  1058. ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
  1059. MDIO_AN_10GBT_CTRL_ADVFSRT2_5G);
  1060. if (ret)
  1061. return ret;
  1062. ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_CTRL2,
  1063. MDIO_AN_THP_BP2_5GT);
  1064. if (ret)
  1065. return ret;
  1066. }
  1067. return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FSRT_CSR,
  1068. MDIO_PMA_10GBR_FSRT_ENABLE);
  1069. }
  1070. EXPORT_SYMBOL_GPL(genphy_c45_fast_retrain);
  1071. /**
  1072. * genphy_c45_plca_get_cfg - get PLCA configuration from standard registers
  1073. * @phydev: target phy_device struct
  1074. * @plca_cfg: output structure to store the PLCA configuration
  1075. *
  1076. * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA
  1077. * Management Registers specifications, this function can be used to retrieve
  1078. * the current PLCA configuration from the standard registers in MMD 31.
  1079. */
  1080. int genphy_c45_plca_get_cfg(struct phy_device *phydev,
  1081. struct phy_plca_cfg *plca_cfg)
  1082. {
  1083. int ret;
  1084. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_IDVER);
  1085. if (ret < 0)
  1086. return ret;
  1087. if ((ret & MDIO_OATC14_PLCA_IDM) != OATC14_IDM)
  1088. return -ENODEV;
  1089. plca_cfg->version = ret & ~MDIO_OATC14_PLCA_IDM;
  1090. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_CTRL0);
  1091. if (ret < 0)
  1092. return ret;
  1093. plca_cfg->enabled = !!(ret & MDIO_OATC14_PLCA_EN);
  1094. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_CTRL1);
  1095. if (ret < 0)
  1096. return ret;
  1097. plca_cfg->node_cnt = (ret & MDIO_OATC14_PLCA_NCNT) >> 8;
  1098. plca_cfg->node_id = (ret & MDIO_OATC14_PLCA_ID);
  1099. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_TOTMR);
  1100. if (ret < 0)
  1101. return ret;
  1102. plca_cfg->to_tmr = ret & MDIO_OATC14_PLCA_TOT;
  1103. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_BURST);
  1104. if (ret < 0)
  1105. return ret;
  1106. plca_cfg->burst_cnt = (ret & MDIO_OATC14_PLCA_MAXBC) >> 8;
  1107. plca_cfg->burst_tmr = (ret & MDIO_OATC14_PLCA_BTMR);
  1108. return 0;
  1109. }
  1110. EXPORT_SYMBOL_GPL(genphy_c45_plca_get_cfg);
  1111. /**
  1112. * genphy_c45_plca_set_cfg - set PLCA configuration using standard registers
  1113. * @phydev: target phy_device struct
  1114. * @plca_cfg: structure containing the PLCA configuration. Fields set to -1 are
  1115. * not to be changed.
  1116. *
  1117. * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA
  1118. * Management Registers specifications, this function can be used to modify
  1119. * the PLCA configuration using the standard registers in MMD 31.
  1120. */
  1121. int genphy_c45_plca_set_cfg(struct phy_device *phydev,
  1122. const struct phy_plca_cfg *plca_cfg)
  1123. {
  1124. u16 val = 0;
  1125. int ret;
  1126. // PLCA IDVER is read-only
  1127. if (plca_cfg->version >= 0)
  1128. return -EINVAL;
  1129. // first of all, disable PLCA if required
  1130. if (plca_cfg->enabled == 0) {
  1131. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2,
  1132. MDIO_OATC14_PLCA_CTRL0,
  1133. MDIO_OATC14_PLCA_EN);
  1134. if (ret < 0)
  1135. return ret;
  1136. }
  1137. // check if we need to set the PLCA node count, node ID, or both
  1138. if (plca_cfg->node_cnt >= 0 || plca_cfg->node_id >= 0) {
  1139. /* if one between node count and node ID is -not- to be
  1140. * changed, read the register to later perform merge/purge of
  1141. * the configuration as appropriate
  1142. */
  1143. if (plca_cfg->node_cnt < 0 || plca_cfg->node_id < 0) {
  1144. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  1145. MDIO_OATC14_PLCA_CTRL1);
  1146. if (ret < 0)
  1147. return ret;
  1148. val = ret;
  1149. }
  1150. if (plca_cfg->node_cnt >= 0)
  1151. val = (val & ~MDIO_OATC14_PLCA_NCNT) |
  1152. (plca_cfg->node_cnt << 8);
  1153. if (plca_cfg->node_id >= 0)
  1154. val = (val & ~MDIO_OATC14_PLCA_ID) |
  1155. (plca_cfg->node_id);
  1156. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
  1157. MDIO_OATC14_PLCA_CTRL1, val);
  1158. if (ret < 0)
  1159. return ret;
  1160. }
  1161. if (plca_cfg->to_tmr >= 0) {
  1162. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
  1163. MDIO_OATC14_PLCA_TOTMR,
  1164. plca_cfg->to_tmr);
  1165. if (ret < 0)
  1166. return ret;
  1167. }
  1168. // check if we need to set the PLCA burst count, burst timer, or both
  1169. if (plca_cfg->burst_cnt >= 0 || plca_cfg->burst_tmr >= 0) {
  1170. /* if one between burst count and burst timer is -not- to be
  1171. * changed, read the register to later perform merge/purge of
  1172. * the configuration as appropriate
  1173. */
  1174. if (plca_cfg->burst_cnt < 0 || plca_cfg->burst_tmr < 0) {
  1175. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  1176. MDIO_OATC14_PLCA_BURST);
  1177. if (ret < 0)
  1178. return ret;
  1179. val = ret;
  1180. }
  1181. if (plca_cfg->burst_cnt >= 0)
  1182. val = (val & ~MDIO_OATC14_PLCA_MAXBC) |
  1183. (plca_cfg->burst_cnt << 8);
  1184. if (plca_cfg->burst_tmr >= 0)
  1185. val = (val & ~MDIO_OATC14_PLCA_BTMR) |
  1186. (plca_cfg->burst_tmr);
  1187. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
  1188. MDIO_OATC14_PLCA_BURST, val);
  1189. if (ret < 0)
  1190. return ret;
  1191. }
  1192. // if we need to enable PLCA, do it at the end
  1193. if (plca_cfg->enabled > 0) {
  1194. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2,
  1195. MDIO_OATC14_PLCA_CTRL0,
  1196. MDIO_OATC14_PLCA_EN);
  1197. if (ret < 0)
  1198. return ret;
  1199. }
  1200. return 0;
  1201. }
  1202. EXPORT_SYMBOL_GPL(genphy_c45_plca_set_cfg);
  1203. /**
  1204. * genphy_c45_plca_get_status - get PLCA status from standard registers
  1205. * @phydev: target phy_device struct
  1206. * @plca_st: output structure to store the PLCA status
  1207. *
  1208. * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA
  1209. * Management Registers specifications, this function can be used to retrieve
  1210. * the current PLCA status information from the standard registers in MMD 31.
  1211. */
  1212. int genphy_c45_plca_get_status(struct phy_device *phydev,
  1213. struct phy_plca_status *plca_st)
  1214. {
  1215. int ret;
  1216. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_STATUS);
  1217. if (ret < 0)
  1218. return ret;
  1219. plca_st->pst = !!(ret & MDIO_OATC14_PLCA_PST);
  1220. return 0;
  1221. }
  1222. EXPORT_SYMBOL_GPL(genphy_c45_plca_get_status);
  1223. /**
  1224. * genphy_c45_eee_is_active - get EEE status
  1225. * @phydev: target phy_device struct
  1226. * @lp: variable to store LP advertised linkmodes
  1227. *
  1228. * Description: this function will read link partner PHY advertisement
  1229. * and compare it to local advertisement to return current EEE state.
  1230. */
  1231. int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *lp)
  1232. {
  1233. __ETHTOOL_DECLARE_LINK_MODE_MASK(tmp_lp) = {};
  1234. __ETHTOOL_DECLARE_LINK_MODE_MASK(common);
  1235. int ret;
  1236. if (!phydev->eee_cfg.eee_enabled)
  1237. return 0;
  1238. ret = genphy_c45_read_eee_lpa(phydev, tmp_lp);
  1239. if (ret)
  1240. return ret;
  1241. if (lp)
  1242. linkmode_copy(lp, tmp_lp);
  1243. linkmode_and(common, phydev->advertising_eee, tmp_lp);
  1244. if (linkmode_empty(common))
  1245. return 0;
  1246. return phy_check_valid(phydev->speed, phydev->duplex, common);
  1247. }
  1248. EXPORT_SYMBOL(genphy_c45_eee_is_active);
  1249. /**
  1250. * genphy_c45_ethtool_get_eee - get EEE supported and status
  1251. * @phydev: target phy_device struct
  1252. * @data: ethtool_keee data
  1253. *
  1254. * Description: it reports the Supported/Advertisement/LP Advertisement
  1255. * capabilities.
  1256. */
  1257. int genphy_c45_ethtool_get_eee(struct phy_device *phydev,
  1258. struct ethtool_keee *data)
  1259. {
  1260. int ret;
  1261. ret = genphy_c45_eee_is_active(phydev, data->lp_advertised);
  1262. if (ret < 0)
  1263. return ret;
  1264. data->eee_active = phydev->eee_active;
  1265. linkmode_andnot(data->supported, phydev->supported_eee,
  1266. phydev->eee_disabled_modes);
  1267. linkmode_copy(data->advertised, phydev->advertising_eee);
  1268. return 0;
  1269. }
  1270. EXPORT_SYMBOL(genphy_c45_ethtool_get_eee);
  1271. /**
  1272. * genphy_c45_ethtool_set_eee - set EEE supported and status
  1273. * @phydev: target phy_device struct
  1274. * @data: ethtool_keee data
  1275. *
  1276. * Description: sets the Supported/Advertisement/LP Advertisement
  1277. * capabilities. If eee_enabled is false, no links modes are
  1278. * advertised, but the previously advertised link modes are
  1279. * retained. This allows EEE to be enabled/disabled in a
  1280. * non-destructive way.
  1281. * Returns either error code, 0 if there was no change, or positive
  1282. * value if there was a change which triggered auto-neg.
  1283. */
  1284. int genphy_c45_ethtool_set_eee(struct phy_device *phydev,
  1285. struct ethtool_keee *data)
  1286. {
  1287. int ret;
  1288. if (data->eee_enabled) {
  1289. unsigned long *adv = data->advertised;
  1290. if (!linkmode_empty(adv)) {
  1291. __ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
  1292. if (linkmode_andnot(tmp, adv, phydev->supported_eee)) {
  1293. phydev_warn(phydev, "At least some EEE link modes are not supported.\n");
  1294. return -EINVAL;
  1295. }
  1296. linkmode_andnot(phydev->advertising_eee, adv,
  1297. phydev->eee_disabled_modes);
  1298. } else if (linkmode_empty(phydev->advertising_eee)) {
  1299. phy_advertise_eee_all(phydev);
  1300. }
  1301. }
  1302. ret = genphy_c45_an_config_eee_aneg(phydev);
  1303. if (ret > 0) {
  1304. ret = phy_restart_aneg(phydev);
  1305. if (ret < 0)
  1306. return ret;
  1307. /* explicitly return 1, otherwise (ret > 0) value will be
  1308. * overwritten by phy_restart_aneg().
  1309. */
  1310. return 1;
  1311. }
  1312. return ret;
  1313. }
  1314. EXPORT_SYMBOL(genphy_c45_ethtool_set_eee);
  1315. /**
  1316. * oatc14_cable_test_get_result_code - Convert hardware cable test status to
  1317. * ethtool result code.
  1318. * @status: The hardware-reported cable test status
  1319. *
  1320. * This helper function maps the OATC14 HDD cable test status to the
  1321. * corresponding ethtool cable test result code. It provides a translation
  1322. * between the device-specific status values and the standardized ethtool
  1323. * result codes.
  1324. *
  1325. * Return:
  1326. * * ETHTOOL_A_CABLE_RESULT_CODE_OK - Cable is OK
  1327. * * ETHTOOL_A_CABLE_RESULT_CODE_OPEN - Open circuit detected
  1328. * * ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT - Short circuit detected
  1329. * * ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC - Status not detectable or invalid
  1330. */
  1331. static int oatc14_cable_test_get_result_code(enum oatc14_hdd_status status)
  1332. {
  1333. switch (status) {
  1334. case OATC14_HDD_STATUS_CABLE_OK:
  1335. return ETHTOOL_A_CABLE_RESULT_CODE_OK;
  1336. case OATC14_HDD_STATUS_OPEN:
  1337. return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
  1338. case OATC14_HDD_STATUS_SHORT:
  1339. return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
  1340. case OATC14_HDD_STATUS_NOT_DETECTABLE:
  1341. default:
  1342. return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
  1343. }
  1344. }
  1345. /**
  1346. * genphy_c45_oatc14_cable_test_get_status - Get status of OATC14 10Base-T1S
  1347. * PHY cable test.
  1348. * @phydev: pointer to the PHY device structure
  1349. * @finished: pointer to a boolean set true if the test is complete
  1350. *
  1351. * Retrieves the current status of the OATC14 10Base-T1S PHY cable test.
  1352. * This function reads the OATC14 HDD register to determine whether the test
  1353. * results are valid and whether the test has finished.
  1354. *
  1355. * If the test is complete, the function reports the cable test result via
  1356. * the ethtool cable test interface using ethnl_cable_test_result(), and then
  1357. * clears the test control bit in the PHY register to reset the test state.
  1358. *
  1359. * Return: 0 on success, or a negative error code on failure (e.g. register
  1360. * read/write error).
  1361. */
  1362. int genphy_c45_oatc14_cable_test_get_status(struct phy_device *phydev,
  1363. bool *finished)
  1364. {
  1365. int ret;
  1366. u8 sts;
  1367. *finished = false;
  1368. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_HDD);
  1369. if (ret < 0)
  1370. return ret;
  1371. if (!(ret & OATC14_HDD_VALID))
  1372. return 0;
  1373. *finished = true;
  1374. sts = FIELD_GET(OATC14_HDD_SHORT_OPEN_STATUS, ret);
  1375. ret = ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A,
  1376. oatc14_cable_test_get_result_code(sts));
  1377. if (ret)
  1378. return ret;
  1379. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2,
  1380. MDIO_OATC14_HDD, OATC14_HDD_CONTROL);
  1381. }
  1382. EXPORT_SYMBOL(genphy_c45_oatc14_cable_test_get_status);
  1383. /**
  1384. * genphy_c45_oatc14_cable_test_start - Start a cable test on an OATC14
  1385. * 10Base-T1S PHY.
  1386. * @phydev: Pointer to the PHY device structure
  1387. *
  1388. * This function initiates a cable diagnostic test on a Clause 45 OATC14
  1389. * 10Base-T1S capable PHY device. It first reads the PHY’s advanced diagnostic
  1390. * capability register to check if High Definition Diagnostics (HDD) mode is
  1391. * supported. If the PHY does not report HDD capability, cable testing is not
  1392. * supported and the function returns -EOPNOTSUPP.
  1393. *
  1394. * For PHYs that support HDD, the function sets the appropriate control bits in
  1395. * the OATC14_HDD register to enable and start the cable diagnostic test.
  1396. *
  1397. * Return:
  1398. * * 0 on success
  1399. * * -EOPNOTSUPP if the PHY does not support HDD capability
  1400. * * A negative error code on I/O or register access failures
  1401. */
  1402. int genphy_c45_oatc14_cable_test_start(struct phy_device *phydev)
  1403. {
  1404. int ret;
  1405. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_ADFCAP);
  1406. if (ret < 0)
  1407. return ret;
  1408. if (!(ret & OATC14_ADFCAP_HDD_CAPABILITY))
  1409. return -EOPNOTSUPP;
  1410. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_HDD,
  1411. OATC14_HDD_CONTROL);
  1412. if (ret)
  1413. return ret;
  1414. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_HDD);
  1415. if (ret < 0)
  1416. return ret;
  1417. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_HDD,
  1418. OATC14_HDD_START_CONTROL);
  1419. }
  1420. EXPORT_SYMBOL(genphy_c45_oatc14_cable_test_start);
  1421. /**
  1422. * oatc14_update_sqi_capability - Read and update OATC14 10Base-T1S PHY SQI/SQI+
  1423. * capability
  1424. * @phydev: Pointer to the PHY device structure
  1425. *
  1426. * This helper reads the OATC14 ADFCAP capability register to determine whether
  1427. * the PHY supports SQI or SQI+ reporting.
  1428. *
  1429. * SQI+ capability is detected first. The SQI+ field indicates the number of
  1430. * valid MSBs (3–8), corresponding to 8–256 SQI+ levels. When present, the
  1431. * function stores the number of SQI+ bits and computes the maximum SQI+ value
  1432. * as (2^bits - 1).
  1433. *
  1434. * If SQI+ is not supported, the function checks for basic SQI capability,
  1435. * which provides 0–7 SQI levels.
  1436. *
  1437. * On success, the capability information is stored in
  1438. * @phydev->oatc14_sqi_capability and marked as updated.
  1439. *
  1440. * Return:
  1441. * * 0 - capability successfully read and stored
  1442. * * -EOPNOTSUPP - SQI/SQI+ not supported by this PHY
  1443. * * Negative errno on read failure
  1444. */
  1445. static int oatc14_update_sqi_capability(struct phy_device *phydev)
  1446. {
  1447. u8 bits;
  1448. int ret;
  1449. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_ADFCAP);
  1450. if (ret < 0)
  1451. return ret;
  1452. /* Check for SQI+ capability
  1453. * 0 - SQI+ is not supported
  1454. * (3-8) bits for (8-256) SQI+ levels supported
  1455. */
  1456. bits = FIELD_GET(OATC14_ADFCAP_SQIPLUS_CAPABILITY, ret);
  1457. if (bits) {
  1458. phydev->oatc14_sqi_capability.sqiplus_bits = bits;
  1459. /* Max sqi+ level supported: (2 ^ bits) - 1 */
  1460. phydev->oatc14_sqi_capability.sqi_max = BIT(bits) - 1;
  1461. goto update_done;
  1462. }
  1463. /* Check for SQI capability
  1464. * 0 - SQI is not supported
  1465. * 1 - SQI is supported (0-7 levels)
  1466. */
  1467. if (ret & OATC14_ADFCAP_SQI_CAPABILITY) {
  1468. phydev->oatc14_sqi_capability.sqi_max = OATC14_SQI_MAX_LEVEL;
  1469. goto update_done;
  1470. }
  1471. return -EOPNOTSUPP;
  1472. update_done:
  1473. phydev->oatc14_sqi_capability.updated = true;
  1474. return 0;
  1475. }
  1476. /**
  1477. * genphy_c45_oatc14_get_sqi_max - Get maximum supported SQI or SQI+ level of
  1478. * OATC14 10Base-T1S PHY
  1479. * @phydev: pointer to the PHY device structure
  1480. *
  1481. * This function returns the maximum supported Signal Quality Indicator (SQI) or
  1482. * SQI+ level. The SQI capability is updated on first invocation if it has not
  1483. * already been updated.
  1484. *
  1485. * Return:
  1486. * * Maximum SQI/SQI+ level supported
  1487. * * Negative errno on capability read failure
  1488. */
  1489. int genphy_c45_oatc14_get_sqi_max(struct phy_device *phydev)
  1490. {
  1491. int ret;
  1492. if (!phydev->oatc14_sqi_capability.updated) {
  1493. ret = oatc14_update_sqi_capability(phydev);
  1494. if (ret)
  1495. return ret;
  1496. }
  1497. return phydev->oatc14_sqi_capability.sqi_max;
  1498. }
  1499. EXPORT_SYMBOL(genphy_c45_oatc14_get_sqi_max);
  1500. /**
  1501. * genphy_c45_oatc14_get_sqi - Get Signal Quality Indicator (SQI) from an OATC14
  1502. * 10Base-T1S PHY
  1503. * @phydev: pointer to the PHY device structure
  1504. *
  1505. * This function reads the SQI+ or SQI value from an OATC14-compatible
  1506. * 10Base-T1S PHY. If SQI+ capability is supported, the function returns the
  1507. * extended SQI+ value; otherwise, it returns the basic SQI value. The SQI
  1508. * capability is updated on first invocation if it has not already been updated.
  1509. *
  1510. * Return:
  1511. * * SQI/SQI+ value on success
  1512. * * Negative errno on read failure
  1513. */
  1514. int genphy_c45_oatc14_get_sqi(struct phy_device *phydev)
  1515. {
  1516. u8 shift;
  1517. int ret;
  1518. if (!phydev->oatc14_sqi_capability.updated) {
  1519. ret = oatc14_update_sqi_capability(phydev);
  1520. if (ret)
  1521. return ret;
  1522. }
  1523. /* Calculate and return SQI+ value if supported */
  1524. if (phydev->oatc14_sqi_capability.sqiplus_bits) {
  1525. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  1526. MDIO_OATC14_DCQ_SQIPLUS);
  1527. if (ret < 0)
  1528. return ret;
  1529. /* SQI+ uses N MSBs out of 8 bits, left-aligned with padding 1's
  1530. * Calculate the right-shift needed to isolate the N bits.
  1531. */
  1532. shift = 8 - phydev->oatc14_sqi_capability.sqiplus_bits;
  1533. return (ret & OATC14_DCQ_SQIPLUS_VALUE) >> shift;
  1534. }
  1535. /* Read and return SQI value if SQI+ capability is not supported */
  1536. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_DCQ_SQI);
  1537. if (ret < 0)
  1538. return ret;
  1539. return ret & OATC14_DCQ_SQI_VALUE;
  1540. }
  1541. EXPORT_SYMBOL(genphy_c45_oatc14_get_sqi);