microchip.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. * Copyright (C) 2015 Microchip Technology
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version 2
  7. * of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/mii.h>
  20. #include <linux/ethtool.h>
  21. #include <linux/phy.h>
  22. #include <linux/microchipphy.h>
  23. #include <linux/delay.h>
  24. #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
  25. #define DRIVER_DESC "Microchip LAN88XX PHY driver"
  26. struct lan88xx_priv {
  27. int chip_id;
  28. int chip_rev;
  29. __u32 wolopts;
  30. };
  31. static int lan88xx_read_page(struct phy_device *phydev)
  32. {
  33. return __phy_read(phydev, LAN88XX_EXT_PAGE_ACCESS);
  34. }
  35. static int lan88xx_write_page(struct phy_device *phydev, int page)
  36. {
  37. return __phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, page);
  38. }
  39. static int lan88xx_phy_config_intr(struct phy_device *phydev)
  40. {
  41. int rc;
  42. if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  43. /* unmask all source and clear them before enable */
  44. rc = phy_write(phydev, LAN88XX_INT_MASK, 0x7FFF);
  45. rc = phy_read(phydev, LAN88XX_INT_STS);
  46. rc = phy_write(phydev, LAN88XX_INT_MASK,
  47. LAN88XX_INT_MASK_MDINTPIN_EN_ |
  48. LAN88XX_INT_MASK_LINK_CHANGE_);
  49. } else {
  50. rc = phy_write(phydev, LAN88XX_INT_MASK, 0);
  51. }
  52. return rc < 0 ? rc : 0;
  53. }
  54. static int lan88xx_phy_ack_interrupt(struct phy_device *phydev)
  55. {
  56. int rc = phy_read(phydev, LAN88XX_INT_STS);
  57. return rc < 0 ? rc : 0;
  58. }
  59. static int lan88xx_suspend(struct phy_device *phydev)
  60. {
  61. struct lan88xx_priv *priv = phydev->priv;
  62. /* do not power down PHY when WOL is enabled */
  63. if (!priv->wolopts)
  64. genphy_suspend(phydev);
  65. return 0;
  66. }
  67. static int lan88xx_TR_reg_set(struct phy_device *phydev, u16 regaddr,
  68. u32 data)
  69. {
  70. int val, save_page, ret = 0;
  71. u16 buf;
  72. /* Save current page */
  73. save_page = phy_save_page(phydev);
  74. if (save_page < 0) {
  75. pr_warn("Failed to get current page\n");
  76. goto err;
  77. }
  78. /* Switch to TR page */
  79. lan88xx_write_page(phydev, LAN88XX_EXT_PAGE_ACCESS_TR);
  80. ret = __phy_write(phydev, LAN88XX_EXT_PAGE_TR_LOW_DATA,
  81. (data & 0xFFFF));
  82. if (ret < 0) {
  83. pr_warn("Failed to write TR low data\n");
  84. goto err;
  85. }
  86. ret = __phy_write(phydev, LAN88XX_EXT_PAGE_TR_HIGH_DATA,
  87. (data & 0x00FF0000) >> 16);
  88. if (ret < 0) {
  89. pr_warn("Failed to write TR high data\n");
  90. goto err;
  91. }
  92. /* Config control bits [15:13] of register */
  93. buf = (regaddr & ~(0x3 << 13));/* Clr [14:13] to write data in reg */
  94. buf |= 0x8000; /* Set [15] to Packet transmit */
  95. ret = __phy_write(phydev, LAN88XX_EXT_PAGE_TR_CR, buf);
  96. if (ret < 0) {
  97. pr_warn("Failed to write data in reg\n");
  98. goto err;
  99. }
  100. usleep_range(1000, 2000);/* Wait for Data to be written */
  101. val = __phy_read(phydev, LAN88XX_EXT_PAGE_TR_CR);
  102. if (!(val & 0x8000))
  103. pr_warn("TR Register[0x%X] configuration failed\n", regaddr);
  104. err:
  105. return phy_restore_page(phydev, save_page, ret);
  106. }
  107. static void lan88xx_config_TR_regs(struct phy_device *phydev)
  108. {
  109. int err;
  110. /* Get access to Channel 0x1, Node 0xF , Register 0x01.
  111. * Write 24-bit value 0x12B00A to register. Setting MrvlTrFix1000Kf,
  112. * MrvlTrFix1000Kp, MasterEnableTR bits.
  113. */
  114. err = lan88xx_TR_reg_set(phydev, 0x0F82, 0x12B00A);
  115. if (err < 0)
  116. pr_warn("Failed to Set Register[0x0F82]\n");
  117. /* Get access to Channel b'10, Node b'1101, Register 0x06.
  118. * Write 24-bit value 0xD2C46F to register. Setting SSTrKf1000Slv,
  119. * SSTrKp1000Mas bits.
  120. */
  121. err = lan88xx_TR_reg_set(phydev, 0x168C, 0xD2C46F);
  122. if (err < 0)
  123. pr_warn("Failed to Set Register[0x168C]\n");
  124. /* Get access to Channel b'10, Node b'1111, Register 0x11.
  125. * Write 24-bit value 0x620 to register. Setting rem_upd_done_thresh
  126. * bits
  127. */
  128. err = lan88xx_TR_reg_set(phydev, 0x17A2, 0x620);
  129. if (err < 0)
  130. pr_warn("Failed to Set Register[0x17A2]\n");
  131. /* Get access to Channel b'10, Node b'1101, Register 0x10.
  132. * Write 24-bit value 0xEEFFDD to register. Setting
  133. * eee_TrKp1Long_1000, eee_TrKp2Long_1000, eee_TrKp3Long_1000,
  134. * eee_TrKp1Short_1000,eee_TrKp2Short_1000, eee_TrKp3Short_1000 bits.
  135. */
  136. err = lan88xx_TR_reg_set(phydev, 0x16A0, 0xEEFFDD);
  137. if (err < 0)
  138. pr_warn("Failed to Set Register[0x16A0]\n");
  139. /* Get access to Channel b'10, Node b'1101, Register 0x13.
  140. * Write 24-bit value 0x071448 to register. Setting
  141. * slv_lpi_tr_tmr_val1, slv_lpi_tr_tmr_val2 bits.
  142. */
  143. err = lan88xx_TR_reg_set(phydev, 0x16A6, 0x071448);
  144. if (err < 0)
  145. pr_warn("Failed to Set Register[0x16A6]\n");
  146. /* Get access to Channel b'10, Node b'1101, Register 0x12.
  147. * Write 24-bit value 0x13132F to register. Setting
  148. * slv_sigdet_timer_val1, slv_sigdet_timer_val2 bits.
  149. */
  150. err = lan88xx_TR_reg_set(phydev, 0x16A4, 0x13132F);
  151. if (err < 0)
  152. pr_warn("Failed to Set Register[0x16A4]\n");
  153. /* Get access to Channel b'10, Node b'1101, Register 0x14.
  154. * Write 24-bit value 0x0 to register. Setting eee_3level_delay,
  155. * eee_TrKf_freeze_delay bits.
  156. */
  157. err = lan88xx_TR_reg_set(phydev, 0x16A8, 0x0);
  158. if (err < 0)
  159. pr_warn("Failed to Set Register[0x16A8]\n");
  160. /* Get access to Channel b'01, Node b'1111, Register 0x34.
  161. * Write 24-bit value 0x91B06C to register. Setting
  162. * FastMseSearchThreshLong1000, FastMseSearchThreshShort1000,
  163. * FastMseSearchUpdGain1000 bits.
  164. */
  165. err = lan88xx_TR_reg_set(phydev, 0x0FE8, 0x91B06C);
  166. if (err < 0)
  167. pr_warn("Failed to Set Register[0x0FE8]\n");
  168. /* Get access to Channel b'01, Node b'1111, Register 0x3E.
  169. * Write 24-bit value 0xC0A028 to register. Setting
  170. * FastMseKp2ThreshLong1000, FastMseKp2ThreshShort1000,
  171. * FastMseKp2UpdGain1000, FastMseKp2ExitEn1000 bits.
  172. */
  173. err = lan88xx_TR_reg_set(phydev, 0x0FFC, 0xC0A028);
  174. if (err < 0)
  175. pr_warn("Failed to Set Register[0x0FFC]\n");
  176. /* Get access to Channel b'01, Node b'1111, Register 0x35.
  177. * Write 24-bit value 0x041600 to register. Setting
  178. * FastMseSearchPhShNum1000, FastMseSearchClksPerPh1000,
  179. * FastMsePhChangeDelay1000 bits.
  180. */
  181. err = lan88xx_TR_reg_set(phydev, 0x0FEA, 0x041600);
  182. if (err < 0)
  183. pr_warn("Failed to Set Register[0x0FEA]\n");
  184. /* Get access to Channel b'10, Node b'1101, Register 0x03.
  185. * Write 24-bit value 0x000004 to register. Setting TrFreeze bits.
  186. */
  187. err = lan88xx_TR_reg_set(phydev, 0x1686, 0x000004);
  188. if (err < 0)
  189. pr_warn("Failed to Set Register[0x1686]\n");
  190. }
  191. static int lan88xx_probe(struct phy_device *phydev)
  192. {
  193. struct device *dev = &phydev->mdio.dev;
  194. struct lan88xx_priv *priv;
  195. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  196. if (!priv)
  197. return -ENOMEM;
  198. priv->wolopts = 0;
  199. /* these values can be used to identify internal PHY */
  200. priv->chip_id = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_ID);
  201. priv->chip_rev = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_REV);
  202. phydev->priv = priv;
  203. return 0;
  204. }
  205. static void lan88xx_remove(struct phy_device *phydev)
  206. {
  207. struct device *dev = &phydev->mdio.dev;
  208. struct lan88xx_priv *priv = phydev->priv;
  209. if (priv)
  210. devm_kfree(dev, priv);
  211. }
  212. static int lan88xx_set_wol(struct phy_device *phydev,
  213. struct ethtool_wolinfo *wol)
  214. {
  215. struct lan88xx_priv *priv = phydev->priv;
  216. priv->wolopts = wol->wolopts;
  217. return 0;
  218. }
  219. static void lan88xx_set_mdix(struct phy_device *phydev)
  220. {
  221. int buf;
  222. int val;
  223. switch (phydev->mdix_ctrl) {
  224. case ETH_TP_MDI:
  225. val = LAN88XX_EXT_MODE_CTRL_MDI_;
  226. break;
  227. case ETH_TP_MDI_X:
  228. val = LAN88XX_EXT_MODE_CTRL_MDI_X_;
  229. break;
  230. case ETH_TP_MDI_AUTO:
  231. val = LAN88XX_EXT_MODE_CTRL_AUTO_MDIX_;
  232. break;
  233. default:
  234. return;
  235. }
  236. phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, LAN88XX_EXT_PAGE_SPACE_1);
  237. buf = phy_read(phydev, LAN88XX_EXT_MODE_CTRL);
  238. buf &= ~LAN88XX_EXT_MODE_CTRL_MDIX_MASK_;
  239. buf |= val;
  240. phy_write(phydev, LAN88XX_EXT_MODE_CTRL, buf);
  241. phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, LAN88XX_EXT_PAGE_SPACE_0);
  242. }
  243. static int lan88xx_config_init(struct phy_device *phydev)
  244. {
  245. int val;
  246. genphy_config_init(phydev);
  247. /*Zerodetect delay enable */
  248. val = phy_read_mmd(phydev, MDIO_MMD_PCS,
  249. PHY_ARDENNES_MMD_DEV_3_PHY_CFG);
  250. val |= PHY_ARDENNES_MMD_DEV_3_PHY_CFG_ZD_DLY_EN_;
  251. phy_write_mmd(phydev, MDIO_MMD_PCS, PHY_ARDENNES_MMD_DEV_3_PHY_CFG,
  252. val);
  253. /* Config DSP registers */
  254. lan88xx_config_TR_regs(phydev);
  255. return 0;
  256. }
  257. static int lan88xx_config_aneg(struct phy_device *phydev)
  258. {
  259. lan88xx_set_mdix(phydev);
  260. return genphy_config_aneg(phydev);
  261. }
  262. static struct phy_driver microchip_phy_driver[] = {
  263. {
  264. .phy_id = 0x0007c130,
  265. .phy_id_mask = 0xfffffff0,
  266. .name = "Microchip LAN88xx",
  267. .features = PHY_GBIT_FEATURES,
  268. .flags = PHY_HAS_INTERRUPT,
  269. .probe = lan88xx_probe,
  270. .remove = lan88xx_remove,
  271. .config_init = lan88xx_config_init,
  272. .config_aneg = lan88xx_config_aneg,
  273. .ack_interrupt = lan88xx_phy_ack_interrupt,
  274. .config_intr = lan88xx_phy_config_intr,
  275. .suspend = lan88xx_suspend,
  276. .resume = genphy_resume,
  277. .set_wol = lan88xx_set_wol,
  278. .read_page = lan88xx_read_page,
  279. .write_page = lan88xx_write_page,
  280. } };
  281. module_phy_driver(microchip_phy_driver);
  282. static struct mdio_device_id __maybe_unused microchip_tbl[] = {
  283. { 0x0007c130, 0xfffffff0 },
  284. { }
  285. };
  286. MODULE_DEVICE_TABLE(mdio, microchip_tbl);
  287. MODULE_AUTHOR(DRIVER_AUTHOR);
  288. MODULE_DESCRIPTION(DRIVER_DESC);
  289. MODULE_LICENSE("GPL");