xemac_l.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. /******************************************************************************
  2. *
  3. * Author: Xilinx, Inc.
  4. *
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the
  8. * Free Software Foundation; either version 2 of the License, or (at your
  9. * option) any later version.
  10. *
  11. *
  12. * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
  13. * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
  14. * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD,
  15. * XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
  16. * FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING
  17. * ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
  18. * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
  19. * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY
  20. * WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM
  21. * CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND
  22. * FITNESS FOR A PARTICULAR PURPOSE.
  23. *
  24. *
  25. * Xilinx hardware products are not intended for use in life support
  26. * appliances, devices, or systems. Use in such applications is
  27. * expressly prohibited.
  28. *
  29. *
  30. * (c) Copyright 2002-2004 Xilinx Inc.
  31. * All rights reserved.
  32. *
  33. *
  34. * You should have received a copy of the GNU General Public License along
  35. * with this program; if not, write to the Free Software Foundation, Inc.,
  36. * 675 Mass Ave, Cambridge, MA 02139, USA.
  37. *
  38. ******************************************************************************/
  39. /*****************************************************************************/
  40. /**
  41. *
  42. * @file xemac_l.h
  43. *
  44. * This header file contains identifiers and low-level driver functions (or
  45. * macros) that can be used to access the device. High-level driver functions
  46. * are defined in xemac.h.
  47. *
  48. * <pre>
  49. * MODIFICATION HISTORY:
  50. *
  51. * Ver Who Date Changes
  52. * ----- ---- -------- -----------------------------------------------
  53. * 1.00b rpm 04/26/02 First release
  54. * 1.00b rmm 09/23/02 Added XEmac_mPhyReset macro
  55. * 1.00c rpm 12/05/02 New version includes support for simple DMA
  56. * </pre>
  57. *
  58. ******************************************************************************/
  59. #ifndef XEMAC_L_H /* prevent circular inclusions */
  60. #define XEMAC_L_H /* by using protection macros */
  61. /***************************** Include Files *********************************/
  62. #include "xbasic_types.h"
  63. #include "xio.h"
  64. /************************** Constant Definitions *****************************/
  65. /* Offset of the MAC registers from the IPIF base address */
  66. #define XEM_REG_OFFSET 0x1100UL
  67. /*
  68. * Register offsets for the Ethernet MAC. Each register is 32 bits.
  69. */
  70. #define XEM_EMIR_OFFSET (XEM_REG_OFFSET + 0x0) /* EMAC Module ID */
  71. #define XEM_ECR_OFFSET (XEM_REG_OFFSET + 0x4) /* MAC Control */
  72. #define XEM_IFGP_OFFSET (XEM_REG_OFFSET + 0x8) /* Interframe Gap */
  73. #define XEM_SAH_OFFSET (XEM_REG_OFFSET + 0xC) /* Station addr, high */
  74. #define XEM_SAL_OFFSET (XEM_REG_OFFSET + 0x10) /* Station addr, low */
  75. #define XEM_MGTCR_OFFSET (XEM_REG_OFFSET + 0x14) /* MII mgmt control */
  76. #define XEM_MGTDR_OFFSET (XEM_REG_OFFSET + 0x18) /* MII mgmt data */
  77. #define XEM_RPLR_OFFSET (XEM_REG_OFFSET + 0x1C) /* Rx packet length */
  78. #define XEM_TPLR_OFFSET (XEM_REG_OFFSET + 0x20) /* Tx packet length */
  79. #define XEM_TSR_OFFSET (XEM_REG_OFFSET + 0x24) /* Tx status */
  80. #define XEM_RMFC_OFFSET (XEM_REG_OFFSET + 0x28) /* Rx missed frames */
  81. #define XEM_RCC_OFFSET (XEM_REG_OFFSET + 0x2C) /* Rx collisions */
  82. #define XEM_RFCSEC_OFFSET (XEM_REG_OFFSET + 0x30) /* Rx FCS errors */
  83. #define XEM_RAEC_OFFSET (XEM_REG_OFFSET + 0x34) /* Rx alignment errors */
  84. #define XEM_TEDC_OFFSET (XEM_REG_OFFSET + 0x38) /* Transmit excess
  85. * deferral cnt */
  86. /*
  87. * Register offsets for the IPIF components
  88. */
  89. #define XEM_ISR_OFFSET 0x20UL /* Interrupt status */
  90. #define XEM_DMA_OFFSET 0x2300UL
  91. #define XEM_DMA_SEND_OFFSET (XEM_DMA_OFFSET + 0x0) /* DMA send channel */
  92. #define XEM_DMA_RECV_OFFSET (XEM_DMA_OFFSET + 0x40) /* DMA recv channel */
  93. #define XEM_PFIFO_OFFSET 0x2000UL
  94. #define XEM_PFIFO_TXREG_OFFSET (XEM_PFIFO_OFFSET + 0x0) /* Tx registers */
  95. #define XEM_PFIFO_RXREG_OFFSET (XEM_PFIFO_OFFSET + 0x10) /* Rx registers */
  96. #define XEM_PFIFO_TXDATA_OFFSET (XEM_PFIFO_OFFSET + 0x100) /* Tx keyhole */
  97. #define XEM_PFIFO_RXDATA_OFFSET (XEM_PFIFO_OFFSET + 0x200) /* Rx keyhole */
  98. /*
  99. * EMAC Module Identification Register (EMIR)
  100. */
  101. #define XEM_EMIR_VERSION_MASK 0xFFFF0000UL /* Device version */
  102. #define XEM_EMIR_TYPE_MASK 0x0000FF00UL /* Device type */
  103. /*
  104. * EMAC Control Register (ECR)
  105. */
  106. #define XEM_ECR_FULL_DUPLEX_MASK 0x80000000UL /* Full duplex mode */
  107. #define XEM_ECR_XMIT_RESET_MASK 0x40000000UL /* Reset transmitter */
  108. #define XEM_ECR_XMIT_ENABLE_MASK 0x20000000UL /* Enable transmitter */
  109. #define XEM_ECR_RECV_RESET_MASK 0x10000000UL /* Reset receiver */
  110. #define XEM_ECR_RECV_ENABLE_MASK 0x08000000UL /* Enable receiver */
  111. #define XEM_ECR_PHY_ENABLE_MASK 0x04000000UL /* Enable PHY */
  112. #define XEM_ECR_XMIT_PAD_ENABLE_MASK 0x02000000UL /* Enable xmit pad insert */
  113. #define XEM_ECR_XMIT_FCS_ENABLE_MASK 0x01000000UL /* Enable xmit FCS insert */
  114. #define XEM_ECR_XMIT_ADDR_INSERT_MASK 0x00800000UL /* Enable xmit source addr
  115. * insertion */
  116. #define XEM_ECR_XMIT_ERROR_INSERT_MASK 0x00400000UL /* Insert xmit error */
  117. #define XEM_ECR_XMIT_ADDR_OVWRT_MASK 0x00200000UL /* Enable xmit source addr
  118. * overwrite */
  119. #define XEM_ECR_LOOPBACK_MASK 0x00100000UL /* Enable internal
  120. * loopback */
  121. #define XEM_ECR_RECV_STRIP_ENABLE_MASK 0x00080000UL /* Enable recv pad/fcs strip */
  122. #define XEM_ECR_UNICAST_ENABLE_MASK 0x00020000UL /* Enable unicast addr */
  123. #define XEM_ECR_MULTI_ENABLE_MASK 0x00010000UL /* Enable multicast addr */
  124. #define XEM_ECR_BROAD_ENABLE_MASK 0x00008000UL /* Enable broadcast addr */
  125. #define XEM_ECR_PROMISC_ENABLE_MASK 0x00004000UL /* Enable promiscuous mode */
  126. #define XEM_ECR_RECV_ALL_MASK 0x00002000UL /* Receive all frames */
  127. #define XEM_ECR_RESERVED2_MASK 0x00001000UL /* Reserved */
  128. #define XEM_ECR_MULTI_HASH_ENABLE_MASK 0x00000800UL /* Enable multicast hash */
  129. #define XEM_ECR_PAUSE_FRAME_MASK 0x00000400UL /* Interpret pause frames */
  130. #define XEM_ECR_CLEAR_HASH_MASK 0x00000200UL /* Clear hash table */
  131. #define XEM_ECR_ADD_HASH_ADDR_MASK 0x00000100UL /* Add hash table address */
  132. /*
  133. * Interframe Gap Register (IFGR)
  134. */
  135. #define XEM_IFGP_PART1_MASK 0xF8000000UL /* Interframe Gap Part1 */
  136. #define XEM_IFGP_PART1_SHIFT 27
  137. #define XEM_IFGP_PART2_MASK 0x07C00000UL /* Interframe Gap Part2 */
  138. #define XEM_IFGP_PART2_SHIFT 22
  139. /*
  140. * Station Address High Register (SAH)
  141. */
  142. #define XEM_SAH_ADDR_MASK 0x0000FFFFUL /* Station address high bytes */
  143. /*
  144. * Station Address Low Register (SAL)
  145. */
  146. #define XEM_SAL_ADDR_MASK 0xFFFFFFFFUL /* Station address low bytes */
  147. /*
  148. * MII Management Control Register (MGTCR)
  149. */
  150. #define XEM_MGTCR_START_MASK 0x80000000UL /* Start/Busy */
  151. #define XEM_MGTCR_RW_NOT_MASK 0x40000000UL /* Read/Write Not (direction) */
  152. #define XEM_MGTCR_PHY_ADDR_MASK 0x3E000000UL /* PHY address */
  153. #define XEM_MGTCR_PHY_ADDR_SHIFT 25 /* PHY address shift */
  154. #define XEM_MGTCR_REG_ADDR_MASK 0x01F00000UL /* Register address */
  155. #define XEM_MGTCR_REG_ADDR_SHIFT 20 /* Register addr shift */
  156. #define XEM_MGTCR_MII_ENABLE_MASK 0x00080000UL /* Enable MII from EMAC */
  157. #define XEM_MGTCR_RD_ERROR_MASK 0x00040000UL /* MII mgmt read error */
  158. /*
  159. * MII Management Data Register (MGTDR)
  160. */
  161. #define XEM_MGTDR_DATA_MASK 0x0000FFFFUL /* MII data */
  162. /*
  163. * Receive Packet Length Register (RPLR)
  164. */
  165. #define XEM_RPLR_LENGTH_MASK 0x0000FFFFUL /* Receive packet length */
  166. /*
  167. * Transmit Packet Length Register (TPLR)
  168. */
  169. #define XEM_TPLR_LENGTH_MASK 0x0000FFFFUL /* Transmit packet length */
  170. /*
  171. * Transmit Status Register (TSR)
  172. */
  173. #define XEM_TSR_EXCESS_DEFERRAL_MASK 0x80000000UL /* Transmit excess deferral */
  174. #define XEM_TSR_FIFO_UNDERRUN_MASK 0x40000000UL /* Packet FIFO underrun */
  175. #define XEM_TSR_ATTEMPTS_MASK 0x3E000000UL /* Transmission attempts */
  176. #define XEM_TSR_LATE_COLLISION_MASK 0x01000000UL /* Transmit late collision */
  177. /*
  178. * Receive Missed Frame Count (RMFC)
  179. */
  180. #define XEM_RMFC_DATA_MASK 0x0000FFFFUL
  181. /*
  182. * Receive Collision Count (RCC)
  183. */
  184. #define XEM_RCC_DATA_MASK 0x0000FFFFUL
  185. /*
  186. * Receive FCS Error Count (RFCSEC)
  187. */
  188. #define XEM_RFCSEC_DATA_MASK 0x0000FFFFUL
  189. /*
  190. * Receive Alignment Error Count (RALN)
  191. */
  192. #define XEM_RAEC_DATA_MASK 0x0000FFFFUL
  193. /*
  194. * Transmit Excess Deferral Count (TEDC)
  195. */
  196. #define XEM_TEDC_DATA_MASK 0x0000FFFFUL
  197. /*
  198. * EMAC Interrupt Registers (Status and Enable) masks. These registers are
  199. * part of the IPIF IP Interrupt registers
  200. */
  201. #define XEM_EIR_XMIT_DONE_MASK 0x00000001UL /* Xmit complete */
  202. #define XEM_EIR_RECV_DONE_MASK 0x00000002UL /* Recv complete */
  203. #define XEM_EIR_XMIT_ERROR_MASK 0x00000004UL /* Xmit error */
  204. #define XEM_EIR_RECV_ERROR_MASK 0x00000008UL /* Recv error */
  205. #define XEM_EIR_XMIT_SFIFO_EMPTY_MASK 0x00000010UL /* Xmit status fifo empty */
  206. #define XEM_EIR_RECV_LFIFO_EMPTY_MASK 0x00000020UL /* Recv length fifo empty */
  207. #define XEM_EIR_XMIT_LFIFO_FULL_MASK 0x00000040UL /* Xmit length fifo full */
  208. #define XEM_EIR_RECV_LFIFO_OVER_MASK 0x00000080UL /* Recv length fifo
  209. * overrun */
  210. #define XEM_EIR_RECV_LFIFO_UNDER_MASK 0x00000100UL /* Recv length fifo
  211. * underrun */
  212. #define XEM_EIR_XMIT_SFIFO_OVER_MASK 0x00000200UL /* Xmit status fifo
  213. * overrun */
  214. #define XEM_EIR_XMIT_SFIFO_UNDER_MASK 0x00000400UL /* Transmit status fifo
  215. * underrun */
  216. #define XEM_EIR_XMIT_LFIFO_OVER_MASK 0x00000800UL /* Transmit length fifo
  217. * overrun */
  218. #define XEM_EIR_XMIT_LFIFO_UNDER_MASK 0x00001000UL /* Transmit length fifo
  219. * underrun */
  220. #define XEM_EIR_XMIT_PAUSE_MASK 0x00002000UL /* Transmit pause pkt
  221. * received */
  222. #define XEM_EIR_RECV_DFIFO_OVER_MASK 0x00004000UL /* Receive data fifo
  223. * overrun */
  224. #define XEM_EIR_RECV_MISSED_FRAME_MASK 0x00008000UL /* Receive missed frame
  225. * error */
  226. #define XEM_EIR_RECV_COLLISION_MASK 0x00010000UL /* Receive collision
  227. * error */
  228. #define XEM_EIR_RECV_FCS_ERROR_MASK 0x00020000UL /* Receive FCS error */
  229. #define XEM_EIR_RECV_LEN_ERROR_MASK 0x00040000UL /* Receive length field
  230. * error */
  231. #define XEM_EIR_RECV_SHORT_ERROR_MASK 0x00080000UL /* Receive short frame
  232. * error */
  233. #define XEM_EIR_RECV_LONG_ERROR_MASK 0x00100000UL /* Receive long frame
  234. * error */
  235. #define XEM_EIR_RECV_ALIGN_ERROR_MASK 0x00200000UL /* Receive alignment
  236. * error */
  237. /**************************** Type Definitions *******************************/
  238. /***************** Macros (Inline Functions) Definitions *********************/
  239. /*****************************************************************************
  240. *
  241. * Low-level driver macros and functions. The list below provides signatures
  242. * to help the user use the macros.
  243. *
  244. * u32 XEmac_mReadReg(u32 BaseAddress, int RegOffset)
  245. * void XEmac_mWriteReg(u32 BaseAddress, int RegOffset, u32 Mask)
  246. *
  247. * void XEmac_mSetControlReg(u32 BaseAddress, u32 Mask)
  248. * void XEmac_mSetMacAddress(u32 BaseAddress, u8 *AddressPtr)
  249. *
  250. * void XEmac_mEnable(u32 BaseAddress)
  251. * void XEmac_mDisable(u32 BaseAddress)
  252. *
  253. * u32 XEmac_mIsTxDone(u32 BaseAddress)
  254. * u32 XEmac_mIsRxEmpty(u32 BaseAddress)
  255. *
  256. * void XEmac_SendFrame(u32 BaseAddress, u8 *FramePtr, int Size)
  257. * int XEmac_RecvFrame(u32 BaseAddress, u8 *FramePtr)
  258. *
  259. *****************************************************************************/
  260. /****************************************************************************/
  261. /**
  262. *
  263. * Read the given register.
  264. *
  265. * @param BaseAddress is the base address of the device
  266. * @param RegOffset is the register offset to be read
  267. *
  268. * @return The 32-bit value of the register
  269. *
  270. * @note None.
  271. *
  272. *****************************************************************************/
  273. #define XEmac_mReadReg(BaseAddress, RegOffset) \
  274. XIo_In32((BaseAddress) + (RegOffset))
  275. /****************************************************************************/
  276. /**
  277. *
  278. * Write the given register.
  279. *
  280. * @param BaseAddress is the base address of the device
  281. * @param RegOffset is the register offset to be written
  282. * @param Data is the 32-bit value to write to the register
  283. *
  284. * @return None.
  285. *
  286. * @note None.
  287. *
  288. *****************************************************************************/
  289. #define XEmac_mWriteReg(BaseAddress, RegOffset, Data) \
  290. XIo_Out32((BaseAddress) + (RegOffset), (Data))
  291. /****************************************************************************/
  292. /**
  293. *
  294. * Set the contents of the control register. Use the XEM_ECR_* constants
  295. * defined above to create the bit-mask to be written to the register.
  296. *
  297. * @param BaseAddress is the base address of the device
  298. * @param Mask is the 16-bit value to write to the control register
  299. *
  300. * @return None.
  301. *
  302. * @note None.
  303. *
  304. *****************************************************************************/
  305. #define XEmac_mSetControlReg(BaseAddress, Mask) \
  306. XIo_Out32((BaseAddress) + XEM_ECR_OFFSET, (Mask))
  307. /****************************************************************************/
  308. /**
  309. *
  310. * Set the station address of the EMAC device.
  311. *
  312. * @param BaseAddress is the base address of the device
  313. * @param AddressPtr is a pointer to a 6-byte MAC address
  314. *
  315. * @return None.
  316. *
  317. * @note None.
  318. *
  319. *****************************************************************************/
  320. #define XEmac_mSetMacAddress(BaseAddress, AddressPtr) \
  321. { \
  322. u32 MacAddr; \
  323. \
  324. MacAddr = ((AddressPtr)[0] << 8) | (AddressPtr)[1]; \
  325. XIo_Out32((BaseAddress) + XEM_SAH_OFFSET, MacAddr); \
  326. \
  327. MacAddr = ((AddressPtr)[2] << 24) | ((AddressPtr)[3] << 16) | \
  328. ((AddressPtr)[4] << 8) | (AddressPtr)[5]; \
  329. \
  330. XIo_Out32((BaseAddress) + XEM_SAL_OFFSET, MacAddr); \
  331. }
  332. /****************************************************************************/
  333. /**
  334. *
  335. * Enable the transmitter and receiver. Preserve the contents of the control
  336. * register.
  337. *
  338. * @param BaseAddress is the base address of the device
  339. *
  340. * @return None.
  341. *
  342. * @note None.
  343. *
  344. *****************************************************************************/
  345. #define XEmac_mEnable(BaseAddress) \
  346. { \
  347. u32 Control; \
  348. Control = XIo_In32((BaseAddress) + XEM_ECR_OFFSET); \
  349. Control &= ~(XEM_ECR_XMIT_RESET_MASK | XEM_ECR_RECV_RESET_MASK); \
  350. Control |= (XEM_ECR_XMIT_ENABLE_MASK | XEM_ECR_RECV_ENABLE_MASK); \
  351. XIo_Out32((BaseAddress) + XEM_ECR_OFFSET, Control); \
  352. }
  353. /****************************************************************************/
  354. /**
  355. *
  356. * Disable the transmitter and receiver. Preserve the contents of the control
  357. * register.
  358. *
  359. * @param BaseAddress is the base address of the device
  360. *
  361. * @return None.
  362. *
  363. * @note None.
  364. *
  365. *****************************************************************************/
  366. #define XEmac_mDisable(BaseAddress) \
  367. XIo_Out32((BaseAddress) + XEM_ECR_OFFSET, \
  368. XIo_In32((BaseAddress) + XEM_ECR_OFFSET) & \
  369. ~(XEM_ECR_XMIT_ENABLE_MASK | XEM_ECR_RECV_ENABLE_MASK))
  370. /****************************************************************************/
  371. /**
  372. *
  373. * Check to see if the transmission is complete.
  374. *
  375. * @param BaseAddress is the base address of the device
  376. *
  377. * @return TRUE if it is done, or FALSE if it is not.
  378. *
  379. * @note None.
  380. *
  381. *****************************************************************************/
  382. #define XEmac_mIsTxDone(BaseAddress) \
  383. (XIo_In32((BaseAddress) + XEM_ISR_OFFSET) & XEM_EIR_XMIT_DONE_MASK)
  384. /****************************************************************************/
  385. /**
  386. *
  387. * Check to see if the receive FIFO is empty.
  388. *
  389. * @param BaseAddress is the base address of the device
  390. *
  391. * @return TRUE if it is empty, or FALSE if it is not.
  392. *
  393. * @note None.
  394. *
  395. *****************************************************************************/
  396. #define XEmac_mIsRxEmpty(BaseAddress) \
  397. (!(XIo_In32((BaseAddress) + XEM_ISR_OFFSET) & XEM_EIR_RECV_DONE_MASK))
  398. /****************************************************************************/
  399. /**
  400. *
  401. * Reset MII compliant PHY
  402. *
  403. * @param BaseAddress is the base address of the device
  404. *
  405. * @return None.
  406. *
  407. * @note None.
  408. *
  409. *****************************************************************************/
  410. #define XEmac_mPhyReset(BaseAddress) \
  411. { \
  412. u32 Control; \
  413. Control = XIo_In32((BaseAddress) + XEM_ECR_OFFSET); \
  414. Control &= ~XEM_ECR_PHY_ENABLE_MASK; \
  415. XIo_Out32((BaseAddress) + XEM_ECR_OFFSET, Control); \
  416. Control |= XEM_ECR_PHY_ENABLE_MASK; \
  417. XIo_Out32((BaseAddress) + XEM_ECR_OFFSET, Control); \
  418. }
  419. /************************** Function Prototypes ******************************/
  420. void XEmac_SendFrame(u32 BaseAddress, u8 * FramePtr, int Size);
  421. int XEmac_RecvFrame(u32 BaseAddress, u8 * FramePtr);
  422. #endif /* end of protection macro */