adin.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  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/init.h>
  12. #include <linux/module.h>
  13. #include <linux/mii.h>
  14. #include <linux/phy.h>
  15. #include <linux/property.h>
  16. #define PHY_ID_ADIN1200 0x0283bc20
  17. #define PHY_ID_ADIN1300 0x0283bc30
  18. #define ADIN1300_MII_EXT_REG_PTR 0x0010
  19. #define ADIN1300_MII_EXT_REG_DATA 0x0011
  20. #define ADIN1300_PHY_CTRL1 0x0012
  21. #define ADIN1300_AUTO_MDI_EN BIT(10)
  22. #define ADIN1300_MAN_MDIX_EN BIT(9)
  23. #define ADIN1300_RX_ERR_CNT 0x0014
  24. #define ADIN1300_PHY_CTRL_STATUS2 0x0015
  25. #define ADIN1300_NRG_PD_EN BIT(3)
  26. #define ADIN1300_NRG_PD_TX_EN BIT(2)
  27. #define ADIN1300_NRG_PD_STATUS BIT(1)
  28. #define ADIN1300_PHY_CTRL2 0x0016
  29. #define ADIN1300_DOWNSPEED_AN_100_EN BIT(11)
  30. #define ADIN1300_DOWNSPEED_AN_10_EN BIT(10)
  31. #define ADIN1300_GROUP_MDIO_EN BIT(6)
  32. #define ADIN1300_DOWNSPEEDS_EN \
  33. (ADIN1300_DOWNSPEED_AN_100_EN | ADIN1300_DOWNSPEED_AN_10_EN)
  34. #define ADIN1300_PHY_CTRL3 0x0017
  35. #define ADIN1300_LINKING_EN BIT(13)
  36. #define ADIN1300_DOWNSPEED_RETRIES_MSK GENMASK(12, 10)
  37. #define ADIN1300_INT_MASK_REG 0x0018
  38. #define ADIN1300_INT_MDIO_SYNC_EN BIT(9)
  39. #define ADIN1300_INT_ANEG_STAT_CHNG_EN BIT(8)
  40. #define ADIN1300_INT_ANEG_PAGE_RX_EN BIT(6)
  41. #define ADIN1300_INT_IDLE_ERR_CNT_EN BIT(5)
  42. #define ADIN1300_INT_MAC_FIFO_OU_EN BIT(4)
  43. #define ADIN1300_INT_RX_STAT_CHNG_EN BIT(3)
  44. #define ADIN1300_INT_LINK_STAT_CHNG_EN BIT(2)
  45. #define ADIN1300_INT_SPEED_CHNG_EN BIT(1)
  46. #define ADIN1300_INT_HW_IRQ_EN BIT(0)
  47. #define ADIN1300_INT_MASK_EN \
  48. (ADIN1300_INT_LINK_STAT_CHNG_EN | ADIN1300_INT_HW_IRQ_EN)
  49. #define ADIN1300_INT_STATUS_REG 0x0019
  50. #define ADIN1300_PHY_STATUS1 0x001a
  51. #define ADIN1300_PAIR_01_SWAP BIT(11)
  52. /* EEE register addresses, accessible via Clause 22 access using
  53. * ADIN1300_MII_EXT_REG_PTR & ADIN1300_MII_EXT_REG_DATA.
  54. * The bit-fields are the same as specified by IEEE for EEE.
  55. */
  56. #define ADIN1300_EEE_CAP_REG 0x8000
  57. #define ADIN1300_EEE_ADV_REG 0x8001
  58. #define ADIN1300_EEE_LPABLE_REG 0x8002
  59. #define ADIN1300_CLOCK_STOP_REG 0x9400
  60. #define ADIN1300_LPI_WAKE_ERR_CNT_REG 0xa000
  61. #define ADIN1300_GE_SOFT_RESET_REG 0xff0c
  62. #define ADIN1300_GE_SOFT_RESET BIT(0)
  63. #define ADIN1300_GE_RGMII_CFG_REG 0xff23
  64. #define ADIN1300_GE_RGMII_RX_MSK GENMASK(8, 6)
  65. #define ADIN1300_GE_RGMII_RX_SEL(x) \
  66. FIELD_PREP(ADIN1300_GE_RGMII_RX_MSK, x)
  67. #define ADIN1300_GE_RGMII_GTX_MSK GENMASK(5, 3)
  68. #define ADIN1300_GE_RGMII_GTX_SEL(x) \
  69. FIELD_PREP(ADIN1300_GE_RGMII_GTX_MSK, x)
  70. #define ADIN1300_GE_RGMII_RXID_EN BIT(2)
  71. #define ADIN1300_GE_RGMII_TXID_EN BIT(1)
  72. #define ADIN1300_GE_RGMII_EN BIT(0)
  73. /* RGMII internal delay settings for rx and tx for ADIN1300 */
  74. #define ADIN1300_RGMII_1_60_NS 0x0001
  75. #define ADIN1300_RGMII_1_80_NS 0x0002
  76. #define ADIN1300_RGMII_2_00_NS 0x0000
  77. #define ADIN1300_RGMII_2_20_NS 0x0006
  78. #define ADIN1300_RGMII_2_40_NS 0x0007
  79. #define ADIN1300_GE_RMII_CFG_REG 0xff24
  80. #define ADIN1300_GE_RMII_FIFO_DEPTH_MSK GENMASK(6, 4)
  81. #define ADIN1300_GE_RMII_FIFO_DEPTH_SEL(x) \
  82. FIELD_PREP(ADIN1300_GE_RMII_FIFO_DEPTH_MSK, x)
  83. #define ADIN1300_GE_RMII_EN BIT(0)
  84. /* RMII fifo depth values */
  85. #define ADIN1300_RMII_4_BITS 0x0000
  86. #define ADIN1300_RMII_8_BITS 0x0001
  87. #define ADIN1300_RMII_12_BITS 0x0002
  88. #define ADIN1300_RMII_16_BITS 0x0003
  89. #define ADIN1300_RMII_20_BITS 0x0004
  90. #define ADIN1300_RMII_24_BITS 0x0005
  91. /**
  92. * struct adin_cfg_reg_map - map a config value to aregister value
  93. * @cfg value in device configuration
  94. * @reg value in the register
  95. */
  96. struct adin_cfg_reg_map {
  97. int cfg;
  98. int reg;
  99. };
  100. static const struct adin_cfg_reg_map adin_rgmii_delays[] = {
  101. { 1600, ADIN1300_RGMII_1_60_NS },
  102. { 1800, ADIN1300_RGMII_1_80_NS },
  103. { 2000, ADIN1300_RGMII_2_00_NS },
  104. { 2200, ADIN1300_RGMII_2_20_NS },
  105. { 2400, ADIN1300_RGMII_2_40_NS },
  106. { },
  107. };
  108. static const struct adin_cfg_reg_map adin_rmii_fifo_depths[] = {
  109. { 4, ADIN1300_RMII_4_BITS },
  110. { 8, ADIN1300_RMII_8_BITS },
  111. { 12, ADIN1300_RMII_12_BITS },
  112. { 16, ADIN1300_RMII_16_BITS },
  113. { 20, ADIN1300_RMII_20_BITS },
  114. { 24, ADIN1300_RMII_24_BITS },
  115. { },
  116. };
  117. /**
  118. * struct adin_clause45_mmd_map - map to convert Clause 45 regs to Clause 22
  119. * @devad device address used in Clause 45 access
  120. * @cl45_regnum register address defined by Clause 45
  121. * @adin_regnum equivalent register address accessible via Clause 22
  122. */
  123. struct adin_clause45_mmd_map {
  124. int devad;
  125. u16 cl45_regnum;
  126. u16 adin_regnum;
  127. };
  128. static struct adin_clause45_mmd_map adin_clause45_mmd_map[] = {
  129. { MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE, ADIN1300_EEE_CAP_REG },
  130. { MDIO_MMD_AN, MDIO_AN_EEE_LPABLE, ADIN1300_EEE_LPABLE_REG },
  131. { MDIO_MMD_AN, MDIO_AN_EEE_ADV, ADIN1300_EEE_ADV_REG },
  132. { MDIO_MMD_PCS, MDIO_CTRL1, ADIN1300_CLOCK_STOP_REG },
  133. { MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR, ADIN1300_LPI_WAKE_ERR_CNT_REG },
  134. };
  135. struct adin_hw_stat {
  136. const char *string;
  137. u16 reg1;
  138. u16 reg2;
  139. };
  140. static struct adin_hw_stat adin_hw_stats[] = {
  141. { "total_frames_checked_count", 0x940A, 0x940B }, /* hi + lo */
  142. { "length_error_frames_count", 0x940C },
  143. { "alignment_error_frames_count", 0x940D },
  144. { "symbol_error_count", 0x940E },
  145. { "oversized_frames_count", 0x940F },
  146. { "undersized_frames_count", 0x9410 },
  147. { "odd_nibble_frames_count", 0x9411 },
  148. { "odd_preamble_packet_count", 0x9412 },
  149. { "dribble_bits_frames_count", 0x9413 },
  150. { "false_carrier_events_count", 0x9414 },
  151. };
  152. /**
  153. * struct adin_priv - ADIN PHY driver private data
  154. * stats statistic counters for the PHY
  155. */
  156. struct adin_priv {
  157. u64 stats[ARRAY_SIZE(adin_hw_stats)];
  158. };
  159. static int adin_lookup_reg_value(const struct adin_cfg_reg_map *tbl, int cfg)
  160. {
  161. size_t i;
  162. for (i = 0; tbl[i].cfg; i++) {
  163. if (tbl[i].cfg == cfg)
  164. return tbl[i].reg;
  165. }
  166. return -EINVAL;
  167. }
  168. static u32 adin_get_reg_value(struct phy_device *phydev,
  169. const char *prop_name,
  170. const struct adin_cfg_reg_map *tbl,
  171. u32 dflt)
  172. {
  173. struct device *dev = &phydev->mdio.dev;
  174. u32 val;
  175. int rc;
  176. if (device_property_read_u32(dev, prop_name, &val))
  177. return dflt;
  178. rc = adin_lookup_reg_value(tbl, val);
  179. if (rc < 0) {
  180. phydev_warn(phydev,
  181. "Unsupported value %u for %s using default (%u)\n",
  182. val, prop_name, dflt);
  183. return dflt;
  184. }
  185. return rc;
  186. }
  187. static int adin_config_rgmii_mode(struct phy_device *phydev)
  188. {
  189. u32 val;
  190. int reg;
  191. if (!phy_interface_is_rgmii(phydev))
  192. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  193. ADIN1300_GE_RGMII_CFG_REG,
  194. ADIN1300_GE_RGMII_EN);
  195. reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_RGMII_CFG_REG);
  196. if (reg < 0)
  197. return reg;
  198. reg |= ADIN1300_GE_RGMII_EN;
  199. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
  200. phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
  201. reg |= ADIN1300_GE_RGMII_RXID_EN;
  202. val = adin_get_reg_value(phydev, "adi,rx-internal-delay-ps",
  203. adin_rgmii_delays,
  204. ADIN1300_RGMII_2_00_NS);
  205. reg &= ~ADIN1300_GE_RGMII_RX_MSK;
  206. reg |= ADIN1300_GE_RGMII_RX_SEL(val);
  207. } else {
  208. reg &= ~ADIN1300_GE_RGMII_RXID_EN;
  209. }
  210. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
  211. phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
  212. reg |= ADIN1300_GE_RGMII_TXID_EN;
  213. val = adin_get_reg_value(phydev, "adi,tx-internal-delay-ps",
  214. adin_rgmii_delays,
  215. ADIN1300_RGMII_2_00_NS);
  216. reg &= ~ADIN1300_GE_RGMII_GTX_MSK;
  217. reg |= ADIN1300_GE_RGMII_GTX_SEL(val);
  218. } else {
  219. reg &= ~ADIN1300_GE_RGMII_TXID_EN;
  220. }
  221. return phy_write_mmd(phydev, MDIO_MMD_VEND1,
  222. ADIN1300_GE_RGMII_CFG_REG, reg);
  223. }
  224. static int adin_config_rmii_mode(struct phy_device *phydev)
  225. {
  226. u32 val;
  227. int reg;
  228. if (phydev->interface != PHY_INTERFACE_MODE_RMII)
  229. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  230. ADIN1300_GE_RMII_CFG_REG,
  231. ADIN1300_GE_RMII_EN);
  232. reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_RMII_CFG_REG);
  233. if (reg < 0)
  234. return reg;
  235. reg |= ADIN1300_GE_RMII_EN;
  236. val = adin_get_reg_value(phydev, "adi,fifo-depth-bits",
  237. adin_rmii_fifo_depths,
  238. ADIN1300_RMII_8_BITS);
  239. reg &= ~ADIN1300_GE_RMII_FIFO_DEPTH_MSK;
  240. reg |= ADIN1300_GE_RMII_FIFO_DEPTH_SEL(val);
  241. return phy_write_mmd(phydev, MDIO_MMD_VEND1,
  242. ADIN1300_GE_RMII_CFG_REG, reg);
  243. }
  244. static int adin_get_downshift(struct phy_device *phydev, u8 *data)
  245. {
  246. int val, cnt, enable;
  247. val = phy_read(phydev, ADIN1300_PHY_CTRL2);
  248. if (val < 0)
  249. return val;
  250. cnt = phy_read(phydev, ADIN1300_PHY_CTRL3);
  251. if (cnt < 0)
  252. return cnt;
  253. enable = FIELD_GET(ADIN1300_DOWNSPEEDS_EN, val);
  254. cnt = FIELD_GET(ADIN1300_DOWNSPEED_RETRIES_MSK, cnt);
  255. *data = (enable && cnt) ? cnt : DOWNSHIFT_DEV_DISABLE;
  256. return 0;
  257. }
  258. static int adin_set_downshift(struct phy_device *phydev, u8 cnt)
  259. {
  260. u16 val;
  261. int rc;
  262. if (cnt == DOWNSHIFT_DEV_DISABLE)
  263. return phy_clear_bits(phydev, ADIN1300_PHY_CTRL2,
  264. ADIN1300_DOWNSPEEDS_EN);
  265. if (cnt > 7)
  266. return -E2BIG;
  267. val = FIELD_PREP(ADIN1300_DOWNSPEED_RETRIES_MSK, cnt);
  268. val |= ADIN1300_LINKING_EN;
  269. rc = phy_modify(phydev, ADIN1300_PHY_CTRL3,
  270. ADIN1300_LINKING_EN | ADIN1300_DOWNSPEED_RETRIES_MSK,
  271. val);
  272. if (rc < 0)
  273. return rc;
  274. return phy_set_bits(phydev, ADIN1300_PHY_CTRL2,
  275. ADIN1300_DOWNSPEEDS_EN);
  276. }
  277. static int adin_get_edpd(struct phy_device *phydev, u16 *tx_interval)
  278. {
  279. int val;
  280. val = phy_read(phydev, ADIN1300_PHY_CTRL_STATUS2);
  281. if (val < 0)
  282. return val;
  283. if (ADIN1300_NRG_PD_EN & val) {
  284. if (val & ADIN1300_NRG_PD_TX_EN)
  285. /* default is 1 second */
  286. *tx_interval = ETHTOOL_PHY_EDPD_DFLT_TX_MSECS;
  287. else
  288. *tx_interval = ETHTOOL_PHY_EDPD_NO_TX;
  289. } else {
  290. *tx_interval = ETHTOOL_PHY_EDPD_DISABLE;
  291. }
  292. return 0;
  293. }
  294. static int adin_set_edpd(struct phy_device *phydev, u16 tx_interval)
  295. {
  296. u16 val;
  297. if (tx_interval == ETHTOOL_PHY_EDPD_DISABLE)
  298. return phy_clear_bits(phydev, ADIN1300_PHY_CTRL_STATUS2,
  299. (ADIN1300_NRG_PD_EN | ADIN1300_NRG_PD_TX_EN));
  300. val = ADIN1300_NRG_PD_EN;
  301. switch (tx_interval) {
  302. case 1000: /* 1 second */
  303. /* fallthrough */
  304. case ETHTOOL_PHY_EDPD_DFLT_TX_MSECS:
  305. val |= ADIN1300_NRG_PD_TX_EN;
  306. /* fallthrough */
  307. case ETHTOOL_PHY_EDPD_NO_TX:
  308. break;
  309. default:
  310. return -EINVAL;
  311. }
  312. return phy_modify(phydev, ADIN1300_PHY_CTRL_STATUS2,
  313. (ADIN1300_NRG_PD_EN | ADIN1300_NRG_PD_TX_EN),
  314. val);
  315. }
  316. static int adin_get_tunable(struct phy_device *phydev,
  317. struct ethtool_tunable *tuna, void *data)
  318. {
  319. switch (tuna->id) {
  320. case ETHTOOL_PHY_DOWNSHIFT:
  321. return adin_get_downshift(phydev, data);
  322. case ETHTOOL_PHY_EDPD:
  323. return adin_get_edpd(phydev, data);
  324. default:
  325. return -EOPNOTSUPP;
  326. }
  327. }
  328. static int adin_set_tunable(struct phy_device *phydev,
  329. struct ethtool_tunable *tuna, const void *data)
  330. {
  331. switch (tuna->id) {
  332. case ETHTOOL_PHY_DOWNSHIFT:
  333. return adin_set_downshift(phydev, *(const u8 *)data);
  334. case ETHTOOL_PHY_EDPD:
  335. return adin_set_edpd(phydev, *(const u16 *)data);
  336. default:
  337. return -EOPNOTSUPP;
  338. }
  339. }
  340. static int adin_config_init(struct phy_device *phydev)
  341. {
  342. int rc;
  343. phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
  344. rc = adin_config_rgmii_mode(phydev);
  345. if (rc < 0)
  346. return rc;
  347. rc = adin_config_rmii_mode(phydev);
  348. if (rc < 0)
  349. return rc;
  350. rc = adin_set_downshift(phydev, 4);
  351. if (rc < 0)
  352. return rc;
  353. rc = adin_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS);
  354. if (rc < 0)
  355. return rc;
  356. phydev_dbg(phydev, "PHY is using mode '%s'\n",
  357. phy_modes(phydev->interface));
  358. return 0;
  359. }
  360. static int adin_phy_ack_intr(struct phy_device *phydev)
  361. {
  362. /* Clear pending interrupts */
  363. int rc = phy_read(phydev, ADIN1300_INT_STATUS_REG);
  364. return rc < 0 ? rc : 0;
  365. }
  366. static int adin_phy_config_intr(struct phy_device *phydev)
  367. {
  368. if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
  369. return phy_set_bits(phydev, ADIN1300_INT_MASK_REG,
  370. ADIN1300_INT_MASK_EN);
  371. return phy_clear_bits(phydev, ADIN1300_INT_MASK_REG,
  372. ADIN1300_INT_MASK_EN);
  373. }
  374. static int adin_cl45_to_adin_reg(struct phy_device *phydev, int devad,
  375. u16 cl45_regnum)
  376. {
  377. struct adin_clause45_mmd_map *m;
  378. int i;
  379. if (devad == MDIO_MMD_VEND1)
  380. return cl45_regnum;
  381. for (i = 0; i < ARRAY_SIZE(adin_clause45_mmd_map); i++) {
  382. m = &adin_clause45_mmd_map[i];
  383. if (m->devad == devad && m->cl45_regnum == cl45_regnum)
  384. return m->adin_regnum;
  385. }
  386. phydev_err(phydev,
  387. "No translation available for devad: %d reg: %04x\n",
  388. devad, cl45_regnum);
  389. return -EINVAL;
  390. }
  391. static int adin_read_mmd(struct phy_device *phydev, int devad, u16 regnum)
  392. {
  393. struct mii_bus *bus = phydev->mdio.bus;
  394. int phy_addr = phydev->mdio.addr;
  395. int adin_regnum;
  396. int err;
  397. adin_regnum = adin_cl45_to_adin_reg(phydev, devad, regnum);
  398. if (adin_regnum < 0)
  399. return adin_regnum;
  400. err = __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_PTR,
  401. adin_regnum);
  402. if (err)
  403. return err;
  404. return __mdiobus_read(bus, phy_addr, ADIN1300_MII_EXT_REG_DATA);
  405. }
  406. static int adin_write_mmd(struct phy_device *phydev, int devad, u16 regnum,
  407. u16 val)
  408. {
  409. struct mii_bus *bus = phydev->mdio.bus;
  410. int phy_addr = phydev->mdio.addr;
  411. int adin_regnum;
  412. int err;
  413. adin_regnum = adin_cl45_to_adin_reg(phydev, devad, regnum);
  414. if (adin_regnum < 0)
  415. return adin_regnum;
  416. err = __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_PTR,
  417. adin_regnum);
  418. if (err)
  419. return err;
  420. return __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_DATA, val);
  421. }
  422. static int adin_config_mdix(struct phy_device *phydev)
  423. {
  424. bool auto_en, mdix_en;
  425. int reg;
  426. mdix_en = false;
  427. auto_en = false;
  428. switch (phydev->mdix_ctrl) {
  429. case ETH_TP_MDI:
  430. break;
  431. case ETH_TP_MDI_X:
  432. mdix_en = true;
  433. break;
  434. case ETH_TP_MDI_AUTO:
  435. auto_en = true;
  436. break;
  437. default:
  438. return -EINVAL;
  439. }
  440. reg = phy_read(phydev, ADIN1300_PHY_CTRL1);
  441. if (reg < 0)
  442. return reg;
  443. if (mdix_en)
  444. reg |= ADIN1300_MAN_MDIX_EN;
  445. else
  446. reg &= ~ADIN1300_MAN_MDIX_EN;
  447. if (auto_en)
  448. reg |= ADIN1300_AUTO_MDI_EN;
  449. else
  450. reg &= ~ADIN1300_AUTO_MDI_EN;
  451. return phy_write(phydev, ADIN1300_PHY_CTRL1, reg);
  452. }
  453. static int adin_config_aneg(struct phy_device *phydev)
  454. {
  455. int ret;
  456. ret = adin_config_mdix(phydev);
  457. if (ret)
  458. return ret;
  459. return genphy_config_aneg(phydev);
  460. }
  461. static int adin_mdix_update(struct phy_device *phydev)
  462. {
  463. bool auto_en, mdix_en;
  464. bool swapped;
  465. int reg;
  466. reg = phy_read(phydev, ADIN1300_PHY_CTRL1);
  467. if (reg < 0)
  468. return reg;
  469. auto_en = !!(reg & ADIN1300_AUTO_MDI_EN);
  470. mdix_en = !!(reg & ADIN1300_MAN_MDIX_EN);
  471. /* If MDI/MDIX is forced, just read it from the control reg */
  472. if (!auto_en) {
  473. if (mdix_en)
  474. phydev->mdix = ETH_TP_MDI_X;
  475. else
  476. phydev->mdix = ETH_TP_MDI;
  477. return 0;
  478. }
  479. /**
  480. * Otherwise, we need to deduce it from the PHY status2 reg.
  481. * When Auto-MDI is enabled, the ADIN1300_MAN_MDIX_EN bit implies
  482. * a preference for MDIX when it is set.
  483. */
  484. reg = phy_read(phydev, ADIN1300_PHY_STATUS1);
  485. if (reg < 0)
  486. return reg;
  487. swapped = !!(reg & ADIN1300_PAIR_01_SWAP);
  488. if (mdix_en != swapped)
  489. phydev->mdix = ETH_TP_MDI_X;
  490. else
  491. phydev->mdix = ETH_TP_MDI;
  492. return 0;
  493. }
  494. static int adin_read_status(struct phy_device *phydev)
  495. {
  496. int ret;
  497. ret = adin_mdix_update(phydev);
  498. if (ret < 0)
  499. return ret;
  500. return genphy_read_status(phydev);
  501. }
  502. static int adin_soft_reset(struct phy_device *phydev)
  503. {
  504. int rc;
  505. /* The reset bit is self-clearing, set it and wait */
  506. rc = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  507. ADIN1300_GE_SOFT_RESET_REG,
  508. ADIN1300_GE_SOFT_RESET);
  509. if (rc < 0)
  510. return rc;
  511. msleep(10);
  512. /* If we get a read error something may be wrong */
  513. rc = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  514. ADIN1300_GE_SOFT_RESET_REG);
  515. return rc < 0 ? rc : 0;
  516. }
  517. static int adin_get_sset_count(struct phy_device *phydev)
  518. {
  519. return ARRAY_SIZE(adin_hw_stats);
  520. }
  521. static void adin_get_strings(struct phy_device *phydev, u8 *data)
  522. {
  523. int i;
  524. for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++) {
  525. strlcpy(&data[i * ETH_GSTRING_LEN],
  526. adin_hw_stats[i].string, ETH_GSTRING_LEN);
  527. }
  528. }
  529. static int adin_read_mmd_stat_regs(struct phy_device *phydev,
  530. struct adin_hw_stat *stat,
  531. u32 *val)
  532. {
  533. int ret;
  534. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg1);
  535. if (ret < 0)
  536. return ret;
  537. *val = (ret & 0xffff);
  538. if (stat->reg2 == 0)
  539. return 0;
  540. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg2);
  541. if (ret < 0)
  542. return ret;
  543. *val <<= 16;
  544. *val |= (ret & 0xffff);
  545. return 0;
  546. }
  547. static u64 adin_get_stat(struct phy_device *phydev, int i)
  548. {
  549. struct adin_hw_stat *stat = &adin_hw_stats[i];
  550. struct adin_priv *priv = phydev->priv;
  551. u32 val;
  552. int ret;
  553. if (stat->reg1 > 0x1f) {
  554. ret = adin_read_mmd_stat_regs(phydev, stat, &val);
  555. if (ret < 0)
  556. return (u64)(~0);
  557. } else {
  558. ret = phy_read(phydev, stat->reg1);
  559. if (ret < 0)
  560. return (u64)(~0);
  561. val = (ret & 0xffff);
  562. }
  563. priv->stats[i] += val;
  564. return priv->stats[i];
  565. }
  566. static void adin_get_stats(struct phy_device *phydev,
  567. struct ethtool_stats *stats, u64 *data)
  568. {
  569. int i, rc;
  570. /* latch copies of all the frame-checker counters */
  571. rc = phy_read(phydev, ADIN1300_RX_ERR_CNT);
  572. if (rc < 0)
  573. return;
  574. for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++)
  575. data[i] = adin_get_stat(phydev, i);
  576. }
  577. static int adin_probe(struct phy_device *phydev)
  578. {
  579. struct device *dev = &phydev->mdio.dev;
  580. struct adin_priv *priv;
  581. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  582. if (!priv)
  583. return -ENOMEM;
  584. phydev->priv = priv;
  585. return 0;
  586. }
  587. static struct phy_driver adin_driver[] = {
  588. {
  589. PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200),
  590. .name = "ADIN1200",
  591. .probe = adin_probe,
  592. .config_init = adin_config_init,
  593. .soft_reset = adin_soft_reset,
  594. .config_aneg = adin_config_aneg,
  595. .read_status = adin_read_status,
  596. .get_tunable = adin_get_tunable,
  597. .set_tunable = adin_set_tunable,
  598. .ack_interrupt = adin_phy_ack_intr,
  599. .config_intr = adin_phy_config_intr,
  600. .get_sset_count = adin_get_sset_count,
  601. .get_strings = adin_get_strings,
  602. .get_stats = adin_get_stats,
  603. .resume = genphy_resume,
  604. .suspend = genphy_suspend,
  605. .read_mmd = adin_read_mmd,
  606. .write_mmd = adin_write_mmd,
  607. },
  608. {
  609. PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300),
  610. .name = "ADIN1300",
  611. .probe = adin_probe,
  612. .config_init = adin_config_init,
  613. .soft_reset = adin_soft_reset,
  614. .config_aneg = adin_config_aneg,
  615. .read_status = adin_read_status,
  616. .get_tunable = adin_get_tunable,
  617. .set_tunable = adin_set_tunable,
  618. .ack_interrupt = adin_phy_ack_intr,
  619. .config_intr = adin_phy_config_intr,
  620. .get_sset_count = adin_get_sset_count,
  621. .get_strings = adin_get_strings,
  622. .get_stats = adin_get_stats,
  623. .resume = genphy_resume,
  624. .suspend = genphy_suspend,
  625. .read_mmd = adin_read_mmd,
  626. .write_mmd = adin_write_mmd,
  627. },
  628. };
  629. module_phy_driver(adin_driver);
  630. static struct mdio_device_id __maybe_unused adin_tbl[] = {
  631. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200) },
  632. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300) },
  633. { }
  634. };
  635. MODULE_DEVICE_TABLE(mdio, adin_tbl);
  636. MODULE_DESCRIPTION("Analog Devices Industrial Ethernet PHY driver");
  637. MODULE_LICENSE("GPL");