mscc.c 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518
  1. // SPDX-License-Identifier: (GPL-2.0 OR MIT)
  2. /*
  3. * Driver for Microsemi VSC85xx PHYs
  4. *
  5. * Author: Nagaraju Lakkaraju
  6. * License: Dual MIT/GPL
  7. * Copyright (c) 2016 Microsemi Corporation
  8. */
  9. #include <linux/firmware.h>
  10. #include <linux/jiffies.h>
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/mdio.h>
  14. #include <linux/mii.h>
  15. #include <linux/phy.h>
  16. #include <linux/of.h>
  17. #include <linux/netdevice.h>
  18. #include <dt-bindings/net/mscc-phy-vsc8531.h>
  19. enum rgmii_rx_clock_delay {
  20. RGMII_RX_CLK_DELAY_0_2_NS = 0,
  21. RGMII_RX_CLK_DELAY_0_8_NS = 1,
  22. RGMII_RX_CLK_DELAY_1_1_NS = 2,
  23. RGMII_RX_CLK_DELAY_1_7_NS = 3,
  24. RGMII_RX_CLK_DELAY_2_0_NS = 4,
  25. RGMII_RX_CLK_DELAY_2_3_NS = 5,
  26. RGMII_RX_CLK_DELAY_2_6_NS = 6,
  27. RGMII_RX_CLK_DELAY_3_4_NS = 7
  28. };
  29. /* Microsemi VSC85xx PHY registers */
  30. /* IEEE 802. Std Registers */
  31. #define MSCC_PHY_BYPASS_CONTROL 18
  32. #define DISABLE_HP_AUTO_MDIX_MASK 0x0080
  33. #define DISABLE_PAIR_SWAP_CORR_MASK 0x0020
  34. #define DISABLE_POLARITY_CORR_MASK 0x0010
  35. #define PARALLEL_DET_IGNORE_ADVERTISED 0x0008
  36. #define MSCC_PHY_EXT_CNTL_STATUS 22
  37. #define SMI_BROADCAST_WR_EN 0x0001
  38. #define MSCC_PHY_ERR_RX_CNT 19
  39. #define MSCC_PHY_ERR_FALSE_CARRIER_CNT 20
  40. #define MSCC_PHY_ERR_LINK_DISCONNECT_CNT 21
  41. #define ERR_CNT_MASK GENMASK(7, 0)
  42. #define MSCC_PHY_EXT_PHY_CNTL_1 23
  43. #define MAC_IF_SELECTION_MASK 0x1800
  44. #define MAC_IF_SELECTION_GMII 0
  45. #define MAC_IF_SELECTION_RMII 1
  46. #define MAC_IF_SELECTION_RGMII 2
  47. #define MAC_IF_SELECTION_POS 11
  48. #define VSC8584_MAC_IF_SELECTION_MASK 0x1000
  49. #define VSC8584_MAC_IF_SELECTION_SGMII 0
  50. #define VSC8584_MAC_IF_SELECTION_1000BASEX 1
  51. #define VSC8584_MAC_IF_SELECTION_POS 12
  52. #define FAR_END_LOOPBACK_MODE_MASK 0x0008
  53. #define MEDIA_OP_MODE_MASK 0x0700
  54. #define MEDIA_OP_MODE_COPPER 0
  55. #define MEDIA_OP_MODE_SERDES 1
  56. #define MEDIA_OP_MODE_1000BASEX 2
  57. #define MEDIA_OP_MODE_100BASEFX 3
  58. #define MEDIA_OP_MODE_AMS_COPPER_SERDES 5
  59. #define MEDIA_OP_MODE_AMS_COPPER_1000BASEX 6
  60. #define MEDIA_OP_MODE_AMS_COPPER_100BASEFX 7
  61. #define MEDIA_OP_MODE_POS 8
  62. #define MSCC_PHY_EXT_PHY_CNTL_2 24
  63. #define MII_VSC85XX_INT_MASK 25
  64. #define MII_VSC85XX_INT_MASK_MASK 0xa000
  65. #define MII_VSC85XX_INT_MASK_WOL 0x0040
  66. #define MII_VSC85XX_INT_STATUS 26
  67. #define MSCC_PHY_WOL_MAC_CONTROL 27
  68. #define EDGE_RATE_CNTL_POS 5
  69. #define EDGE_RATE_CNTL_MASK 0x00E0
  70. #define MSCC_PHY_DEV_AUX_CNTL 28
  71. #define HP_AUTO_MDIX_X_OVER_IND_MASK 0x2000
  72. #define MSCC_PHY_LED_MODE_SEL 29
  73. #define LED_MODE_SEL_POS(x) ((x) * 4)
  74. #define LED_MODE_SEL_MASK(x) (GENMASK(3, 0) << LED_MODE_SEL_POS(x))
  75. #define LED_MODE_SEL(x, mode) (((mode) << LED_MODE_SEL_POS(x)) & LED_MODE_SEL_MASK(x))
  76. #define MSCC_EXT_PAGE_CSR_CNTL_17 17
  77. #define MSCC_EXT_PAGE_CSR_CNTL_18 18
  78. #define MSCC_EXT_PAGE_CSR_CNTL_19 19
  79. #define MSCC_PHY_CSR_CNTL_19_REG_ADDR(x) (x)
  80. #define MSCC_PHY_CSR_CNTL_19_TARGET(x) ((x) << 12)
  81. #define MSCC_PHY_CSR_CNTL_19_READ BIT(14)
  82. #define MSCC_PHY_CSR_CNTL_19_CMD BIT(15)
  83. #define MSCC_EXT_PAGE_CSR_CNTL_20 20
  84. #define MSCC_PHY_CSR_CNTL_20_TARGET(x) (x)
  85. #define PHY_MCB_TARGET 0x07
  86. #define PHY_MCB_S6G_WRITE BIT(31)
  87. #define PHY_MCB_S6G_READ BIT(30)
  88. #define PHY_S6G_PLL5G_CFG0 0x06
  89. #define PHY_S6G_LCPLL_CFG 0x11
  90. #define PHY_S6G_PLL_CFG 0x2b
  91. #define PHY_S6G_COMMON_CFG 0x2c
  92. #define PHY_S6G_GPC_CFG 0x2e
  93. #define PHY_S6G_MISC_CFG 0x3b
  94. #define PHY_MCB_S6G_CFG 0x3f
  95. #define PHY_S6G_DFT_CFG2 0x3e
  96. #define PHY_S6G_PLL_STATUS 0x31
  97. #define PHY_S6G_IB_STATUS0 0x2f
  98. #define PHY_S6G_SYS_RST_POS 31
  99. #define PHY_S6G_ENA_LANE_POS 18
  100. #define PHY_S6G_ENA_LOOP_POS 8
  101. #define PHY_S6G_QRATE_POS 6
  102. #define PHY_S6G_IF_MODE_POS 4
  103. #define PHY_S6G_PLL_ENA_OFFS_POS 21
  104. #define PHY_S6G_PLL_FSM_CTRL_DATA_POS 8
  105. #define PHY_S6G_PLL_FSM_ENA_POS 7
  106. #define MSCC_EXT_PAGE_ACCESS 31
  107. #define MSCC_PHY_PAGE_STANDARD 0x0000 /* Standard registers */
  108. #define MSCC_PHY_PAGE_EXTENDED 0x0001 /* Extended registers */
  109. #define MSCC_PHY_PAGE_EXTENDED_2 0x0002 /* Extended reg - page 2 */
  110. #define MSCC_PHY_PAGE_EXTENDED_3 0x0003 /* Extended reg - page 3 */
  111. #define MSCC_PHY_PAGE_EXTENDED_4 0x0004 /* Extended reg - page 4 */
  112. #define MSCC_PHY_PAGE_CSR_CNTL MSCC_PHY_PAGE_EXTENDED_4
  113. /* Extended reg - GPIO; this is a bank of registers that are shared for all PHYs
  114. * in the same package.
  115. */
  116. #define MSCC_PHY_PAGE_EXTENDED_GPIO 0x0010 /* Extended reg - GPIO */
  117. #define MSCC_PHY_PAGE_TEST 0x2a30 /* Test reg */
  118. #define MSCC_PHY_PAGE_TR 0x52b5 /* Token ring registers */
  119. /* Extended Page 1 Registers */
  120. #define MSCC_PHY_CU_MEDIA_CRC_VALID_CNT 18
  121. #define VALID_CRC_CNT_CRC_MASK GENMASK(13, 0)
  122. #define MSCC_PHY_EXT_MODE_CNTL 19
  123. #define FORCE_MDI_CROSSOVER_MASK 0x000C
  124. #define FORCE_MDI_CROSSOVER_MDIX 0x000C
  125. #define FORCE_MDI_CROSSOVER_MDI 0x0008
  126. #define MSCC_PHY_ACTIPHY_CNTL 20
  127. #define PHY_ADDR_REVERSED 0x0200
  128. #define DOWNSHIFT_CNTL_MASK 0x001C
  129. #define DOWNSHIFT_EN 0x0010
  130. #define DOWNSHIFT_CNTL_POS 2
  131. #define MSCC_PHY_EXT_PHY_CNTL_4 23
  132. #define PHY_CNTL_4_ADDR_POS 11
  133. #define MSCC_PHY_VERIPHY_CNTL_2 25
  134. #define MSCC_PHY_VERIPHY_CNTL_3 26
  135. /* Extended Page 2 Registers */
  136. #define MSCC_PHY_CU_PMD_TX_CNTL 16
  137. #define MSCC_PHY_RGMII_CNTL 20
  138. #define RGMII_RX_CLK_DELAY_MASK 0x0070
  139. #define RGMII_RX_CLK_DELAY_POS 4
  140. #define MSCC_PHY_WOL_LOWER_MAC_ADDR 21
  141. #define MSCC_PHY_WOL_MID_MAC_ADDR 22
  142. #define MSCC_PHY_WOL_UPPER_MAC_ADDR 23
  143. #define MSCC_PHY_WOL_LOWER_PASSWD 24
  144. #define MSCC_PHY_WOL_MID_PASSWD 25
  145. #define MSCC_PHY_WOL_UPPER_PASSWD 26
  146. #define MSCC_PHY_WOL_MAC_CONTROL 27
  147. #define SECURE_ON_ENABLE 0x8000
  148. #define SECURE_ON_PASSWD_LEN_4 0x4000
  149. /* Extended Page 3 Registers */
  150. #define MSCC_PHY_SERDES_TX_VALID_CNT 21
  151. #define MSCC_PHY_SERDES_TX_CRC_ERR_CNT 22
  152. #define MSCC_PHY_SERDES_RX_VALID_CNT 28
  153. #define MSCC_PHY_SERDES_RX_CRC_ERR_CNT 29
  154. /* Extended page GPIO Registers */
  155. #define MSCC_DW8051_CNTL_STATUS 0
  156. #define MICRO_NSOFT_RESET 0x8000
  157. #define RUN_FROM_INT_ROM 0x4000
  158. #define AUTOINC_ADDR 0x2000
  159. #define PATCH_RAM_CLK 0x1000
  160. #define MICRO_PATCH_EN 0x0080
  161. #define DW8051_CLK_EN 0x0010
  162. #define MICRO_CLK_EN 0x0008
  163. #define MICRO_CLK_DIVIDE(x) ((x) >> 1)
  164. #define MSCC_DW8051_VLD_MASK 0xf1ff
  165. /* x Address in range 1-4 */
  166. #define MSCC_TRAP_ROM_ADDR(x) ((x) * 2 + 1)
  167. #define MSCC_PATCH_RAM_ADDR(x) (((x) + 1) * 2)
  168. #define MSCC_INT_MEM_ADDR 11
  169. #define MSCC_INT_MEM_CNTL 12
  170. #define READ_SFR 0x6000
  171. #define READ_PRAM 0x4000
  172. #define READ_ROM 0x2000
  173. #define READ_RAM 0x0000
  174. #define INT_MEM_WRITE_EN 0x1000
  175. #define EN_PATCH_RAM_TRAP_ADDR(x) (0x0100 << ((x) - 1))
  176. #define INT_MEM_DATA_M 0x00ff
  177. #define INT_MEM_DATA(x) (INT_MEM_DATA_M & (x))
  178. #define MSCC_PHY_PROC_CMD 18
  179. #define PROC_CMD_NCOMPLETED 0x8000
  180. #define PROC_CMD_FAILED 0x4000
  181. #define PROC_CMD_SGMII_PORT(x) ((x) << 8)
  182. #define PROC_CMD_FIBER_PORT(x) (0x0100 << (x) % 4)
  183. #define PROC_CMD_QSGMII_PORT 0x0c00
  184. #define PROC_CMD_RST_CONF_PORT 0x0080
  185. #define PROC_CMD_RECONF_PORT 0x0000
  186. #define PROC_CMD_READ_MOD_WRITE_PORT 0x0040
  187. #define PROC_CMD_WRITE 0x0040
  188. #define PROC_CMD_READ 0x0000
  189. #define PROC_CMD_FIBER_DISABLE 0x0020
  190. #define PROC_CMD_FIBER_100BASE_FX 0x0010
  191. #define PROC_CMD_FIBER_1000BASE_X 0x0000
  192. #define PROC_CMD_SGMII_MAC 0x0030
  193. #define PROC_CMD_QSGMII_MAC 0x0020
  194. #define PROC_CMD_NO_MAC_CONF 0x0000
  195. #define PROC_CMD_1588_DEFAULT_INIT 0x0010
  196. #define PROC_CMD_NOP 0x000f
  197. #define PROC_CMD_PHY_INIT 0x000a
  198. #define PROC_CMD_CRC16 0x0008
  199. #define PROC_CMD_FIBER_MEDIA_CONF 0x0001
  200. #define PROC_CMD_MCB_ACCESS_MAC_CONF 0x0000
  201. #define PROC_CMD_NCOMPLETED_TIMEOUT_MS 500
  202. #define MSCC_PHY_MAC_CFG_FASTLINK 19
  203. #define MAC_CFG_MASK 0xc000
  204. #define MAC_CFG_SGMII 0x0000
  205. #define MAC_CFG_QSGMII 0x4000
  206. /* Test page Registers */
  207. #define MSCC_PHY_TEST_PAGE_5 5
  208. #define MSCC_PHY_TEST_PAGE_8 8
  209. #define MSCC_PHY_TEST_PAGE_9 9
  210. #define MSCC_PHY_TEST_PAGE_20 20
  211. #define MSCC_PHY_TEST_PAGE_24 24
  212. /* Token ring page Registers */
  213. #define MSCC_PHY_TR_CNTL 16
  214. #define TR_WRITE 0x8000
  215. #define TR_ADDR(x) (0x7fff & (x))
  216. #define MSCC_PHY_TR_LSB 17
  217. #define MSCC_PHY_TR_MSB 18
  218. /* Microsemi PHY ID's */
  219. #define PHY_ID_VSC8514 0x00070670
  220. #define PHY_ID_VSC8530 0x00070560
  221. #define PHY_ID_VSC8531 0x00070570
  222. #define PHY_ID_VSC8540 0x00070760
  223. #define PHY_ID_VSC8541 0x00070770
  224. #define PHY_ID_VSC8574 0x000704a0
  225. #define PHY_ID_VSC8584 0x000707c0
  226. #define MSCC_VDDMAC_1500 1500
  227. #define MSCC_VDDMAC_1800 1800
  228. #define MSCC_VDDMAC_2500 2500
  229. #define MSCC_VDDMAC_3300 3300
  230. #define DOWNSHIFT_COUNT_MAX 5
  231. #define MAX_LEDS 4
  232. #define VSC8584_SUPP_LED_MODES (BIT(VSC8531_LINK_ACTIVITY) | \
  233. BIT(VSC8531_LINK_1000_ACTIVITY) | \
  234. BIT(VSC8531_LINK_100_ACTIVITY) | \
  235. BIT(VSC8531_LINK_10_ACTIVITY) | \
  236. BIT(VSC8531_LINK_100_1000_ACTIVITY) | \
  237. BIT(VSC8531_LINK_10_1000_ACTIVITY) | \
  238. BIT(VSC8531_LINK_10_100_ACTIVITY) | \
  239. BIT(VSC8584_LINK_100FX_1000X_ACTIVITY) | \
  240. BIT(VSC8531_DUPLEX_COLLISION) | \
  241. BIT(VSC8531_COLLISION) | \
  242. BIT(VSC8531_ACTIVITY) | \
  243. BIT(VSC8584_100FX_1000X_ACTIVITY) | \
  244. BIT(VSC8531_AUTONEG_FAULT) | \
  245. BIT(VSC8531_SERIAL_MODE) | \
  246. BIT(VSC8531_FORCE_LED_OFF) | \
  247. BIT(VSC8531_FORCE_LED_ON))
  248. #define VSC85XX_SUPP_LED_MODES (BIT(VSC8531_LINK_ACTIVITY) | \
  249. BIT(VSC8531_LINK_1000_ACTIVITY) | \
  250. BIT(VSC8531_LINK_100_ACTIVITY) | \
  251. BIT(VSC8531_LINK_10_ACTIVITY) | \
  252. BIT(VSC8531_LINK_100_1000_ACTIVITY) | \
  253. BIT(VSC8531_LINK_10_1000_ACTIVITY) | \
  254. BIT(VSC8531_LINK_10_100_ACTIVITY) | \
  255. BIT(VSC8531_DUPLEX_COLLISION) | \
  256. BIT(VSC8531_COLLISION) | \
  257. BIT(VSC8531_ACTIVITY) | \
  258. BIT(VSC8531_AUTONEG_FAULT) | \
  259. BIT(VSC8531_SERIAL_MODE) | \
  260. BIT(VSC8531_FORCE_LED_OFF) | \
  261. BIT(VSC8531_FORCE_LED_ON))
  262. #define MSCC_VSC8584_REVB_INT8051_FW "microchip/mscc_vsc8584_revb_int8051_fb48.bin"
  263. #define MSCC_VSC8584_REVB_INT8051_FW_START_ADDR 0xe800
  264. #define MSCC_VSC8584_REVB_INT8051_FW_CRC 0xfb48
  265. #define MSCC_VSC8574_REVB_INT8051_FW "microchip/mscc_vsc8574_revb_int8051_29e8.bin"
  266. #define MSCC_VSC8574_REVB_INT8051_FW_START_ADDR 0x4000
  267. #define MSCC_VSC8574_REVB_INT8051_FW_CRC 0x29e8
  268. #define VSC8584_REVB 0x0001
  269. #define MSCC_DEV_REV_MASK GENMASK(3, 0)
  270. struct reg_val {
  271. u16 reg;
  272. u32 val;
  273. };
  274. struct vsc85xx_hw_stat {
  275. const char *string;
  276. u8 reg;
  277. u16 page;
  278. u16 mask;
  279. };
  280. static const struct vsc85xx_hw_stat vsc85xx_hw_stats[] = {
  281. {
  282. .string = "phy_receive_errors",
  283. .reg = MSCC_PHY_ERR_RX_CNT,
  284. .page = MSCC_PHY_PAGE_STANDARD,
  285. .mask = ERR_CNT_MASK,
  286. }, {
  287. .string = "phy_false_carrier",
  288. .reg = MSCC_PHY_ERR_FALSE_CARRIER_CNT,
  289. .page = MSCC_PHY_PAGE_STANDARD,
  290. .mask = ERR_CNT_MASK,
  291. }, {
  292. .string = "phy_cu_media_link_disconnect",
  293. .reg = MSCC_PHY_ERR_LINK_DISCONNECT_CNT,
  294. .page = MSCC_PHY_PAGE_STANDARD,
  295. .mask = ERR_CNT_MASK,
  296. }, {
  297. .string = "phy_cu_media_crc_good_count",
  298. .reg = MSCC_PHY_CU_MEDIA_CRC_VALID_CNT,
  299. .page = MSCC_PHY_PAGE_EXTENDED,
  300. .mask = VALID_CRC_CNT_CRC_MASK,
  301. }, {
  302. .string = "phy_cu_media_crc_error_count",
  303. .reg = MSCC_PHY_EXT_PHY_CNTL_4,
  304. .page = MSCC_PHY_PAGE_EXTENDED,
  305. .mask = ERR_CNT_MASK,
  306. },
  307. };
  308. static const struct vsc85xx_hw_stat vsc8584_hw_stats[] = {
  309. {
  310. .string = "phy_receive_errors",
  311. .reg = MSCC_PHY_ERR_RX_CNT,
  312. .page = MSCC_PHY_PAGE_STANDARD,
  313. .mask = ERR_CNT_MASK,
  314. }, {
  315. .string = "phy_false_carrier",
  316. .reg = MSCC_PHY_ERR_FALSE_CARRIER_CNT,
  317. .page = MSCC_PHY_PAGE_STANDARD,
  318. .mask = ERR_CNT_MASK,
  319. }, {
  320. .string = "phy_cu_media_link_disconnect",
  321. .reg = MSCC_PHY_ERR_LINK_DISCONNECT_CNT,
  322. .page = MSCC_PHY_PAGE_STANDARD,
  323. .mask = ERR_CNT_MASK,
  324. }, {
  325. .string = "phy_cu_media_crc_good_count",
  326. .reg = MSCC_PHY_CU_MEDIA_CRC_VALID_CNT,
  327. .page = MSCC_PHY_PAGE_EXTENDED,
  328. .mask = VALID_CRC_CNT_CRC_MASK,
  329. }, {
  330. .string = "phy_cu_media_crc_error_count",
  331. .reg = MSCC_PHY_EXT_PHY_CNTL_4,
  332. .page = MSCC_PHY_PAGE_EXTENDED,
  333. .mask = ERR_CNT_MASK,
  334. }, {
  335. .string = "phy_serdes_tx_good_pkt_count",
  336. .reg = MSCC_PHY_SERDES_TX_VALID_CNT,
  337. .page = MSCC_PHY_PAGE_EXTENDED_3,
  338. .mask = VALID_CRC_CNT_CRC_MASK,
  339. }, {
  340. .string = "phy_serdes_tx_bad_crc_count",
  341. .reg = MSCC_PHY_SERDES_TX_CRC_ERR_CNT,
  342. .page = MSCC_PHY_PAGE_EXTENDED_3,
  343. .mask = ERR_CNT_MASK,
  344. }, {
  345. .string = "phy_serdes_rx_good_pkt_count",
  346. .reg = MSCC_PHY_SERDES_RX_VALID_CNT,
  347. .page = MSCC_PHY_PAGE_EXTENDED_3,
  348. .mask = VALID_CRC_CNT_CRC_MASK,
  349. }, {
  350. .string = "phy_serdes_rx_bad_crc_count",
  351. .reg = MSCC_PHY_SERDES_RX_CRC_ERR_CNT,
  352. .page = MSCC_PHY_PAGE_EXTENDED_3,
  353. .mask = ERR_CNT_MASK,
  354. },
  355. };
  356. struct vsc8531_private {
  357. int rate_magic;
  358. u16 supp_led_modes;
  359. u32 leds_mode[MAX_LEDS];
  360. u8 nleds;
  361. const struct vsc85xx_hw_stat *hw_stats;
  362. u64 *stats;
  363. int nstats;
  364. bool pkg_init;
  365. /* For multiple port PHYs; the MDIO address of the base PHY in the
  366. * package.
  367. */
  368. unsigned int base_addr;
  369. };
  370. #ifdef CONFIG_OF_MDIO
  371. struct vsc8531_edge_rate_table {
  372. u32 vddmac;
  373. u32 slowdown[8];
  374. };
  375. static const struct vsc8531_edge_rate_table edge_table[] = {
  376. {MSCC_VDDMAC_3300, { 0, 2, 4, 7, 10, 17, 29, 53} },
  377. {MSCC_VDDMAC_2500, { 0, 3, 6, 10, 14, 23, 37, 63} },
  378. {MSCC_VDDMAC_1800, { 0, 5, 9, 16, 23, 35, 52, 76} },
  379. {MSCC_VDDMAC_1500, { 0, 6, 14, 21, 29, 42, 58, 77} },
  380. };
  381. #endif /* CONFIG_OF_MDIO */
  382. static int vsc85xx_phy_read_page(struct phy_device *phydev)
  383. {
  384. return __phy_read(phydev, MSCC_EXT_PAGE_ACCESS);
  385. }
  386. static int vsc85xx_phy_write_page(struct phy_device *phydev, int page)
  387. {
  388. return __phy_write(phydev, MSCC_EXT_PAGE_ACCESS, page);
  389. }
  390. static int vsc85xx_get_sset_count(struct phy_device *phydev)
  391. {
  392. struct vsc8531_private *priv = phydev->priv;
  393. if (!priv)
  394. return 0;
  395. return priv->nstats;
  396. }
  397. static void vsc85xx_get_strings(struct phy_device *phydev, u8 *data)
  398. {
  399. struct vsc8531_private *priv = phydev->priv;
  400. int i;
  401. if (!priv)
  402. return;
  403. for (i = 0; i < priv->nstats; i++)
  404. strlcpy(data + i * ETH_GSTRING_LEN, priv->hw_stats[i].string,
  405. ETH_GSTRING_LEN);
  406. }
  407. static u64 vsc85xx_get_stat(struct phy_device *phydev, int i)
  408. {
  409. struct vsc8531_private *priv = phydev->priv;
  410. int val;
  411. val = phy_read_paged(phydev, priv->hw_stats[i].page,
  412. priv->hw_stats[i].reg);
  413. if (val < 0)
  414. return U64_MAX;
  415. val = val & priv->hw_stats[i].mask;
  416. priv->stats[i] += val;
  417. return priv->stats[i];
  418. }
  419. static void vsc85xx_get_stats(struct phy_device *phydev,
  420. struct ethtool_stats *stats, u64 *data)
  421. {
  422. struct vsc8531_private *priv = phydev->priv;
  423. int i;
  424. if (!priv)
  425. return;
  426. for (i = 0; i < priv->nstats; i++)
  427. data[i] = vsc85xx_get_stat(phydev, i);
  428. }
  429. static int vsc85xx_led_cntl_set(struct phy_device *phydev,
  430. u8 led_num,
  431. u8 mode)
  432. {
  433. int rc;
  434. u16 reg_val;
  435. mutex_lock(&phydev->lock);
  436. reg_val = phy_read(phydev, MSCC_PHY_LED_MODE_SEL);
  437. reg_val &= ~LED_MODE_SEL_MASK(led_num);
  438. reg_val |= LED_MODE_SEL(led_num, (u16)mode);
  439. rc = phy_write(phydev, MSCC_PHY_LED_MODE_SEL, reg_val);
  440. mutex_unlock(&phydev->lock);
  441. return rc;
  442. }
  443. static int vsc85xx_mdix_get(struct phy_device *phydev, u8 *mdix)
  444. {
  445. u16 reg_val;
  446. reg_val = phy_read(phydev, MSCC_PHY_DEV_AUX_CNTL);
  447. if (reg_val & HP_AUTO_MDIX_X_OVER_IND_MASK)
  448. *mdix = ETH_TP_MDI_X;
  449. else
  450. *mdix = ETH_TP_MDI;
  451. return 0;
  452. }
  453. static int vsc85xx_mdix_set(struct phy_device *phydev, u8 mdix)
  454. {
  455. int rc;
  456. u16 reg_val;
  457. reg_val = phy_read(phydev, MSCC_PHY_BYPASS_CONTROL);
  458. if (mdix == ETH_TP_MDI || mdix == ETH_TP_MDI_X) {
  459. reg_val |= (DISABLE_PAIR_SWAP_CORR_MASK |
  460. DISABLE_POLARITY_CORR_MASK |
  461. DISABLE_HP_AUTO_MDIX_MASK);
  462. } else {
  463. reg_val &= ~(DISABLE_PAIR_SWAP_CORR_MASK |
  464. DISABLE_POLARITY_CORR_MASK |
  465. DISABLE_HP_AUTO_MDIX_MASK);
  466. }
  467. rc = phy_write(phydev, MSCC_PHY_BYPASS_CONTROL, reg_val);
  468. if (rc)
  469. return rc;
  470. reg_val = 0;
  471. if (mdix == ETH_TP_MDI)
  472. reg_val = FORCE_MDI_CROSSOVER_MDI;
  473. else if (mdix == ETH_TP_MDI_X)
  474. reg_val = FORCE_MDI_CROSSOVER_MDIX;
  475. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED,
  476. MSCC_PHY_EXT_MODE_CNTL, FORCE_MDI_CROSSOVER_MASK,
  477. reg_val);
  478. if (rc < 0)
  479. return rc;
  480. return genphy_restart_aneg(phydev);
  481. }
  482. static int vsc85xx_downshift_get(struct phy_device *phydev, u8 *count)
  483. {
  484. int reg_val;
  485. reg_val = phy_read_paged(phydev, MSCC_PHY_PAGE_EXTENDED,
  486. MSCC_PHY_ACTIPHY_CNTL);
  487. if (reg_val < 0)
  488. return reg_val;
  489. reg_val &= DOWNSHIFT_CNTL_MASK;
  490. if (!(reg_val & DOWNSHIFT_EN))
  491. *count = DOWNSHIFT_DEV_DISABLE;
  492. else
  493. *count = ((reg_val & ~DOWNSHIFT_EN) >> DOWNSHIFT_CNTL_POS) + 2;
  494. return 0;
  495. }
  496. static int vsc85xx_downshift_set(struct phy_device *phydev, u8 count)
  497. {
  498. if (count == DOWNSHIFT_DEV_DEFAULT_COUNT) {
  499. /* Default downshift count 3 (i.e. Bit3:2 = 0b01) */
  500. count = ((1 << DOWNSHIFT_CNTL_POS) | DOWNSHIFT_EN);
  501. } else if (count > DOWNSHIFT_COUNT_MAX || count == 1) {
  502. phydev_err(phydev, "Downshift count should be 2,3,4 or 5\n");
  503. return -ERANGE;
  504. } else if (count) {
  505. /* Downshift count is either 2,3,4 or 5 */
  506. count = (((count - 2) << DOWNSHIFT_CNTL_POS) | DOWNSHIFT_EN);
  507. }
  508. return phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED,
  509. MSCC_PHY_ACTIPHY_CNTL, DOWNSHIFT_CNTL_MASK,
  510. count);
  511. }
  512. static int vsc85xx_wol_set(struct phy_device *phydev,
  513. struct ethtool_wolinfo *wol)
  514. {
  515. int rc;
  516. u16 reg_val;
  517. u8 i;
  518. u16 pwd[3] = {0, 0, 0};
  519. struct ethtool_wolinfo *wol_conf = wol;
  520. u8 *mac_addr = phydev->attached_dev->dev_addr;
  521. mutex_lock(&phydev->lock);
  522. rc = phy_select_page(phydev, MSCC_PHY_PAGE_EXTENDED_2);
  523. if (rc < 0) {
  524. rc = phy_restore_page(phydev, rc, rc);
  525. goto out_unlock;
  526. }
  527. if (wol->wolopts & WAKE_MAGIC) {
  528. /* Store the device address for the magic packet */
  529. for (i = 0; i < ARRAY_SIZE(pwd); i++)
  530. pwd[i] = mac_addr[5 - (i * 2 + 1)] << 8 |
  531. mac_addr[5 - i * 2];
  532. __phy_write(phydev, MSCC_PHY_WOL_LOWER_MAC_ADDR, pwd[0]);
  533. __phy_write(phydev, MSCC_PHY_WOL_MID_MAC_ADDR, pwd[1]);
  534. __phy_write(phydev, MSCC_PHY_WOL_UPPER_MAC_ADDR, pwd[2]);
  535. } else {
  536. __phy_write(phydev, MSCC_PHY_WOL_LOWER_MAC_ADDR, 0);
  537. __phy_write(phydev, MSCC_PHY_WOL_MID_MAC_ADDR, 0);
  538. __phy_write(phydev, MSCC_PHY_WOL_UPPER_MAC_ADDR, 0);
  539. }
  540. if (wol_conf->wolopts & WAKE_MAGICSECURE) {
  541. for (i = 0; i < ARRAY_SIZE(pwd); i++)
  542. pwd[i] = wol_conf->sopass[5 - (i * 2 + 1)] << 8 |
  543. wol_conf->sopass[5 - i * 2];
  544. __phy_write(phydev, MSCC_PHY_WOL_LOWER_PASSWD, pwd[0]);
  545. __phy_write(phydev, MSCC_PHY_WOL_MID_PASSWD, pwd[1]);
  546. __phy_write(phydev, MSCC_PHY_WOL_UPPER_PASSWD, pwd[2]);
  547. } else {
  548. __phy_write(phydev, MSCC_PHY_WOL_LOWER_PASSWD, 0);
  549. __phy_write(phydev, MSCC_PHY_WOL_MID_PASSWD, 0);
  550. __phy_write(phydev, MSCC_PHY_WOL_UPPER_PASSWD, 0);
  551. }
  552. reg_val = __phy_read(phydev, MSCC_PHY_WOL_MAC_CONTROL);
  553. if (wol_conf->wolopts & WAKE_MAGICSECURE)
  554. reg_val |= SECURE_ON_ENABLE;
  555. else
  556. reg_val &= ~SECURE_ON_ENABLE;
  557. __phy_write(phydev, MSCC_PHY_WOL_MAC_CONTROL, reg_val);
  558. rc = phy_restore_page(phydev, rc, rc > 0 ? 0 : rc);
  559. if (rc < 0)
  560. goto out_unlock;
  561. if (wol->wolopts & WAKE_MAGIC) {
  562. /* Enable the WOL interrupt */
  563. reg_val = phy_read(phydev, MII_VSC85XX_INT_MASK);
  564. reg_val |= MII_VSC85XX_INT_MASK_WOL;
  565. rc = phy_write(phydev, MII_VSC85XX_INT_MASK, reg_val);
  566. if (rc)
  567. goto out_unlock;
  568. } else {
  569. /* Disable the WOL interrupt */
  570. reg_val = phy_read(phydev, MII_VSC85XX_INT_MASK);
  571. reg_val &= (~MII_VSC85XX_INT_MASK_WOL);
  572. rc = phy_write(phydev, MII_VSC85XX_INT_MASK, reg_val);
  573. if (rc)
  574. goto out_unlock;
  575. }
  576. /* Clear WOL iterrupt status */
  577. reg_val = phy_read(phydev, MII_VSC85XX_INT_STATUS);
  578. out_unlock:
  579. mutex_unlock(&phydev->lock);
  580. return rc;
  581. }
  582. static void vsc85xx_wol_get(struct phy_device *phydev,
  583. struct ethtool_wolinfo *wol)
  584. {
  585. int rc;
  586. u16 reg_val;
  587. u8 i;
  588. u16 pwd[3] = {0, 0, 0};
  589. struct ethtool_wolinfo *wol_conf = wol;
  590. mutex_lock(&phydev->lock);
  591. rc = phy_select_page(phydev, MSCC_PHY_PAGE_EXTENDED_2);
  592. if (rc < 0)
  593. goto out_unlock;
  594. reg_val = __phy_read(phydev, MSCC_PHY_WOL_MAC_CONTROL);
  595. if (reg_val & SECURE_ON_ENABLE)
  596. wol_conf->wolopts |= WAKE_MAGICSECURE;
  597. if (wol_conf->wolopts & WAKE_MAGICSECURE) {
  598. pwd[0] = __phy_read(phydev, MSCC_PHY_WOL_LOWER_PASSWD);
  599. pwd[1] = __phy_read(phydev, MSCC_PHY_WOL_MID_PASSWD);
  600. pwd[2] = __phy_read(phydev, MSCC_PHY_WOL_UPPER_PASSWD);
  601. for (i = 0; i < ARRAY_SIZE(pwd); i++) {
  602. wol_conf->sopass[5 - i * 2] = pwd[i] & 0x00ff;
  603. wol_conf->sopass[5 - (i * 2 + 1)] = (pwd[i] & 0xff00)
  604. >> 8;
  605. }
  606. }
  607. out_unlock:
  608. phy_restore_page(phydev, rc, rc > 0 ? 0 : rc);
  609. mutex_unlock(&phydev->lock);
  610. }
  611. #ifdef CONFIG_OF_MDIO
  612. static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev)
  613. {
  614. u32 vdd, sd;
  615. int i, j;
  616. struct device *dev = &phydev->mdio.dev;
  617. struct device_node *of_node = dev->of_node;
  618. u8 sd_array_size = ARRAY_SIZE(edge_table[0].slowdown);
  619. if (!of_node)
  620. return -ENODEV;
  621. if (of_property_read_u32(of_node, "vsc8531,vddmac", &vdd))
  622. vdd = MSCC_VDDMAC_3300;
  623. if (of_property_read_u32(of_node, "vsc8531,edge-slowdown", &sd))
  624. sd = 0;
  625. for (i = 0; i < ARRAY_SIZE(edge_table); i++)
  626. if (edge_table[i].vddmac == vdd)
  627. for (j = 0; j < sd_array_size; j++)
  628. if (edge_table[i].slowdown[j] == sd)
  629. return (sd_array_size - j - 1);
  630. return -EINVAL;
  631. }
  632. static int vsc85xx_dt_led_mode_get(struct phy_device *phydev,
  633. char *led,
  634. u32 default_mode)
  635. {
  636. struct vsc8531_private *priv = phydev->priv;
  637. struct device *dev = &phydev->mdio.dev;
  638. struct device_node *of_node = dev->of_node;
  639. u32 led_mode;
  640. int err;
  641. if (!of_node)
  642. return -ENODEV;
  643. led_mode = default_mode;
  644. err = of_property_read_u32(of_node, led, &led_mode);
  645. if (!err && !(BIT(led_mode) & priv->supp_led_modes)) {
  646. phydev_err(phydev, "DT %s invalid\n", led);
  647. return -EINVAL;
  648. }
  649. return led_mode;
  650. }
  651. #else
  652. static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev)
  653. {
  654. return 0;
  655. }
  656. static int vsc85xx_dt_led_mode_get(struct phy_device *phydev,
  657. char *led,
  658. u8 default_mode)
  659. {
  660. return default_mode;
  661. }
  662. #endif /* CONFIG_OF_MDIO */
  663. static int vsc85xx_dt_led_modes_get(struct phy_device *phydev,
  664. u32 *default_mode)
  665. {
  666. struct vsc8531_private *priv = phydev->priv;
  667. char led_dt_prop[28];
  668. int i, ret;
  669. for (i = 0; i < priv->nleds; i++) {
  670. ret = sprintf(led_dt_prop, "vsc8531,led-%d-mode", i);
  671. if (ret < 0)
  672. return ret;
  673. ret = vsc85xx_dt_led_mode_get(phydev, led_dt_prop,
  674. default_mode[i]);
  675. if (ret < 0)
  676. return ret;
  677. priv->leds_mode[i] = ret;
  678. }
  679. return 0;
  680. }
  681. static int vsc85xx_edge_rate_cntl_set(struct phy_device *phydev, u8 edge_rate)
  682. {
  683. int rc;
  684. mutex_lock(&phydev->lock);
  685. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2,
  686. MSCC_PHY_WOL_MAC_CONTROL, EDGE_RATE_CNTL_MASK,
  687. edge_rate << EDGE_RATE_CNTL_POS);
  688. mutex_unlock(&phydev->lock);
  689. return rc;
  690. }
  691. static int vsc85xx_mac_if_set(struct phy_device *phydev,
  692. phy_interface_t interface)
  693. {
  694. int rc;
  695. u16 reg_val;
  696. mutex_lock(&phydev->lock);
  697. reg_val = phy_read(phydev, MSCC_PHY_EXT_PHY_CNTL_1);
  698. reg_val &= ~(MAC_IF_SELECTION_MASK);
  699. switch (interface) {
  700. case PHY_INTERFACE_MODE_RGMII:
  701. reg_val |= (MAC_IF_SELECTION_RGMII << MAC_IF_SELECTION_POS);
  702. break;
  703. case PHY_INTERFACE_MODE_RMII:
  704. reg_val |= (MAC_IF_SELECTION_RMII << MAC_IF_SELECTION_POS);
  705. break;
  706. case PHY_INTERFACE_MODE_MII:
  707. case PHY_INTERFACE_MODE_GMII:
  708. reg_val |= (MAC_IF_SELECTION_GMII << MAC_IF_SELECTION_POS);
  709. break;
  710. default:
  711. rc = -EINVAL;
  712. goto out_unlock;
  713. }
  714. rc = phy_write(phydev, MSCC_PHY_EXT_PHY_CNTL_1, reg_val);
  715. if (rc)
  716. goto out_unlock;
  717. rc = genphy_soft_reset(phydev);
  718. out_unlock:
  719. mutex_unlock(&phydev->lock);
  720. return rc;
  721. }
  722. static int vsc85xx_default_config(struct phy_device *phydev)
  723. {
  724. int rc;
  725. u16 reg_val;
  726. phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
  727. mutex_lock(&phydev->lock);
  728. reg_val = RGMII_RX_CLK_DELAY_1_1_NS << RGMII_RX_CLK_DELAY_POS;
  729. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2,
  730. MSCC_PHY_RGMII_CNTL, RGMII_RX_CLK_DELAY_MASK,
  731. reg_val);
  732. mutex_unlock(&phydev->lock);
  733. return rc;
  734. }
  735. static int vsc85xx_get_tunable(struct phy_device *phydev,
  736. struct ethtool_tunable *tuna, void *data)
  737. {
  738. switch (tuna->id) {
  739. case ETHTOOL_PHY_DOWNSHIFT:
  740. return vsc85xx_downshift_get(phydev, (u8 *)data);
  741. default:
  742. return -EINVAL;
  743. }
  744. }
  745. static int vsc85xx_set_tunable(struct phy_device *phydev,
  746. struct ethtool_tunable *tuna,
  747. const void *data)
  748. {
  749. switch (tuna->id) {
  750. case ETHTOOL_PHY_DOWNSHIFT:
  751. return vsc85xx_downshift_set(phydev, *(u8 *)data);
  752. default:
  753. return -EINVAL;
  754. }
  755. }
  756. /* mdiobus lock should be locked when using this function */
  757. static void vsc85xx_tr_write(struct phy_device *phydev, u16 addr, u32 val)
  758. {
  759. __phy_write(phydev, MSCC_PHY_TR_MSB, val >> 16);
  760. __phy_write(phydev, MSCC_PHY_TR_LSB, val & GENMASK(15, 0));
  761. __phy_write(phydev, MSCC_PHY_TR_CNTL, TR_WRITE | TR_ADDR(addr));
  762. }
  763. static int vsc8531_pre_init_seq_set(struct phy_device *phydev)
  764. {
  765. int rc;
  766. const struct reg_val init_seq[] = {
  767. {0x0f90, 0x00688980},
  768. {0x0696, 0x00000003},
  769. {0x07fa, 0x0050100f},
  770. {0x1686, 0x00000004},
  771. };
  772. unsigned int i;
  773. int oldpage;
  774. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_STANDARD,
  775. MSCC_PHY_EXT_CNTL_STATUS, SMI_BROADCAST_WR_EN,
  776. SMI_BROADCAST_WR_EN);
  777. if (rc < 0)
  778. return rc;
  779. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_TEST,
  780. MSCC_PHY_TEST_PAGE_24, 0, 0x0400);
  781. if (rc < 0)
  782. return rc;
  783. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_TEST,
  784. MSCC_PHY_TEST_PAGE_5, 0x0a00, 0x0e00);
  785. if (rc < 0)
  786. return rc;
  787. rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_TEST,
  788. MSCC_PHY_TEST_PAGE_8, 0x8000, 0x8000);
  789. if (rc < 0)
  790. return rc;
  791. mutex_lock(&phydev->lock);
  792. oldpage = phy_select_page(phydev, MSCC_PHY_PAGE_TR);
  793. if (oldpage < 0)
  794. goto out_unlock;
  795. for (i = 0; i < ARRAY_SIZE(init_seq); i++)
  796. vsc85xx_tr_write(phydev, init_seq[i].reg, init_seq[i].val);
  797. out_unlock:
  798. oldpage = phy_restore_page(phydev, oldpage, oldpage);
  799. mutex_unlock(&phydev->lock);
  800. return oldpage;
  801. }
  802. static int vsc85xx_eee_init_seq_set(struct phy_device *phydev)
  803. {
  804. const struct reg_val init_eee[] = {
  805. {0x0f82, 0x0012b00a},
  806. {0x1686, 0x00000004},
  807. {0x168c, 0x00d2c46f},
  808. {0x17a2, 0x00000620},
  809. {0x16a0, 0x00eeffdd},
  810. {0x16a6, 0x00071448},
  811. {0x16a4, 0x0013132f},
  812. {0x16a8, 0x00000000},
  813. {0x0ffc, 0x00c0a028},
  814. {0x0fe8, 0x0091b06c},
  815. {0x0fea, 0x00041600},
  816. {0x0f80, 0x00000af4},
  817. {0x0fec, 0x00901809},
  818. {0x0fee, 0x0000a6a1},
  819. {0x0ffe, 0x00b01007},
  820. {0x16b0, 0x00eeff00},
  821. {0x16b2, 0x00007000},
  822. {0x16b4, 0x00000814},
  823. };
  824. unsigned int i;
  825. int oldpage;
  826. mutex_lock(&phydev->lock);
  827. oldpage = phy_select_page(phydev, MSCC_PHY_PAGE_TR);
  828. if (oldpage < 0)
  829. goto out_unlock;
  830. for (i = 0; i < ARRAY_SIZE(init_eee); i++)
  831. vsc85xx_tr_write(phydev, init_eee[i].reg, init_eee[i].val);
  832. out_unlock:
  833. oldpage = phy_restore_page(phydev, oldpage, oldpage);
  834. mutex_unlock(&phydev->lock);
  835. return oldpage;
  836. }
  837. /* phydev->bus->mdio_lock should be locked when using this function */
  838. static int phy_base_write(struct phy_device *phydev, u32 regnum, u16 val)
  839. {
  840. struct vsc8531_private *priv = phydev->priv;
  841. if (unlikely(!mutex_is_locked(&phydev->mdio.bus->mdio_lock))) {
  842. dev_err(&phydev->mdio.dev, "MDIO bus lock not held!\n");
  843. dump_stack();
  844. }
  845. return __mdiobus_write(phydev->mdio.bus, priv->base_addr, regnum, val);
  846. }
  847. /* phydev->bus->mdio_lock should be locked when using this function */
  848. static int phy_base_read(struct phy_device *phydev, u32 regnum)
  849. {
  850. struct vsc8531_private *priv = phydev->priv;
  851. if (unlikely(!mutex_is_locked(&phydev->mdio.bus->mdio_lock))) {
  852. dev_err(&phydev->mdio.dev, "MDIO bus lock not held!\n");
  853. dump_stack();
  854. }
  855. return __mdiobus_read(phydev->mdio.bus, priv->base_addr, regnum);
  856. }
  857. /* bus->mdio_lock should be locked when using this function */
  858. static void vsc8584_csr_write(struct phy_device *phydev, u16 addr, u32 val)
  859. {
  860. phy_base_write(phydev, MSCC_PHY_TR_MSB, val >> 16);
  861. phy_base_write(phydev, MSCC_PHY_TR_LSB, val & GENMASK(15, 0));
  862. phy_base_write(phydev, MSCC_PHY_TR_CNTL, TR_WRITE | TR_ADDR(addr));
  863. }
  864. /* bus->mdio_lock should be locked when using this function */
  865. static int vsc8584_cmd(struct phy_device *phydev, u16 val)
  866. {
  867. unsigned long deadline;
  868. u16 reg_val;
  869. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  870. MSCC_PHY_PAGE_EXTENDED_GPIO);
  871. phy_base_write(phydev, MSCC_PHY_PROC_CMD, PROC_CMD_NCOMPLETED | val);
  872. deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
  873. do {
  874. reg_val = phy_base_read(phydev, MSCC_PHY_PROC_CMD);
  875. } while (time_before(jiffies, deadline) &&
  876. (reg_val & PROC_CMD_NCOMPLETED) &&
  877. !(reg_val & PROC_CMD_FAILED));
  878. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  879. if (reg_val & PROC_CMD_FAILED)
  880. return -EIO;
  881. if (reg_val & PROC_CMD_NCOMPLETED)
  882. return -ETIMEDOUT;
  883. return 0;
  884. }
  885. /* bus->mdio_lock should be locked when using this function */
  886. static int vsc8584_micro_deassert_reset(struct phy_device *phydev,
  887. bool patch_en)
  888. {
  889. u32 enable, release;
  890. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  891. MSCC_PHY_PAGE_EXTENDED_GPIO);
  892. enable = RUN_FROM_INT_ROM | MICRO_CLK_EN | DW8051_CLK_EN;
  893. release = MICRO_NSOFT_RESET | RUN_FROM_INT_ROM | DW8051_CLK_EN |
  894. MICRO_CLK_EN;
  895. if (patch_en) {
  896. enable |= MICRO_PATCH_EN;
  897. release |= MICRO_PATCH_EN;
  898. /* Clear all patches */
  899. phy_base_write(phydev, MSCC_INT_MEM_CNTL, READ_RAM);
  900. }
  901. /* Enable 8051 Micro clock; CLEAR/SET patch present; disable PRAM clock
  902. * override and addr. auto-incr; operate at 125 MHz
  903. */
  904. phy_base_write(phydev, MSCC_DW8051_CNTL_STATUS, enable);
  905. /* Release 8051 Micro SW reset */
  906. phy_base_write(phydev, MSCC_DW8051_CNTL_STATUS, release);
  907. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  908. return 0;
  909. }
  910. /* bus->mdio_lock should be locked when using this function */
  911. static int vsc8584_micro_assert_reset(struct phy_device *phydev)
  912. {
  913. int ret;
  914. u16 reg;
  915. ret = vsc8584_cmd(phydev, PROC_CMD_NOP);
  916. if (ret)
  917. return ret;
  918. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  919. MSCC_PHY_PAGE_EXTENDED_GPIO);
  920. reg = phy_base_read(phydev, MSCC_INT_MEM_CNTL);
  921. reg &= ~EN_PATCH_RAM_TRAP_ADDR(4);
  922. phy_base_write(phydev, MSCC_INT_MEM_CNTL, reg);
  923. phy_base_write(phydev, MSCC_TRAP_ROM_ADDR(4), 0x005b);
  924. phy_base_write(phydev, MSCC_PATCH_RAM_ADDR(4), 0x005b);
  925. reg = phy_base_read(phydev, MSCC_INT_MEM_CNTL);
  926. reg |= EN_PATCH_RAM_TRAP_ADDR(4);
  927. phy_base_write(phydev, MSCC_INT_MEM_CNTL, reg);
  928. phy_base_write(phydev, MSCC_PHY_PROC_CMD, PROC_CMD_NOP);
  929. reg = phy_base_read(phydev, MSCC_DW8051_CNTL_STATUS);
  930. reg &= ~MICRO_NSOFT_RESET;
  931. phy_base_write(phydev, MSCC_DW8051_CNTL_STATUS, reg);
  932. phy_base_write(phydev, MSCC_PHY_PROC_CMD, PROC_CMD_MCB_ACCESS_MAC_CONF |
  933. PROC_CMD_SGMII_PORT(0) | PROC_CMD_NO_MAC_CONF |
  934. PROC_CMD_READ);
  935. reg = phy_base_read(phydev, MSCC_INT_MEM_CNTL);
  936. reg &= ~EN_PATCH_RAM_TRAP_ADDR(4);
  937. phy_base_write(phydev, MSCC_INT_MEM_CNTL, reg);
  938. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  939. return 0;
  940. }
  941. /* bus->mdio_lock should be locked when using this function */
  942. static int vsc8584_get_fw_crc(struct phy_device *phydev, u16 start, u16 size,
  943. u16 *crc)
  944. {
  945. int ret;
  946. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED);
  947. phy_base_write(phydev, MSCC_PHY_VERIPHY_CNTL_2, start);
  948. phy_base_write(phydev, MSCC_PHY_VERIPHY_CNTL_3, size);
  949. /* Start Micro command */
  950. ret = vsc8584_cmd(phydev, PROC_CMD_CRC16);
  951. if (ret)
  952. goto out;
  953. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED);
  954. *crc = phy_base_read(phydev, MSCC_PHY_VERIPHY_CNTL_2);
  955. out:
  956. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  957. return ret;
  958. }
  959. /* bus->mdio_lock should be locked when using this function */
  960. static int vsc8584_patch_fw(struct phy_device *phydev,
  961. const struct firmware *fw)
  962. {
  963. int i, ret;
  964. ret = vsc8584_micro_assert_reset(phydev);
  965. if (ret) {
  966. dev_err(&phydev->mdio.dev,
  967. "%s: failed to assert reset of micro\n", __func__);
  968. return ret;
  969. }
  970. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  971. MSCC_PHY_PAGE_EXTENDED_GPIO);
  972. /* Hold 8051 Micro in SW Reset, Enable auto incr address and patch clock
  973. * Disable the 8051 Micro clock
  974. */
  975. phy_base_write(phydev, MSCC_DW8051_CNTL_STATUS, RUN_FROM_INT_ROM |
  976. AUTOINC_ADDR | PATCH_RAM_CLK | MICRO_CLK_EN |
  977. MICRO_CLK_DIVIDE(2));
  978. phy_base_write(phydev, MSCC_INT_MEM_CNTL, READ_PRAM | INT_MEM_WRITE_EN |
  979. INT_MEM_DATA(2));
  980. phy_base_write(phydev, MSCC_INT_MEM_ADDR, 0x0000);
  981. for (i = 0; i < fw->size; i++)
  982. phy_base_write(phydev, MSCC_INT_MEM_CNTL, READ_PRAM |
  983. INT_MEM_WRITE_EN | fw->data[i]);
  984. /* Clear internal memory access */
  985. phy_base_write(phydev, MSCC_INT_MEM_CNTL, READ_RAM);
  986. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  987. return 0;
  988. }
  989. /* bus->mdio_lock should be locked when using this function */
  990. static bool vsc8574_is_serdes_init(struct phy_device *phydev)
  991. {
  992. u16 reg;
  993. bool ret;
  994. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  995. MSCC_PHY_PAGE_EXTENDED_GPIO);
  996. reg = phy_base_read(phydev, MSCC_TRAP_ROM_ADDR(1));
  997. if (reg != 0x3eb7) {
  998. ret = false;
  999. goto out;
  1000. }
  1001. reg = phy_base_read(phydev, MSCC_PATCH_RAM_ADDR(1));
  1002. if (reg != 0x4012) {
  1003. ret = false;
  1004. goto out;
  1005. }
  1006. reg = phy_base_read(phydev, MSCC_INT_MEM_CNTL);
  1007. if (reg != EN_PATCH_RAM_TRAP_ADDR(1)) {
  1008. ret = false;
  1009. goto out;
  1010. }
  1011. reg = phy_base_read(phydev, MSCC_DW8051_CNTL_STATUS);
  1012. if ((MICRO_NSOFT_RESET | RUN_FROM_INT_ROM | DW8051_CLK_EN |
  1013. MICRO_CLK_EN) != (reg & MSCC_DW8051_VLD_MASK)) {
  1014. ret = false;
  1015. goto out;
  1016. }
  1017. ret = true;
  1018. out:
  1019. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1020. return ret;
  1021. }
  1022. /* bus->mdio_lock should be locked when using this function */
  1023. static int vsc8574_config_pre_init(struct phy_device *phydev)
  1024. {
  1025. const struct reg_val pre_init1[] = {
  1026. {0x0fae, 0x000401bd},
  1027. {0x0fac, 0x000f000f},
  1028. {0x17a0, 0x00a0f147},
  1029. {0x0fe4, 0x00052f54},
  1030. {0x1792, 0x0027303d},
  1031. {0x07fe, 0x00000704},
  1032. {0x0fe0, 0x00060150},
  1033. {0x0f82, 0x0012b00a},
  1034. {0x0f80, 0x00000d74},
  1035. {0x02e0, 0x00000012},
  1036. {0x03a2, 0x00050208},
  1037. {0x03b2, 0x00009186},
  1038. {0x0fb0, 0x000e3700},
  1039. {0x1688, 0x00049f81},
  1040. {0x0fd2, 0x0000ffff},
  1041. {0x168a, 0x00039fa2},
  1042. {0x1690, 0x0020640b},
  1043. {0x0258, 0x00002220},
  1044. {0x025a, 0x00002a20},
  1045. {0x025c, 0x00003060},
  1046. {0x025e, 0x00003fa0},
  1047. {0x03a6, 0x0000e0f0},
  1048. {0x0f92, 0x00001489},
  1049. {0x16a2, 0x00007000},
  1050. {0x16a6, 0x00071448},
  1051. {0x16a0, 0x00eeffdd},
  1052. {0x0fe8, 0x0091b06c},
  1053. {0x0fea, 0x00041600},
  1054. {0x16b0, 0x00eeff00},
  1055. {0x16b2, 0x00007000},
  1056. {0x16b4, 0x00000814},
  1057. {0x0f90, 0x00688980},
  1058. {0x03a4, 0x0000d8f0},
  1059. {0x0fc0, 0x00000400},
  1060. {0x07fa, 0x0050100f},
  1061. {0x0796, 0x00000003},
  1062. {0x07f8, 0x00c3ff98},
  1063. {0x0fa4, 0x0018292a},
  1064. {0x168c, 0x00d2c46f},
  1065. {0x17a2, 0x00000620},
  1066. {0x16a4, 0x0013132f},
  1067. {0x16a8, 0x00000000},
  1068. {0x0ffc, 0x00c0a028},
  1069. {0x0fec, 0x00901c09},
  1070. {0x0fee, 0x0004a6a1},
  1071. {0x0ffe, 0x00b01807},
  1072. };
  1073. const struct reg_val pre_init2[] = {
  1074. {0x0486, 0x0008a518},
  1075. {0x0488, 0x006dc696},
  1076. {0x048a, 0x00000912},
  1077. {0x048e, 0x00000db6},
  1078. {0x049c, 0x00596596},
  1079. {0x049e, 0x00000514},
  1080. {0x04a2, 0x00410280},
  1081. {0x04a4, 0x00000000},
  1082. {0x04a6, 0x00000000},
  1083. {0x04a8, 0x00000000},
  1084. {0x04aa, 0x00000000},
  1085. {0x04ae, 0x007df7dd},
  1086. {0x04b0, 0x006d95d4},
  1087. {0x04b2, 0x00492410},
  1088. };
  1089. struct device *dev = &phydev->mdio.dev;
  1090. const struct firmware *fw;
  1091. unsigned int i;
  1092. u16 crc, reg;
  1093. bool serdes_init;
  1094. int ret;
  1095. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1096. /* all writes below are broadcasted to all PHYs in the same package */
  1097. reg = phy_base_read(phydev, MSCC_PHY_EXT_CNTL_STATUS);
  1098. reg |= SMI_BROADCAST_WR_EN;
  1099. phy_base_write(phydev, MSCC_PHY_EXT_CNTL_STATUS, reg);
  1100. phy_base_write(phydev, MII_VSC85XX_INT_MASK, 0);
  1101. /* The below register writes are tweaking analog and electrical
  1102. * configuration that were determined through characterization by PHY
  1103. * engineers. These don't mean anything more than "these are the best
  1104. * values".
  1105. */
  1106. phy_base_write(phydev, MSCC_PHY_EXT_PHY_CNTL_2, 0x0040);
  1107. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TEST);
  1108. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_20, 0x4320);
  1109. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_24, 0x0c00);
  1110. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_9, 0x18ca);
  1111. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_5, 0x1b20);
  1112. reg = phy_base_read(phydev, MSCC_PHY_TEST_PAGE_8);
  1113. reg |= 0x8000;
  1114. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_8, reg);
  1115. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TR);
  1116. for (i = 0; i < ARRAY_SIZE(pre_init1); i++)
  1117. vsc8584_csr_write(phydev, pre_init1[i].reg, pre_init1[i].val);
  1118. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED_2);
  1119. phy_base_write(phydev, MSCC_PHY_CU_PMD_TX_CNTL, 0x028e);
  1120. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TR);
  1121. for (i = 0; i < ARRAY_SIZE(pre_init2); i++)
  1122. vsc8584_csr_write(phydev, pre_init2[i].reg, pre_init2[i].val);
  1123. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TEST);
  1124. reg = phy_base_read(phydev, MSCC_PHY_TEST_PAGE_8);
  1125. reg &= ~0x8000;
  1126. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_8, reg);
  1127. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1128. /* end of write broadcasting */
  1129. reg = phy_base_read(phydev, MSCC_PHY_EXT_CNTL_STATUS);
  1130. reg &= ~SMI_BROADCAST_WR_EN;
  1131. phy_base_write(phydev, MSCC_PHY_EXT_CNTL_STATUS, reg);
  1132. ret = request_firmware(&fw, MSCC_VSC8574_REVB_INT8051_FW, dev);
  1133. if (ret) {
  1134. dev_err(dev, "failed to load firmware %s, ret: %d\n",
  1135. MSCC_VSC8574_REVB_INT8051_FW, ret);
  1136. return ret;
  1137. }
  1138. /* Add one byte to size for the one added by the patch_fw function */
  1139. ret = vsc8584_get_fw_crc(phydev,
  1140. MSCC_VSC8574_REVB_INT8051_FW_START_ADDR,
  1141. fw->size + 1, &crc);
  1142. if (ret)
  1143. goto out;
  1144. if (crc == MSCC_VSC8574_REVB_INT8051_FW_CRC) {
  1145. serdes_init = vsc8574_is_serdes_init(phydev);
  1146. if (!serdes_init) {
  1147. ret = vsc8584_micro_assert_reset(phydev);
  1148. if (ret) {
  1149. dev_err(dev,
  1150. "%s: failed to assert reset of micro\n",
  1151. __func__);
  1152. goto out;
  1153. }
  1154. }
  1155. } else {
  1156. dev_dbg(dev, "FW CRC is not the expected one, patching FW\n");
  1157. serdes_init = false;
  1158. if (vsc8584_patch_fw(phydev, fw))
  1159. dev_warn(dev,
  1160. "failed to patch FW, expect non-optimal device\n");
  1161. }
  1162. if (!serdes_init) {
  1163. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  1164. MSCC_PHY_PAGE_EXTENDED_GPIO);
  1165. phy_base_write(phydev, MSCC_TRAP_ROM_ADDR(1), 0x3eb7);
  1166. phy_base_write(phydev, MSCC_PATCH_RAM_ADDR(1), 0x4012);
  1167. phy_base_write(phydev, MSCC_INT_MEM_CNTL,
  1168. EN_PATCH_RAM_TRAP_ADDR(1));
  1169. vsc8584_micro_deassert_reset(phydev, false);
  1170. /* Add one byte to size for the one added by the patch_fw
  1171. * function
  1172. */
  1173. ret = vsc8584_get_fw_crc(phydev,
  1174. MSCC_VSC8574_REVB_INT8051_FW_START_ADDR,
  1175. fw->size + 1, &crc);
  1176. if (ret)
  1177. goto out;
  1178. if (crc != MSCC_VSC8574_REVB_INT8051_FW_CRC)
  1179. dev_warn(dev,
  1180. "FW CRC after patching is not the expected one, expect non-optimal device\n");
  1181. }
  1182. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  1183. MSCC_PHY_PAGE_EXTENDED_GPIO);
  1184. ret = vsc8584_cmd(phydev, PROC_CMD_1588_DEFAULT_INIT |
  1185. PROC_CMD_PHY_INIT);
  1186. out:
  1187. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1188. release_firmware(fw);
  1189. return ret;
  1190. }
  1191. /* bus->mdio_lock should be locked when using this function */
  1192. static int vsc8584_config_pre_init(struct phy_device *phydev)
  1193. {
  1194. const struct reg_val pre_init1[] = {
  1195. {0x07fa, 0x0050100f},
  1196. {0x1688, 0x00049f81},
  1197. {0x0f90, 0x00688980},
  1198. {0x03a4, 0x0000d8f0},
  1199. {0x0fc0, 0x00000400},
  1200. {0x0f82, 0x0012b002},
  1201. {0x1686, 0x00000004},
  1202. {0x168c, 0x00d2c46f},
  1203. {0x17a2, 0x00000620},
  1204. {0x16a0, 0x00eeffdd},
  1205. {0x16a6, 0x00071448},
  1206. {0x16a4, 0x0013132f},
  1207. {0x16a8, 0x00000000},
  1208. {0x0ffc, 0x00c0a028},
  1209. {0x0fe8, 0x0091b06c},
  1210. {0x0fea, 0x00041600},
  1211. {0x0f80, 0x00fffaff},
  1212. {0x0fec, 0x00901809},
  1213. {0x0ffe, 0x00b01007},
  1214. {0x16b0, 0x00eeff00},
  1215. {0x16b2, 0x00007000},
  1216. {0x16b4, 0x00000814},
  1217. };
  1218. const struct reg_val pre_init2[] = {
  1219. {0x0486, 0x0008a518},
  1220. {0x0488, 0x006dc696},
  1221. {0x048a, 0x00000912},
  1222. };
  1223. const struct firmware *fw;
  1224. struct device *dev = &phydev->mdio.dev;
  1225. unsigned int i;
  1226. u16 crc, reg;
  1227. int ret;
  1228. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1229. /* all writes below are broadcasted to all PHYs in the same package */
  1230. reg = phy_base_read(phydev, MSCC_PHY_EXT_CNTL_STATUS);
  1231. reg |= SMI_BROADCAST_WR_EN;
  1232. phy_base_write(phydev, MSCC_PHY_EXT_CNTL_STATUS, reg);
  1233. phy_base_write(phydev, MII_VSC85XX_INT_MASK, 0);
  1234. reg = phy_base_read(phydev, MSCC_PHY_BYPASS_CONTROL);
  1235. reg |= PARALLEL_DET_IGNORE_ADVERTISED;
  1236. phy_base_write(phydev, MSCC_PHY_BYPASS_CONTROL, reg);
  1237. /* The below register writes are tweaking analog and electrical
  1238. * configuration that were determined through characterization by PHY
  1239. * engineers. These don't mean anything more than "these are the best
  1240. * values".
  1241. */
  1242. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED_3);
  1243. phy_base_write(phydev, MSCC_PHY_SERDES_TX_CRC_ERR_CNT, 0x2000);
  1244. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TEST);
  1245. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_5, 0x1f20);
  1246. reg = phy_base_read(phydev, MSCC_PHY_TEST_PAGE_8);
  1247. reg |= 0x8000;
  1248. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_8, reg);
  1249. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TR);
  1250. phy_base_write(phydev, MSCC_PHY_TR_CNTL, TR_WRITE | TR_ADDR(0x2fa4));
  1251. reg = phy_base_read(phydev, MSCC_PHY_TR_MSB);
  1252. reg &= ~0x007f;
  1253. reg |= 0x0019;
  1254. phy_base_write(phydev, MSCC_PHY_TR_MSB, reg);
  1255. phy_base_write(phydev, MSCC_PHY_TR_CNTL, TR_WRITE | TR_ADDR(0x0fa4));
  1256. for (i = 0; i < ARRAY_SIZE(pre_init1); i++)
  1257. vsc8584_csr_write(phydev, pre_init1[i].reg, pre_init1[i].val);
  1258. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED_2);
  1259. phy_base_write(phydev, MSCC_PHY_CU_PMD_TX_CNTL, 0x028e);
  1260. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TR);
  1261. for (i = 0; i < ARRAY_SIZE(pre_init2); i++)
  1262. vsc8584_csr_write(phydev, pre_init2[i].reg, pre_init2[i].val);
  1263. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TEST);
  1264. reg = phy_base_read(phydev, MSCC_PHY_TEST_PAGE_8);
  1265. reg &= ~0x8000;
  1266. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_8, reg);
  1267. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1268. /* end of write broadcasting */
  1269. reg = phy_base_read(phydev, MSCC_PHY_EXT_CNTL_STATUS);
  1270. reg &= ~SMI_BROADCAST_WR_EN;
  1271. phy_base_write(phydev, MSCC_PHY_EXT_CNTL_STATUS, reg);
  1272. ret = request_firmware(&fw, MSCC_VSC8584_REVB_INT8051_FW, dev);
  1273. if (ret) {
  1274. dev_err(dev, "failed to load firmware %s, ret: %d\n",
  1275. MSCC_VSC8584_REVB_INT8051_FW, ret);
  1276. return ret;
  1277. }
  1278. /* Add one byte to size for the one added by the patch_fw function */
  1279. ret = vsc8584_get_fw_crc(phydev,
  1280. MSCC_VSC8584_REVB_INT8051_FW_START_ADDR,
  1281. fw->size + 1, &crc);
  1282. if (ret)
  1283. goto out;
  1284. if (crc != MSCC_VSC8584_REVB_INT8051_FW_CRC) {
  1285. dev_dbg(dev, "FW CRC is not the expected one, patching FW\n");
  1286. if (vsc8584_patch_fw(phydev, fw))
  1287. dev_warn(dev,
  1288. "failed to patch FW, expect non-optimal device\n");
  1289. }
  1290. vsc8584_micro_deassert_reset(phydev, false);
  1291. /* Add one byte to size for the one added by the patch_fw function */
  1292. ret = vsc8584_get_fw_crc(phydev,
  1293. MSCC_VSC8584_REVB_INT8051_FW_START_ADDR,
  1294. fw->size + 1, &crc);
  1295. if (ret)
  1296. goto out;
  1297. if (crc != MSCC_VSC8584_REVB_INT8051_FW_CRC)
  1298. dev_warn(dev,
  1299. "FW CRC after patching is not the expected one, expect non-optimal device\n");
  1300. ret = vsc8584_micro_assert_reset(phydev);
  1301. if (ret)
  1302. goto out;
  1303. vsc8584_micro_deassert_reset(phydev, true);
  1304. out:
  1305. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1306. release_firmware(fw);
  1307. return ret;
  1308. }
  1309. /* Check if one PHY has already done the init of the parts common to all PHYs
  1310. * in the Quad PHY package.
  1311. */
  1312. static bool vsc8584_is_pkg_init(struct phy_device *phydev, bool reversed)
  1313. {
  1314. struct mdio_device **map = phydev->mdio.bus->mdio_map;
  1315. struct vsc8531_private *vsc8531;
  1316. struct phy_device *phy;
  1317. int i, addr;
  1318. /* VSC8584 is a Quad PHY */
  1319. for (i = 0; i < 4; i++) {
  1320. vsc8531 = phydev->priv;
  1321. if (reversed)
  1322. addr = vsc8531->base_addr - i;
  1323. else
  1324. addr = vsc8531->base_addr + i;
  1325. phy = container_of(map[addr], struct phy_device, mdio);
  1326. if ((phy->phy_id & phydev->drv->phy_id_mask) !=
  1327. (phydev->drv->phy_id & phydev->drv->phy_id_mask))
  1328. continue;
  1329. vsc8531 = phy->priv;
  1330. if (vsc8531 && vsc8531->pkg_init)
  1331. return true;
  1332. }
  1333. return false;
  1334. }
  1335. static int vsc8584_config_init(struct phy_device *phydev)
  1336. {
  1337. struct vsc8531_private *vsc8531 = phydev->priv;
  1338. u16 addr, val;
  1339. int ret, i;
  1340. phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
  1341. mutex_lock(&phydev->mdio.bus->mdio_lock);
  1342. __mdiobus_write(phydev->mdio.bus, phydev->mdio.addr,
  1343. MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED);
  1344. addr = __mdiobus_read(phydev->mdio.bus, phydev->mdio.addr,
  1345. MSCC_PHY_EXT_PHY_CNTL_4);
  1346. addr >>= PHY_CNTL_4_ADDR_POS;
  1347. val = __mdiobus_read(phydev->mdio.bus, phydev->mdio.addr,
  1348. MSCC_PHY_ACTIPHY_CNTL);
  1349. if (val & PHY_ADDR_REVERSED)
  1350. vsc8531->base_addr = phydev->mdio.addr + addr;
  1351. else
  1352. vsc8531->base_addr = phydev->mdio.addr - addr;
  1353. /* Some parts of the init sequence are identical for every PHY in the
  1354. * package. Some parts are modifying the GPIO register bank which is a
  1355. * set of registers that are affecting all PHYs, a few resetting the
  1356. * microprocessor common to all PHYs. The CRC check responsible of the
  1357. * checking the firmware within the 8051 microprocessor can only be
  1358. * accessed via the PHY whose internal address in the package is 0.
  1359. * All PHYs' interrupts mask register has to be zeroed before enabling
  1360. * any PHY's interrupt in this register.
  1361. * For all these reasons, we need to do the init sequence once and only
  1362. * once whatever is the first PHY in the package that is initialized and
  1363. * do the correct init sequence for all PHYs that are package-critical
  1364. * in this pre-init function.
  1365. */
  1366. if (!vsc8584_is_pkg_init(phydev, val & PHY_ADDR_REVERSED ? 1 : 0)) {
  1367. if ((phydev->phy_id & phydev->drv->phy_id_mask) ==
  1368. (PHY_ID_VSC8574 & phydev->drv->phy_id_mask))
  1369. ret = vsc8574_config_pre_init(phydev);
  1370. else if ((phydev->phy_id & phydev->drv->phy_id_mask) ==
  1371. (PHY_ID_VSC8584 & phydev->drv->phy_id_mask))
  1372. ret = vsc8584_config_pre_init(phydev);
  1373. else
  1374. ret = -EINVAL;
  1375. if (ret)
  1376. goto err;
  1377. }
  1378. vsc8531->pkg_init = true;
  1379. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  1380. MSCC_PHY_PAGE_EXTENDED_GPIO);
  1381. val = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK);
  1382. val &= ~MAC_CFG_MASK;
  1383. if (phydev->interface == PHY_INTERFACE_MODE_QSGMII)
  1384. val |= MAC_CFG_QSGMII;
  1385. else
  1386. val |= MAC_CFG_SGMII;
  1387. ret = phy_base_write(phydev, MSCC_PHY_MAC_CFG_FASTLINK, val);
  1388. if (ret)
  1389. goto err;
  1390. val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT |
  1391. PROC_CMD_READ_MOD_WRITE_PORT;
  1392. if (phydev->interface == PHY_INTERFACE_MODE_QSGMII)
  1393. val |= PROC_CMD_QSGMII_MAC;
  1394. else
  1395. val |= PROC_CMD_SGMII_MAC;
  1396. ret = vsc8584_cmd(phydev, val);
  1397. if (ret)
  1398. goto err;
  1399. usleep_range(10000, 20000);
  1400. /* Disable SerDes for 100Base-FX */
  1401. ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF |
  1402. PROC_CMD_FIBER_PORT(addr) | PROC_CMD_FIBER_DISABLE |
  1403. PROC_CMD_READ_MOD_WRITE_PORT |
  1404. PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_100BASE_FX);
  1405. if (ret)
  1406. goto err;
  1407. /* Disable SerDes for 1000Base-X */
  1408. ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF |
  1409. PROC_CMD_FIBER_PORT(addr) | PROC_CMD_FIBER_DISABLE |
  1410. PROC_CMD_READ_MOD_WRITE_PORT |
  1411. PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_1000BASE_X);
  1412. if (ret)
  1413. goto err;
  1414. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1415. phy_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1416. val = phy_read(phydev, MSCC_PHY_EXT_PHY_CNTL_1);
  1417. val &= ~(MEDIA_OP_MODE_MASK | VSC8584_MAC_IF_SELECTION_MASK);
  1418. val |= MEDIA_OP_MODE_COPPER | (VSC8584_MAC_IF_SELECTION_SGMII <<
  1419. VSC8584_MAC_IF_SELECTION_POS);
  1420. ret = phy_write(phydev, MSCC_PHY_EXT_PHY_CNTL_1, val);
  1421. ret = genphy_soft_reset(phydev);
  1422. if (ret)
  1423. return ret;
  1424. for (i = 0; i < vsc8531->nleds; i++) {
  1425. ret = vsc85xx_led_cntl_set(phydev, i, vsc8531->leds_mode[i]);
  1426. if (ret)
  1427. return ret;
  1428. }
  1429. return 0;
  1430. err:
  1431. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1432. return ret;
  1433. }
  1434. static int vsc85xx_config_init(struct phy_device *phydev)
  1435. {
  1436. int rc, i, phy_id;
  1437. struct vsc8531_private *vsc8531 = phydev->priv;
  1438. rc = vsc85xx_default_config(phydev);
  1439. if (rc)
  1440. return rc;
  1441. rc = vsc85xx_mac_if_set(phydev, phydev->interface);
  1442. if (rc)
  1443. return rc;
  1444. rc = vsc85xx_edge_rate_cntl_set(phydev, vsc8531->rate_magic);
  1445. if (rc)
  1446. return rc;
  1447. phy_id = phydev->drv->phy_id & phydev->drv->phy_id_mask;
  1448. if (PHY_ID_VSC8531 == phy_id || PHY_ID_VSC8541 == phy_id ||
  1449. PHY_ID_VSC8530 == phy_id || PHY_ID_VSC8540 == phy_id) {
  1450. rc = vsc8531_pre_init_seq_set(phydev);
  1451. if (rc)
  1452. return rc;
  1453. }
  1454. rc = vsc85xx_eee_init_seq_set(phydev);
  1455. if (rc)
  1456. return rc;
  1457. for (i = 0; i < vsc8531->nleds; i++) {
  1458. rc = vsc85xx_led_cntl_set(phydev, i, vsc8531->leds_mode[i]);
  1459. if (rc)
  1460. return rc;
  1461. }
  1462. return 0;
  1463. }
  1464. static int vsc8584_did_interrupt(struct phy_device *phydev)
  1465. {
  1466. int rc = 0;
  1467. if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
  1468. rc = phy_read(phydev, MII_VSC85XX_INT_STATUS);
  1469. return (rc < 0) ? 0 : rc & MII_VSC85XX_INT_MASK_MASK;
  1470. }
  1471. static int vsc8514_config_pre_init(struct phy_device *phydev)
  1472. {
  1473. /* These are the settings to override the silicon default
  1474. * values to handle hardware performance of PHY. They
  1475. * are set at Power-On state and remain until PHY Reset.
  1476. */
  1477. const struct reg_val pre_init1[] = {
  1478. {0x0f90, 0x00688980},
  1479. {0x0786, 0x00000003},
  1480. {0x07fa, 0x0050100f},
  1481. {0x0f82, 0x0012b002},
  1482. {0x1686, 0x00000004},
  1483. {0x168c, 0x00d2c46f},
  1484. {0x17a2, 0x00000620},
  1485. {0x16a0, 0x00eeffdd},
  1486. {0x16a6, 0x00071448},
  1487. {0x16a4, 0x0013132f},
  1488. {0x16a8, 0x00000000},
  1489. {0x0ffc, 0x00c0a028},
  1490. {0x0fe8, 0x0091b06c},
  1491. {0x0fea, 0x00041600},
  1492. {0x0f80, 0x00fffaff},
  1493. {0x0fec, 0x00901809},
  1494. {0x0ffe, 0x00b01007},
  1495. {0x16b0, 0x00eeff00},
  1496. {0x16b2, 0x00007000},
  1497. {0x16b4, 0x00000814},
  1498. };
  1499. unsigned int i;
  1500. u16 reg;
  1501. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1502. /* all writes below are broadcasted to all PHYs in the same package */
  1503. reg = phy_base_read(phydev, MSCC_PHY_EXT_CNTL_STATUS);
  1504. reg |= SMI_BROADCAST_WR_EN;
  1505. phy_base_write(phydev, MSCC_PHY_EXT_CNTL_STATUS, reg);
  1506. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TEST);
  1507. reg = phy_base_read(phydev, MSCC_PHY_TEST_PAGE_8);
  1508. reg |= BIT(15);
  1509. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_8, reg);
  1510. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TR);
  1511. for (i = 0; i < ARRAY_SIZE(pre_init1); i++)
  1512. vsc8584_csr_write(phydev, pre_init1[i].reg, pre_init1[i].val);
  1513. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_TEST);
  1514. reg = phy_base_read(phydev, MSCC_PHY_TEST_PAGE_8);
  1515. reg &= ~BIT(15);
  1516. phy_base_write(phydev, MSCC_PHY_TEST_PAGE_8, reg);
  1517. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1518. reg = phy_base_read(phydev, MSCC_PHY_EXT_CNTL_STATUS);
  1519. reg &= ~SMI_BROADCAST_WR_EN;
  1520. phy_base_write(phydev, MSCC_PHY_EXT_CNTL_STATUS, reg);
  1521. return 0;
  1522. }
  1523. static u32 vsc85xx_csr_ctrl_phy_read(struct phy_device *phydev,
  1524. u32 target, u32 reg)
  1525. {
  1526. unsigned long deadline;
  1527. u32 val, val_l, val_h;
  1528. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_CSR_CNTL);
  1529. /* CSR registers are grouped under different Target IDs.
  1530. * 6-bit Target_ID is split between MSCC_EXT_PAGE_CSR_CNTL_20 and
  1531. * MSCC_EXT_PAGE_CSR_CNTL_19 registers.
  1532. * Target_ID[5:2] maps to bits[3:0] of MSCC_EXT_PAGE_CSR_CNTL_20
  1533. * and Target_ID[1:0] maps to bits[13:12] of MSCC_EXT_PAGE_CSR_CNTL_19.
  1534. */
  1535. /* Setup the Target ID */
  1536. phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_20,
  1537. MSCC_PHY_CSR_CNTL_20_TARGET(target >> 2));
  1538. /* Trigger CSR Action - Read into the CSR's */
  1539. phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_19,
  1540. MSCC_PHY_CSR_CNTL_19_CMD | MSCC_PHY_CSR_CNTL_19_READ |
  1541. MSCC_PHY_CSR_CNTL_19_REG_ADDR(reg) |
  1542. MSCC_PHY_CSR_CNTL_19_TARGET(target & 0x3));
  1543. /* Wait for register access*/
  1544. deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
  1545. do {
  1546. usleep_range(500, 1000);
  1547. val = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_19);
  1548. } while (time_before(jiffies, deadline) &&
  1549. !(val & MSCC_PHY_CSR_CNTL_19_CMD));
  1550. if (!(val & MSCC_PHY_CSR_CNTL_19_CMD))
  1551. return 0xffffffff;
  1552. /* Read the Least Significant Word (LSW) (17) */
  1553. val_l = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_17);
  1554. /* Read the Most Significant Word (MSW) (18) */
  1555. val_h = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_18);
  1556. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  1557. MSCC_PHY_PAGE_STANDARD);
  1558. return (val_h << 16) | val_l;
  1559. }
  1560. static int vsc85xx_csr_ctrl_phy_write(struct phy_device *phydev,
  1561. u32 target, u32 reg, u32 val)
  1562. {
  1563. unsigned long deadline;
  1564. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_CSR_CNTL);
  1565. /* CSR registers are grouped under different Target IDs.
  1566. * 6-bit Target_ID is split between MSCC_EXT_PAGE_CSR_CNTL_20 and
  1567. * MSCC_EXT_PAGE_CSR_CNTL_19 registers.
  1568. * Target_ID[5:2] maps to bits[3:0] of MSCC_EXT_PAGE_CSR_CNTL_20
  1569. * and Target_ID[1:0] maps to bits[13:12] of MSCC_EXT_PAGE_CSR_CNTL_19.
  1570. */
  1571. /* Setup the Target ID */
  1572. phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_20,
  1573. MSCC_PHY_CSR_CNTL_20_TARGET(target >> 2));
  1574. /* Write the Least Significant Word (LSW) (17) */
  1575. phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_17, (u16)val);
  1576. /* Write the Most Significant Word (MSW) (18) */
  1577. phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_18, (u16)(val >> 16));
  1578. /* Trigger CSR Action - Write into the CSR's */
  1579. phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_19,
  1580. MSCC_PHY_CSR_CNTL_19_CMD |
  1581. MSCC_PHY_CSR_CNTL_19_REG_ADDR(reg) |
  1582. MSCC_PHY_CSR_CNTL_19_TARGET(target & 0x3));
  1583. /* Wait for register access */
  1584. deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
  1585. do {
  1586. usleep_range(500, 1000);
  1587. val = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_19);
  1588. } while (time_before(jiffies, deadline) &&
  1589. !(val & MSCC_PHY_CSR_CNTL_19_CMD));
  1590. if (!(val & MSCC_PHY_CSR_CNTL_19_CMD))
  1591. return -ETIMEDOUT;
  1592. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  1593. MSCC_PHY_PAGE_STANDARD);
  1594. return 0;
  1595. }
  1596. static int __phy_write_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb,
  1597. u32 op)
  1598. {
  1599. unsigned long deadline;
  1600. u32 val;
  1601. int ret;
  1602. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, reg,
  1603. op | (1 << mcb));
  1604. if (ret)
  1605. return -EINVAL;
  1606. deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
  1607. do {
  1608. usleep_range(500, 1000);
  1609. val = vsc85xx_csr_ctrl_phy_read(phydev, PHY_MCB_TARGET, reg);
  1610. if (val == 0xffffffff)
  1611. return -EIO;
  1612. } while (time_before(jiffies, deadline) && (val & op));
  1613. if (val & op)
  1614. return -ETIMEDOUT;
  1615. return 0;
  1616. }
  1617. /* Trigger a read to the spcified MCB */
  1618. static int phy_update_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb)
  1619. {
  1620. return __phy_write_mcb_s6g(phydev, reg, mcb, PHY_MCB_S6G_READ);
  1621. }
  1622. /* Trigger a write to the spcified MCB */
  1623. static int phy_commit_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb)
  1624. {
  1625. return __phy_write_mcb_s6g(phydev, reg, mcb, PHY_MCB_S6G_WRITE);
  1626. }
  1627. static int vsc8514_config_init(struct phy_device *phydev)
  1628. {
  1629. struct vsc8531_private *vsc8531 = phydev->priv;
  1630. unsigned long deadline;
  1631. u16 val, addr;
  1632. int ret, i;
  1633. u32 reg;
  1634. phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
  1635. mutex_lock(&phydev->mdio.bus->mdio_lock);
  1636. __phy_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED);
  1637. addr = __phy_read(phydev, MSCC_PHY_EXT_PHY_CNTL_4);
  1638. addr >>= PHY_CNTL_4_ADDR_POS;
  1639. val = __phy_read(phydev, MSCC_PHY_ACTIPHY_CNTL);
  1640. if (val & PHY_ADDR_REVERSED)
  1641. vsc8531->base_addr = phydev->mdio.addr + addr;
  1642. else
  1643. vsc8531->base_addr = phydev->mdio.addr - addr;
  1644. /* Some parts of the init sequence are identical for every PHY in the
  1645. * package. Some parts are modifying the GPIO register bank which is a
  1646. * set of registers that are affecting all PHYs, a few resetting the
  1647. * microprocessor common to all PHYs.
  1648. * All PHYs' interrupts mask register has to be zeroed before enabling
  1649. * any PHY's interrupt in this register.
  1650. * For all these reasons, we need to do the init sequence once and only
  1651. * once whatever is the first PHY in the package that is initialized and
  1652. * do the correct init sequence for all PHYs that are package-critical
  1653. * in this pre-init function.
  1654. */
  1655. if (!vsc8584_is_pkg_init(phydev, val & PHY_ADDR_REVERSED ? 1 : 0))
  1656. vsc8514_config_pre_init(phydev);
  1657. vsc8531->pkg_init = true;
  1658. phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
  1659. MSCC_PHY_PAGE_EXTENDED_GPIO);
  1660. val = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK);
  1661. val &= ~MAC_CFG_MASK;
  1662. val |= MAC_CFG_QSGMII;
  1663. ret = phy_base_write(phydev, MSCC_PHY_MAC_CFG_FASTLINK, val);
  1664. if (ret)
  1665. goto err;
  1666. ret = vsc8584_cmd(phydev,
  1667. PROC_CMD_MCB_ACCESS_MAC_CONF |
  1668. PROC_CMD_RST_CONF_PORT |
  1669. PROC_CMD_READ_MOD_WRITE_PORT | PROC_CMD_QSGMII_MAC);
  1670. if (ret)
  1671. goto err;
  1672. /* 6g mcb */
  1673. phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
  1674. /* lcpll mcb */
  1675. phy_update_mcb_s6g(phydev, PHY_S6G_LCPLL_CFG, 0);
  1676. /* pll5gcfg0 */
  1677. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET,
  1678. PHY_S6G_PLL5G_CFG0, 0x7036f145);
  1679. if (ret)
  1680. goto err;
  1681. phy_commit_mcb_s6g(phydev, PHY_S6G_LCPLL_CFG, 0);
  1682. /* pllcfg */
  1683. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET,
  1684. PHY_S6G_PLL_CFG,
  1685. (3 << PHY_S6G_PLL_ENA_OFFS_POS) |
  1686. (120 << PHY_S6G_PLL_FSM_CTRL_DATA_POS)
  1687. | (0 << PHY_S6G_PLL_FSM_ENA_POS));
  1688. if (ret)
  1689. goto err;
  1690. /* commoncfg */
  1691. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET,
  1692. PHY_S6G_COMMON_CFG,
  1693. (0 << PHY_S6G_SYS_RST_POS) |
  1694. (0 << PHY_S6G_ENA_LANE_POS) |
  1695. (0 << PHY_S6G_ENA_LOOP_POS) |
  1696. (0 << PHY_S6G_QRATE_POS) |
  1697. (3 << PHY_S6G_IF_MODE_POS));
  1698. if (ret)
  1699. goto err;
  1700. /* misccfg */
  1701. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET,
  1702. PHY_S6G_MISC_CFG, 1);
  1703. if (ret)
  1704. goto err;
  1705. /* gpcfg */
  1706. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET,
  1707. PHY_S6G_GPC_CFG, 768);
  1708. if (ret)
  1709. goto err;
  1710. phy_commit_mcb_s6g(phydev, PHY_S6G_DFT_CFG2, 0);
  1711. deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
  1712. do {
  1713. usleep_range(500, 1000);
  1714. phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG,
  1715. 0); /* read 6G MCB into CSRs */
  1716. reg = vsc85xx_csr_ctrl_phy_read(phydev, PHY_MCB_TARGET,
  1717. PHY_S6G_PLL_STATUS);
  1718. if (reg == 0xffffffff) {
  1719. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1720. return -EIO;
  1721. }
  1722. } while (time_before(jiffies, deadline) && (reg & BIT(12)));
  1723. if (reg & BIT(12)) {
  1724. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1725. return -ETIMEDOUT;
  1726. }
  1727. /* misccfg */
  1728. ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET,
  1729. PHY_S6G_MISC_CFG, 0);
  1730. if (ret)
  1731. goto err;
  1732. phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
  1733. deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
  1734. do {
  1735. usleep_range(500, 1000);
  1736. phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG,
  1737. 0); /* read 6G MCB into CSRs */
  1738. reg = vsc85xx_csr_ctrl_phy_read(phydev, PHY_MCB_TARGET,
  1739. PHY_S6G_IB_STATUS0);
  1740. if (reg == 0xffffffff) {
  1741. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1742. return -EIO;
  1743. }
  1744. } while (time_before(jiffies, deadline) && !(reg & BIT(8)));
  1745. if (!(reg & BIT(8))) {
  1746. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1747. return -ETIMEDOUT;
  1748. }
  1749. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1750. ret = phy_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
  1751. if (ret)
  1752. return ret;
  1753. ret = phy_modify(phydev, MSCC_PHY_EXT_PHY_CNTL_1, MEDIA_OP_MODE_MASK,
  1754. MEDIA_OP_MODE_COPPER);
  1755. if (ret)
  1756. return ret;
  1757. ret = genphy_soft_reset(phydev);
  1758. if (ret)
  1759. return ret;
  1760. for (i = 0; i < vsc8531->nleds; i++) {
  1761. ret = vsc85xx_led_cntl_set(phydev, i, vsc8531->leds_mode[i]);
  1762. if (ret)
  1763. return ret;
  1764. }
  1765. return ret;
  1766. err:
  1767. mutex_unlock(&phydev->mdio.bus->mdio_lock);
  1768. return ret;
  1769. }
  1770. static int vsc85xx_ack_interrupt(struct phy_device *phydev)
  1771. {
  1772. int rc = 0;
  1773. if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
  1774. rc = phy_read(phydev, MII_VSC85XX_INT_STATUS);
  1775. return (rc < 0) ? rc : 0;
  1776. }
  1777. static int vsc85xx_config_intr(struct phy_device *phydev)
  1778. {
  1779. int rc;
  1780. if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  1781. rc = phy_write(phydev, MII_VSC85XX_INT_MASK,
  1782. MII_VSC85XX_INT_MASK_MASK);
  1783. } else {
  1784. rc = phy_write(phydev, MII_VSC85XX_INT_MASK, 0);
  1785. if (rc < 0)
  1786. return rc;
  1787. rc = phy_read(phydev, MII_VSC85XX_INT_STATUS);
  1788. }
  1789. return rc;
  1790. }
  1791. static int vsc85xx_config_aneg(struct phy_device *phydev)
  1792. {
  1793. int rc;
  1794. rc = vsc85xx_mdix_set(phydev, phydev->mdix_ctrl);
  1795. if (rc < 0)
  1796. return rc;
  1797. return genphy_config_aneg(phydev);
  1798. }
  1799. static int vsc85xx_read_status(struct phy_device *phydev)
  1800. {
  1801. int rc;
  1802. rc = vsc85xx_mdix_get(phydev, &phydev->mdix);
  1803. if (rc < 0)
  1804. return rc;
  1805. return genphy_read_status(phydev);
  1806. }
  1807. static int vsc8514_probe(struct phy_device *phydev)
  1808. {
  1809. struct vsc8531_private *vsc8531;
  1810. u32 default_mode[4] = {VSC8531_LINK_1000_ACTIVITY,
  1811. VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY,
  1812. VSC8531_DUPLEX_COLLISION};
  1813. vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL);
  1814. if (!vsc8531)
  1815. return -ENOMEM;
  1816. phydev->priv = vsc8531;
  1817. vsc8531->nleds = 4;
  1818. vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES;
  1819. vsc8531->hw_stats = vsc85xx_hw_stats;
  1820. vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats);
  1821. vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
  1822. sizeof(u64), GFP_KERNEL);
  1823. if (!vsc8531->stats)
  1824. return -ENOMEM;
  1825. return vsc85xx_dt_led_modes_get(phydev, default_mode);
  1826. }
  1827. static int vsc8574_probe(struct phy_device *phydev)
  1828. {
  1829. struct vsc8531_private *vsc8531;
  1830. u32 default_mode[4] = {VSC8531_LINK_1000_ACTIVITY,
  1831. VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY,
  1832. VSC8531_DUPLEX_COLLISION};
  1833. vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL);
  1834. if (!vsc8531)
  1835. return -ENOMEM;
  1836. phydev->priv = vsc8531;
  1837. vsc8531->nleds = 4;
  1838. vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES;
  1839. vsc8531->hw_stats = vsc8584_hw_stats;
  1840. vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats);
  1841. vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
  1842. sizeof(u64), GFP_KERNEL);
  1843. if (!vsc8531->stats)
  1844. return -ENOMEM;
  1845. return vsc85xx_dt_led_modes_get(phydev, default_mode);
  1846. }
  1847. static int vsc8584_probe(struct phy_device *phydev)
  1848. {
  1849. struct vsc8531_private *vsc8531;
  1850. u32 default_mode[4] = {VSC8531_LINK_1000_ACTIVITY,
  1851. VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY,
  1852. VSC8531_DUPLEX_COLLISION};
  1853. if ((phydev->phy_id & MSCC_DEV_REV_MASK) != VSC8584_REVB) {
  1854. dev_err(&phydev->mdio.dev, "Only VSC8584 revB is supported.\n");
  1855. return -ENOTSUPP;
  1856. }
  1857. vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL);
  1858. if (!vsc8531)
  1859. return -ENOMEM;
  1860. phydev->priv = vsc8531;
  1861. vsc8531->nleds = 4;
  1862. vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES;
  1863. vsc8531->hw_stats = vsc8584_hw_stats;
  1864. vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats);
  1865. vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
  1866. sizeof(u64), GFP_KERNEL);
  1867. if (!vsc8531->stats)
  1868. return -ENOMEM;
  1869. return vsc85xx_dt_led_modes_get(phydev, default_mode);
  1870. }
  1871. static int vsc85xx_probe(struct phy_device *phydev)
  1872. {
  1873. struct vsc8531_private *vsc8531;
  1874. int rate_magic;
  1875. u32 default_mode[2] = {VSC8531_LINK_1000_ACTIVITY,
  1876. VSC8531_LINK_100_ACTIVITY};
  1877. rate_magic = vsc85xx_edge_rate_magic_get(phydev);
  1878. if (rate_magic < 0)
  1879. return rate_magic;
  1880. vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL);
  1881. if (!vsc8531)
  1882. return -ENOMEM;
  1883. phydev->priv = vsc8531;
  1884. vsc8531->rate_magic = rate_magic;
  1885. vsc8531->nleds = 2;
  1886. vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES;
  1887. vsc8531->hw_stats = vsc85xx_hw_stats;
  1888. vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats);
  1889. vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
  1890. sizeof(u64), GFP_KERNEL);
  1891. if (!vsc8531->stats)
  1892. return -ENOMEM;
  1893. return vsc85xx_dt_led_modes_get(phydev, default_mode);
  1894. }
  1895. /* Microsemi VSC85xx PHYs */
  1896. static struct phy_driver vsc85xx_driver[] = {
  1897. {
  1898. .phy_id = PHY_ID_VSC8514,
  1899. .name = "Microsemi GE VSC8514 SyncE",
  1900. .phy_id_mask = 0xfffffff0,
  1901. .soft_reset = &genphy_soft_reset,
  1902. .config_init = &vsc8514_config_init,
  1903. .config_aneg = &vsc85xx_config_aneg,
  1904. .read_status = &vsc85xx_read_status,
  1905. .ack_interrupt = &vsc85xx_ack_interrupt,
  1906. .config_intr = &vsc85xx_config_intr,
  1907. .suspend = &genphy_suspend,
  1908. .resume = &genphy_resume,
  1909. .probe = &vsc8514_probe,
  1910. .set_wol = &vsc85xx_wol_set,
  1911. .get_wol = &vsc85xx_wol_get,
  1912. .get_tunable = &vsc85xx_get_tunable,
  1913. .set_tunable = &vsc85xx_set_tunable,
  1914. .read_page = &vsc85xx_phy_read_page,
  1915. .write_page = &vsc85xx_phy_write_page,
  1916. .get_sset_count = &vsc85xx_get_sset_count,
  1917. .get_strings = &vsc85xx_get_strings,
  1918. .get_stats = &vsc85xx_get_stats,
  1919. },
  1920. {
  1921. .phy_id = PHY_ID_VSC8530,
  1922. .name = "Microsemi FE VSC8530",
  1923. .phy_id_mask = 0xfffffff0,
  1924. /* PHY_BASIC_FEATURES */
  1925. .soft_reset = &genphy_soft_reset,
  1926. .config_init = &vsc85xx_config_init,
  1927. .config_aneg = &vsc85xx_config_aneg,
  1928. .aneg_done = &genphy_aneg_done,
  1929. .read_status = &vsc85xx_read_status,
  1930. .ack_interrupt = &vsc85xx_ack_interrupt,
  1931. .config_intr = &vsc85xx_config_intr,
  1932. .suspend = &genphy_suspend,
  1933. .resume = &genphy_resume,
  1934. .probe = &vsc85xx_probe,
  1935. .set_wol = &vsc85xx_wol_set,
  1936. .get_wol = &vsc85xx_wol_get,
  1937. .get_tunable = &vsc85xx_get_tunable,
  1938. .set_tunable = &vsc85xx_set_tunable,
  1939. .read_page = &vsc85xx_phy_read_page,
  1940. .write_page = &vsc85xx_phy_write_page,
  1941. .get_sset_count = &vsc85xx_get_sset_count,
  1942. .get_strings = &vsc85xx_get_strings,
  1943. .get_stats = &vsc85xx_get_stats,
  1944. },
  1945. {
  1946. .phy_id = PHY_ID_VSC8531,
  1947. .name = "Microsemi VSC8531",
  1948. .phy_id_mask = 0xfffffff0,
  1949. /* PHY_GBIT_FEATURES */
  1950. .soft_reset = &genphy_soft_reset,
  1951. .config_init = &vsc85xx_config_init,
  1952. .config_aneg = &vsc85xx_config_aneg,
  1953. .aneg_done = &genphy_aneg_done,
  1954. .read_status = &vsc85xx_read_status,
  1955. .ack_interrupt = &vsc85xx_ack_interrupt,
  1956. .config_intr = &vsc85xx_config_intr,
  1957. .suspend = &genphy_suspend,
  1958. .resume = &genphy_resume,
  1959. .probe = &vsc85xx_probe,
  1960. .set_wol = &vsc85xx_wol_set,
  1961. .get_wol = &vsc85xx_wol_get,
  1962. .get_tunable = &vsc85xx_get_tunable,
  1963. .set_tunable = &vsc85xx_set_tunable,
  1964. .read_page = &vsc85xx_phy_read_page,
  1965. .write_page = &vsc85xx_phy_write_page,
  1966. .get_sset_count = &vsc85xx_get_sset_count,
  1967. .get_strings = &vsc85xx_get_strings,
  1968. .get_stats = &vsc85xx_get_stats,
  1969. },
  1970. {
  1971. .phy_id = PHY_ID_VSC8540,
  1972. .name = "Microsemi FE VSC8540 SyncE",
  1973. .phy_id_mask = 0xfffffff0,
  1974. /* PHY_BASIC_FEATURES */
  1975. .soft_reset = &genphy_soft_reset,
  1976. .config_init = &vsc85xx_config_init,
  1977. .config_aneg = &vsc85xx_config_aneg,
  1978. .aneg_done = &genphy_aneg_done,
  1979. .read_status = &vsc85xx_read_status,
  1980. .ack_interrupt = &vsc85xx_ack_interrupt,
  1981. .config_intr = &vsc85xx_config_intr,
  1982. .suspend = &genphy_suspend,
  1983. .resume = &genphy_resume,
  1984. .probe = &vsc85xx_probe,
  1985. .set_wol = &vsc85xx_wol_set,
  1986. .get_wol = &vsc85xx_wol_get,
  1987. .get_tunable = &vsc85xx_get_tunable,
  1988. .set_tunable = &vsc85xx_set_tunable,
  1989. .read_page = &vsc85xx_phy_read_page,
  1990. .write_page = &vsc85xx_phy_write_page,
  1991. .get_sset_count = &vsc85xx_get_sset_count,
  1992. .get_strings = &vsc85xx_get_strings,
  1993. .get_stats = &vsc85xx_get_stats,
  1994. },
  1995. {
  1996. .phy_id = PHY_ID_VSC8541,
  1997. .name = "Microsemi VSC8541 SyncE",
  1998. .phy_id_mask = 0xfffffff0,
  1999. /* PHY_GBIT_FEATURES */
  2000. .soft_reset = &genphy_soft_reset,
  2001. .config_init = &vsc85xx_config_init,
  2002. .config_aneg = &vsc85xx_config_aneg,
  2003. .aneg_done = &genphy_aneg_done,
  2004. .read_status = &vsc85xx_read_status,
  2005. .ack_interrupt = &vsc85xx_ack_interrupt,
  2006. .config_intr = &vsc85xx_config_intr,
  2007. .suspend = &genphy_suspend,
  2008. .resume = &genphy_resume,
  2009. .probe = &vsc85xx_probe,
  2010. .set_wol = &vsc85xx_wol_set,
  2011. .get_wol = &vsc85xx_wol_get,
  2012. .get_tunable = &vsc85xx_get_tunable,
  2013. .set_tunable = &vsc85xx_set_tunable,
  2014. .read_page = &vsc85xx_phy_read_page,
  2015. .write_page = &vsc85xx_phy_write_page,
  2016. .get_sset_count = &vsc85xx_get_sset_count,
  2017. .get_strings = &vsc85xx_get_strings,
  2018. .get_stats = &vsc85xx_get_stats,
  2019. },
  2020. {
  2021. .phy_id = PHY_ID_VSC8574,
  2022. .name = "Microsemi GE VSC8574 SyncE",
  2023. .phy_id_mask = 0xfffffff0,
  2024. /* PHY_GBIT_FEATURES */
  2025. .soft_reset = &genphy_soft_reset,
  2026. .config_init = &vsc8584_config_init,
  2027. .config_aneg = &vsc85xx_config_aneg,
  2028. .aneg_done = &genphy_aneg_done,
  2029. .read_status = &vsc85xx_read_status,
  2030. .ack_interrupt = &vsc85xx_ack_interrupt,
  2031. .config_intr = &vsc85xx_config_intr,
  2032. .did_interrupt = &vsc8584_did_interrupt,
  2033. .suspend = &genphy_suspend,
  2034. .resume = &genphy_resume,
  2035. .probe = &vsc8574_probe,
  2036. .set_wol = &vsc85xx_wol_set,
  2037. .get_wol = &vsc85xx_wol_get,
  2038. .get_tunable = &vsc85xx_get_tunable,
  2039. .set_tunable = &vsc85xx_set_tunable,
  2040. .read_page = &vsc85xx_phy_read_page,
  2041. .write_page = &vsc85xx_phy_write_page,
  2042. .get_sset_count = &vsc85xx_get_sset_count,
  2043. .get_strings = &vsc85xx_get_strings,
  2044. .get_stats = &vsc85xx_get_stats,
  2045. },
  2046. {
  2047. .phy_id = PHY_ID_VSC8584,
  2048. .name = "Microsemi GE VSC8584 SyncE",
  2049. .phy_id_mask = 0xfffffff0,
  2050. /* PHY_GBIT_FEATURES */
  2051. .soft_reset = &genphy_soft_reset,
  2052. .config_init = &vsc8584_config_init,
  2053. .config_aneg = &vsc85xx_config_aneg,
  2054. .aneg_done = &genphy_aneg_done,
  2055. .read_status = &vsc85xx_read_status,
  2056. .ack_interrupt = &vsc85xx_ack_interrupt,
  2057. .config_intr = &vsc85xx_config_intr,
  2058. .did_interrupt = &vsc8584_did_interrupt,
  2059. .suspend = &genphy_suspend,
  2060. .resume = &genphy_resume,
  2061. .probe = &vsc8584_probe,
  2062. .get_tunable = &vsc85xx_get_tunable,
  2063. .set_tunable = &vsc85xx_set_tunable,
  2064. .read_page = &vsc85xx_phy_read_page,
  2065. .write_page = &vsc85xx_phy_write_page,
  2066. .get_sset_count = &vsc85xx_get_sset_count,
  2067. .get_strings = &vsc85xx_get_strings,
  2068. .get_stats = &vsc85xx_get_stats,
  2069. }
  2070. };
  2071. module_phy_driver(vsc85xx_driver);
  2072. static struct mdio_device_id __maybe_unused vsc85xx_tbl[] = {
  2073. { PHY_ID_VSC8514, 0xfffffff0, },
  2074. { PHY_ID_VSC8530, 0xfffffff0, },
  2075. { PHY_ID_VSC8531, 0xfffffff0, },
  2076. { PHY_ID_VSC8540, 0xfffffff0, },
  2077. { PHY_ID_VSC8541, 0xfffffff0, },
  2078. { PHY_ID_VSC8574, 0xfffffff0, },
  2079. { PHY_ID_VSC8584, 0xfffffff0, },
  2080. { }
  2081. };
  2082. MODULE_DEVICE_TABLE(mdio, vsc85xx_tbl);
  2083. MODULE_DESCRIPTION("Microsemi VSC85xx PHY driver");
  2084. MODULE_AUTHOR("Nagaraju Lakkaraju");
  2085. MODULE_LICENSE("Dual MIT/GPL");