IxEthAccDataPlane_p.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /**
  2. * @file IxEthAccDataPlane_p.h
  3. *
  4. * @author Intel Corporation
  5. * @date 12-Feb-2002
  6. *
  7. * @brief Internal Header file for IXP425 Ethernet Access component.
  8. *
  9. * Design Notes:
  10. *
  11. *
  12. * @par
  13. * IXP400 SW Release version 2.0
  14. *
  15. * -- Copyright Notice --
  16. *
  17. * @par
  18. * Copyright 2001-2005, Intel Corporation.
  19. * All rights reserved.
  20. *
  21. * @par
  22. * SPDX-License-Identifier: BSD-3-Clause
  23. * @par
  24. * -- End of Copyright Notice --
  25. */
  26. #ifndef IxEthAccDataPlane_p_H
  27. #define IxEthAccDataPlane_p_H
  28. #include <IxOsal.h>
  29. #include <IxQMgr.h>
  30. /**
  31. * @addtogroup IxEthAccPri
  32. *@{
  33. */
  34. /* typedefs global to this file*/
  35. typedef struct
  36. {
  37. IX_OSAL_MBUF *pHead;
  38. IX_OSAL_MBUF *pTail;
  39. }IxEthAccDataPlaneQList;
  40. /**
  41. * @struct IxEthAccDataPlaneStats
  42. * @brief Statistics data structure associated with the data plane
  43. *
  44. */
  45. typedef struct
  46. {
  47. UINT32 addToSwQ;
  48. UINT32 removeFromSwQ;
  49. UINT32 unchainedTxMBufs;
  50. UINT32 chainedTxMBufs;
  51. UINT32 unchainedTxDoneMBufs;
  52. UINT32 chainedTxDoneMBufs;
  53. UINT32 unchainedRxMBufs;
  54. UINT32 chainedRxMBufs;
  55. UINT32 unchainedRxFreeMBufs;
  56. UINT32 chainedRxFreeMBufs;
  57. UINT32 rxCallbackCounter;
  58. UINT32 rxCallbackBurstRead;
  59. UINT32 txDoneCallbackCounter;
  60. UINT32 unexpectedError;
  61. } IxEthAccDataPlaneStats;
  62. /**
  63. * @fn ixEthAccMbufFromSwQ
  64. * @brief used during disable steps to convert mbufs from
  65. * swq format, ready to be pushed into hw queues for NPE,
  66. * back into XScale format
  67. */
  68. IX_OSAL_MBUF *ixEthAccMbufFromSwQ(IX_OSAL_MBUF *mbuf);
  69. /**
  70. * @fn ixEthAccDataPlaneShow
  71. * @brief Show function (for data plane statistics
  72. */
  73. void ixEthAccDataPlaneShow(void);
  74. /*
  75. * lock dataplane when atomic operation is required
  76. */
  77. #define IX_ETH_ACC_DATA_PLANE_LOCK(arg) arg = ixOsalIrqLock();
  78. #define IX_ETH_ACC_DATA_PLANE_UNLOCK(arg) ixOsalIrqUnlock(arg);
  79. /*
  80. * Use MBUF fields
  81. */
  82. #define IX_ETHACC_NE_SHARED(mBufPtr) \
  83. ((IxEthAccNe *)&((mBufPtr)->ix_ne))
  84. #if 1
  85. #define IX_ETHACC_NE_NEXT(mBufPtr) (mBufPtr)->ix_ne.reserved[0]
  86. /* tm - wrong!! len and pkt_len are in the second word - #define IX_ETHACC_NE_LEN(mBufPtr) (mBufPtr)->ix_ne.reserved[3] */
  87. #define IX_ETHACC_NE_LEN(mBufPtr) (mBufPtr)->ix_ne.reserved[1]
  88. #define IX_ETHACC_NE_DATA(mBufPtr)(mBufPtr)->ix_ne.reserved[2]
  89. #else
  90. #define IX_ETHACC_NE_NEXT(mBufPtr) \
  91. IX_ETHACC_NE_SHARED(mBufPtr)->ixReserved_next
  92. #define IX_ETHACC_NE_LEN(mBufPtr) \
  93. IX_ETHACC_NE_SHARED(mBufPtr)->ixReserved_lengths
  94. #define IX_ETHACC_NE_DATA(mBufPtr) \
  95. IX_ETHACC_NE_SHARED(mBufPtr)->ixReserved_data
  96. #endif
  97. /*
  98. * Use MBUF next pointer field to chain data.
  99. */
  100. #define IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER(mbuf) (mbuf)->ix_ctrl.ix_chain
  101. #define IX_ETH_ACC_DATAPLANE_IS_Q_EMPTY(mbuf_list) ((mbuf_list.pHead) == NULL)
  102. #define IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_HEAD(mbuf_list,mbuf_to_add) \
  103. do { \
  104. int lockVal; \
  105. IX_ETH_ACC_DATA_PLANE_LOCK(lockVal); \
  106. IX_ETH_ACC_STATS_INC(ixEthAccDataStats.addToSwQ); \
  107. if ( (mbuf_list.pHead) != NULL ) \
  108. { \
  109. (IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add))) = (mbuf_list.pHead);\
  110. (mbuf_list.pHead) = (mbuf_to_add); \
  111. } \
  112. else { \
  113. (mbuf_list.pTail) = (mbuf_list.pHead) = (mbuf_to_add); \
  114. IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add)) = NULL; \
  115. } \
  116. IX_ETH_ACC_DATA_PLANE_UNLOCK(lockVal); \
  117. } while(0)
  118. #define IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_TAIL(mbuf_list,mbuf_to_add) \
  119. do { \
  120. int lockVal; \
  121. IX_ETH_ACC_DATA_PLANE_LOCK(lockVal); \
  122. IX_ETH_ACC_STATS_INC(ixEthAccDataStats.addToSwQ); \
  123. if ( (mbuf_list.pHead) == NULL ) \
  124. { \
  125. (mbuf_list.pHead) = mbuf_to_add; \
  126. IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add)) = NULL; \
  127. } \
  128. else { \
  129. IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_list.pTail)) = (mbuf_to_add); \
  130. IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add)) = NULL; \
  131. } \
  132. (mbuf_list.pTail) = mbuf_to_add; \
  133. IX_ETH_ACC_DATA_PLANE_UNLOCK(lockVal); \
  134. } while (0)
  135. #define IX_ETH_ACC_DATAPLANE_REMOVE_MBUF_FROM_Q_HEAD(mbuf_list,mbuf_to_rem) \
  136. do { \
  137. int lockVal; \
  138. IX_ETH_ACC_DATA_PLANE_LOCK(lockVal); \
  139. if ( (mbuf_list.pHead) != NULL ) \
  140. { \
  141. IX_ETH_ACC_STATS_INC(ixEthAccDataStats.removeFromSwQ); \
  142. (mbuf_to_rem) = (mbuf_list.pHead) ; \
  143. (mbuf_list.pHead) = (IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_rem)));\
  144. } \
  145. else { \
  146. (mbuf_to_rem) = NULL; \
  147. } \
  148. IX_ETH_ACC_DATA_PLANE_UNLOCK(lockVal); \
  149. } while (0)
  150. /**
  151. * @brief message handler QManager entries for NPE id => port ID conversion (NPE_B => 0, NPE_C => 1)
  152. */
  153. #define IX_ETH_ACC_PORT_TO_NPE_ID(port) \
  154. ixEthAccPortData[(port)].npeId
  155. #define IX_ETH_ACC_NPE_TO_PORT_ID(npe) ((npe == 0 ? 2 : (npe == 1 ? 0 : ( npe == 2 ? 1 : -1 ))))
  156. #define IX_ETH_ACC_PORT_TO_TX_Q_ID(port) \
  157. ixEthAccPortData[(port)].ixEthAccTxData.txQueue
  158. #define IX_ETH_ACC_PORT_TO_RX_FREE_Q_ID(port) \
  159. ixEthAccPortData[(port)].ixEthAccRxData.rxFreeQueue
  160. #define IX_ETH_ACC_PORT_TO_TX_Q_SOURCE(port) (port == IX_ETH_PORT_1 ? IX_ETH_ACC_TX_FRAME_ENET0_Q_SOURCE : (port == IX_ETH_PORT_2 ? IX_ETH_ACC_TX_FRAME_ENET1_Q_SOURCE : IX_ETH_ACC_TX_FRAME_ENET2_Q_SOURCE))
  161. #define IX_ETH_ACC_PORT_TO_RX_FREE_Q_SOURCE(port) (port == IX_ETH_PORT_1 ? IX_ETH_ACC_RX_FREE_BUFF_ENET0_Q_SOURCE : (port == IX_ETH_PORT_2 ? IX_ETH_ACC_RX_FREE_BUFF_ENET1_Q_SOURCE : IX_ETH_ACC_RX_FREE_BUFF_ENET2_Q_SOURCE ))
  162. /* Flush the mbufs chain and all data pointed to by the mbuf */
  163. #ifndef NDEBUG
  164. #define IX_ETH_ACC_STATS_INC(x) (x++)
  165. #else
  166. #define IX_ETH_ACC_STATS_INC(x)
  167. #endif
  168. #define IX_ETH_ACC_MAX_TX_FRAMES_TO_SUBMIT 128
  169. void ixEthRxFrameQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
  170. void ixEthRxMultiBufferQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
  171. void ixEthTxFrameDoneQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
  172. #endif /* IxEthAccDataPlane_p_H */
  173. /**
  174. *@}
  175. */