microchip_t1.c 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (C) 2018 Microchip Technology
  3. #include <linux/kernel.h>
  4. #include <linux/module.h>
  5. #include <linux/delay.h>
  6. #include <linux/mii.h>
  7. #include <linux/phy.h>
  8. #include <linux/ethtool.h>
  9. #include <linux/ethtool_netlink.h>
  10. #include <linux/bitfield.h>
  11. #define PHY_ID_LAN87XX 0x0007c150
  12. #define PHY_ID_LAN937X 0x0007c180
  13. #define PHY_ID_LAN887X 0x0007c1f0
  14. /* External Register Control Register */
  15. #define LAN87XX_EXT_REG_CTL (0x14)
  16. #define LAN87XX_EXT_REG_CTL_RD_CTL (0x1000)
  17. #define LAN87XX_EXT_REG_CTL_WR_CTL (0x0800)
  18. #define LAN87XX_REG_BANK_SEL_MASK GENMASK(10, 8)
  19. #define LAN87XX_REG_ADDR_MASK GENMASK(7, 0)
  20. /* External Register Read Data Register */
  21. #define LAN87XX_EXT_REG_RD_DATA (0x15)
  22. /* External Register Write Data Register */
  23. #define LAN87XX_EXT_REG_WR_DATA (0x16)
  24. /* Interrupt Source Register */
  25. #define LAN87XX_INTERRUPT_SOURCE (0x18)
  26. #define LAN87XX_INTERRUPT_SOURCE_2 (0x08)
  27. /* Interrupt Mask Register */
  28. #define LAN87XX_INTERRUPT_MASK (0x19)
  29. #define LAN87XX_MASK_LINK_UP (0x0004)
  30. #define LAN87XX_MASK_LINK_DOWN (0x0002)
  31. #define LAN87XX_INTERRUPT_MASK_2 (0x09)
  32. #define LAN87XX_MASK_COMM_RDY BIT(10)
  33. /* MISC Control 1 Register */
  34. #define LAN87XX_CTRL_1 (0x11)
  35. #define LAN87XX_MASK_RGMII_TXC_DLY_EN (0x4000)
  36. #define LAN87XX_MASK_RGMII_RXC_DLY_EN (0x2000)
  37. /* phyaccess nested types */
  38. #define PHYACC_ATTR_MODE_READ 0
  39. #define PHYACC_ATTR_MODE_WRITE 1
  40. #define PHYACC_ATTR_MODE_MODIFY 2
  41. #define PHYACC_ATTR_MODE_POLL 3
  42. #define PHYACC_ATTR_BANK_SMI 0
  43. #define PHYACC_ATTR_BANK_MISC 1
  44. #define PHYACC_ATTR_BANK_PCS 2
  45. #define PHYACC_ATTR_BANK_AFE 3
  46. #define PHYACC_ATTR_BANK_DSP 4
  47. #define PHYACC_ATTR_BANK_MAX 7
  48. /* measurement defines */
  49. #define LAN87XX_CABLE_TEST_OK 0
  50. #define LAN87XX_CABLE_TEST_OPEN 1
  51. #define LAN87XX_CABLE_TEST_SAME_SHORT 2
  52. /* T1 Registers */
  53. #define T1_AFE_PORT_CFG1_REG 0x0B
  54. #define T1_POWER_DOWN_CONTROL_REG 0x1A
  55. #define T1_SLV_FD_MULT_CFG_REG 0x18
  56. #define T1_CDR_CFG_PRE_LOCK_REG 0x05
  57. #define T1_CDR_CFG_POST_LOCK_REG 0x06
  58. #define T1_LCK_STG2_MUFACT_CFG_REG 0x1A
  59. #define T1_LCK_STG3_MUFACT_CFG_REG 0x1B
  60. #define T1_POST_LCK_MUFACT_CFG_REG 0x1C
  61. #define T1_TX_RX_FIFO_CFG_REG 0x02
  62. #define T1_TX_LPF_FIR_CFG_REG 0x55
  63. #define T1_COEF_CLK_PWR_DN_CFG 0x04
  64. #define T1_COEF_RW_CTL_CFG 0x0D
  65. #define T1_SQI_CONFIG_REG 0x2E
  66. #define T1_SQI_CONFIG2_REG 0x4A
  67. #define T1_DCQ_SQI_REG 0xC3
  68. #define T1_DCQ_SQI_MSK GENMASK(3, 1)
  69. #define T1_MDIO_CONTROL2_REG 0x10
  70. #define T1_INTERRUPT_SOURCE_REG 0x18
  71. #define T1_INTERRUPT2_SOURCE_REG 0x08
  72. #define T1_EQ_FD_STG1_FRZ_CFG 0x69
  73. #define T1_EQ_FD_STG2_FRZ_CFG 0x6A
  74. #define T1_EQ_FD_STG3_FRZ_CFG 0x6B
  75. #define T1_EQ_FD_STG4_FRZ_CFG 0x6C
  76. #define T1_EQ_WT_FD_LCK_FRZ_CFG 0x6D
  77. #define T1_PST_EQ_LCK_STG1_FRZ_CFG 0x6E
  78. #define T1_MODE_STAT_REG 0x11
  79. #define T1_LINK_UP_MSK BIT(0)
  80. /* SQI defines */
  81. #define LAN87XX_MAX_SQI 0x07
  82. /* Chiptop registers */
  83. #define LAN887X_PMA_EXT_ABILITY_2 0x12
  84. #define LAN887X_PMA_EXT_ABILITY_2_1000T1 BIT(1)
  85. #define LAN887X_PMA_EXT_ABILITY_2_100T1 BIT(0)
  86. /* DSP 100M registers */
  87. #define LAN887x_CDR_CONFIG1_100 0x0405
  88. #define LAN887x_LOCK1_EQLSR_CONFIG_100 0x0411
  89. #define LAN887x_SLV_HD_MUFAC_CONFIG_100 0x0417
  90. #define LAN887x_PLOCK_MUFAC_CONFIG_100 0x041c
  91. #define LAN887x_PROT_DISABLE_100 0x0425
  92. #define LAN887x_KF_LOOP_SAT_CONFIG_100 0x0454
  93. /* DSP 1000M registers */
  94. #define LAN887X_LOCK1_EQLSR_CONFIG 0x0811
  95. #define LAN887X_LOCK3_EQLSR_CONFIG 0x0813
  96. #define LAN887X_PROT_DISABLE 0x0825
  97. #define LAN887X_FFE_GAIN6 0x0843
  98. #define LAN887X_FFE_GAIN7 0x0844
  99. #define LAN887X_FFE_GAIN8 0x0845
  100. #define LAN887X_FFE_GAIN9 0x0846
  101. #define LAN887X_ECHO_DELAY_CONFIG 0x08ec
  102. #define LAN887X_FFE_MAX_CONFIG 0x08ee
  103. /* PCS 1000M registers */
  104. #define LAN887X_SCR_CONFIG_3 0x8043
  105. #define LAN887X_INFO_FLD_CONFIG_5 0x8048
  106. /* T1 afe registers */
  107. #define LAN887X_ZQCAL_CONTROL_1 0x8080
  108. #define LAN887X_AFE_PORT_TESTBUS_CTRL2 0x8089
  109. #define LAN887X_AFE_PORT_TESTBUS_CTRL4 0x808b
  110. #define LAN887X_AFE_PORT_TESTBUS_CTRL6 0x808d
  111. #define LAN887X_TX_AMPLT_1000T1_REG 0x80b0
  112. #define LAN887X_INIT_COEFF_DFE1_100 0x0422
  113. /* PMA registers */
  114. #define LAN887X_DSP_PMA_CONTROL 0x810e
  115. #define LAN887X_DSP_PMA_CONTROL_LNK_SYNC BIT(4)
  116. /* PCS 100M registers */
  117. #define LAN887X_IDLE_ERR_TIMER_WIN 0x8204
  118. #define LAN887X_IDLE_ERR_CNT_THRESH 0x8213
  119. /* Misc registers */
  120. #define LAN887X_REG_REG26 0x001a
  121. #define LAN887X_REG_REG26_HW_INIT_SEQ_EN BIT(8)
  122. /* Mis registers */
  123. #define LAN887X_MIS_CFG_REG0 0xa00
  124. #define LAN887X_MIS_CFG_REG0_RCLKOUT_DIS BIT(5)
  125. #define LAN887X_MIS_CFG_REG0_MAC_MODE_SEL GENMASK(1, 0)
  126. #define LAN887X_MAC_MODE_RGMII 0x01
  127. #define LAN887X_MAC_MODE_SGMII 0x03
  128. #define LAN887X_MIS_DLL_CFG_REG0 0xa01
  129. #define LAN887X_MIS_DLL_CFG_REG1 0xa02
  130. #define LAN887X_MIS_DLL_DELAY_EN BIT(15)
  131. #define LAN887X_MIS_DLL_EN BIT(0)
  132. #define LAN887X_MIS_DLL_CONF (LAN887X_MIS_DLL_DELAY_EN |\
  133. LAN887X_MIS_DLL_EN)
  134. #define LAN887X_MIS_CFG_REG2 0xa03
  135. #define LAN887X_MIS_CFG_REG2_FE_LPBK_EN BIT(2)
  136. #define LAN887X_MIS_PKT_STAT_REG0 0xa06
  137. #define LAN887X_MIS_PKT_STAT_REG1 0xa07
  138. #define LAN887X_MIS_PKT_STAT_REG3 0xa09
  139. #define LAN887X_MIS_PKT_STAT_REG4 0xa0a
  140. #define LAN887X_MIS_PKT_STAT_REG5 0xa0b
  141. #define LAN887X_MIS_PKT_STAT_REG6 0xa0c
  142. /* Chiptop common registers */
  143. #define LAN887X_COMMON_LED3_LED2 0xc05
  144. #define LAN887X_COMMON_LED2_MODE_SEL_MASK GENMASK(4, 0)
  145. #define LAN887X_LED_LINK_ACT_ANY_SPEED 0x0
  146. /* MX chip top registers */
  147. #define LAN887X_CHIP_HARD_RST 0xf03e
  148. #define LAN887X_CHIP_HARD_RST_RESET BIT(0)
  149. #define LAN887X_CHIP_SOFT_RST 0xf03f
  150. #define LAN887X_CHIP_SOFT_RST_RESET BIT(0)
  151. #define LAN887X_SGMII_CTL 0xf01a
  152. #define LAN887X_SGMII_CTL_SGMII_MUX_EN BIT(0)
  153. #define LAN887X_SGMII_PCS_CFG 0xf034
  154. #define LAN887X_SGMII_PCS_CFG_PCS_ENA BIT(9)
  155. #define LAN887X_EFUSE_READ_DAT9 0xf209
  156. #define LAN887X_EFUSE_READ_DAT9_SGMII_DIS BIT(9)
  157. #define LAN887X_EFUSE_READ_DAT9_MAC_MODE GENMASK(1, 0)
  158. #define LAN887X_CALIB_CONFIG_100 0x437
  159. #define LAN887X_CALIB_CONFIG_100_CBL_DIAG_USE_LOCAL_SMPL BIT(5)
  160. #define LAN887X_CALIB_CONFIG_100_CBL_DIAG_STB_SYNC_MODE BIT(4)
  161. #define LAN887X_CALIB_CONFIG_100_CBL_DIAG_CLK_ALGN_MODE BIT(3)
  162. #define LAN887X_CALIB_CONFIG_100_VAL \
  163. (LAN887X_CALIB_CONFIG_100_CBL_DIAG_CLK_ALGN_MODE |\
  164. LAN887X_CALIB_CONFIG_100_CBL_DIAG_STB_SYNC_MODE |\
  165. LAN887X_CALIB_CONFIG_100_CBL_DIAG_USE_LOCAL_SMPL)
  166. #define LAN887X_MAX_PGA_GAIN_100 0x44f
  167. #define LAN887X_MIN_PGA_GAIN_100 0x450
  168. #define LAN887X_START_CBL_DIAG_100 0x45a
  169. #define LAN887X_CBL_DIAG_DONE BIT(1)
  170. #define LAN887X_CBL_DIAG_START BIT(0)
  171. #define LAN887X_CBL_DIAG_STOP 0x0
  172. #define LAN887X_CBL_DIAG_TDR_THRESH_100 0x45b
  173. #define LAN887X_CBL_DIAG_AGC_THRESH_100 0x45c
  174. #define LAN887X_CBL_DIAG_MIN_WAIT_CONFIG_100 0x45d
  175. #define LAN887X_CBL_DIAG_MAX_WAIT_CONFIG_100 0x45e
  176. #define LAN887X_CBL_DIAG_CYC_CONFIG_100 0x45f
  177. #define LAN887X_CBL_DIAG_TX_PULSE_CONFIG_100 0x460
  178. #define LAN887X_CBL_DIAG_MIN_PGA_GAIN_100 0x462
  179. #define LAN887X_CBL_DIAG_AGC_GAIN_100 0x497
  180. #define LAN887X_CBL_DIAG_POS_PEAK_VALUE_100 0x499
  181. #define LAN887X_CBL_DIAG_NEG_PEAK_VALUE_100 0x49a
  182. #define LAN887X_CBL_DIAG_POS_PEAK_TIME_100 0x49c
  183. #define LAN887X_CBL_DIAG_NEG_PEAK_TIME_100 0x49d
  184. #define MICROCHIP_CABLE_NOISE_MARGIN 20
  185. #define MICROCHIP_CABLE_TIME_MARGIN 89
  186. #define MICROCHIP_CABLE_MIN_TIME_DIFF 96
  187. #define MICROCHIP_CABLE_MAX_TIME_DIFF \
  188. (MICROCHIP_CABLE_MIN_TIME_DIFF + MICROCHIP_CABLE_TIME_MARGIN)
  189. #define DRIVER_AUTHOR "Nisar Sayed <nisar.sayed@microchip.com>"
  190. #define DRIVER_DESC "Microchip LAN87XX/LAN937x/LAN887x T1 PHY driver"
  191. /* TEST_MODE_NORMAL: Non-hybrid results to calculate cable status(open/short/ok)
  192. * TEST_MODE_HYBRID: Hybrid results to calculate distance to fault
  193. */
  194. enum cable_diag_mode {
  195. TEST_MODE_NORMAL,
  196. TEST_MODE_HYBRID
  197. };
  198. /* CD_TEST_INIT: Cable test is initated
  199. * CD_TEST_DONE: Cable test is done
  200. */
  201. enum cable_diag_state {
  202. CD_TEST_INIT,
  203. CD_TEST_DONE
  204. };
  205. struct access_ereg_val {
  206. u8 mode;
  207. u8 bank;
  208. u8 offset;
  209. u16 val;
  210. u16 mask;
  211. };
  212. struct lan887x_hw_stat {
  213. const char *string;
  214. u8 mmd;
  215. u16 reg;
  216. u8 bits;
  217. };
  218. static const struct lan887x_hw_stat lan887x_hw_stats[] = {
  219. { "TX Good Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG0, 14},
  220. { "RX Good Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG1, 14},
  221. { "RX ERR Count detected by PCS", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG3, 16},
  222. { "TX CRC ERR Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG4, 8},
  223. { "RX CRC ERR Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG5, 8},
  224. { "RX ERR Count for SGMII MII2GMII", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG6, 8},
  225. };
  226. struct lan887x_regwr_map {
  227. u8 mmd;
  228. u16 reg;
  229. u16 val;
  230. };
  231. struct lan887x_priv {
  232. u64 stats[ARRAY_SIZE(lan887x_hw_stats)];
  233. };
  234. static int lan937x_dsp_workaround(struct phy_device *phydev, u16 ereg, u8 bank)
  235. {
  236. u8 prev_bank;
  237. int rc = 0;
  238. u16 val;
  239. mutex_lock(&phydev->lock);
  240. /* Read previous selected bank */
  241. rc = phy_read(phydev, LAN87XX_EXT_REG_CTL);
  242. if (rc < 0)
  243. goto out_unlock;
  244. /* store the prev_bank */
  245. prev_bank = FIELD_GET(LAN87XX_REG_BANK_SEL_MASK, rc);
  246. if (bank != prev_bank && bank == PHYACC_ATTR_BANK_DSP) {
  247. val = ereg & ~LAN87XX_REG_ADDR_MASK;
  248. val &= ~LAN87XX_EXT_REG_CTL_WR_CTL;
  249. val |= LAN87XX_EXT_REG_CTL_RD_CTL;
  250. /* access twice for DSP bank change,dummy access */
  251. rc = phy_write(phydev, LAN87XX_EXT_REG_CTL, val);
  252. }
  253. out_unlock:
  254. mutex_unlock(&phydev->lock);
  255. return rc;
  256. }
  257. static int access_ereg(struct phy_device *phydev, u8 mode, u8 bank,
  258. u8 offset, u16 val)
  259. {
  260. u16 ereg = 0;
  261. int rc = 0;
  262. if (mode > PHYACC_ATTR_MODE_WRITE || bank > PHYACC_ATTR_BANK_MAX)
  263. return -EINVAL;
  264. if (bank == PHYACC_ATTR_BANK_SMI) {
  265. if (mode == PHYACC_ATTR_MODE_WRITE)
  266. rc = phy_write(phydev, offset, val);
  267. else
  268. rc = phy_read(phydev, offset);
  269. return rc;
  270. }
  271. if (mode == PHYACC_ATTR_MODE_WRITE) {
  272. ereg = LAN87XX_EXT_REG_CTL_WR_CTL;
  273. rc = phy_write(phydev, LAN87XX_EXT_REG_WR_DATA, val);
  274. if (rc < 0)
  275. return rc;
  276. } else {
  277. ereg = LAN87XX_EXT_REG_CTL_RD_CTL;
  278. }
  279. ereg |= (bank << 8) | offset;
  280. /* DSP bank access workaround for lan937x */
  281. if (phydev->phy_id == PHY_ID_LAN937X) {
  282. rc = lan937x_dsp_workaround(phydev, ereg, bank);
  283. if (rc < 0)
  284. return rc;
  285. }
  286. rc = phy_write(phydev, LAN87XX_EXT_REG_CTL, ereg);
  287. if (rc < 0)
  288. return rc;
  289. if (mode == PHYACC_ATTR_MODE_READ)
  290. rc = phy_read(phydev, LAN87XX_EXT_REG_RD_DATA);
  291. return rc;
  292. }
  293. static int access_ereg_modify_changed(struct phy_device *phydev,
  294. u8 bank, u8 offset, u16 val, u16 mask)
  295. {
  296. int new = 0, rc = 0;
  297. if (bank > PHYACC_ATTR_BANK_MAX)
  298. return -EINVAL;
  299. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, bank, offset, val);
  300. if (rc < 0)
  301. return rc;
  302. new = val | (rc & (mask ^ 0xFFFF));
  303. rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE, bank, offset, new);
  304. return rc;
  305. }
  306. static int access_smi_poll_timeout(struct phy_device *phydev,
  307. u8 offset, u16 mask, u16 clr)
  308. {
  309. int val;
  310. return phy_read_poll_timeout(phydev, offset, val, (val & mask) == clr,
  311. 150, 30000, true);
  312. }
  313. static int lan87xx_config_rgmii_delay(struct phy_device *phydev)
  314. {
  315. int rc;
  316. if (!phy_interface_is_rgmii(phydev))
  317. return 0;
  318. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  319. PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, 0);
  320. if (rc < 0)
  321. return rc;
  322. switch (phydev->interface) {
  323. case PHY_INTERFACE_MODE_RGMII:
  324. rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN;
  325. rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN;
  326. break;
  327. case PHY_INTERFACE_MODE_RGMII_ID:
  328. rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN;
  329. rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN;
  330. break;
  331. case PHY_INTERFACE_MODE_RGMII_RXID:
  332. rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN;
  333. rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN;
  334. break;
  335. case PHY_INTERFACE_MODE_RGMII_TXID:
  336. rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN;
  337. rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN;
  338. break;
  339. default:
  340. return 0;
  341. }
  342. return access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
  343. PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, rc);
  344. }
  345. static int lan87xx_phy_init_cmd(struct phy_device *phydev,
  346. const struct access_ereg_val *cmd_seq, int cnt)
  347. {
  348. int ret, i;
  349. for (i = 0; i < cnt; i++) {
  350. if (cmd_seq[i].mode == PHYACC_ATTR_MODE_POLL &&
  351. cmd_seq[i].bank == PHYACC_ATTR_BANK_SMI) {
  352. ret = access_smi_poll_timeout(phydev,
  353. cmd_seq[i].offset,
  354. cmd_seq[i].val,
  355. cmd_seq[i].mask);
  356. } else {
  357. ret = access_ereg(phydev, cmd_seq[i].mode,
  358. cmd_seq[i].bank, cmd_seq[i].offset,
  359. cmd_seq[i].val);
  360. }
  361. if (ret < 0)
  362. return ret;
  363. }
  364. return ret;
  365. }
  366. static int lan87xx_phy_init(struct phy_device *phydev)
  367. {
  368. static const struct access_ereg_val hw_init[] = {
  369. /* TXPD/TXAMP6 Configs */
  370. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_AFE,
  371. T1_AFE_PORT_CFG1_REG, 0x002D, 0 },
  372. /* HW_Init Hi and Force_ED */
  373. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
  374. T1_POWER_DOWN_CONTROL_REG, 0x0308, 0 },
  375. };
  376. static const struct access_ereg_val slave_init[] = {
  377. /* Equalizer Full Duplex Freeze - T1 Slave */
  378. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  379. T1_EQ_FD_STG1_FRZ_CFG, 0x0002, 0 },
  380. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  381. T1_EQ_FD_STG2_FRZ_CFG, 0x0002, 0 },
  382. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  383. T1_EQ_FD_STG3_FRZ_CFG, 0x0002, 0 },
  384. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  385. T1_EQ_FD_STG4_FRZ_CFG, 0x0002, 0 },
  386. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  387. T1_EQ_WT_FD_LCK_FRZ_CFG, 0x0002, 0 },
  388. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  389. T1_PST_EQ_LCK_STG1_FRZ_CFG, 0x0002, 0 },
  390. };
  391. static const struct access_ereg_val phy_init[] = {
  392. /* Slave Full Duplex Multi Configs */
  393. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  394. T1_SLV_FD_MULT_CFG_REG, 0x0D53, 0 },
  395. /* CDR Pre and Post Lock Configs */
  396. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  397. T1_CDR_CFG_PRE_LOCK_REG, 0x0AB2, 0 },
  398. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  399. T1_CDR_CFG_POST_LOCK_REG, 0x0AB3, 0 },
  400. /* Lock Stage 2-3 Multi Factor Config */
  401. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  402. T1_LCK_STG2_MUFACT_CFG_REG, 0x0AEA, 0 },
  403. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  404. T1_LCK_STG3_MUFACT_CFG_REG, 0x0AEB, 0 },
  405. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  406. T1_POST_LCK_MUFACT_CFG_REG, 0x0AEB, 0 },
  407. /* Pointer delay */
  408. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  409. T1_TX_RX_FIFO_CFG_REG, 0x1C00, 0 },
  410. /* Tx iir edits */
  411. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  412. T1_TX_LPF_FIR_CFG_REG, 0x1000, 0 },
  413. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  414. T1_TX_LPF_FIR_CFG_REG, 0x1861, 0 },
  415. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  416. T1_TX_LPF_FIR_CFG_REG, 0x1061, 0 },
  417. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  418. T1_TX_LPF_FIR_CFG_REG, 0x1922, 0 },
  419. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  420. T1_TX_LPF_FIR_CFG_REG, 0x1122, 0 },
  421. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  422. T1_TX_LPF_FIR_CFG_REG, 0x1983, 0 },
  423. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  424. T1_TX_LPF_FIR_CFG_REG, 0x1183, 0 },
  425. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  426. T1_TX_LPF_FIR_CFG_REG, 0x1944, 0 },
  427. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  428. T1_TX_LPF_FIR_CFG_REG, 0x1144, 0 },
  429. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  430. T1_TX_LPF_FIR_CFG_REG, 0x18c5, 0 },
  431. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  432. T1_TX_LPF_FIR_CFG_REG, 0x10c5, 0 },
  433. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  434. T1_TX_LPF_FIR_CFG_REG, 0x1846, 0 },
  435. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  436. T1_TX_LPF_FIR_CFG_REG, 0x1046, 0 },
  437. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  438. T1_TX_LPF_FIR_CFG_REG, 0x1807, 0 },
  439. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  440. T1_TX_LPF_FIR_CFG_REG, 0x1007, 0 },
  441. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  442. T1_TX_LPF_FIR_CFG_REG, 0x1808, 0 },
  443. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  444. T1_TX_LPF_FIR_CFG_REG, 0x1008, 0 },
  445. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  446. T1_TX_LPF_FIR_CFG_REG, 0x1809, 0 },
  447. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  448. T1_TX_LPF_FIR_CFG_REG, 0x1009, 0 },
  449. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  450. T1_TX_LPF_FIR_CFG_REG, 0x180A, 0 },
  451. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  452. T1_TX_LPF_FIR_CFG_REG, 0x100A, 0 },
  453. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  454. T1_TX_LPF_FIR_CFG_REG, 0x180B, 0 },
  455. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  456. T1_TX_LPF_FIR_CFG_REG, 0x100B, 0 },
  457. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  458. T1_TX_LPF_FIR_CFG_REG, 0x180C, 0 },
  459. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  460. T1_TX_LPF_FIR_CFG_REG, 0x100C, 0 },
  461. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  462. T1_TX_LPF_FIR_CFG_REG, 0x180D, 0 },
  463. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  464. T1_TX_LPF_FIR_CFG_REG, 0x100D, 0 },
  465. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  466. T1_TX_LPF_FIR_CFG_REG, 0x180E, 0 },
  467. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  468. T1_TX_LPF_FIR_CFG_REG, 0x100E, 0 },
  469. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  470. T1_TX_LPF_FIR_CFG_REG, 0x180F, 0 },
  471. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  472. T1_TX_LPF_FIR_CFG_REG, 0x100F, 0 },
  473. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  474. T1_TX_LPF_FIR_CFG_REG, 0x1810, 0 },
  475. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  476. T1_TX_LPF_FIR_CFG_REG, 0x1010, 0 },
  477. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  478. T1_TX_LPF_FIR_CFG_REG, 0x1811, 0 },
  479. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  480. T1_TX_LPF_FIR_CFG_REG, 0x1011, 0 },
  481. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  482. T1_TX_LPF_FIR_CFG_REG, 0x1000, 0 },
  483. /* Setup SQI measurement */
  484. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  485. T1_COEF_CLK_PWR_DN_CFG, 0x16d6, 0 },
  486. /* SQI enable */
  487. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  488. T1_SQI_CONFIG_REG, 0x9572, 0 },
  489. /* SQI select mode 5 */
  490. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  491. T1_SQI_CONFIG2_REG, 0x0001, 0 },
  492. /* Throws the first SQI reading */
  493. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
  494. T1_COEF_RW_CTL_CFG, 0x0301, 0 },
  495. { PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_DSP,
  496. T1_DCQ_SQI_REG, 0, 0 },
  497. /* Flag LPS and WUR as idle errors */
  498. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
  499. T1_MDIO_CONTROL2_REG, 0x0014, 0 },
  500. /* HW_Init toggle, undo force ED, TXPD off */
  501. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
  502. T1_POWER_DOWN_CONTROL_REG, 0x0200, 0 },
  503. /* Reset PCS to trigger hardware initialization */
  504. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
  505. T1_MDIO_CONTROL2_REG, 0x0094, 0 },
  506. /* Poll till Hardware is initialized */
  507. { PHYACC_ATTR_MODE_POLL, PHYACC_ATTR_BANK_SMI,
  508. T1_MDIO_CONTROL2_REG, 0x0080, 0 },
  509. /* Tx AMP - 0x06 */
  510. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_AFE,
  511. T1_AFE_PORT_CFG1_REG, 0x000C, 0 },
  512. /* Read INTERRUPT_SOURCE Register */
  513. { PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_SMI,
  514. T1_INTERRUPT_SOURCE_REG, 0, 0 },
  515. /* Read INTERRUPT_SOURCE Register */
  516. { PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_MISC,
  517. T1_INTERRUPT2_SOURCE_REG, 0, 0 },
  518. /* HW_Init Hi */
  519. { PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
  520. T1_POWER_DOWN_CONTROL_REG, 0x0300, 0 },
  521. };
  522. int rc;
  523. /* phy Soft reset */
  524. rc = genphy_soft_reset(phydev);
  525. if (rc < 0)
  526. return rc;
  527. /* PHY Initialization */
  528. rc = lan87xx_phy_init_cmd(phydev, hw_init, ARRAY_SIZE(hw_init));
  529. if (rc < 0)
  530. return rc;
  531. rc = genphy_read_master_slave(phydev);
  532. if (rc)
  533. return rc;
  534. /* The following squence needs to run only if phydev is in
  535. * slave mode.
  536. */
  537. if (phydev->master_slave_state == MASTER_SLAVE_STATE_SLAVE) {
  538. rc = lan87xx_phy_init_cmd(phydev, slave_init,
  539. ARRAY_SIZE(slave_init));
  540. if (rc < 0)
  541. return rc;
  542. }
  543. rc = lan87xx_phy_init_cmd(phydev, phy_init, ARRAY_SIZE(phy_init));
  544. if (rc < 0)
  545. return rc;
  546. return lan87xx_config_rgmii_delay(phydev);
  547. }
  548. static int lan87xx_phy_config_intr(struct phy_device *phydev)
  549. {
  550. int rc, val = 0;
  551. if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  552. /* clear all interrupt */
  553. rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val);
  554. if (rc < 0)
  555. return rc;
  556. rc = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE);
  557. if (rc < 0)
  558. return rc;
  559. rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
  560. PHYACC_ATTR_BANK_MISC,
  561. LAN87XX_INTERRUPT_MASK_2, val);
  562. if (rc < 0)
  563. return rc;
  564. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  565. PHYACC_ATTR_BANK_MISC,
  566. LAN87XX_INTERRUPT_SOURCE_2, 0);
  567. if (rc < 0)
  568. return rc;
  569. /* enable link down and comm ready interrupt */
  570. val = LAN87XX_MASK_LINK_DOWN;
  571. rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val);
  572. if (rc < 0)
  573. return rc;
  574. val = LAN87XX_MASK_COMM_RDY;
  575. rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
  576. PHYACC_ATTR_BANK_MISC,
  577. LAN87XX_INTERRUPT_MASK_2, val);
  578. } else {
  579. rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val);
  580. if (rc < 0)
  581. return rc;
  582. rc = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE);
  583. if (rc < 0)
  584. return rc;
  585. rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
  586. PHYACC_ATTR_BANK_MISC,
  587. LAN87XX_INTERRUPT_MASK_2, val);
  588. if (rc < 0)
  589. return rc;
  590. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  591. PHYACC_ATTR_BANK_MISC,
  592. LAN87XX_INTERRUPT_SOURCE_2, 0);
  593. }
  594. return rc < 0 ? rc : 0;
  595. }
  596. static irqreturn_t lan87xx_handle_interrupt(struct phy_device *phydev)
  597. {
  598. int irq_status;
  599. irq_status = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  600. PHYACC_ATTR_BANK_MISC,
  601. LAN87XX_INTERRUPT_SOURCE_2, 0);
  602. if (irq_status < 0) {
  603. phy_error(phydev);
  604. return IRQ_NONE;
  605. }
  606. irq_status = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE);
  607. if (irq_status < 0) {
  608. phy_error(phydev);
  609. return IRQ_NONE;
  610. }
  611. if (irq_status == 0)
  612. return IRQ_NONE;
  613. phy_trigger_machine(phydev);
  614. return IRQ_HANDLED;
  615. }
  616. static int lan87xx_config_init(struct phy_device *phydev)
  617. {
  618. int rc = lan87xx_phy_init(phydev);
  619. return rc < 0 ? rc : 0;
  620. }
  621. static int microchip_cable_test_start_common(struct phy_device *phydev)
  622. {
  623. int bmcr, bmsr, ret;
  624. /* If auto-negotiation is enabled, but not complete, the cable
  625. * test never completes. So disable auto-neg.
  626. */
  627. bmcr = phy_read(phydev, MII_BMCR);
  628. if (bmcr < 0)
  629. return bmcr;
  630. bmsr = phy_read(phydev, MII_BMSR);
  631. if (bmsr < 0)
  632. return bmsr;
  633. if (bmcr & BMCR_ANENABLE) {
  634. ret = phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
  635. if (ret < 0)
  636. return ret;
  637. ret = genphy_soft_reset(phydev);
  638. if (ret < 0)
  639. return ret;
  640. }
  641. /* If the link is up, allow it some time to go down */
  642. if (bmsr & BMSR_LSTATUS)
  643. msleep(1500);
  644. return 0;
  645. }
  646. static int lan87xx_cable_test_start(struct phy_device *phydev)
  647. {
  648. static const struct access_ereg_val cable_test[] = {
  649. /* min wait */
  650. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 93,
  651. 0, 0},
  652. /* max wait */
  653. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 94,
  654. 10, 0},
  655. /* pulse cycle */
  656. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 95,
  657. 90, 0},
  658. /* cable diag thresh */
  659. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 92,
  660. 60, 0},
  661. /* max gain */
  662. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 79,
  663. 31, 0},
  664. /* clock align for each iteration */
  665. {PHYACC_ATTR_MODE_MODIFY, PHYACC_ATTR_BANK_DSP, 55,
  666. 0, 0x0038},
  667. /* max cycle wait config */
  668. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 94,
  669. 70, 0},
  670. /* start cable diag*/
  671. {PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 90,
  672. 1, 0},
  673. };
  674. int rc, i;
  675. rc = microchip_cable_test_start_common(phydev);
  676. if (rc < 0)
  677. return rc;
  678. /* start cable diag */
  679. /* check if part is alive - if not, return diagnostic error */
  680. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_SMI,
  681. 0x00, 0);
  682. if (rc < 0)
  683. return rc;
  684. /* master/slave specific configs */
  685. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_SMI,
  686. 0x0A, 0);
  687. if (rc < 0)
  688. return rc;
  689. if ((rc & 0x4000) != 0x4000) {
  690. /* DUT is Slave */
  691. rc = access_ereg_modify_changed(phydev, PHYACC_ATTR_BANK_AFE,
  692. 0x0E, 0x5, 0x7);
  693. if (rc < 0)
  694. return rc;
  695. rc = access_ereg_modify_changed(phydev, PHYACC_ATTR_BANK_SMI,
  696. 0x1A, 0x8, 0x8);
  697. if (rc < 0)
  698. return rc;
  699. } else {
  700. /* DUT is Master */
  701. rc = access_ereg_modify_changed(phydev, PHYACC_ATTR_BANK_SMI,
  702. 0x10, 0x8, 0x40);
  703. if (rc < 0)
  704. return rc;
  705. }
  706. for (i = 0; i < ARRAY_SIZE(cable_test); i++) {
  707. if (cable_test[i].mode == PHYACC_ATTR_MODE_MODIFY) {
  708. rc = access_ereg_modify_changed(phydev,
  709. cable_test[i].bank,
  710. cable_test[i].offset,
  711. cable_test[i].val,
  712. cable_test[i].mask);
  713. /* wait 50ms */
  714. msleep(50);
  715. } else {
  716. rc = access_ereg(phydev, cable_test[i].mode,
  717. cable_test[i].bank,
  718. cable_test[i].offset,
  719. cable_test[i].val);
  720. }
  721. if (rc < 0)
  722. return rc;
  723. }
  724. /* cable diag started */
  725. return 0;
  726. }
  727. static int lan87xx_cable_test_report_trans(u32 result)
  728. {
  729. switch (result) {
  730. case LAN87XX_CABLE_TEST_OK:
  731. return ETHTOOL_A_CABLE_RESULT_CODE_OK;
  732. case LAN87XX_CABLE_TEST_OPEN:
  733. return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
  734. case LAN87XX_CABLE_TEST_SAME_SHORT:
  735. return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
  736. default:
  737. /* DIAGNOSTIC_ERROR */
  738. return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
  739. }
  740. }
  741. static int lan87xx_cable_test_report(struct phy_device *phydev)
  742. {
  743. int pos_peak_cycle = 0, pos_peak_in_phases = 0, pos_peak_phase = 0;
  744. int neg_peak_cycle = 0, neg_peak_in_phases = 0, neg_peak_phase = 0;
  745. int noise_margin = 20, time_margin = 89, jitter_var = 30;
  746. int min_time_diff = 96, max_time_diff = 96 + time_margin;
  747. bool fault = false, check_a = false, check_b = false;
  748. int gain_idx = 0, pos_peak = 0, neg_peak = 0;
  749. int pos_peak_time = 0, neg_peak_time = 0;
  750. int pos_peak_in_phases_hybrid = 0;
  751. int detect = -1;
  752. gain_idx = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  753. PHYACC_ATTR_BANK_DSP, 151, 0);
  754. /* read non-hybrid results */
  755. pos_peak = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  756. PHYACC_ATTR_BANK_DSP, 153, 0);
  757. neg_peak = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  758. PHYACC_ATTR_BANK_DSP, 154, 0);
  759. pos_peak_time = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  760. PHYACC_ATTR_BANK_DSP, 156, 0);
  761. neg_peak_time = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  762. PHYACC_ATTR_BANK_DSP, 157, 0);
  763. pos_peak_cycle = (pos_peak_time >> 7) & 0x7F;
  764. /* calculate non-hybrid values */
  765. pos_peak_phase = pos_peak_time & 0x7F;
  766. pos_peak_in_phases = (pos_peak_cycle * 96) + pos_peak_phase;
  767. neg_peak_cycle = (neg_peak_time >> 7) & 0x7F;
  768. neg_peak_phase = neg_peak_time & 0x7F;
  769. neg_peak_in_phases = (neg_peak_cycle * 96) + neg_peak_phase;
  770. /* process values */
  771. check_a =
  772. ((pos_peak_in_phases - neg_peak_in_phases) >= min_time_diff) &&
  773. ((pos_peak_in_phases - neg_peak_in_phases) < max_time_diff) &&
  774. pos_peak_in_phases_hybrid < pos_peak_in_phases &&
  775. (pos_peak_in_phases_hybrid < (neg_peak_in_phases + jitter_var));
  776. check_b =
  777. ((neg_peak_in_phases - pos_peak_in_phases) >= min_time_diff) &&
  778. ((neg_peak_in_phases - pos_peak_in_phases) < max_time_diff) &&
  779. pos_peak_in_phases_hybrid < neg_peak_in_phases &&
  780. (pos_peak_in_phases_hybrid < (pos_peak_in_phases + jitter_var));
  781. if (pos_peak_in_phases > neg_peak_in_phases && check_a)
  782. detect = 2;
  783. else if ((neg_peak_in_phases > pos_peak_in_phases) && check_b)
  784. detect = 1;
  785. if (pos_peak > noise_margin && neg_peak > noise_margin &&
  786. gain_idx >= 0) {
  787. if (detect == 1 || detect == 2)
  788. fault = true;
  789. }
  790. if (!fault)
  791. detect = 0;
  792. ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A,
  793. lan87xx_cable_test_report_trans(detect));
  794. return phy_init_hw(phydev);
  795. }
  796. static int lan87xx_cable_test_get_status(struct phy_device *phydev,
  797. bool *finished)
  798. {
  799. int rc = 0;
  800. *finished = false;
  801. /* check if cable diag was finished */
  802. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_DSP,
  803. 90, 0);
  804. if (rc < 0)
  805. return rc;
  806. if ((rc & 2) == 2) {
  807. /* stop cable diag*/
  808. rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
  809. PHYACC_ATTR_BANK_DSP,
  810. 90, 0);
  811. if (rc < 0)
  812. return rc;
  813. *finished = true;
  814. return lan87xx_cable_test_report(phydev);
  815. }
  816. return 0;
  817. }
  818. static int lan87xx_read_status(struct phy_device *phydev)
  819. {
  820. int rc = 0;
  821. rc = phy_read(phydev, T1_MODE_STAT_REG);
  822. if (rc < 0)
  823. return rc;
  824. if (rc & T1_LINK_UP_MSK)
  825. phydev->link = 1;
  826. else
  827. phydev->link = 0;
  828. phydev->speed = SPEED_UNKNOWN;
  829. phydev->duplex = DUPLEX_UNKNOWN;
  830. phydev->pause = 0;
  831. phydev->asym_pause = 0;
  832. rc = genphy_read_master_slave(phydev);
  833. if (rc < 0)
  834. return rc;
  835. rc = genphy_read_status_fixed(phydev);
  836. if (rc < 0)
  837. return rc;
  838. return rc;
  839. }
  840. static int lan87xx_config_aneg(struct phy_device *phydev)
  841. {
  842. u16 ctl = 0;
  843. int ret;
  844. switch (phydev->master_slave_set) {
  845. case MASTER_SLAVE_CFG_MASTER_FORCE:
  846. ctl |= CTL1000_AS_MASTER;
  847. break;
  848. case MASTER_SLAVE_CFG_SLAVE_FORCE:
  849. break;
  850. case MASTER_SLAVE_CFG_UNKNOWN:
  851. case MASTER_SLAVE_CFG_UNSUPPORTED:
  852. return 0;
  853. default:
  854. phydev_warn(phydev, "Unsupported Master/Slave mode\n");
  855. return -EOPNOTSUPP;
  856. }
  857. ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl);
  858. if (ret == 1)
  859. return phy_init_hw(phydev);
  860. return ret;
  861. }
  862. static int lan87xx_get_sqi(struct phy_device *phydev)
  863. {
  864. u8 sqi_value = 0;
  865. int rc;
  866. rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
  867. PHYACC_ATTR_BANK_DSP, T1_COEF_RW_CTL_CFG, 0x0301);
  868. if (rc < 0)
  869. return rc;
  870. rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
  871. PHYACC_ATTR_BANK_DSP, T1_DCQ_SQI_REG, 0x0);
  872. if (rc < 0)
  873. return rc;
  874. sqi_value = FIELD_GET(T1_DCQ_SQI_MSK, rc);
  875. return sqi_value;
  876. }
  877. static int lan87xx_get_sqi_max(struct phy_device *phydev)
  878. {
  879. return LAN87XX_MAX_SQI;
  880. }
  881. static int lan887x_rgmii_init(struct phy_device *phydev)
  882. {
  883. int ret;
  884. /* SGMII mux disable */
  885. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  886. LAN887X_SGMII_CTL,
  887. LAN887X_SGMII_CTL_SGMII_MUX_EN);
  888. if (ret < 0)
  889. return ret;
  890. /* Select MAC_MODE as RGMII */
  891. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0,
  892. LAN887X_MIS_CFG_REG0_MAC_MODE_SEL,
  893. LAN887X_MAC_MODE_RGMII);
  894. if (ret < 0)
  895. return ret;
  896. /* Disable PCS */
  897. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  898. LAN887X_SGMII_PCS_CFG,
  899. LAN887X_SGMII_PCS_CFG_PCS_ENA);
  900. if (ret < 0)
  901. return ret;
  902. /* LAN887x Errata: RGMII rx clock active in SGMII mode
  903. * Disabled it for SGMII mode
  904. * Re-enabling it for RGMII mode
  905. */
  906. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  907. LAN887X_MIS_CFG_REG0,
  908. LAN887X_MIS_CFG_REG0_RCLKOUT_DIS);
  909. }
  910. static int lan887x_sgmii_init(struct phy_device *phydev)
  911. {
  912. int ret;
  913. /* SGMII mux enable */
  914. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  915. LAN887X_SGMII_CTL,
  916. LAN887X_SGMII_CTL_SGMII_MUX_EN);
  917. if (ret < 0)
  918. return ret;
  919. /* Select MAC_MODE as SGMII */
  920. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0,
  921. LAN887X_MIS_CFG_REG0_MAC_MODE_SEL,
  922. LAN887X_MAC_MODE_SGMII);
  923. if (ret < 0)
  924. return ret;
  925. /* LAN887x Errata: RGMII rx clock active in SGMII mode.
  926. * So disabling it for SGMII mode
  927. */
  928. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0,
  929. LAN887X_MIS_CFG_REG0_RCLKOUT_DIS);
  930. if (ret < 0)
  931. return ret;
  932. /* Enable PCS */
  933. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_SGMII_PCS_CFG,
  934. LAN887X_SGMII_PCS_CFG_PCS_ENA);
  935. }
  936. static int lan887x_config_rgmii_en(struct phy_device *phydev)
  937. {
  938. int txc;
  939. int rxc;
  940. int ret;
  941. ret = lan887x_rgmii_init(phydev);
  942. if (ret < 0)
  943. return ret;
  944. /* Control bit to enable/disable TX DLL delay line in signal path */
  945. txc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG0);
  946. if (txc < 0)
  947. return txc;
  948. /* Control bit to enable/disable RX DLL delay line in signal path */
  949. rxc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG1);
  950. if (rxc < 0)
  951. return rxc;
  952. /* Configures the phy to enable RX/TX delay
  953. * RGMII - TX & RX delays are either added by MAC or not needed,
  954. * phy should not add
  955. * RGMII_ID - Configures phy to enable TX & RX delays, MAC shouldn't add
  956. * RGMII_RX_ID - Configures the PHY to enable the RX delay.
  957. * The MAC shouldn't add the RX delay
  958. * RGMII_TX_ID - Configures the PHY to enable the TX delay.
  959. * The MAC shouldn't add the TX delay in this case
  960. */
  961. switch (phydev->interface) {
  962. case PHY_INTERFACE_MODE_RGMII:
  963. txc &= ~LAN887X_MIS_DLL_CONF;
  964. rxc &= ~LAN887X_MIS_DLL_CONF;
  965. break;
  966. case PHY_INTERFACE_MODE_RGMII_ID:
  967. txc |= LAN887X_MIS_DLL_CONF;
  968. rxc |= LAN887X_MIS_DLL_CONF;
  969. break;
  970. case PHY_INTERFACE_MODE_RGMII_RXID:
  971. txc &= ~LAN887X_MIS_DLL_CONF;
  972. rxc |= LAN887X_MIS_DLL_CONF;
  973. break;
  974. case PHY_INTERFACE_MODE_RGMII_TXID:
  975. txc |= LAN887X_MIS_DLL_CONF;
  976. rxc &= ~LAN887X_MIS_DLL_CONF;
  977. break;
  978. default:
  979. WARN_ONCE(1, "Invalid phydev interface %d\n", phydev->interface);
  980. return 0;
  981. }
  982. /* Configures the PHY to enable/disable RX delay in signal path */
  983. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG1,
  984. LAN887X_MIS_DLL_CONF, rxc);
  985. if (ret < 0)
  986. return ret;
  987. /* Configures the PHY to enable/disable the TX delay in signal path */
  988. return phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG0,
  989. LAN887X_MIS_DLL_CONF, txc);
  990. }
  991. static int lan887x_config_phy_interface(struct phy_device *phydev)
  992. {
  993. int interface_mode;
  994. int sgmii_dis;
  995. int ret;
  996. /* Read sku efuse data for interfaces supported by sku */
  997. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_EFUSE_READ_DAT9);
  998. if (ret < 0)
  999. return ret;
  1000. /* If interface_mode is 1 then efuse sets RGMII operations.
  1001. * If interface mode is 3 then efuse sets SGMII operations.
  1002. */
  1003. interface_mode = ret & LAN887X_EFUSE_READ_DAT9_MAC_MODE;
  1004. /* SGMII disable is set for RGMII operations */
  1005. sgmii_dis = ret & LAN887X_EFUSE_READ_DAT9_SGMII_DIS;
  1006. switch (phydev->interface) {
  1007. case PHY_INTERFACE_MODE_RGMII:
  1008. case PHY_INTERFACE_MODE_RGMII_ID:
  1009. case PHY_INTERFACE_MODE_RGMII_RXID:
  1010. case PHY_INTERFACE_MODE_RGMII_TXID:
  1011. /* Reject RGMII settings for SGMII only sku */
  1012. ret = -EOPNOTSUPP;
  1013. if (!((interface_mode & LAN887X_MAC_MODE_SGMII) ==
  1014. LAN887X_MAC_MODE_SGMII))
  1015. ret = lan887x_config_rgmii_en(phydev);
  1016. break;
  1017. case PHY_INTERFACE_MODE_SGMII:
  1018. /* Reject SGMII setting for RGMII only sku */
  1019. ret = -EOPNOTSUPP;
  1020. if (!sgmii_dis)
  1021. ret = lan887x_sgmii_init(phydev);
  1022. break;
  1023. default:
  1024. /* Reject setting for unsupported interfaces */
  1025. ret = -EOPNOTSUPP;
  1026. }
  1027. return ret;
  1028. }
  1029. static int lan887x_get_features(struct phy_device *phydev)
  1030. {
  1031. int ret;
  1032. ret = genphy_c45_pma_read_abilities(phydev);
  1033. if (ret < 0)
  1034. return ret;
  1035. /* Enable twisted pair */
  1036. linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, phydev->supported);
  1037. /* First patch only supports 100Mbps and 1000Mbps force-mode.
  1038. * T1 Auto-Negotiation (Clause 98 of IEEE 802.3) will be added later.
  1039. */
  1040. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
  1041. return 0;
  1042. }
  1043. static int lan887x_phy_init(struct phy_device *phydev)
  1044. {
  1045. int ret;
  1046. /* Clear loopback */
  1047. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  1048. LAN887X_MIS_CFG_REG2,
  1049. LAN887X_MIS_CFG_REG2_FE_LPBK_EN);
  1050. if (ret < 0)
  1051. return ret;
  1052. /* Configure default behavior of led to link and activity for any
  1053. * speed
  1054. */
  1055. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  1056. LAN887X_COMMON_LED3_LED2,
  1057. LAN887X_COMMON_LED2_MODE_SEL_MASK,
  1058. LAN887X_LED_LINK_ACT_ANY_SPEED);
  1059. if (ret < 0)
  1060. return ret;
  1061. /* PHY interface setup */
  1062. return lan887x_config_phy_interface(phydev);
  1063. }
  1064. static int lan887x_phy_config(struct phy_device *phydev,
  1065. const struct lan887x_regwr_map *reg_map, int cnt)
  1066. {
  1067. int ret;
  1068. for (int i = 0; i < cnt; i++) {
  1069. ret = phy_write_mmd(phydev, reg_map[i].mmd,
  1070. reg_map[i].reg, reg_map[i].val);
  1071. if (ret < 0)
  1072. return ret;
  1073. }
  1074. return 0;
  1075. }
  1076. static int lan887x_phy_setup(struct phy_device *phydev)
  1077. {
  1078. static const struct lan887x_regwr_map phy_cfg[] = {
  1079. /* PORT_AFE writes */
  1080. {MDIO_MMD_PMAPMD, LAN887X_ZQCAL_CONTROL_1, 0x4008},
  1081. {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL2, 0x0000},
  1082. {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL6, 0x0040},
  1083. /* 100T1_PCS_VENDOR writes */
  1084. {MDIO_MMD_PCS, LAN887X_IDLE_ERR_CNT_THRESH, 0x0008},
  1085. {MDIO_MMD_PCS, LAN887X_IDLE_ERR_TIMER_WIN, 0x800d},
  1086. /* 100T1 DSP writes */
  1087. {MDIO_MMD_VEND1, LAN887x_CDR_CONFIG1_100, 0x0ab1},
  1088. {MDIO_MMD_VEND1, LAN887x_LOCK1_EQLSR_CONFIG_100, 0x5274},
  1089. {MDIO_MMD_VEND1, LAN887x_SLV_HD_MUFAC_CONFIG_100, 0x0d74},
  1090. {MDIO_MMD_VEND1, LAN887x_PLOCK_MUFAC_CONFIG_100, 0x0aea},
  1091. {MDIO_MMD_VEND1, LAN887x_PROT_DISABLE_100, 0x0360},
  1092. {MDIO_MMD_VEND1, LAN887x_KF_LOOP_SAT_CONFIG_100, 0x0c30},
  1093. /* 1000T1 DSP writes */
  1094. {MDIO_MMD_VEND1, LAN887X_LOCK1_EQLSR_CONFIG, 0x2a78},
  1095. {MDIO_MMD_VEND1, LAN887X_LOCK3_EQLSR_CONFIG, 0x1368},
  1096. {MDIO_MMD_VEND1, LAN887X_PROT_DISABLE, 0x1354},
  1097. {MDIO_MMD_VEND1, LAN887X_FFE_GAIN6, 0x3C84},
  1098. {MDIO_MMD_VEND1, LAN887X_FFE_GAIN7, 0x3ca5},
  1099. {MDIO_MMD_VEND1, LAN887X_FFE_GAIN8, 0x3ca5},
  1100. {MDIO_MMD_VEND1, LAN887X_FFE_GAIN9, 0x3ca5},
  1101. {MDIO_MMD_VEND1, LAN887X_ECHO_DELAY_CONFIG, 0x0024},
  1102. {MDIO_MMD_VEND1, LAN887X_FFE_MAX_CONFIG, 0x227f},
  1103. /* 1000T1 PCS writes */
  1104. {MDIO_MMD_PCS, LAN887X_SCR_CONFIG_3, 0x1e00},
  1105. {MDIO_MMD_PCS, LAN887X_INFO_FLD_CONFIG_5, 0x0fa1},
  1106. };
  1107. return lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
  1108. }
  1109. static int lan887x_100M_setup(struct phy_device *phydev)
  1110. {
  1111. int ret;
  1112. /* (Re)configure the speed/mode dependent T1 settings */
  1113. if (phydev->master_slave_set == MASTER_SLAVE_CFG_MASTER_FORCE ||
  1114. phydev->master_slave_set == MASTER_SLAVE_CFG_MASTER_PREFERRED){
  1115. static const struct lan887x_regwr_map phy_cfg[] = {
  1116. {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x00b8},
  1117. {MDIO_MMD_PMAPMD, LAN887X_TX_AMPLT_1000T1_REG, 0x0038},
  1118. {MDIO_MMD_VEND1, LAN887X_INIT_COEFF_DFE1_100, 0x000f},
  1119. };
  1120. ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
  1121. } else {
  1122. static const struct lan887x_regwr_map phy_cfg[] = {
  1123. {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x0038},
  1124. {MDIO_MMD_VEND1, LAN887X_INIT_COEFF_DFE1_100, 0x0014},
  1125. };
  1126. ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
  1127. }
  1128. if (ret < 0)
  1129. return ret;
  1130. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26,
  1131. LAN887X_REG_REG26_HW_INIT_SEQ_EN);
  1132. }
  1133. static int lan887x_1000M_setup(struct phy_device *phydev)
  1134. {
  1135. static const struct lan887x_regwr_map phy_cfg[] = {
  1136. {MDIO_MMD_PMAPMD, LAN887X_TX_AMPLT_1000T1_REG, 0x003f},
  1137. {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x00b8},
  1138. };
  1139. int ret;
  1140. /* (Re)configure the speed/mode dependent T1 settings */
  1141. ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
  1142. if (ret < 0)
  1143. return ret;
  1144. return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, LAN887X_DSP_PMA_CONTROL,
  1145. LAN887X_DSP_PMA_CONTROL_LNK_SYNC);
  1146. }
  1147. static int lan887x_link_setup(struct phy_device *phydev)
  1148. {
  1149. int ret = -EINVAL;
  1150. if (phydev->speed == SPEED_1000)
  1151. ret = lan887x_1000M_setup(phydev);
  1152. else if (phydev->speed == SPEED_100)
  1153. ret = lan887x_100M_setup(phydev);
  1154. return ret;
  1155. }
  1156. /* LAN887x Errata: speed configuration changes require soft reset
  1157. * and chip soft reset
  1158. */
  1159. static int lan887x_phy_reset(struct phy_device *phydev)
  1160. {
  1161. int ret, val;
  1162. /* Clear 1000M link sync */
  1163. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, LAN887X_DSP_PMA_CONTROL,
  1164. LAN887X_DSP_PMA_CONTROL_LNK_SYNC);
  1165. if (ret < 0)
  1166. return ret;
  1167. /* Clear 100M link sync */
  1168. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26,
  1169. LAN887X_REG_REG26_HW_INIT_SEQ_EN);
  1170. if (ret < 0)
  1171. return ret;
  1172. /* Chiptop soft-reset to allow the speed/mode change */
  1173. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_CHIP_SOFT_RST,
  1174. LAN887X_CHIP_SOFT_RST_RESET);
  1175. if (ret < 0)
  1176. return ret;
  1177. /* CL22 soft-reset to let the link re-train */
  1178. ret = phy_modify(phydev, MII_BMCR, BMCR_RESET, BMCR_RESET);
  1179. if (ret < 0)
  1180. return ret;
  1181. /* Wait for reset complete or timeout if > 10ms */
  1182. return phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET),
  1183. 5000, 10000, true);
  1184. }
  1185. static int lan887x_phy_reconfig(struct phy_device *phydev)
  1186. {
  1187. int ret;
  1188. linkmode_zero(phydev->advertising);
  1189. ret = genphy_c45_pma_setup_forced(phydev);
  1190. if (ret < 0)
  1191. return ret;
  1192. return lan887x_link_setup(phydev);
  1193. }
  1194. static int lan887x_config_aneg(struct phy_device *phydev)
  1195. {
  1196. int ret;
  1197. /* LAN887x Errata: speed configuration changes require soft reset
  1198. * and chip soft reset
  1199. */
  1200. ret = lan887x_phy_reset(phydev);
  1201. if (ret < 0)
  1202. return ret;
  1203. return lan887x_phy_reconfig(phydev);
  1204. }
  1205. static int lan887x_probe(struct phy_device *phydev)
  1206. {
  1207. struct lan887x_priv *priv;
  1208. priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
  1209. if (!priv)
  1210. return -ENOMEM;
  1211. phydev->priv = priv;
  1212. return lan887x_phy_setup(phydev);
  1213. }
  1214. static u64 lan887x_get_stat(struct phy_device *phydev, int i)
  1215. {
  1216. struct lan887x_hw_stat stat = lan887x_hw_stats[i];
  1217. struct lan887x_priv *priv = phydev->priv;
  1218. int val;
  1219. u64 ret;
  1220. if (stat.mmd)
  1221. val = phy_read_mmd(phydev, stat.mmd, stat.reg);
  1222. else
  1223. val = phy_read(phydev, stat.reg);
  1224. if (val < 0) {
  1225. ret = U64_MAX;
  1226. } else {
  1227. val = val & ((1 << stat.bits) - 1);
  1228. priv->stats[i] += val;
  1229. ret = priv->stats[i];
  1230. }
  1231. return ret;
  1232. }
  1233. static void lan887x_get_stats(struct phy_device *phydev,
  1234. struct ethtool_stats *stats, u64 *data)
  1235. {
  1236. for (int i = 0; i < ARRAY_SIZE(lan887x_hw_stats); i++)
  1237. data[i] = lan887x_get_stat(phydev, i);
  1238. }
  1239. static int lan887x_get_sset_count(struct phy_device *phydev)
  1240. {
  1241. return ARRAY_SIZE(lan887x_hw_stats);
  1242. }
  1243. static void lan887x_get_strings(struct phy_device *phydev, u8 *data)
  1244. {
  1245. for (int i = 0; i < ARRAY_SIZE(lan887x_hw_stats); i++)
  1246. ethtool_puts(&data, lan887x_hw_stats[i].string);
  1247. }
  1248. static int lan887x_cd_reset(struct phy_device *phydev,
  1249. enum cable_diag_state cd_done)
  1250. {
  1251. u16 val;
  1252. int rc;
  1253. /* Chip hard-reset */
  1254. rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_CHIP_HARD_RST,
  1255. LAN887X_CHIP_HARD_RST_RESET);
  1256. if (rc < 0)
  1257. return rc;
  1258. /* Wait for reset to complete */
  1259. rc = phy_read_poll_timeout(phydev, MII_PHYSID2, val,
  1260. ((val & GENMASK(15, 4)) ==
  1261. (PHY_ID_LAN887X & GENMASK(15, 4))),
  1262. 5000, 50000, true);
  1263. if (rc < 0)
  1264. return rc;
  1265. if (cd_done == CD_TEST_DONE) {
  1266. /* Cable diagnostics complete. Restore PHY. */
  1267. rc = lan887x_phy_setup(phydev);
  1268. if (rc < 0)
  1269. return rc;
  1270. rc = lan887x_phy_init(phydev);
  1271. if (rc < 0)
  1272. return rc;
  1273. rc = lan887x_phy_reconfig(phydev);
  1274. if (rc < 0)
  1275. return rc;
  1276. }
  1277. return 0;
  1278. }
  1279. static int lan887x_cable_test_prep(struct phy_device *phydev,
  1280. enum cable_diag_mode mode)
  1281. {
  1282. static const struct lan887x_regwr_map values[] = {
  1283. {MDIO_MMD_VEND1, LAN887X_MAX_PGA_GAIN_100, 0x1f},
  1284. {MDIO_MMD_VEND1, LAN887X_MIN_PGA_GAIN_100, 0x0},
  1285. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_TDR_THRESH_100, 0x1},
  1286. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_AGC_THRESH_100, 0x3c},
  1287. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_MIN_WAIT_CONFIG_100, 0x0},
  1288. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_MAX_WAIT_CONFIG_100, 0x46},
  1289. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_CYC_CONFIG_100, 0x5a},
  1290. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_TX_PULSE_CONFIG_100, 0x44d5},
  1291. {MDIO_MMD_VEND1, LAN887X_CBL_DIAG_MIN_PGA_GAIN_100, 0x0},
  1292. };
  1293. int rc;
  1294. rc = lan887x_cd_reset(phydev, CD_TEST_INIT);
  1295. if (rc < 0)
  1296. return rc;
  1297. /* Forcing DUT to master mode, as we don't care about
  1298. * mode during diagnostics
  1299. */
  1300. rc = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL,
  1301. MDIO_PMA_PMD_BT1_CTRL_CFG_MST);
  1302. if (rc < 0)
  1303. return rc;
  1304. rc = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, 0x80b0, 0x0038);
  1305. if (rc < 0)
  1306. return rc;
  1307. rc = phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  1308. LAN887X_CALIB_CONFIG_100, 0,
  1309. LAN887X_CALIB_CONFIG_100_VAL);
  1310. if (rc < 0)
  1311. return rc;
  1312. for (int i = 0; i < ARRAY_SIZE(values); i++) {
  1313. rc = phy_write_mmd(phydev, values[i].mmd, values[i].reg,
  1314. values[i].val);
  1315. if (rc < 0)
  1316. return rc;
  1317. if (mode &&
  1318. values[i].reg == LAN887X_CBL_DIAG_MAX_WAIT_CONFIG_100) {
  1319. rc = phy_write_mmd(phydev, values[i].mmd,
  1320. values[i].reg, 0xa);
  1321. if (rc < 0)
  1322. return rc;
  1323. }
  1324. }
  1325. if (mode == TEST_MODE_HYBRID) {
  1326. rc = phy_modify_mmd(phydev, MDIO_MMD_PMAPMD,
  1327. LAN887X_AFE_PORT_TESTBUS_CTRL4,
  1328. BIT(0), BIT(0));
  1329. if (rc < 0)
  1330. return rc;
  1331. }
  1332. /* HW_INIT 100T1, Get DUT running in 100T1 mode */
  1333. rc = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26,
  1334. LAN887X_REG_REG26_HW_INIT_SEQ_EN,
  1335. LAN887X_REG_REG26_HW_INIT_SEQ_EN);
  1336. if (rc < 0)
  1337. return rc;
  1338. /* Cable diag requires hard reset and is sensitive regarding the delays.
  1339. * Hard reset is expected into and out of cable diag.
  1340. * Wait for 50ms
  1341. */
  1342. msleep(50);
  1343. /* Start cable diag */
  1344. return phy_write_mmd(phydev, MDIO_MMD_VEND1,
  1345. LAN887X_START_CBL_DIAG_100,
  1346. LAN887X_CBL_DIAG_START);
  1347. }
  1348. static int lan887x_cable_test_chk(struct phy_device *phydev,
  1349. enum cable_diag_mode mode)
  1350. {
  1351. int val;
  1352. int rc;
  1353. if (mode == TEST_MODE_HYBRID) {
  1354. /* Cable diag requires hard reset and is sensitive regarding the delays.
  1355. * Hard reset is expected into and out of cable diag.
  1356. * Wait for cable diag to complete.
  1357. * Minimum wait time is 50ms if the condition is not a match.
  1358. */
  1359. rc = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  1360. LAN887X_START_CBL_DIAG_100, val,
  1361. ((val & LAN887X_CBL_DIAG_DONE) ==
  1362. LAN887X_CBL_DIAG_DONE),
  1363. 50000, 500000, false);
  1364. if (rc < 0)
  1365. return rc;
  1366. } else {
  1367. rc = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1368. LAN887X_START_CBL_DIAG_100);
  1369. if (rc < 0)
  1370. return rc;
  1371. if ((rc & LAN887X_CBL_DIAG_DONE) != LAN887X_CBL_DIAG_DONE)
  1372. return -EAGAIN;
  1373. }
  1374. /* Stop cable diag */
  1375. return phy_write_mmd(phydev, MDIO_MMD_VEND1,
  1376. LAN887X_START_CBL_DIAG_100,
  1377. LAN887X_CBL_DIAG_STOP);
  1378. }
  1379. static int lan887x_cable_test_start(struct phy_device *phydev)
  1380. {
  1381. int rc, ret;
  1382. rc = lan887x_cable_test_prep(phydev, TEST_MODE_NORMAL);
  1383. if (rc < 0) {
  1384. ret = lan887x_cd_reset(phydev, CD_TEST_DONE);
  1385. if (ret < 0)
  1386. return ret;
  1387. return rc;
  1388. }
  1389. return 0;
  1390. }
  1391. static int lan887x_cable_test_report(struct phy_device *phydev)
  1392. {
  1393. int pos_peak_cycle, pos_peak_cycle_hybrid, pos_peak_in_phases;
  1394. int pos_peak_time, pos_peak_time_hybrid, neg_peak_time;
  1395. int neg_peak_cycle, neg_peak_in_phases;
  1396. int pos_peak_in_phases_hybrid;
  1397. int gain_idx, gain_idx_hybrid;
  1398. int pos_peak_phase_hybrid;
  1399. int pos_peak, neg_peak;
  1400. int distance;
  1401. int detect;
  1402. int length;
  1403. int ret;
  1404. int rc;
  1405. /* Read non-hybrid results */
  1406. gain_idx = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1407. LAN887X_CBL_DIAG_AGC_GAIN_100);
  1408. if (gain_idx < 0) {
  1409. rc = gain_idx;
  1410. goto error;
  1411. }
  1412. pos_peak = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1413. LAN887X_CBL_DIAG_POS_PEAK_VALUE_100);
  1414. if (pos_peak < 0) {
  1415. rc = pos_peak;
  1416. goto error;
  1417. }
  1418. neg_peak = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1419. LAN887X_CBL_DIAG_NEG_PEAK_VALUE_100);
  1420. if (neg_peak < 0) {
  1421. rc = neg_peak;
  1422. goto error;
  1423. }
  1424. pos_peak_time = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1425. LAN887X_CBL_DIAG_POS_PEAK_TIME_100);
  1426. if (pos_peak_time < 0) {
  1427. rc = pos_peak_time;
  1428. goto error;
  1429. }
  1430. neg_peak_time = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1431. LAN887X_CBL_DIAG_NEG_PEAK_TIME_100);
  1432. if (neg_peak_time < 0) {
  1433. rc = neg_peak_time;
  1434. goto error;
  1435. }
  1436. /* Calculate non-hybrid values */
  1437. pos_peak_cycle = (pos_peak_time >> 7) & 0x7f;
  1438. pos_peak_in_phases = (pos_peak_cycle * 96) + (pos_peak_time & 0x7f);
  1439. neg_peak_cycle = (neg_peak_time >> 7) & 0x7f;
  1440. neg_peak_in_phases = (neg_peak_cycle * 96) + (neg_peak_time & 0x7f);
  1441. /* Deriving the status of cable */
  1442. if (pos_peak > MICROCHIP_CABLE_NOISE_MARGIN &&
  1443. neg_peak > MICROCHIP_CABLE_NOISE_MARGIN && gain_idx >= 0) {
  1444. if (pos_peak_in_phases > neg_peak_in_phases &&
  1445. ((pos_peak_in_phases - neg_peak_in_phases) >=
  1446. MICROCHIP_CABLE_MIN_TIME_DIFF) &&
  1447. ((pos_peak_in_phases - neg_peak_in_phases) <
  1448. MICROCHIP_CABLE_MAX_TIME_DIFF) &&
  1449. pos_peak_in_phases > 0) {
  1450. detect = LAN87XX_CABLE_TEST_SAME_SHORT;
  1451. } else if (neg_peak_in_phases > pos_peak_in_phases &&
  1452. ((neg_peak_in_phases - pos_peak_in_phases) >=
  1453. MICROCHIP_CABLE_MIN_TIME_DIFF) &&
  1454. ((neg_peak_in_phases - pos_peak_in_phases) <
  1455. MICROCHIP_CABLE_MAX_TIME_DIFF) &&
  1456. neg_peak_in_phases > 0) {
  1457. detect = LAN87XX_CABLE_TEST_OPEN;
  1458. } else {
  1459. detect = LAN87XX_CABLE_TEST_OK;
  1460. }
  1461. } else {
  1462. detect = LAN87XX_CABLE_TEST_OK;
  1463. }
  1464. if (detect == LAN87XX_CABLE_TEST_OK) {
  1465. distance = 0;
  1466. goto get_len;
  1467. }
  1468. /* Re-initialize PHY and start cable diag test */
  1469. rc = lan887x_cable_test_prep(phydev, TEST_MODE_HYBRID);
  1470. if (rc < 0)
  1471. goto cd_stop;
  1472. /* Wait for cable diag test completion */
  1473. rc = lan887x_cable_test_chk(phydev, TEST_MODE_HYBRID);
  1474. if (rc < 0)
  1475. goto cd_stop;
  1476. /* Read hybrid results */
  1477. gain_idx_hybrid = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1478. LAN887X_CBL_DIAG_AGC_GAIN_100);
  1479. if (gain_idx_hybrid < 0) {
  1480. rc = gain_idx_hybrid;
  1481. goto error;
  1482. }
  1483. pos_peak_time_hybrid = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  1484. LAN887X_CBL_DIAG_POS_PEAK_TIME_100);
  1485. if (pos_peak_time_hybrid < 0) {
  1486. rc = pos_peak_time_hybrid;
  1487. goto error;
  1488. }
  1489. /* Calculate hybrid values to derive cable length to fault */
  1490. pos_peak_cycle_hybrid = (pos_peak_time_hybrid >> 7) & 0x7f;
  1491. pos_peak_phase_hybrid = pos_peak_time_hybrid & 0x7f;
  1492. pos_peak_in_phases_hybrid = pos_peak_cycle_hybrid * 96 +
  1493. pos_peak_phase_hybrid;
  1494. /* Distance to fault calculation.
  1495. * distance = (peak_in_phases - peak_in_phases_hybrid) *
  1496. * propagationconstant.
  1497. * constant to convert number of phases to meters
  1498. * propagationconstant = 0.015953
  1499. * (0.6811 * 2.9979 * 156.2499 * 0.0001 * 0.5)
  1500. * Applying constant 1.5953 as ethtool further devides by 100 to
  1501. * convert to meters.
  1502. */
  1503. if (detect == LAN87XX_CABLE_TEST_OPEN) {
  1504. distance = (((pos_peak_in_phases - pos_peak_in_phases_hybrid)
  1505. * 15953) / 10000);
  1506. } else if (detect == LAN87XX_CABLE_TEST_SAME_SHORT) {
  1507. distance = (((neg_peak_in_phases - pos_peak_in_phases_hybrid)
  1508. * 15953) / 10000);
  1509. } else {
  1510. distance = 0;
  1511. }
  1512. get_len:
  1513. rc = lan887x_cd_reset(phydev, CD_TEST_DONE);
  1514. if (rc < 0)
  1515. return rc;
  1516. length = ((u32)distance & GENMASK(15, 0));
  1517. ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A,
  1518. lan87xx_cable_test_report_trans(detect));
  1519. ethnl_cable_test_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_A, length);
  1520. return 0;
  1521. cd_stop:
  1522. /* Stop cable diag */
  1523. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1,
  1524. LAN887X_START_CBL_DIAG_100,
  1525. LAN887X_CBL_DIAG_STOP);
  1526. if (ret < 0)
  1527. return ret;
  1528. error:
  1529. /* Cable diag test failed */
  1530. ret = lan887x_cd_reset(phydev, CD_TEST_DONE);
  1531. if (ret < 0)
  1532. return ret;
  1533. /* Return error in failure case */
  1534. return rc;
  1535. }
  1536. static int lan887x_cable_test_get_status(struct phy_device *phydev,
  1537. bool *finished)
  1538. {
  1539. int rc;
  1540. rc = lan887x_cable_test_chk(phydev, TEST_MODE_NORMAL);
  1541. if (rc < 0) {
  1542. /* Let PHY statemachine poll again */
  1543. if (rc == -EAGAIN)
  1544. return 0;
  1545. return rc;
  1546. }
  1547. /* Cable diag test complete */
  1548. *finished = true;
  1549. /* Retrieve test status and cable length to fault */
  1550. return lan887x_cable_test_report(phydev);
  1551. }
  1552. static struct phy_driver microchip_t1_phy_driver[] = {
  1553. {
  1554. PHY_ID_MATCH_MODEL(PHY_ID_LAN87XX),
  1555. .name = "Microchip LAN87xx T1",
  1556. .flags = PHY_POLL_CABLE_TEST,
  1557. .features = PHY_BASIC_T1_FEATURES,
  1558. .config_init = lan87xx_config_init,
  1559. .config_intr = lan87xx_phy_config_intr,
  1560. .handle_interrupt = lan87xx_handle_interrupt,
  1561. .suspend = genphy_suspend,
  1562. .resume = genphy_resume,
  1563. .config_aneg = lan87xx_config_aneg,
  1564. .read_status = lan87xx_read_status,
  1565. .get_sqi = lan87xx_get_sqi,
  1566. .get_sqi_max = lan87xx_get_sqi_max,
  1567. .cable_test_start = lan87xx_cable_test_start,
  1568. .cable_test_get_status = lan87xx_cable_test_get_status,
  1569. },
  1570. {
  1571. PHY_ID_MATCH_MODEL(PHY_ID_LAN937X),
  1572. .name = "Microchip LAN937x T1",
  1573. .flags = PHY_POLL_CABLE_TEST,
  1574. .features = PHY_BASIC_T1_FEATURES,
  1575. .config_init = lan87xx_config_init,
  1576. .config_intr = lan87xx_phy_config_intr,
  1577. .handle_interrupt = lan87xx_handle_interrupt,
  1578. .suspend = genphy_suspend,
  1579. .resume = genphy_resume,
  1580. .config_aneg = lan87xx_config_aneg,
  1581. .read_status = lan87xx_read_status,
  1582. .get_sqi = lan87xx_get_sqi,
  1583. .get_sqi_max = lan87xx_get_sqi_max,
  1584. .cable_test_start = lan87xx_cable_test_start,
  1585. .cable_test_get_status = lan87xx_cable_test_get_status,
  1586. },
  1587. {
  1588. PHY_ID_MATCH_MODEL(PHY_ID_LAN887X),
  1589. .name = "Microchip LAN887x T1 PHY",
  1590. .flags = PHY_POLL_CABLE_TEST,
  1591. .probe = lan887x_probe,
  1592. .get_features = lan887x_get_features,
  1593. .config_init = lan887x_phy_init,
  1594. .config_aneg = lan887x_config_aneg,
  1595. .get_stats = lan887x_get_stats,
  1596. .get_sset_count = lan887x_get_sset_count,
  1597. .get_strings = lan887x_get_strings,
  1598. .suspend = genphy_suspend,
  1599. .resume = genphy_resume,
  1600. .read_status = genphy_c45_read_status,
  1601. .cable_test_start = lan887x_cable_test_start,
  1602. .cable_test_get_status = lan887x_cable_test_get_status,
  1603. }
  1604. };
  1605. module_phy_driver(microchip_t1_phy_driver);
  1606. static struct mdio_device_id __maybe_unused microchip_t1_tbl[] = {
  1607. { PHY_ID_MATCH_MODEL(PHY_ID_LAN87XX) },
  1608. { PHY_ID_MATCH_MODEL(PHY_ID_LAN937X) },
  1609. { PHY_ID_MATCH_MODEL(PHY_ID_LAN887X) },
  1610. { }
  1611. };
  1612. MODULE_DEVICE_TABLE(mdio, microchip_t1_tbl);
  1613. MODULE_AUTHOR(DRIVER_AUTHOR);
  1614. MODULE_DESCRIPTION(DRIVER_DESC);
  1615. MODULE_LICENSE("GPL");