lan7x.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (c) 2017 Microchip Technology Inc. All rights reserved.
  4. */
  5. #include <console.h>
  6. #include <watchdog.h>
  7. /* USB Vendor Requests */
  8. #define USB_VENDOR_REQUEST_WRITE_REGISTER 0xA0
  9. #define USB_VENDOR_REQUEST_READ_REGISTER 0xA1
  10. #define USB_VENDOR_REQUEST_GET_STATS 0xA2
  11. /* Tx Command A */
  12. #define TX_CMD_A_FCS BIT(22)
  13. #define TX_CMD_A_LEN_MASK 0x000FFFFF
  14. /* Rx Command A */
  15. #define RX_CMD_A_RXE BIT(18)
  16. #define RX_CMD_A_LEN_MASK 0x00003FFF
  17. /* SCSRs */
  18. #define ID_REV 0x00
  19. #define ID_REV_CHIP_ID_MASK 0xFFFF0000
  20. #define ID_REV_CHIP_ID_7500 0x7500
  21. #define ID_REV_CHIP_ID_7800 0x7800
  22. #define ID_REV_CHIP_ID_7850 0x7850
  23. #define INT_STS 0x0C
  24. #define HW_CFG 0x010
  25. #define HW_CFG_LRST BIT(1)
  26. #define PMT_CTL 0x014
  27. #define PMT_CTL_PHY_PWRUP BIT(10)
  28. #define PMT_CTL_READY BIT(7)
  29. #define PMT_CTL_PHY_RST BIT(4)
  30. #define E2P_CMD 0x040
  31. #define E2P_CMD_EPC_BUSY BIT(31)
  32. #define E2P_CMD_EPC_CMD_READ 0x00000000
  33. #define E2P_CMD_EPC_TIMEOUT BIT(10)
  34. #define E2P_CMD_EPC_ADDR_MASK 0x000001FF
  35. #define E2P_DATA 0x044
  36. #define RFE_CTL_BCAST_EN BIT(10)
  37. #define RFE_CTL_DA_PERFECT BIT(1)
  38. #define FCT_RX_CTL_EN BIT(31)
  39. #define FCT_TX_CTL_EN BIT(31)
  40. #define MAC_CR 0x100
  41. #define MAC_CR_ADP BIT(13)
  42. #define MAC_CR_AUTO_DUPLEX BIT(12)
  43. #define MAC_CR_AUTO_SPEED BIT(11)
  44. #define MAC_RX 0x104
  45. #define MAC_RX_FCS_STRIP BIT(4)
  46. #define MAC_RX_RXEN BIT(0)
  47. #define MAC_TX 0x108
  48. #define MAC_TX_TXEN BIT(0)
  49. #define FLOW 0x10C
  50. #define FLOW_CR_TX_FCEN BIT(30)
  51. #define FLOW_CR_RX_FCEN BIT(29)
  52. #define RX_ADDRH 0x118
  53. #define RX_ADDRL 0x11C
  54. #define MII_ACC 0x120
  55. #define MII_ACC_MII_READ 0x00000000
  56. #define MII_ACC_MII_WRITE 0x00000002
  57. #define MII_ACC_MII_BUSY BIT(0)
  58. #define MII_DATA 0x124
  59. #define SS_USB_PKT_SIZE 1024
  60. #define HS_USB_PKT_SIZE 512
  61. #define FS_USB_PKT_SIZE 64
  62. #define MAX_RX_FIFO_SIZE (12 * 1024)
  63. #define MAX_TX_FIFO_SIZE (12 * 1024)
  64. #define DEFAULT_BULK_IN_DELAY 0x0800
  65. #define EEPROM_INDICATOR 0xA5
  66. #define EEPROM_MAC_OFFSET 0x01
  67. /* Some extra defines */
  68. #define LAN7X_INTERNAL_PHY_ID 1
  69. #define LAN7X_MAC_RX_MAX_SIZE(mtu) \
  70. ((mtu) << 16) /* Max frame size */
  71. #define LAN7X_MAC_RX_MAX_SIZE_DEFAULT \
  72. LAN7X_MAC_RX_MAX_SIZE(PKTSIZE_ALIGN + 4 /* VLAN */ + 4 /* CRC */)
  73. /* Timeouts */
  74. #define USB_CTRL_SET_TIMEOUT_MS 5000
  75. #define USB_CTRL_GET_TIMEOUT_MS 5000
  76. #define USB_BULK_SEND_TIMEOUT_MS 5000
  77. #define USB_BULK_RECV_TIMEOUT_MS 5000
  78. #define TIMEOUT_RESOLUTION_MS 50
  79. #define PHY_CONNECT_TIMEOUT_MS 5000
  80. #define RX_URB_SIZE 2048
  81. /* driver private */
  82. struct lan7x_private {
  83. struct ueth_data ueth;
  84. u32 chipid; /* Chip or device ID */
  85. struct mii_dev *mdiobus;
  86. struct phy_device *phydev;
  87. };
  88. /*
  89. * Lan7x infrastructure commands
  90. */
  91. int lan7x_write_reg(struct usb_device *udev, u32 index, u32 data);
  92. int lan7x_read_reg(struct usb_device *udev, u32 index, u32 *data);
  93. static inline int lan7x_wait_for_bit(struct usb_device *udev,
  94. const char *prefix, const u32 reg,
  95. const u32 mask, const bool set,
  96. const unsigned int timeout_ms,
  97. const bool breakable)
  98. {
  99. u32 val;
  100. unsigned long start = get_timer(0);
  101. while (1) {
  102. lan7x_read_reg(udev, reg, &val);
  103. if (!set)
  104. val = ~val;
  105. if ((val & mask) == mask)
  106. return 0;
  107. if (get_timer(start) > timeout_ms)
  108. break;
  109. if (breakable && ctrlc()) {
  110. puts("Abort\n");
  111. return -EINTR;
  112. }
  113. udelay(1);
  114. WATCHDOG_RESET();
  115. }
  116. debug("%s: Timeout (reg=0x%x mask=%08x wait_set=%i)\n", prefix, reg,
  117. mask, set);
  118. return -ETIMEDOUT;
  119. }
  120. int lan7x_mdio_read(struct usb_device *udev, int phy_id, int idx);
  121. void lan7x_mdio_write(struct usb_device *udev, int phy_id, int idx,
  122. int regval);
  123. static inline int lan7x_mdio_wait_for_bit(struct usb_device *udev,
  124. const char *prefix,
  125. int phy_id, const u32 reg,
  126. const u32 mask, const bool set,
  127. const unsigned int timeout_ms,
  128. const bool breakable)
  129. {
  130. u32 val;
  131. unsigned long start = get_timer(0);
  132. while (1) {
  133. val = lan7x_mdio_read(udev, phy_id, reg);
  134. if (!set)
  135. val = ~val;
  136. if ((val & mask) == mask)
  137. return 0;
  138. if (get_timer(start) > timeout_ms)
  139. break;
  140. if (breakable && ctrlc()) {
  141. puts("Abort\n");
  142. return -EINTR;
  143. }
  144. udelay(1);
  145. WATCHDOG_RESET();
  146. }
  147. debug("%s: Timeout (reg=0x%x mask=%08x wait_set=%i)\n", prefix, reg,
  148. mask, set);
  149. return -ETIMEDOUT;
  150. }
  151. int lan7x_phylib_register(struct udevice *udev);
  152. int lan7x_eth_phylib_connect(struct udevice *udev, struct ueth_data *dev);
  153. int lan7x_eth_phylib_config_start(struct udevice *udev);
  154. int lan7x_pmt_phy_reset(struct usb_device *udev,
  155. struct ueth_data *dev);
  156. int lan7x_update_flowcontrol(struct usb_device *udev,
  157. struct ueth_data *dev,
  158. uint32_t *flow, uint32_t *fct_flow);
  159. int lan7x_read_eeprom_mac(unsigned char *enetaddr, struct usb_device *udev);
  160. int lan7x_basic_reset(struct usb_device *udev,
  161. struct ueth_data *dev);
  162. void lan7x_eth_stop(struct udevice *dev);
  163. int lan7x_eth_send(struct udevice *dev, void *packet, int length);
  164. int lan7x_eth_recv(struct udevice *dev, int flags, uchar **packetp);
  165. int lan7x_free_pkt(struct udevice *dev, uchar *packet, int packet_len);
  166. int lan7x_eth_remove(struct udevice *dev);