microchip_t1.c 59 KB

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