fgmac.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * Copyright : (C) 2022 Phytium Information Technology, Inc.
  3. * All Rights Reserved.
  4. *
  5. * This program is OPEN SOURCE software: you can redistribute it and/or modify it
  6. * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
  7. * either version 1.0 of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
  10. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. * See the Phytium Public License for more details.
  12. *
  13. *
  14. * FilePath: fgmac.h
  15. * Date: 2022-04-06 14:46:52
  16. * LastEditTime: 2022-04-06 14:46:58
  17. * Description:  This file is for
  18. *
  19. * Modify History:
  20. * Ver   Who        Date         Changes
  21. * ----- ------     --------    --------------------------------------
  22. */
  23. #ifndef DRIVERS_ETH_FGMAC_H
  24. #define DRIVERS_ETH_FGMAC_H
  25. #ifdef __cplusplus
  26. extern "C"
  27. {
  28. #endif
  29. /***************************** Include Files *********************************/
  30. #include "ftypes.h"
  31. #include "fassert.h"
  32. #include "ferror_code.h"
  33. #include "fkernel.h"
  34. #define FGMAC_PHY_MAX_NUM 32U
  35. /************************** Constant Definitions *****************************/
  36. #define FGMAC_SUCCESS FT_SUCCESS
  37. #define FGMAC_ERR_TIMEOUT FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 1)
  38. #define FGMAC_ERR_INVALID_DMA_MEM FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 2)
  39. #define FGMAC_ERR_NOT_READY FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 3)
  40. #define FGMAC_ERR_TRANS_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 4)
  41. #define FGMAC_ERR_PHY_NOT_SUPPORT FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 5)
  42. #define FGMAC_ERR_PHY_IS_NOT_FOUND FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 6)
  43. #define FGMAC_ERR_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 7)
  44. #define FGMAC_ERR_PHY_AUTO_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 8)
  45. #define FGMAC_ERR_CODE_PREFIX FGMAC_ERR_TIMEOUT & (FT_ERRCODE_SYS_MODULE_MASK | FT_ERRCODE_SUB_MODULE_MASK)
  46. #define FGMAC_NUM_OF_ERR_CODE 5
  47. /********发送描述符********/
  48. /* TDES0 包含发送的帧状态和描述符所有权信息 */
  49. #define FGMAC_DMA_TDES0_DEFERRED BIT(0)
  50. #define FGMAC_DMA_TDES0_UNDERFLOW_ERROR BIT(1)
  51. #define FGMAC_DMA_TDES0_EXCESSIVE_DEFERRAL BIT(2)
  52. #define FGMAC_DMA_TDES0_COLLISION_COUNT_MASK GENMASK(6, 3)
  53. #define FGMAC_DMA_TDES0_VLAN_FRAME BIT(7)
  54. #define FGMAC_DMA_TDES0_EXCESSIVE_COLLISIONS BIT(8)
  55. #define FGMAC_DMA_TDES0_LATE_COLLISION BIT(9)
  56. #define FGMAC_DMA_TDES0_NO_CARRIER BIT(10)
  57. #define FGMAC_DMA_TDES0_LOSS_CARRIER BIT(11)
  58. #define FGMAC_DMA_TDES0_PAYLOAD_ERROR BIT(12)
  59. #define FGMAC_DMA_TDES0_FRAME_FLUSHED BIT(13)
  60. #define FGMAC_DMA_TDES0_JABBER_TIMEOUT BIT(14)
  61. #define FGMAC_DMA_TDES0_ERROR_SUMMARY BIT(15)
  62. #define FGMAC_DMA_TDES0_IP_HEADER_ERROR BIT(16)
  63. #define FGMAC_DMA_TDES0_TIME_STAMP_STATUS BIT(17) /* 指示已捕获相应发送帧的时间戳 */
  64. #define FGMAC_DMA_TDES0_OWN BIT(31) /* 该位表示描述符归 DMA 所有 */
  65. /* TDES1 包含缓冲区大小和控制描述符链/环和正在传输的帧的其他位 */
  66. #define FGMAC_DMA_TDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
  67. #define FGMAC_DMA_TDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
  68. #define FGMAC_DMA_TDES1_BUFFER2_SIZE_SHIFT 11
  69. #define FGMAC_DMA_TDES1_TIME_STAMP_ENABLE BIT(22)
  70. #define FGMAC_DMA_TDES1_DISABLE_PADDING BIT(23)
  71. #define FGMAC_DMA_TDES1_SECOND_ADDRESS_CHAINED BIT(24)
  72. #define FGMAC_DMA_TDES1_END_RING BIT(25)
  73. #define FGMAC_DMA_TDES1_CRC_DISABLE BIT(26)
  74. #define FGMAC_DMA_TDES1_CHECKSUM_INSERTION_MASK GENMASK(28, 27)
  75. #define FGMAC_DMA_TDES1_CHECKSUM_INSERTION_SHIFT 27
  76. #define FGMAC_DMA_TDES1_FIRST_SEGMENT BIT(29)
  77. #define FGMAC_DMA_TDES1_LAST_SEGMENT BIT(30)
  78. #define FGMAC_DMA_TDES1_INTERRUPT BIT(31)
  79. /********接收描述符********/
  80. /* RDES0 包含接收的帧状态,帧长度和描述符所有权信息 */
  81. #define FGMAC_DMA_RDES0_PAYLOAD_CSUM_ERR BIT(0)
  82. #define FGMAC_DMA_RDES0_CRC_ERROR BIT(1)
  83. #define FGMAC_DMA_RDES0_DRIBBLING BIT(2)
  84. #define FGMAC_DMA_RDES0_MII_ERROR BIT(3)
  85. #define FGMAC_DMA_RDES0_RECEIVE_WATCHDOG BIT(4)
  86. #define FGMAC_DMA_RDES0_FRAME_TYPE BIT(5)
  87. #define FGMAC_DMA_RDES0_COLLISION BIT(6)
  88. #define FGMAC_DMA_RDES0_IPC_CSUM_ERROR BIT(7)
  89. #define FGMAC_DMA_RDES0_LAST_DESCRIPTOR BIT(8)
  90. #define FGMAC_DMA_RDES0_FIRST_DESCRIPTOR BIT(9)
  91. #define FGMAC_DMA_RDES0_VLAN_TAG BIT(10)
  92. #define FGMAC_DMA_RDES0_OVERFLOW_ERROR BIT(11)
  93. #define FGMAC_DMA_RDES0_LENGTH_ERROR BIT(12)
  94. #define FGMAC_DMA_RDES0_SA_FILTER_FAIL BIT(13)
  95. #define FGMAC_DMA_RDES0_DESCRIPTOR_ERROR BIT(14)
  96. #define FGMAC_DMA_RDES0_ERROR_SUMMARY BIT(15)
  97. #define FGMAC_DMA_RDES0_FRAME_LEN_MASK (0x3FFF << 16) /* GENMASK(29, 16)*/
  98. #define FGMAC_DMA_RDES0_FRAME_LEN_SHIFT 16
  99. #define FGMAC_DMA_RDES0_DA_FILTER_FAIL BIT(30)
  100. #define FGMAC_DMA_RDES0_OWN BIT(31)
  101. /* RDES1 包含缓冲区大小和控制描述符链/环的其他位 */
  102. #define FGMAC_DMA_RDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
  103. #define FGMAC_DMA_RDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
  104. #define FGMAC_DMA_RDES1_BUFFER2_SIZE_SHIFT 11
  105. #define FGMAC_DMA_RDES1_SECOND_ADDRESS_CHAINED BIT(24)
  106. #define FGMAC_DMA_RDES1_END_RING BIT(25)
  107. #define FGMAC_DMA_RDES1_DISABLE_IC BIT(31)
  108. /* Operational Mode */
  109. enum
  110. {
  111. FGMAC_CHECKSUM_BY_SOFTWARE = 0,
  112. FGMAC_CHECKSUM_BY_HARDWARE
  113. }; /* software checksum or hardware checksum */
  114. enum
  115. {
  116. FGMAC_TX_COMPLETE_EVT = 0,
  117. FGMAC_RX_COMPLETE_EVT,
  118. FGMAC_LINK_STATUS_EVT,
  119. FGMAC_PHY_STATUS_EVT,
  120. FGMAC_DMA_ERR_EVT,
  121. FGMAC_INTR_EVT_NUM
  122. }; /* interrupt event type */
  123. /**************************** Type Definitions *******************************/
  124. /**
  125. * This typedef contains configuration information for the device.
  126. */
  127. typedef struct
  128. {
  129. u32 instance_id; /* device instance id */
  130. uintptr base_addr; /* device base address */
  131. u32 irq_num; /* irq num */
  132. u32 irq_prority; /* device intrrupt priority */
  133. u32 cheksum_mode; /* hardware or software checksum */
  134. u32 duplex_mode; /* selects the MAC duplex mode: Half-Duplex or Full-Duplex mode */
  135. u32 max_packet_size; /* max num of bytes in frame transfer */
  136. u32 mdc_clk_hz; /* MDC clock access PHY. [1.0MHz ~2.5MHz] */
  137. boolean en_auto_negtiation; /* auto-negotiation or not */
  138. u32 speed; /* sets the Ethernet speed: 10/100/1000 Mbps. */
  139. } FGmacConfig; /* FGMAC 驱动配置数据 */
  140. /**
  141. * This typedef contains driver instance data. The user is required to allocate a
  142. * variable of this type for every device in the system. A pointer
  143. * to a variable of this type is then passed to the driver API functions.
  144. */
  145. typedef struct
  146. {
  147. volatile u32 status;
  148. u32 ctrl;
  149. u32 buf_addr;
  150. u32 next;
  151. } FGmacDmaDesc; /* FGMAC DMA描述符 */
  152. typedef struct
  153. {
  154. u32 desc_idx; /* For Current Desc position */
  155. u32 desc_buf_idx; /* For Current Desc buffer buf position */
  156. u32 desc_max_num; /* Max Number for Desc and Desc buffer */
  157. u8 *desc_buf_base; /* Desc buffer Base */
  158. } FGmacRingDescData; /* FGMAC DMA描述符表(链式)相关数据 */
  159. typedef void (*FGmacEvtHandler)(void *pCtrl);
  160. typedef struct
  161. {
  162. FGmacConfig config; /* Current active configs */
  163. u32 is_ready; /* Device is initialized and ready */
  164. FGmacRingDescData rx_ring; /* RX DMA descriptor data (idx, length) */
  165. volatile FGmacDmaDesc *rx_desc; /* RX DMA descriptor table in ring */
  166. FGmacRingDescData tx_ring; /* TX DMA descriptor data (idx, length) */
  167. volatile FGmacDmaDesc *tx_desc; /* TX DMA descriptor table in ring */
  168. FGmacEvtHandler evt_handler[FGMAC_INTR_EVT_NUM]; /* User registered interrupt handler */
  169. u32 phy_valid_mask; /* phy valid addr sequence mask */
  170. u32 phy_speed;
  171. u32 phy_addr; /* phy max valid addr, or the unique value */
  172. u16 phy_id1; /*phy tag,only value to identify phy*/
  173. } FGmac; /* FGMAC 驱动控制数据 */
  174. /************************** Variable Definitions *****************************/
  175. /***************** Macros (Inline Functions) Definitions *********************/
  176. /************************** Function Prototypes ******************************/
  177. /* 获取FGMAC驱动的默认配置参数 */
  178. const FGmacConfig *FGmacLookupConfig(u32 instance_id);
  179. /* 完成FGMAC驱动实例的初始化,使之可以使用 */
  180. FError FGmacCfgInitialize(FGmac *instance_p, const FGmacConfig *cofig_p);
  181. /* 完成FGMAC驱动实例去使能,清零实例数据 */
  182. FError FGmacDeInitialize(FGmac *instance_p);
  183. /* 配置FGMAC的发送DMA描述符和缓冲区 */
  184. FError FGmacSetupTxDescRing(FGmac *instance_p, volatile FGmacDmaDesc *tx_desc_tbl,
  185. u8 *tx_buf, const fsize_t tx_pre_buf_len, const fsize_t tx_buf_num);
  186. /* 配置FGMAC的接收DMA描述符和缓冲区 */
  187. FError FGmacSetupRxDescRing(FGmac *instance_p, volatile FGmacDmaDesc *rx_desc_tbl,
  188. u8 *rx_buf, const fsize_t rx_pre_buf_len, const fsize_t rx_buf_num);
  189. /* FGMAC中断处理函数 */
  190. void FGmacInterruptHandler(s32 vector, void *param);
  191. /* 注册FGMAC中断事件处理函数 */
  192. void FGmacRegisterEvtHandler(FGmac *instance_p, u32 evt, FGmacEvtHandler handler);
  193. /* 使能FGMAC DMA,使之可以接收/发送数据 */
  194. FError FGmacStartTrans(FGmac *instance_p);
  195. /* 去使能FGMAC DMA, 使之不再能接收/发送数据 */
  196. FError FGmacStopTrans(FGmac *instance_p);
  197. /* 通过FGMAC接收数据帧 */
  198. FError FGmacRecvFrame(FGmac *instance_p);
  199. /* 通过FGMAC发送数据帧 */
  200. FError FGmacSendFrame(FGmac *instance_p, u32 frame_len);
  201. /* 设置FGMAC中断屏蔽位 */
  202. void FGmacSetInterruptMask(FGmac *instance_p, u32 intr_type, u32 mask);
  203. /* 设置FGMAC中断使能位 */
  204. void FGmacSetInterruptUmask(FGmac *instance_p, u32 intr_type, u32 mask);
  205. /*fgmac deplex mode configuration */
  206. void FGmacControllerDuplexConfig(FGmac *instance_p, u32 duplex);
  207. /*fgmac speed configuration */
  208. void FGmacControllerSpeedConfig(FGmac *instance_p, u32 speed);
  209. #ifdef __cplusplus
  210. }
  211. #endif
  212. #endif