You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

smsc75xx.h 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. #ifndef _SMSC75XX_H
  2. #define _SMSC75XX_H
  3. /** @file
  4. *
  5. * SMSC LAN75xx USB Ethernet driver
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <ipxe/usb.h>
  10. #include <ipxe/usbnet.h>
  11. #include <ipxe/if_ether.h>
  12. #include <ipxe/mii.h>
  13. /** Register write command */
  14. #define SMSC75XX_REGISTER_WRITE \
  15. ( USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
  16. USB_REQUEST_TYPE ( 0xa0 ) )
  17. /** Register read command */
  18. #define SMSC75XX_REGISTER_READ \
  19. ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
  20. USB_REQUEST_TYPE ( 0xa1 ) )
  21. /** Get statistics command */
  22. #define SMSC75XX_GET_STATISTICS \
  23. ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
  24. USB_REQUEST_TYPE ( 0xa2 ) )
  25. /** Interrupt status register */
  26. #define SMSC75XX_INT_STS 0x00c
  27. #define SMSC75XX_INT_STS_RDFO_INT 0x00400000UL /**< RX FIFO overflow */
  28. #define SMSC75XX_INT_STS_PHY_INT 0x00020000UL /**< PHY interrupt */
  29. /** Hardware configuration register */
  30. #define SMSC75XX_HW_CFG 0x010
  31. #define SMSC75XX_HW_CFG_BIR 0x00000080UL /**< Bulk IN use NAK */
  32. #define SMSC75XX_HW_CFG_LRST 0x00000002UL /**< Soft lite reset */
  33. /** Interrupt endpoint control register */
  34. #define SMSC75XX_INT_EP_CTL 0x038
  35. #define SMSC75XX_INT_EP_CTL_RDFO_EN 0x00400000UL /**< RX FIFO overflow */
  36. #define SMSC75XX_INT_EP_CTL_PHY_EN 0x00020000UL /**< PHY interrupt */
  37. /** Bulk IN delay register */
  38. #define SMSC75XX_BULK_IN_DLY 0x03c
  39. #define SMSC75XX_BULK_IN_DLY_SET(ticks) ( (ticks) << 0 ) /**< Delay / 16.7ns */
  40. /** EEPROM command register */
  41. #define SMSC75XX_E2P_CMD 0x040
  42. #define SMSC75XX_E2P_CMD_EPC_BSY 0x80000000UL /**< EPC busy */
  43. #define SMSC75XX_E2P_CMD_EPC_CMD_READ 0x00000000UL /**< READ command */
  44. #define SMSC75XX_E2P_CMD_EPC_ADDR(addr) ( (addr) << 0 ) /**< EPC address */
  45. /** EEPROM data register */
  46. #define SMSC75XX_E2P_DATA 0x044
  47. #define SMSC75XX_E2P_DATA_GET(e2p_data) \
  48. ( ( (e2p_data) >> 0 ) & 0xff ) /**< EEPROM data */
  49. /** MAC address EEPROM address */
  50. #define SMSC75XX_EEPROM_MAC 0x01
  51. /** Receive filtering engine control register */
  52. #define SMSC75XX_RFE_CTL 0x060
  53. #define SMSC75XX_RFE_CTL_AB 0x00000400UL /**< Accept broadcast */
  54. #define SMSC75XX_RFE_CTL_AM 0x00000200UL /**< Accept multicast */
  55. #define SMSC75XX_RFE_CTL_AU 0x00000100UL /**< Accept unicast */
  56. /** FIFO controller RX FIFO control register */
  57. #define SMSC75XX_FCT_RX_CTL 0x090
  58. #define SMSC75XX_FCT_RX_CTL_EN 0x80000000UL /**< FCT RX enable */
  59. #define SMSC75XX_FCT_RX_CTL_BAD 0x02000000UL /**< Store bad frames */
  60. /** FIFO controller TX FIFO control register */
  61. #define SMSC75XX_FCT_TX_CTL 0x094
  62. #define SMSC75XX_FCT_TX_CTL_EN 0x80000000UL /**< FCT TX enable */
  63. /** MAC receive register */
  64. #define SMSC75XX_MAC_RX 0x104
  65. #define SMSC75XX_MAC_RX_MAX_SIZE(mtu) ( (mtu) << 16 ) /**< Max frame size */
  66. #define SMSC75XX_MAC_RX_MAX_SIZE_DEFAULT \
  67. SMSC75XX_MAC_RX_MAX_SIZE ( ETH_FRAME_LEN + 4 /* VLAN */ + 4 /* CRC */ )
  68. #define SMSC75XX_MAC_RX_FCS 0x00000010UL /**< FCS stripping */
  69. #define SMSC75XX_MAC_RX_EN 0x00000001UL /**< RX enable */
  70. /** MAC transmit register */
  71. #define SMSC75XX_MAC_TX 0x108
  72. #define SMSC75XX_MAC_TX_EN 0x00000001UL /**< TX enable */
  73. /** MAC receive address high register */
  74. #define SMSC75XX_RX_ADDRH 0x118
  75. /** MAC receive address low register */
  76. #define SMSC75XX_RX_ADDRL 0x11c
  77. /** MII access register */
  78. #define SMSC75XX_MII_ACCESS 0x120
  79. #define SMSC75XX_MII_ACCESS_PHY_ADDRESS 0x00000800UL /**< PHY address */
  80. #define SMSC75XX_MII_ACCESS_MIIRINDA(addr) ( (addr) << 6 ) /**< MII register */
  81. #define SMSC75XX_MII_ACCESS_MIIWNR 0x00000002UL /**< MII write */
  82. #define SMSC75XX_MII_ACCESS_MIIBZY 0x00000001UL /**< MII busy */
  83. /** MII data register */
  84. #define SMSC75XX_MII_DATA 0x124
  85. #define SMSC75XX_MII_DATA_SET(data) ( (data) << 0 ) /**< Set data */
  86. #define SMSC75XX_MII_DATA_GET(mii_data) \
  87. ( ( (mii_data) >> 0 ) & 0xffff ) /**< Get data */
  88. /** PHY interrupt source MII register */
  89. #define SMSC75XX_MII_PHY_INTR_SOURCE 29
  90. /** PHY interrupt mask MII register */
  91. #define SMSC75XX_MII_PHY_INTR_MASK 30
  92. /** PHY interrupt: auto-negotiation complete */
  93. #define SMSC75XX_PHY_INTR_ANEG_DONE 0x0040
  94. /** PHY interrupt: link down */
  95. #define SMSC75XX_PHY_INTR_LINK_DOWN 0x0010
  96. /** MAC address perfect filter N high register */
  97. #define SMSC75XX_ADDR_FILTH(n) ( 0x300 + ( 8 * (n) ) )
  98. #define SMSC75XX_ADDR_FILTH_VALID 0x80000000UL /**< Address valid */
  99. /** MAC address perfect filter N low register */
  100. #define SMSC75XX_ADDR_FILTL(n) ( 0x304 + ( 8 * (n) ) )
  101. /** MAC address */
  102. union smsc75xx_mac {
  103. /** MAC receive address registers */
  104. struct {
  105. /** MAC receive address low register */
  106. uint32_t l;
  107. /** MAC receive address high register */
  108. uint32_t h;
  109. } __attribute__ (( packed )) addr;
  110. /** Raw MAC address */
  111. uint8_t raw[ETH_ALEN];
  112. };
  113. /** Receive packet header */
  114. struct smsc75xx_rx_header {
  115. /** RX command word */
  116. uint32_t command;
  117. /** VLAN tag */
  118. uint16_t vtag;
  119. /** Checksum */
  120. uint16_t csum;
  121. /** Two-byte padding used to align Ethernet payload */
  122. uint16_t pad;
  123. } __attribute__ (( packed ));
  124. /** Receive error detected */
  125. #define SMSC75XX_RX_RED 0x00400000UL
  126. /** Transmit packet header */
  127. struct smsc75xx_tx_header {
  128. /** TX command word */
  129. uint32_t command;
  130. /** VLAN tag */
  131. uint16_t tag;
  132. /** Maximum segment size */
  133. uint16_t mss;
  134. } __attribute__ (( packed ));
  135. /** Insert frame checksum and pad */
  136. #define SMSC75XX_TX_FCS 0x00400000UL
  137. /** Interrupt packet format */
  138. struct smsc75xx_interrupt {
  139. /** Current value of INT_STS register */
  140. uint32_t int_sts;
  141. } __attribute__ (( packed ));
  142. /** Byte count statistics */
  143. struct smsc75xx_byte_statistics {
  144. /** Unicast byte count */
  145. uint32_t unicast;
  146. /** Broadcast byte count */
  147. uint32_t broadcast;
  148. /** Multicast byte count */
  149. uint32_t multicast;
  150. } __attribute__ (( packed ));
  151. /** Frame count statistics */
  152. struct smsc75xx_frame_statistics {
  153. /** Unicast frames */
  154. uint32_t unicast;
  155. /** Broadcast frames */
  156. uint32_t broadcast;
  157. /** Multicast frames */
  158. uint32_t multicast;
  159. /** Pause frames */
  160. uint32_t pause;
  161. /** Frames by length category */
  162. uint32_t len[7];
  163. } __attribute__ (( packed ));
  164. /** Receive error statistics */
  165. struct smsc75xx_rx_error_statistics {
  166. /** FCS errors */
  167. uint32_t fcs;
  168. /** Alignment errors */
  169. uint32_t alignment;
  170. /** Fragment errors */
  171. uint32_t fragment;
  172. /** Jabber errors */
  173. uint32_t jabber;
  174. /** Undersize frame errors */
  175. uint32_t undersize;
  176. /** Oversize frame errors */
  177. uint32_t oversize;
  178. /** Dropped frame errors */
  179. uint32_t dropped;
  180. } __attribute__ (( packed ));
  181. /** Receive statistics */
  182. struct smsc75xx_rx_statistics {
  183. /** Error statistics */
  184. struct smsc75xx_rx_error_statistics err;
  185. /** Byte count statistics */
  186. struct smsc75xx_byte_statistics byte;
  187. /** Frame count statistics */
  188. struct smsc75xx_frame_statistics frame;
  189. } __attribute__ (( packed ));
  190. /** Transmit error statistics */
  191. struct smsc75xx_tx_error_statistics {
  192. /** FCS errors */
  193. uint32_t fcs;
  194. /** Excess deferral errors */
  195. uint32_t deferral;
  196. /** Carrier errors */
  197. uint32_t carrier;
  198. /** Bad byte count */
  199. uint32_t count;
  200. /** Single collisions */
  201. uint32_t single;
  202. /** Multiple collisions */
  203. uint32_t multiple;
  204. /** Excession collisions */
  205. uint32_t excessive;
  206. /** Late collisions */
  207. uint32_t late;
  208. } __attribute__ (( packed ));
  209. /** Transmit statistics */
  210. struct smsc75xx_tx_statistics {
  211. /** Error statistics */
  212. struct smsc75xx_tx_error_statistics err;
  213. /** Byte count statistics */
  214. struct smsc75xx_byte_statistics byte;
  215. /** Frame count statistics */
  216. struct smsc75xx_frame_statistics frame;
  217. } __attribute__ (( packed ));
  218. /** Statistics */
  219. struct smsc75xx_statistics {
  220. /** Receive statistics */
  221. struct smsc75xx_rx_statistics rx;
  222. /** Transmit statistics */
  223. struct smsc75xx_tx_statistics tx;
  224. } __attribute__ (( packed ));
  225. /** A SMSC75xx network device */
  226. struct smsc75xx_device {
  227. /** USB device */
  228. struct usb_device *usb;
  229. /** USB bus */
  230. struct usb_bus *bus;
  231. /** Network device */
  232. struct net_device *netdev;
  233. /** USB network device */
  234. struct usbnet_device usbnet;
  235. /** MII interface */
  236. struct mii_interface mii;
  237. /** Interrupt status */
  238. uint32_t int_sts;
  239. };
  240. /** Reset delay (in microseconds) */
  241. #define SMSC75XX_RESET_DELAY_US 2
  242. /** Maximum time to wait for EEPROM (in milliseconds) */
  243. #define SMSC75XX_EEPROM_MAX_WAIT_MS 100
  244. /** Maximum time to wait for MII (in milliseconds) */
  245. #define SMSC75XX_MII_MAX_WAIT_MS 100
  246. /** Interrupt maximum fill level
  247. *
  248. * This is a policy decision.
  249. */
  250. #define SMSC75XX_INTR_MAX_FILL 2
  251. /** Bulk IN maximum fill level
  252. *
  253. * This is a policy decision.
  254. */
  255. #define SMSC75XX_IN_MAX_FILL 8
  256. /** Bulk IN buffer size */
  257. #define SMSC75XX_IN_MTU \
  258. ( sizeof ( struct smsc75xx_rx_header ) + \
  259. ETH_FRAME_LEN + 4 /* possible VLAN header */ )
  260. #endif /* _SMSC75XX_H */