adin.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Driver for Analog Devices Industrial Ethernet PHYs
  4. *
  5. * Copyright 2019 Analog Devices Inc.
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/bitfield.h>
  9. #include <linux/delay.h>
  10. #include <linux/errno.h>
  11. #include <linux/ethtool_netlink.h>
  12. #include <linux/init.h>
  13. #include <linux/module.h>
  14. #include <linux/mii.h>
  15. #include <linux/phy.h>
  16. #include <linux/property.h>
  17. #define PHY_ID_ADIN1200 0x0283bc20
  18. #define PHY_ID_ADIN1300 0x0283bc30
  19. #define ADIN1300_MII_EXT_REG_PTR 0x0010
  20. #define ADIN1300_MII_EXT_REG_DATA 0x0011
  21. #define ADIN1300_PHY_CTRL1 0x0012
  22. #define ADIN1300_AUTO_MDI_EN BIT(10)
  23. #define ADIN1300_MAN_MDIX_EN BIT(9)
  24. #define ADIN1300_DIAG_CLK_EN BIT(2)
  25. #define ADIN1300_RX_ERR_CNT 0x0014
  26. #define ADIN1300_PHY_CTRL_STATUS2 0x0015
  27. #define ADIN1300_NRG_PD_EN BIT(3)
  28. #define ADIN1300_NRG_PD_TX_EN BIT(2)
  29. #define ADIN1300_NRG_PD_STATUS BIT(1)
  30. #define ADIN1300_PHY_CTRL2 0x0016
  31. #define ADIN1300_DOWNSPEED_AN_100_EN BIT(11)
  32. #define ADIN1300_DOWNSPEED_AN_10_EN BIT(10)
  33. #define ADIN1300_GROUP_MDIO_EN BIT(6)
  34. #define ADIN1300_DOWNSPEEDS_EN \
  35. (ADIN1300_DOWNSPEED_AN_100_EN | ADIN1300_DOWNSPEED_AN_10_EN)
  36. #define ADIN1300_PHY_CTRL3 0x0017
  37. #define ADIN1300_LINKING_EN BIT(13)
  38. #define ADIN1300_DOWNSPEED_RETRIES_MSK GENMASK(12, 10)
  39. #define ADIN1300_INT_MASK_REG 0x0018
  40. #define ADIN1300_INT_MDIO_SYNC_EN BIT(9)
  41. #define ADIN1300_INT_ANEG_STAT_CHNG_EN BIT(8)
  42. #define ADIN1300_INT_ANEG_PAGE_RX_EN BIT(6)
  43. #define ADIN1300_INT_IDLE_ERR_CNT_EN BIT(5)
  44. #define ADIN1300_INT_MAC_FIFO_OU_EN BIT(4)
  45. #define ADIN1300_INT_RX_STAT_CHNG_EN BIT(3)
  46. #define ADIN1300_INT_LINK_STAT_CHNG_EN BIT(2)
  47. #define ADIN1300_INT_SPEED_CHNG_EN BIT(1)
  48. #define ADIN1300_INT_HW_IRQ_EN BIT(0)
  49. #define ADIN1300_INT_MASK_EN \
  50. (ADIN1300_INT_LINK_STAT_CHNG_EN | ADIN1300_INT_HW_IRQ_EN)
  51. #define ADIN1300_INT_STATUS_REG 0x0019
  52. #define ADIN1300_PHY_STATUS1 0x001a
  53. #define ADIN1300_PAIR_01_SWAP BIT(11)
  54. /* EEE register addresses, accessible via Clause 22 access using
  55. * ADIN1300_MII_EXT_REG_PTR & ADIN1300_MII_EXT_REG_DATA.
  56. * The bit-fields are the same as specified by IEEE for EEE.
  57. */
  58. #define ADIN1300_EEE_CAP_REG 0x8000
  59. #define ADIN1300_EEE_ADV_REG 0x8001
  60. #define ADIN1300_EEE_LPABLE_REG 0x8002
  61. #define ADIN1300_FLD_EN_REG 0x8E27
  62. #define ADIN1300_FLD_PCS_ERR_100_EN BIT(7)
  63. #define ADIN1300_FLD_PCS_ERR_1000_EN BIT(6)
  64. #define ADIN1300_FLD_SLCR_OUT_STUCK_100_EN BIT(5)
  65. #define ADIN1300_FLD_SLCR_OUT_STUCK_1000_EN BIT(4)
  66. #define ADIN1300_FLD_SLCR_IN_ZDET_100_EN BIT(3)
  67. #define ADIN1300_FLD_SLCR_IN_ZDET_1000_EN BIT(2)
  68. #define ADIN1300_FLD_SLCR_IN_INVLD_100_EN BIT(1)
  69. #define ADIN1300_FLD_SLCR_IN_INVLD_1000_EN BIT(0)
  70. /* These bits are the ones which are enabled by default. */
  71. #define ADIN1300_FLD_EN_ON \
  72. (ADIN1300_FLD_SLCR_OUT_STUCK_100_EN | \
  73. ADIN1300_FLD_SLCR_OUT_STUCK_1000_EN | \
  74. ADIN1300_FLD_SLCR_IN_ZDET_100_EN | \
  75. ADIN1300_FLD_SLCR_IN_ZDET_1000_EN | \
  76. ADIN1300_FLD_SLCR_IN_INVLD_1000_EN)
  77. #define ADIN1300_CLOCK_STOP_REG 0x9400
  78. #define ADIN1300_LPI_WAKE_ERR_CNT_REG 0xa000
  79. #define ADIN1300_B_100_ZPTM_DIMRX 0xB685
  80. #define ADIN1300_B_100_ZPTM_EN_DIMRX BIT(0)
  81. #define ADIN1300_CDIAG_RUN 0xba1b
  82. #define ADIN1300_CDIAG_RUN_EN BIT(0)
  83. /*
  84. * The XSIM3/2/1 and XSHRT3/2/1 are actually relative.
  85. * For CDIAG_DTLD_RSLTS(0) it's ADIN1300_CDIAG_RSLT_XSIM3/2/1
  86. * For CDIAG_DTLD_RSLTS(1) it's ADIN1300_CDIAG_RSLT_XSIM3/2/0
  87. * For CDIAG_DTLD_RSLTS(2) it's ADIN1300_CDIAG_RSLT_XSIM3/1/0
  88. * For CDIAG_DTLD_RSLTS(3) it's ADIN1300_CDIAG_RSLT_XSIM2/1/0
  89. */
  90. #define ADIN1300_CDIAG_DTLD_RSLTS(x) (0xba1d + (x))
  91. #define ADIN1300_CDIAG_RSLT_BUSY BIT(10)
  92. #define ADIN1300_CDIAG_RSLT_XSIM3 BIT(9)
  93. #define ADIN1300_CDIAG_RSLT_XSIM2 BIT(8)
  94. #define ADIN1300_CDIAG_RSLT_XSIM1 BIT(7)
  95. #define ADIN1300_CDIAG_RSLT_SIM BIT(6)
  96. #define ADIN1300_CDIAG_RSLT_XSHRT3 BIT(5)
  97. #define ADIN1300_CDIAG_RSLT_XSHRT2 BIT(4)
  98. #define ADIN1300_CDIAG_RSLT_XSHRT1 BIT(3)
  99. #define ADIN1300_CDIAG_RSLT_SHRT BIT(2)
  100. #define ADIN1300_CDIAG_RSLT_OPEN BIT(1)
  101. #define ADIN1300_CDIAG_RSLT_GOOD BIT(0)
  102. #define ADIN1300_CDIAG_FLT_DIST(x) (0xba21 + (x))
  103. #define ADIN1300_GE_SOFT_RESET_REG 0xff0c
  104. #define ADIN1300_GE_SOFT_RESET BIT(0)
  105. #define ADIN1300_GE_CLK_CFG_REG 0xff1f
  106. #define ADIN1300_GE_CLK_CFG_MASK GENMASK(5, 0)
  107. #define ADIN1300_GE_CLK_CFG_RCVR_125 BIT(5)
  108. #define ADIN1300_GE_CLK_CFG_FREE_125 BIT(4)
  109. #define ADIN1300_GE_CLK_CFG_REF_EN BIT(3)
  110. #define ADIN1300_GE_CLK_CFG_HRT_RCVR BIT(2)
  111. #define ADIN1300_GE_CLK_CFG_HRT_FREE BIT(1)
  112. #define ADIN1300_GE_CLK_CFG_25 BIT(0)
  113. #define ADIN1300_GE_RGMII_CFG_REG 0xff23
  114. #define ADIN1300_GE_RGMII_RX_MSK GENMASK(8, 6)
  115. #define ADIN1300_GE_RGMII_RX_SEL(x) \
  116. FIELD_PREP(ADIN1300_GE_RGMII_RX_MSK, x)
  117. #define ADIN1300_GE_RGMII_GTX_MSK GENMASK(5, 3)
  118. #define ADIN1300_GE_RGMII_GTX_SEL(x) \
  119. FIELD_PREP(ADIN1300_GE_RGMII_GTX_MSK, x)
  120. #define ADIN1300_GE_RGMII_RXID_EN BIT(2)
  121. #define ADIN1300_GE_RGMII_TXID_EN BIT(1)
  122. #define ADIN1300_GE_RGMII_EN BIT(0)
  123. /* RGMII internal delay settings for rx and tx for ADIN1300 */
  124. #define ADIN1300_RGMII_1_60_NS 0x0001
  125. #define ADIN1300_RGMII_1_80_NS 0x0002
  126. #define ADIN1300_RGMII_2_00_NS 0x0000
  127. #define ADIN1300_RGMII_2_20_NS 0x0006
  128. #define ADIN1300_RGMII_2_40_NS 0x0007
  129. #define ADIN1300_GE_RMII_CFG_REG 0xff24
  130. #define ADIN1300_GE_RMII_FIFO_DEPTH_MSK GENMASK(6, 4)
  131. #define ADIN1300_GE_RMII_FIFO_DEPTH_SEL(x) \
  132. FIELD_PREP(ADIN1300_GE_RMII_FIFO_DEPTH_MSK, x)
  133. #define ADIN1300_GE_RMII_EN BIT(0)
  134. /* RMII fifo depth values */
  135. #define ADIN1300_RMII_4_BITS 0x0000
  136. #define ADIN1300_RMII_8_BITS 0x0001
  137. #define ADIN1300_RMII_12_BITS 0x0002
  138. #define ADIN1300_RMII_16_BITS 0x0003
  139. #define ADIN1300_RMII_20_BITS 0x0004
  140. #define ADIN1300_RMII_24_BITS 0x0005
  141. /**
  142. * struct adin_cfg_reg_map - map a config value to aregister value
  143. * @cfg: value in device configuration
  144. * @reg: value in the register
  145. */
  146. struct adin_cfg_reg_map {
  147. int cfg;
  148. int reg;
  149. };
  150. static const struct adin_cfg_reg_map adin_rgmii_delays[] = {
  151. { 1600, ADIN1300_RGMII_1_60_NS },
  152. { 1800, ADIN1300_RGMII_1_80_NS },
  153. { 2000, ADIN1300_RGMII_2_00_NS },
  154. { 2200, ADIN1300_RGMII_2_20_NS },
  155. { 2400, ADIN1300_RGMII_2_40_NS },
  156. { },
  157. };
  158. static const struct adin_cfg_reg_map adin_rmii_fifo_depths[] = {
  159. { 4, ADIN1300_RMII_4_BITS },
  160. { 8, ADIN1300_RMII_8_BITS },
  161. { 12, ADIN1300_RMII_12_BITS },
  162. { 16, ADIN1300_RMII_16_BITS },
  163. { 20, ADIN1300_RMII_20_BITS },
  164. { 24, ADIN1300_RMII_24_BITS },
  165. { },
  166. };
  167. /**
  168. * struct adin_clause45_mmd_map - map to convert Clause 45 regs to Clause 22
  169. * @devad: device address used in Clause 45 access
  170. * @cl45_regnum: register address defined by Clause 45
  171. * @adin_regnum: equivalent register address accessible via Clause 22
  172. */
  173. struct adin_clause45_mmd_map {
  174. int devad;
  175. u16 cl45_regnum;
  176. u16 adin_regnum;
  177. };
  178. static const struct adin_clause45_mmd_map adin_clause45_mmd_map[] = {
  179. { MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE, ADIN1300_EEE_CAP_REG },
  180. { MDIO_MMD_AN, MDIO_AN_EEE_LPABLE, ADIN1300_EEE_LPABLE_REG },
  181. { MDIO_MMD_AN, MDIO_AN_EEE_ADV, ADIN1300_EEE_ADV_REG },
  182. { MDIO_MMD_PCS, MDIO_CTRL1, ADIN1300_CLOCK_STOP_REG },
  183. { MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR, ADIN1300_LPI_WAKE_ERR_CNT_REG },
  184. };
  185. struct adin_hw_stat {
  186. const char *string;
  187. u16 reg1;
  188. u16 reg2;
  189. };
  190. static const struct adin_hw_stat adin_hw_stats[] = {
  191. { "total_frames_checked_count", 0x940A, 0x940B }, /* hi + lo */
  192. { "length_error_frames_count", 0x940C },
  193. { "alignment_error_frames_count", 0x940D },
  194. { "symbol_error_count", 0x940E },
  195. { "oversized_frames_count", 0x940F },
  196. { "undersized_frames_count", 0x9410 },
  197. { "odd_nibble_frames_count", 0x9411 },
  198. { "odd_preamble_packet_count", 0x9412 },
  199. { "dribble_bits_frames_count", 0x9413 },
  200. { "false_carrier_events_count", 0x9414 },
  201. };
  202. /**
  203. * struct adin_priv - ADIN PHY driver private data
  204. * @stats: statistic counters for the PHY
  205. */
  206. struct adin_priv {
  207. u64 stats[ARRAY_SIZE(adin_hw_stats)];
  208. };
  209. static int adin_lookup_reg_value(const struct adin_cfg_reg_map *tbl, int cfg)
  210. {
  211. size_t i;
  212. for (i = 0; tbl[i].cfg; i++) {
  213. if (tbl[i].cfg == cfg)
  214. return tbl[i].reg;
  215. }
  216. return -EINVAL;
  217. }
  218. static u32 adin_get_reg_value(struct phy_device *phydev,
  219. const char *prop_name,
  220. const struct adin_cfg_reg_map *tbl,
  221. u32 dflt)
  222. {
  223. struct device *dev = &phydev->mdio.dev;
  224. u32 val;
  225. int rc;
  226. if (device_property_read_u32(dev, prop_name, &val))
  227. return dflt;
  228. rc = adin_lookup_reg_value(tbl, val);
  229. if (rc < 0) {
  230. phydev_warn(phydev,
  231. "Unsupported value %u for %s using default (%u)\n",
  232. val, prop_name, dflt);
  233. return dflt;
  234. }
  235. return rc;
  236. }
  237. static int adin_config_rgmii_mode(struct phy_device *phydev)
  238. {
  239. u32 val;
  240. int reg;
  241. if (!phy_interface_is_rgmii(phydev))
  242. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  243. ADIN1300_GE_RGMII_CFG_REG,
  244. ADIN1300_GE_RGMII_EN);
  245. reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_RGMII_CFG_REG);
  246. if (reg < 0)
  247. return reg;
  248. reg |= ADIN1300_GE_RGMII_EN;
  249. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
  250. phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
  251. reg |= ADIN1300_GE_RGMII_RXID_EN;
  252. val = adin_get_reg_value(phydev, "adi,rx-internal-delay-ps",
  253. adin_rgmii_delays,
  254. ADIN1300_RGMII_2_00_NS);
  255. reg &= ~ADIN1300_GE_RGMII_RX_MSK;
  256. reg |= ADIN1300_GE_RGMII_RX_SEL(val);
  257. } else {
  258. reg &= ~ADIN1300_GE_RGMII_RXID_EN;
  259. }
  260. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
  261. phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
  262. reg |= ADIN1300_GE_RGMII_TXID_EN;
  263. val = adin_get_reg_value(phydev, "adi,tx-internal-delay-ps",
  264. adin_rgmii_delays,
  265. ADIN1300_RGMII_2_00_NS);
  266. reg &= ~ADIN1300_GE_RGMII_GTX_MSK;
  267. reg |= ADIN1300_GE_RGMII_GTX_SEL(val);
  268. } else {
  269. reg &= ~ADIN1300_GE_RGMII_TXID_EN;
  270. }
  271. return phy_write_mmd(phydev, MDIO_MMD_VEND1,
  272. ADIN1300_GE_RGMII_CFG_REG, reg);
  273. }
  274. static int adin_config_rmii_mode(struct phy_device *phydev)
  275. {
  276. u32 val;
  277. int reg;
  278. if (phydev->interface != PHY_INTERFACE_MODE_RMII)
  279. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  280. ADIN1300_GE_RMII_CFG_REG,
  281. ADIN1300_GE_RMII_EN);
  282. reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_RMII_CFG_REG);
  283. if (reg < 0)
  284. return reg;
  285. reg |= ADIN1300_GE_RMII_EN;
  286. val = adin_get_reg_value(phydev, "adi,fifo-depth-bits",
  287. adin_rmii_fifo_depths,
  288. ADIN1300_RMII_8_BITS);
  289. reg &= ~ADIN1300_GE_RMII_FIFO_DEPTH_MSK;
  290. reg |= ADIN1300_GE_RMII_FIFO_DEPTH_SEL(val);
  291. return phy_write_mmd(phydev, MDIO_MMD_VEND1,
  292. ADIN1300_GE_RMII_CFG_REG, reg);
  293. }
  294. static int adin_get_downshift(struct phy_device *phydev, u8 *data)
  295. {
  296. int val, cnt, enable;
  297. val = phy_read(phydev, ADIN1300_PHY_CTRL2);
  298. if (val < 0)
  299. return val;
  300. cnt = phy_read(phydev, ADIN1300_PHY_CTRL3);
  301. if (cnt < 0)
  302. return cnt;
  303. enable = FIELD_GET(ADIN1300_DOWNSPEEDS_EN, val);
  304. cnt = FIELD_GET(ADIN1300_DOWNSPEED_RETRIES_MSK, cnt);
  305. *data = (enable && cnt) ? cnt : DOWNSHIFT_DEV_DISABLE;
  306. return 0;
  307. }
  308. static int adin_set_downshift(struct phy_device *phydev, u8 cnt)
  309. {
  310. u16 val;
  311. int rc;
  312. if (cnt == DOWNSHIFT_DEV_DISABLE)
  313. return phy_clear_bits(phydev, ADIN1300_PHY_CTRL2,
  314. ADIN1300_DOWNSPEEDS_EN);
  315. if (cnt > 7)
  316. return -E2BIG;
  317. val = FIELD_PREP(ADIN1300_DOWNSPEED_RETRIES_MSK, cnt);
  318. rc = phy_modify(phydev, ADIN1300_PHY_CTRL3,
  319. ADIN1300_DOWNSPEED_RETRIES_MSK,
  320. val);
  321. if (rc < 0)
  322. return rc;
  323. return phy_set_bits(phydev, ADIN1300_PHY_CTRL2,
  324. ADIN1300_DOWNSPEEDS_EN);
  325. }
  326. static int adin_get_edpd(struct phy_device *phydev, u16 *tx_interval)
  327. {
  328. int val;
  329. val = phy_read(phydev, ADIN1300_PHY_CTRL_STATUS2);
  330. if (val < 0)
  331. return val;
  332. if (ADIN1300_NRG_PD_EN & val) {
  333. if (val & ADIN1300_NRG_PD_TX_EN)
  334. /* default is 1 second */
  335. *tx_interval = ETHTOOL_PHY_EDPD_DFLT_TX_MSECS;
  336. else
  337. *tx_interval = ETHTOOL_PHY_EDPD_NO_TX;
  338. } else {
  339. *tx_interval = ETHTOOL_PHY_EDPD_DISABLE;
  340. }
  341. return 0;
  342. }
  343. static int adin_set_edpd(struct phy_device *phydev, u16 tx_interval)
  344. {
  345. u16 val;
  346. if (tx_interval == ETHTOOL_PHY_EDPD_DISABLE)
  347. return phy_clear_bits(phydev, ADIN1300_PHY_CTRL_STATUS2,
  348. (ADIN1300_NRG_PD_EN | ADIN1300_NRG_PD_TX_EN));
  349. val = ADIN1300_NRG_PD_EN;
  350. switch (tx_interval) {
  351. case 1000: /* 1 second */
  352. fallthrough;
  353. case ETHTOOL_PHY_EDPD_DFLT_TX_MSECS:
  354. val |= ADIN1300_NRG_PD_TX_EN;
  355. fallthrough;
  356. case ETHTOOL_PHY_EDPD_NO_TX:
  357. break;
  358. default:
  359. return -EINVAL;
  360. }
  361. return phy_modify(phydev, ADIN1300_PHY_CTRL_STATUS2,
  362. (ADIN1300_NRG_PD_EN | ADIN1300_NRG_PD_TX_EN),
  363. val);
  364. }
  365. static int adin_get_fast_down(struct phy_device *phydev, u8 *msecs)
  366. {
  367. int reg;
  368. reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_FLD_EN_REG);
  369. if (reg < 0)
  370. return reg;
  371. if (reg & ADIN1300_FLD_EN_ON)
  372. *msecs = ETHTOOL_PHY_FAST_LINK_DOWN_ON;
  373. else
  374. *msecs = ETHTOOL_PHY_FAST_LINK_DOWN_OFF;
  375. return 0;
  376. }
  377. static int adin_set_fast_down(struct phy_device *phydev, const u8 *msecs)
  378. {
  379. if (*msecs == ETHTOOL_PHY_FAST_LINK_DOWN_ON)
  380. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  381. ADIN1300_FLD_EN_REG,
  382. ADIN1300_FLD_EN_ON);
  383. if (*msecs == ETHTOOL_PHY_FAST_LINK_DOWN_OFF)
  384. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  385. ADIN1300_FLD_EN_REG,
  386. ADIN1300_FLD_EN_ON);
  387. return -EINVAL;
  388. }
  389. static int adin_get_tunable(struct phy_device *phydev,
  390. struct ethtool_tunable *tuna, void *data)
  391. {
  392. switch (tuna->id) {
  393. case ETHTOOL_PHY_DOWNSHIFT:
  394. return adin_get_downshift(phydev, data);
  395. case ETHTOOL_PHY_EDPD:
  396. return adin_get_edpd(phydev, data);
  397. case ETHTOOL_PHY_FAST_LINK_DOWN:
  398. return adin_get_fast_down(phydev, data);
  399. default:
  400. return -EOPNOTSUPP;
  401. }
  402. }
  403. static int adin_set_tunable(struct phy_device *phydev,
  404. struct ethtool_tunable *tuna, const void *data)
  405. {
  406. switch (tuna->id) {
  407. case ETHTOOL_PHY_DOWNSHIFT:
  408. return adin_set_downshift(phydev, *(const u8 *)data);
  409. case ETHTOOL_PHY_EDPD:
  410. return adin_set_edpd(phydev, *(const u16 *)data);
  411. case ETHTOOL_PHY_FAST_LINK_DOWN:
  412. return adin_set_fast_down(phydev, data);
  413. default:
  414. return -EOPNOTSUPP;
  415. }
  416. }
  417. static int adin_config_clk_out(struct phy_device *phydev)
  418. {
  419. struct device *dev = &phydev->mdio.dev;
  420. const char *val = NULL;
  421. u8 sel = 0;
  422. device_property_read_string(dev, "adi,phy-output-clock", &val);
  423. if (!val) {
  424. /* property not present, do not enable GP_CLK pin */
  425. } else if (strcmp(val, "25mhz-reference") == 0) {
  426. sel |= ADIN1300_GE_CLK_CFG_25;
  427. } else if (strcmp(val, "125mhz-free-running") == 0) {
  428. sel |= ADIN1300_GE_CLK_CFG_FREE_125;
  429. } else if (strcmp(val, "adaptive-free-running") == 0) {
  430. sel |= ADIN1300_GE_CLK_CFG_HRT_FREE;
  431. } else {
  432. phydev_err(phydev, "invalid adi,phy-output-clock\n");
  433. return -EINVAL;
  434. }
  435. if (device_property_read_bool(dev, "adi,phy-output-reference-clock"))
  436. sel |= ADIN1300_GE_CLK_CFG_REF_EN;
  437. return phy_modify_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_CLK_CFG_REG,
  438. ADIN1300_GE_CLK_CFG_MASK, sel);
  439. }
  440. static int adin_config_zptm100(struct phy_device *phydev)
  441. {
  442. struct device *dev = &phydev->mdio.dev;
  443. if (!(device_property_read_bool(dev, "adi,low-cmode-impedance")))
  444. return 0;
  445. /* clear bit 0 to configure for lowest common-mode impedance */
  446. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  447. ADIN1300_B_100_ZPTM_DIMRX,
  448. ADIN1300_B_100_ZPTM_EN_DIMRX);
  449. }
  450. static int adin_config_init(struct phy_device *phydev)
  451. {
  452. int rc;
  453. phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
  454. rc = adin_config_rgmii_mode(phydev);
  455. if (rc < 0)
  456. return rc;
  457. rc = adin_config_rmii_mode(phydev);
  458. if (rc < 0)
  459. return rc;
  460. rc = adin_set_downshift(phydev, 4);
  461. if (rc < 0)
  462. return rc;
  463. rc = adin_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS);
  464. if (rc < 0)
  465. return rc;
  466. rc = adin_config_clk_out(phydev);
  467. if (rc < 0)
  468. return rc;
  469. rc = adin_config_zptm100(phydev);
  470. if (rc < 0)
  471. return rc;
  472. phydev_dbg(phydev, "PHY is using mode '%s'\n",
  473. phy_modes(phydev->interface));
  474. return 0;
  475. }
  476. static int adin_phy_ack_intr(struct phy_device *phydev)
  477. {
  478. /* Clear pending interrupts */
  479. int rc = phy_read(phydev, ADIN1300_INT_STATUS_REG);
  480. return rc < 0 ? rc : 0;
  481. }
  482. static int adin_phy_config_intr(struct phy_device *phydev)
  483. {
  484. int err;
  485. if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  486. err = adin_phy_ack_intr(phydev);
  487. if (err)
  488. return err;
  489. err = phy_set_bits(phydev, ADIN1300_INT_MASK_REG,
  490. ADIN1300_INT_MASK_EN);
  491. } else {
  492. err = phy_clear_bits(phydev, ADIN1300_INT_MASK_REG,
  493. ADIN1300_INT_MASK_EN);
  494. if (err)
  495. return err;
  496. err = adin_phy_ack_intr(phydev);
  497. }
  498. return err;
  499. }
  500. static irqreturn_t adin_phy_handle_interrupt(struct phy_device *phydev)
  501. {
  502. int irq_status;
  503. irq_status = phy_read(phydev, ADIN1300_INT_STATUS_REG);
  504. if (irq_status < 0) {
  505. phy_error(phydev);
  506. return IRQ_NONE;
  507. }
  508. if (!(irq_status & ADIN1300_INT_LINK_STAT_CHNG_EN))
  509. return IRQ_NONE;
  510. phy_trigger_machine(phydev);
  511. return IRQ_HANDLED;
  512. }
  513. static int adin_cl45_to_adin_reg(struct phy_device *phydev, int devad,
  514. u16 cl45_regnum)
  515. {
  516. const struct adin_clause45_mmd_map *m;
  517. int i;
  518. if (devad == MDIO_MMD_VEND1)
  519. return cl45_regnum;
  520. for (i = 0; i < ARRAY_SIZE(adin_clause45_mmd_map); i++) {
  521. m = &adin_clause45_mmd_map[i];
  522. if (m->devad == devad && m->cl45_regnum == cl45_regnum)
  523. return m->adin_regnum;
  524. }
  525. phydev_err(phydev,
  526. "No translation available for devad: %d reg: %04x\n",
  527. devad, cl45_regnum);
  528. return -EINVAL;
  529. }
  530. static int adin_read_mmd(struct phy_device *phydev, int devad, u16 regnum)
  531. {
  532. struct mii_bus *bus = phydev->mdio.bus;
  533. int phy_addr = phydev->mdio.addr;
  534. int adin_regnum;
  535. int err;
  536. adin_regnum = adin_cl45_to_adin_reg(phydev, devad, regnum);
  537. if (adin_regnum < 0)
  538. return adin_regnum;
  539. err = __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_PTR,
  540. adin_regnum);
  541. if (err)
  542. return err;
  543. return __mdiobus_read(bus, phy_addr, ADIN1300_MII_EXT_REG_DATA);
  544. }
  545. static int adin_write_mmd(struct phy_device *phydev, int devad, u16 regnum,
  546. u16 val)
  547. {
  548. struct mii_bus *bus = phydev->mdio.bus;
  549. int phy_addr = phydev->mdio.addr;
  550. int adin_regnum;
  551. int err;
  552. adin_regnum = adin_cl45_to_adin_reg(phydev, devad, regnum);
  553. if (adin_regnum < 0)
  554. return adin_regnum;
  555. err = __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_PTR,
  556. adin_regnum);
  557. if (err)
  558. return err;
  559. return __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_DATA, val);
  560. }
  561. static int adin_config_mdix(struct phy_device *phydev)
  562. {
  563. bool auto_en, mdix_en;
  564. int reg;
  565. mdix_en = false;
  566. auto_en = false;
  567. switch (phydev->mdix_ctrl) {
  568. case ETH_TP_MDI:
  569. break;
  570. case ETH_TP_MDI_X:
  571. mdix_en = true;
  572. break;
  573. case ETH_TP_MDI_AUTO:
  574. auto_en = true;
  575. break;
  576. default:
  577. return -EINVAL;
  578. }
  579. reg = phy_read(phydev, ADIN1300_PHY_CTRL1);
  580. if (reg < 0)
  581. return reg;
  582. if (mdix_en)
  583. reg |= ADIN1300_MAN_MDIX_EN;
  584. else
  585. reg &= ~ADIN1300_MAN_MDIX_EN;
  586. if (auto_en)
  587. reg |= ADIN1300_AUTO_MDI_EN;
  588. else
  589. reg &= ~ADIN1300_AUTO_MDI_EN;
  590. return phy_write(phydev, ADIN1300_PHY_CTRL1, reg);
  591. }
  592. static int adin_config_aneg(struct phy_device *phydev)
  593. {
  594. int ret;
  595. ret = phy_clear_bits(phydev, ADIN1300_PHY_CTRL1, ADIN1300_DIAG_CLK_EN);
  596. if (ret < 0)
  597. return ret;
  598. ret = phy_set_bits(phydev, ADIN1300_PHY_CTRL3, ADIN1300_LINKING_EN);
  599. if (ret < 0)
  600. return ret;
  601. ret = adin_config_mdix(phydev);
  602. if (ret)
  603. return ret;
  604. return genphy_config_aneg(phydev);
  605. }
  606. static int adin_mdix_update(struct phy_device *phydev)
  607. {
  608. bool auto_en, mdix_en;
  609. bool swapped;
  610. int reg;
  611. reg = phy_read(phydev, ADIN1300_PHY_CTRL1);
  612. if (reg < 0)
  613. return reg;
  614. auto_en = !!(reg & ADIN1300_AUTO_MDI_EN);
  615. mdix_en = !!(reg & ADIN1300_MAN_MDIX_EN);
  616. /* If MDI/MDIX is forced, just read it from the control reg */
  617. if (!auto_en) {
  618. if (mdix_en)
  619. phydev->mdix = ETH_TP_MDI_X;
  620. else
  621. phydev->mdix = ETH_TP_MDI;
  622. return 0;
  623. }
  624. /**
  625. * Otherwise, we need to deduce it from the PHY status2 reg.
  626. * When Auto-MDI is enabled, the ADIN1300_MAN_MDIX_EN bit implies
  627. * a preference for MDIX when it is set.
  628. */
  629. reg = phy_read(phydev, ADIN1300_PHY_STATUS1);
  630. if (reg < 0)
  631. return reg;
  632. swapped = !!(reg & ADIN1300_PAIR_01_SWAP);
  633. if (mdix_en != swapped)
  634. phydev->mdix = ETH_TP_MDI_X;
  635. else
  636. phydev->mdix = ETH_TP_MDI;
  637. return 0;
  638. }
  639. static int adin_read_status(struct phy_device *phydev)
  640. {
  641. int ret;
  642. ret = adin_mdix_update(phydev);
  643. if (ret < 0)
  644. return ret;
  645. return genphy_read_status(phydev);
  646. }
  647. static int adin_soft_reset(struct phy_device *phydev)
  648. {
  649. int rc;
  650. /* The reset bit is self-clearing, set it and wait */
  651. rc = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  652. ADIN1300_GE_SOFT_RESET_REG,
  653. ADIN1300_GE_SOFT_RESET);
  654. if (rc < 0)
  655. return rc;
  656. msleep(20);
  657. /* If we get a read error something may be wrong */
  658. rc = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  659. ADIN1300_GE_SOFT_RESET_REG);
  660. return rc < 0 ? rc : 0;
  661. }
  662. static int adin_get_sset_count(struct phy_device *phydev)
  663. {
  664. return ARRAY_SIZE(adin_hw_stats);
  665. }
  666. static void adin_get_strings(struct phy_device *phydev, u8 *data)
  667. {
  668. int i;
  669. for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++)
  670. ethtool_puts(&data, adin_hw_stats[i].string);
  671. }
  672. static int adin_read_mmd_stat_regs(struct phy_device *phydev,
  673. const struct adin_hw_stat *stat,
  674. u32 *val)
  675. {
  676. int ret;
  677. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg1);
  678. if (ret < 0)
  679. return ret;
  680. *val = (ret & 0xffff);
  681. if (stat->reg2 == 0)
  682. return 0;
  683. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg2);
  684. if (ret < 0)
  685. return ret;
  686. *val <<= 16;
  687. *val |= (ret & 0xffff);
  688. return 0;
  689. }
  690. static u64 adin_get_stat(struct phy_device *phydev, int i)
  691. {
  692. const struct adin_hw_stat *stat = &adin_hw_stats[i];
  693. struct adin_priv *priv = phydev->priv;
  694. u32 val;
  695. int ret;
  696. if (stat->reg1 > 0x1f) {
  697. ret = adin_read_mmd_stat_regs(phydev, stat, &val);
  698. if (ret < 0)
  699. return (u64)(~0);
  700. } else {
  701. ret = phy_read(phydev, stat->reg1);
  702. if (ret < 0)
  703. return (u64)(~0);
  704. val = (ret & 0xffff);
  705. }
  706. priv->stats[i] += val;
  707. return priv->stats[i];
  708. }
  709. static void adin_get_stats(struct phy_device *phydev,
  710. struct ethtool_stats *stats, u64 *data)
  711. {
  712. int i, rc;
  713. /* latch copies of all the frame-checker counters */
  714. rc = phy_read(phydev, ADIN1300_RX_ERR_CNT);
  715. if (rc < 0)
  716. return;
  717. for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++)
  718. data[i] = adin_get_stat(phydev, i);
  719. }
  720. static int adin_probe(struct phy_device *phydev)
  721. {
  722. struct device *dev = &phydev->mdio.dev;
  723. struct adin_priv *priv;
  724. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  725. if (!priv)
  726. return -ENOMEM;
  727. phydev->priv = priv;
  728. return 0;
  729. }
  730. static int adin_cable_test_start(struct phy_device *phydev)
  731. {
  732. int ret;
  733. ret = phy_clear_bits(phydev, ADIN1300_PHY_CTRL3, ADIN1300_LINKING_EN);
  734. if (ret < 0)
  735. return ret;
  736. ret = phy_clear_bits(phydev, ADIN1300_PHY_CTRL1, ADIN1300_DIAG_CLK_EN);
  737. if (ret < 0)
  738. return ret;
  739. /* wait a bit for the clock to stabilize */
  740. msleep(50);
  741. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_CDIAG_RUN,
  742. ADIN1300_CDIAG_RUN_EN);
  743. }
  744. static int adin_cable_test_report_trans(int result)
  745. {
  746. int mask;
  747. if (result & ADIN1300_CDIAG_RSLT_GOOD)
  748. return ETHTOOL_A_CABLE_RESULT_CODE_OK;
  749. if (result & ADIN1300_CDIAG_RSLT_OPEN)
  750. return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
  751. /* short with other pairs */
  752. mask = ADIN1300_CDIAG_RSLT_XSHRT3 |
  753. ADIN1300_CDIAG_RSLT_XSHRT2 |
  754. ADIN1300_CDIAG_RSLT_XSHRT1;
  755. if (result & mask)
  756. return ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT;
  757. if (result & ADIN1300_CDIAG_RSLT_SHRT)
  758. return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
  759. return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
  760. }
  761. static int adin_cable_test_report_pair(struct phy_device *phydev,
  762. unsigned int pair)
  763. {
  764. int fault_rslt;
  765. int ret;
  766. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  767. ADIN1300_CDIAG_DTLD_RSLTS(pair));
  768. if (ret < 0)
  769. return ret;
  770. fault_rslt = adin_cable_test_report_trans(ret);
  771. ret = ethnl_cable_test_result(phydev, pair, fault_rslt);
  772. if (ret < 0)
  773. return ret;
  774. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  775. ADIN1300_CDIAG_FLT_DIST(pair));
  776. if (ret < 0)
  777. return ret;
  778. switch (fault_rslt) {
  779. case ETHTOOL_A_CABLE_RESULT_CODE_OPEN:
  780. case ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT:
  781. case ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT:
  782. return ethnl_cable_test_fault_length(phydev, pair, ret * 100);
  783. default:
  784. return 0;
  785. }
  786. }
  787. static int adin_cable_test_report(struct phy_device *phydev)
  788. {
  789. unsigned int pair;
  790. int ret;
  791. for (pair = ETHTOOL_A_CABLE_PAIR_A; pair <= ETHTOOL_A_CABLE_PAIR_D; pair++) {
  792. ret = adin_cable_test_report_pair(phydev, pair);
  793. if (ret < 0)
  794. return ret;
  795. }
  796. return 0;
  797. }
  798. static int adin_cable_test_get_status(struct phy_device *phydev,
  799. bool *finished)
  800. {
  801. int ret;
  802. *finished = false;
  803. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_CDIAG_RUN);
  804. if (ret < 0)
  805. return ret;
  806. if (ret & ADIN1300_CDIAG_RUN_EN)
  807. return 0;
  808. *finished = true;
  809. return adin_cable_test_report(phydev);
  810. }
  811. static struct phy_driver adin_driver[] = {
  812. {
  813. PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200),
  814. .name = "ADIN1200",
  815. .flags = PHY_POLL_CABLE_TEST,
  816. .probe = adin_probe,
  817. .config_init = adin_config_init,
  818. .soft_reset = adin_soft_reset,
  819. .config_aneg = adin_config_aneg,
  820. .read_status = adin_read_status,
  821. .get_tunable = adin_get_tunable,
  822. .set_tunable = adin_set_tunable,
  823. .config_intr = adin_phy_config_intr,
  824. .handle_interrupt = adin_phy_handle_interrupt,
  825. .get_sset_count = adin_get_sset_count,
  826. .get_strings = adin_get_strings,
  827. .get_stats = adin_get_stats,
  828. .resume = genphy_resume,
  829. .suspend = genphy_suspend,
  830. .read_mmd = adin_read_mmd,
  831. .write_mmd = adin_write_mmd,
  832. .cable_test_start = adin_cable_test_start,
  833. .cable_test_get_status = adin_cable_test_get_status,
  834. },
  835. {
  836. PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300),
  837. .name = "ADIN1300",
  838. .flags = PHY_POLL_CABLE_TEST,
  839. .probe = adin_probe,
  840. .config_init = adin_config_init,
  841. .soft_reset = adin_soft_reset,
  842. .config_aneg = adin_config_aneg,
  843. .read_status = adin_read_status,
  844. .get_tunable = adin_get_tunable,
  845. .set_tunable = adin_set_tunable,
  846. .config_intr = adin_phy_config_intr,
  847. .handle_interrupt = adin_phy_handle_interrupt,
  848. .get_sset_count = adin_get_sset_count,
  849. .get_strings = adin_get_strings,
  850. .get_stats = adin_get_stats,
  851. .resume = genphy_resume,
  852. .suspend = genphy_suspend,
  853. .read_mmd = adin_read_mmd,
  854. .write_mmd = adin_write_mmd,
  855. .cable_test_start = adin_cable_test_start,
  856. .cable_test_get_status = adin_cable_test_get_status,
  857. },
  858. };
  859. module_phy_driver(adin_driver);
  860. static const struct mdio_device_id __maybe_unused adin_tbl[] = {
  861. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200) },
  862. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300) },
  863. { }
  864. };
  865. MODULE_DEVICE_TABLE(mdio, adin_tbl);
  866. MODULE_DESCRIPTION("Analog Devices Industrial Ethernet PHY driver");
  867. MODULE_LICENSE("GPL");