lan7x.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 2017 Microchip Technology Inc. All rights reserved.
  4. */
  5. #include <dm.h>
  6. #include <malloc.h>
  7. #include <miiphy.h>
  8. #include <memalign.h>
  9. #include <usb.h>
  10. #include <linux/ethtool.h>
  11. #include <linux/mii.h>
  12. #include "usb_ether.h"
  13. #include "lan7x.h"
  14. /*
  15. * Lan7x infrastructure commands
  16. */
  17. int lan7x_write_reg(struct usb_device *udev, u32 index, u32 data)
  18. {
  19. int len;
  20. ALLOC_CACHE_ALIGN_BUFFER(u32, tmpbuf, 1);
  21. cpu_to_le32s(&data);
  22. tmpbuf[0] = data;
  23. len = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  24. USB_VENDOR_REQUEST_WRITE_REGISTER,
  25. USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  26. 0, index, tmpbuf, sizeof(data),
  27. USB_CTRL_SET_TIMEOUT_MS);
  28. if (len != sizeof(data)) {
  29. debug("%s failed: index=%d, data=%d, len=%d",
  30. __func__, index, data, len);
  31. return -EIO;
  32. }
  33. return 0;
  34. }
  35. int lan7x_read_reg(struct usb_device *udev, u32 index, u32 *data)
  36. {
  37. int len;
  38. ALLOC_CACHE_ALIGN_BUFFER(u32, tmpbuf, 1);
  39. len = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
  40. USB_VENDOR_REQUEST_READ_REGISTER,
  41. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  42. 0, index, tmpbuf, sizeof(*data),
  43. USB_CTRL_GET_TIMEOUT_MS);
  44. *data = tmpbuf[0];
  45. if (len != sizeof(*data)) {
  46. debug("%s failed: index=%d, len=%d", __func__, index, len);
  47. return -EIO;
  48. }
  49. le32_to_cpus(data);
  50. return 0;
  51. }
  52. static int lan7x_phy_wait_not_busy(struct usb_device *udev)
  53. {
  54. return lan7x_wait_for_bit(udev, __func__,
  55. MII_ACC, MII_ACC_MII_BUSY,
  56. false, 100, 0);
  57. }
  58. int lan7x_mdio_read(struct usb_device *udev, int phy_id, int idx)
  59. {
  60. u32 val, addr;
  61. /* confirm MII not busy */
  62. if (lan7x_phy_wait_not_busy(udev)) {
  63. debug("MII is busy in %s\n", __func__);
  64. return -ETIMEDOUT;
  65. }
  66. /* set the address, index & direction (read from PHY) */
  67. addr = (phy_id << 11) | (idx << 6) |
  68. MII_ACC_MII_READ | MII_ACC_MII_BUSY;
  69. lan7x_write_reg(udev, MII_ACC, addr);
  70. if (lan7x_phy_wait_not_busy(udev)) {
  71. debug("Timed out reading MII reg %02X\n", idx);
  72. return -ETIMEDOUT;
  73. }
  74. lan7x_read_reg(udev, MII_DATA, &val);
  75. return val & 0xFFFF;
  76. }
  77. void lan7x_mdio_write(struct usb_device *udev, int phy_id, int idx, int regval)
  78. {
  79. u32 addr;
  80. /* confirm MII not busy */
  81. if (lan7x_phy_wait_not_busy(udev)) {
  82. debug("MII is busy in %s\n", __func__);
  83. return;
  84. }
  85. lan7x_write_reg(udev, MII_DATA, regval);
  86. /* set the address, index & direction (write to PHY) */
  87. addr = (phy_id << 11) | (idx << 6) |
  88. MII_ACC_MII_WRITE | MII_ACC_MII_BUSY;
  89. lan7x_write_reg(udev, MII_ACC, addr);
  90. if (lan7x_phy_wait_not_busy(udev))
  91. debug("Timed out writing MII reg %02X\n", idx);
  92. }
  93. /*
  94. * Lan7x phylib wrappers
  95. */
  96. static int lan7x_phylib_mdio_read(struct mii_dev *bus,
  97. int addr, int devad, int reg)
  98. {
  99. struct usb_device *udev = dev_get_parent_priv(bus->priv);
  100. return lan7x_mdio_read(udev, addr, reg);
  101. }
  102. static int lan7x_phylib_mdio_write(struct mii_dev *bus,
  103. int addr, int devad, int reg, u16 val)
  104. {
  105. struct usb_device *udev = dev_get_parent_priv(bus->priv);
  106. lan7x_mdio_write(udev, addr, reg, (int)val);
  107. return 0;
  108. }
  109. /*
  110. * Lan7x eeprom functions
  111. */
  112. static int lan7x_eeprom_confirm_not_busy(struct usb_device *udev)
  113. {
  114. return lan7x_wait_for_bit(udev, __func__,
  115. E2P_CMD, E2P_CMD_EPC_BUSY,
  116. false, 100, 0);
  117. }
  118. static int lan7x_wait_eeprom(struct usb_device *udev)
  119. {
  120. return lan7x_wait_for_bit(udev, __func__,
  121. E2P_CMD,
  122. (E2P_CMD_EPC_BUSY | E2P_CMD_EPC_TIMEOUT),
  123. false, 100, 0);
  124. }
  125. static int lan7x_read_eeprom(struct usb_device *udev,
  126. u32 offset, u32 length, u8 *data)
  127. {
  128. u32 val;
  129. int i, ret;
  130. ret = lan7x_eeprom_confirm_not_busy(udev);
  131. if (ret)
  132. return ret;
  133. for (i = 0; i < length; i++) {
  134. val = E2P_CMD_EPC_BUSY | E2P_CMD_EPC_CMD_READ |
  135. (offset & E2P_CMD_EPC_ADDR_MASK);
  136. lan7x_write_reg(udev, E2P_CMD, val);
  137. ret = lan7x_wait_eeprom(udev);
  138. if (ret)
  139. return ret;
  140. lan7x_read_reg(udev, E2P_DATA, &val);
  141. data[i] = val & 0xFF;
  142. offset++;
  143. }
  144. return ret;
  145. }
  146. /*
  147. * Lan7x phylib functions
  148. */
  149. int lan7x_phylib_register(struct udevice *udev)
  150. {
  151. struct usb_device *usbdev = dev_get_parent_priv(udev);
  152. struct lan7x_private *priv = dev_get_priv(udev);
  153. int ret;
  154. priv->mdiobus = mdio_alloc();
  155. if (!priv->mdiobus) {
  156. printf("mdio_alloc failed\n");
  157. return -ENOMEM;
  158. }
  159. priv->mdiobus->read = lan7x_phylib_mdio_read;
  160. priv->mdiobus->write = lan7x_phylib_mdio_write;
  161. sprintf(priv->mdiobus->name,
  162. "lan7x_mdiobus-d%hu-p%hu", usbdev->devnum, usbdev->portnr);
  163. priv->mdiobus->priv = (void *)udev;
  164. ret = mdio_register(priv->mdiobus);
  165. if (ret) {
  166. printf("mdio_register failed\n");
  167. free(priv->mdiobus);
  168. return -ENOMEM;
  169. }
  170. return 0;
  171. }
  172. int lan7x_eth_phylib_connect(struct udevice *udev, struct ueth_data *dev)
  173. {
  174. struct lan7x_private *priv = dev_get_priv(udev);
  175. priv->phydev = phy_connect(priv->mdiobus, dev->phy_id,
  176. udev, PHY_INTERFACE_MODE_MII);
  177. if (!priv->phydev) {
  178. printf("phy_connect failed\n");
  179. return -ENODEV;
  180. }
  181. return 0;
  182. }
  183. int lan7x_eth_phylib_config_start(struct udevice *udev)
  184. {
  185. struct lan7x_private *priv = dev_get_priv(udev);
  186. int ret;
  187. /* configure supported modes */
  188. priv->phydev->supported = PHY_BASIC_FEATURES |
  189. SUPPORTED_1000baseT_Full |
  190. SUPPORTED_Pause |
  191. SUPPORTED_Asym_Pause;
  192. priv->phydev->advertising = ADVERTISED_10baseT_Half |
  193. ADVERTISED_10baseT_Full |
  194. ADVERTISED_100baseT_Half |
  195. ADVERTISED_100baseT_Full |
  196. ADVERTISED_1000baseT_Full |
  197. ADVERTISED_Pause |
  198. ADVERTISED_Asym_Pause |
  199. ADVERTISED_Autoneg;
  200. priv->phydev->autoneg = AUTONEG_ENABLE;
  201. ret = genphy_config_aneg(priv->phydev);
  202. if (ret) {
  203. printf("genphy_config_aneg failed\n");
  204. return ret;
  205. }
  206. ret = phy_startup(priv->phydev);
  207. if (ret) {
  208. printf("phy_startup failed\n");
  209. return ret;
  210. }
  211. debug("** %s() speed %i duplex %i adv %X supp %X\n", __func__,
  212. priv->phydev->speed, priv->phydev->duplex,
  213. priv->phydev->advertising, priv->phydev->supported);
  214. return 0;
  215. }
  216. int lan7x_update_flowcontrol(struct usb_device *udev,
  217. struct ueth_data *dev,
  218. uint32_t *flow, uint32_t *fct_flow)
  219. {
  220. uint32_t lcladv, rmtadv;
  221. u8 cap = 0;
  222. struct lan7x_private *priv = dev_get_priv(udev->dev);
  223. debug("** %s()\n", __func__);
  224. debug("** %s() priv->phydev->speed %i duplex %i\n", __func__,
  225. priv->phydev->speed, priv->phydev->duplex);
  226. if (priv->phydev->duplex == DUPLEX_FULL) {
  227. lcladv = lan7x_mdio_read(udev, dev->phy_id, MII_ADVERTISE);
  228. rmtadv = lan7x_mdio_read(udev, dev->phy_id, MII_LPA);
  229. cap = mii_resolve_flowctrl_fdx(lcladv, rmtadv);
  230. debug("TX Flow ");
  231. if (cap & FLOW_CTRL_TX) {
  232. *flow = (FLOW_CR_TX_FCEN | 0xFFFF);
  233. /* set fct_flow thresholds to 20% and 80% */
  234. *fct_flow = ((MAX_RX_FIFO_SIZE * 2) / (10 * 512))
  235. & 0x7FUL;
  236. *fct_flow <<= 8UL;
  237. *fct_flow |= ((MAX_RX_FIFO_SIZE * 8) / (10 * 512))
  238. & 0x7FUL;
  239. debug("EN ");
  240. } else {
  241. debug("DIS ");
  242. }
  243. debug("RX Flow ");
  244. if (cap & FLOW_CTRL_RX) {
  245. *flow |= FLOW_CR_RX_FCEN;
  246. debug("EN");
  247. } else {
  248. debug("DIS");
  249. }
  250. }
  251. debug("\n");
  252. return 0;
  253. }
  254. int lan7x_read_eeprom_mac(unsigned char *enetaddr, struct usb_device *udev)
  255. {
  256. int ret;
  257. memset(enetaddr, 0, 6);
  258. ret = lan7x_read_eeprom(udev, 0, 1, enetaddr);
  259. if ((ret == 0) && (enetaddr[0] == EEPROM_INDICATOR)) {
  260. ret = lan7x_read_eeprom(udev,
  261. EEPROM_MAC_OFFSET, ETH_ALEN,
  262. enetaddr);
  263. if ((ret == 0) && is_valid_ethaddr(enetaddr)) {
  264. /* eeprom values are valid so use them */
  265. debug("MAC address read from EEPROM %pM\n",
  266. enetaddr);
  267. return 0;
  268. }
  269. }
  270. debug("MAC address read from EEPROM invalid %pM\n", enetaddr);
  271. memset(enetaddr, 0, 6);
  272. return -EINVAL;
  273. }
  274. int lan7x_pmt_phy_reset(struct usb_device *udev,
  275. struct ueth_data *dev)
  276. {
  277. int ret;
  278. u32 data;
  279. ret = lan7x_read_reg(udev, PMT_CTL, &data);
  280. if (ret)
  281. return ret;
  282. ret = lan7x_write_reg(udev, PMT_CTL, data | PMT_CTL_PHY_RST);
  283. if (ret)
  284. return ret;
  285. /* for LAN7x, we need to check PMT_CTL_READY asserted */
  286. ret = lan7x_wait_for_bit(udev, "PMT_CTL_PHY_RST",
  287. PMT_CTL, PMT_CTL_PHY_RST,
  288. false, 1000, 0); /* could take over 125mS */
  289. if (ret)
  290. return ret;
  291. return lan7x_wait_for_bit(udev, "PMT_CTL_READY",
  292. PMT_CTL, PMT_CTL_READY,
  293. true, 1000, 0);
  294. }
  295. int lan7x_basic_reset(struct usb_device *udev,
  296. struct ueth_data *dev)
  297. {
  298. int ret;
  299. dev->phy_id = LAN7X_INTERNAL_PHY_ID; /* fixed phy id */
  300. ret = lan7x_write_reg(udev, HW_CFG, HW_CFG_LRST);
  301. if (ret)
  302. return ret;
  303. ret = lan7x_wait_for_bit(udev, "HW_CFG_LRST",
  304. HW_CFG, HW_CFG_LRST,
  305. false, 1000, 0);
  306. if (ret)
  307. return ret;
  308. debug("USB devnum %d portnr %d\n", udev->devnum, udev->portnr);
  309. return lan7x_pmt_phy_reset(udev, dev);
  310. }
  311. void lan7x_eth_stop(struct udevice *dev)
  312. {
  313. debug("** %s()\n", __func__);
  314. }
  315. int lan7x_eth_send(struct udevice *dev, void *packet, int length)
  316. {
  317. struct lan7x_private *priv = dev_get_priv(dev);
  318. struct ueth_data *ueth = &priv->ueth;
  319. int err;
  320. int actual_len;
  321. u32 tx_cmd_a;
  322. u32 tx_cmd_b;
  323. ALLOC_CACHE_ALIGN_BUFFER(unsigned char, msg,
  324. PKTSIZE + sizeof(tx_cmd_a) + sizeof(tx_cmd_b));
  325. debug("** %s(), len %d, buf %#x\n", __func__, length,
  326. (unsigned int)(ulong) msg);
  327. if (length > PKTSIZE)
  328. return -ENOSPC;
  329. /* LAN7x disable all TX offload features for u-boot */
  330. tx_cmd_a = (u32) (length & TX_CMD_A_LEN_MASK) | TX_CMD_A_FCS;
  331. tx_cmd_b = 0;
  332. cpu_to_le32s(&tx_cmd_a);
  333. cpu_to_le32s(&tx_cmd_b);
  334. /* prepend cmd_a and cmd_b */
  335. memcpy(msg, &tx_cmd_a, sizeof(tx_cmd_a));
  336. memcpy(msg + sizeof(tx_cmd_a), &tx_cmd_b, sizeof(tx_cmd_b));
  337. memcpy(msg + sizeof(tx_cmd_a) + sizeof(tx_cmd_b), (void *)packet,
  338. length);
  339. err = usb_bulk_msg(ueth->pusb_dev,
  340. usb_sndbulkpipe(ueth->pusb_dev, ueth->ep_out),
  341. (void *)msg,
  342. length + sizeof(tx_cmd_a) +
  343. sizeof(tx_cmd_b),
  344. &actual_len, USB_BULK_SEND_TIMEOUT_MS);
  345. debug("Tx: len = %u, actual = %u, err = %d\n",
  346. (unsigned int)(length + sizeof(tx_cmd_a) + sizeof(tx_cmd_b)),
  347. (unsigned int)actual_len, err);
  348. return err;
  349. }
  350. int lan7x_eth_recv(struct udevice *dev, int flags, uchar **packetp)
  351. {
  352. struct lan7x_private *priv = dev_get_priv(dev);
  353. struct ueth_data *ueth = &priv->ueth;
  354. uint8_t *ptr;
  355. int ret, len;
  356. u32 packet_len = 0;
  357. u32 rx_cmd_a = 0;
  358. len = usb_ether_get_rx_bytes(ueth, &ptr);
  359. debug("%s: first try, len=%d\n", __func__, len);
  360. if (!len) {
  361. if (!(flags & ETH_RECV_CHECK_DEVICE))
  362. return -EAGAIN;
  363. ret = usb_ether_receive(ueth, RX_URB_SIZE);
  364. if (ret == -EAGAIN)
  365. return ret;
  366. len = usb_ether_get_rx_bytes(ueth, &ptr);
  367. debug("%s: second try, len=%d\n", __func__, len);
  368. }
  369. /*
  370. * 1st 4 bytes contain the length of the actual data plus error info.
  371. * Extract data length.
  372. */
  373. if (len < sizeof(packet_len)) {
  374. debug("Rx: incomplete packet length\n");
  375. goto err;
  376. }
  377. memcpy(&rx_cmd_a, ptr, sizeof(rx_cmd_a));
  378. le32_to_cpus(&rx_cmd_a);
  379. if (rx_cmd_a & RX_CMD_A_RXE) {
  380. debug("Rx: Error header=%#x", rx_cmd_a);
  381. goto err;
  382. }
  383. packet_len = (u16) (rx_cmd_a & RX_CMD_A_LEN_MASK);
  384. if (packet_len > len - sizeof(packet_len)) {
  385. debug("Rx: too large packet: %d\n", packet_len);
  386. goto err;
  387. }
  388. /*
  389. * For LAN7x, the length in command A does not
  390. * include command A, B, and C length.
  391. * So use it as is.
  392. */
  393. *packetp = ptr + 10;
  394. return packet_len;
  395. err:
  396. usb_ether_advance_rxbuf(ueth, -1);
  397. return -EINVAL;
  398. }
  399. int lan7x_free_pkt(struct udevice *dev, uchar *packet, int packet_len)
  400. {
  401. struct lan7x_private *priv = dev_get_priv(dev);
  402. packet_len = ALIGN(packet_len, 4);
  403. usb_ether_advance_rxbuf(&priv->ueth, sizeof(u32) + packet_len);
  404. return 0;
  405. }
  406. int lan7x_eth_remove(struct udevice *dev)
  407. {
  408. struct lan7x_private *priv = dev_get_priv(dev);
  409. debug("** %s()\n", __func__);
  410. free(priv->phydev);
  411. mdio_unregister(priv->mdiobus);
  412. mdio_free(priv->mdiobus);
  413. return 0;
  414. }