blob: dce43d9a1978a494aef3995d00df9e4a297bc89e [file] [log] [blame]
Wolfgang Denk4646d2a2006-05-30 15:56:48 +02001/**
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
Wolfgang Denkc57eadc2013-07-28 22:12:47 +020022 * SPDX-License-Identifier: BSD-3-Clause
Wolfgang Denk4646d2a2006-05-30 15:56:48 +020023 * @par
24 * -- End of Copyright Notice --
25 */
26
27
28
29#ifndef IxEthAccDataPlane_p_H
30#define IxEthAccDataPlane_p_H
31
32#include <IxOsal.h>
33#include <IxQMgr.h>
34
35/**
36 * @addtogroup IxEthAccPri
37 *@{
38 */
39
40/* typedefs global to this file*/
41
42typedef struct
43{
44 IX_OSAL_MBUF *pHead;
45 IX_OSAL_MBUF *pTail;
46}IxEthAccDataPlaneQList;
47
48
49/**
50 * @struct IxEthAccDataPlaneStats
51 * @brief Statistics data structure associated with the data plane
52 *
53 */
54typedef struct
55{
56 UINT32 addToSwQ;
57 UINT32 removeFromSwQ;
58 UINT32 unchainedTxMBufs;
59 UINT32 chainedTxMBufs;
60 UINT32 unchainedTxDoneMBufs;
61 UINT32 chainedTxDoneMBufs;
62 UINT32 unchainedRxMBufs;
63 UINT32 chainedRxMBufs;
64 UINT32 unchainedRxFreeMBufs;
65 UINT32 chainedRxFreeMBufs;
66 UINT32 rxCallbackCounter;
67 UINT32 rxCallbackBurstRead;
68 UINT32 txDoneCallbackCounter;
69 UINT32 unexpectedError;
70} IxEthAccDataPlaneStats;
71
72/**
73 * @fn ixEthAccMbufFromSwQ
74 * @brief used during disable steps to convert mbufs from
75 * swq format, ready to be pushed into hw queues for NPE,
76 * back into XScale format
77 */
78IX_OSAL_MBUF *ixEthAccMbufFromSwQ(IX_OSAL_MBUF *mbuf);
79
80/**
81 * @fn ixEthAccDataPlaneShow
82 * @brief Show function (for data plane statistics
83 */
84void ixEthAccDataPlaneShow(void);
85
86/*
87 * lock dataplane when atomic operation is required
88 */
89#define IX_ETH_ACC_DATA_PLANE_LOCK(arg) arg = ixOsalIrqLock();
90#define IX_ETH_ACC_DATA_PLANE_UNLOCK(arg) ixOsalIrqUnlock(arg);
91
92/*
93 * Use MBUF fields
94 */
95#define IX_ETHACC_NE_SHARED(mBufPtr) \
96 ((IxEthAccNe *)&((mBufPtr)->ix_ne))
97
98#if 1
99
100#define IX_ETHACC_NE_NEXT(mBufPtr) (mBufPtr)->ix_ne.reserved[0]
101
102/* tm - wrong!! len and pkt_len are in the second word - #define IX_ETHACC_NE_LEN(mBufPtr) (mBufPtr)->ix_ne.reserved[3] */
103#define IX_ETHACC_NE_LEN(mBufPtr) (mBufPtr)->ix_ne.reserved[1]
104
105#define IX_ETHACC_NE_DATA(mBufPtr)(mBufPtr)->ix_ne.reserved[2]
106
107#else
108
109#define IX_ETHACC_NE_NEXT(mBufPtr) \
110 IX_ETHACC_NE_SHARED(mBufPtr)->ixReserved_next
111
112#define IX_ETHACC_NE_LEN(mBufPtr) \
113 IX_ETHACC_NE_SHARED(mBufPtr)->ixReserved_lengths
114
115#define IX_ETHACC_NE_DATA(mBufPtr) \
116 IX_ETHACC_NE_SHARED(mBufPtr)->ixReserved_data
117#endif
118
119/*
120 * Use MBUF next pointer field to chain data.
121 */
122#define IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER(mbuf) (mbuf)->ix_ctrl.ix_chain
123
124
125
126#define IX_ETH_ACC_DATAPLANE_IS_Q_EMPTY(mbuf_list) ((mbuf_list.pHead) == NULL)
127
128
129#define IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_HEAD(mbuf_list,mbuf_to_add) \
130 do { \
131 int lockVal; \
132 IX_ETH_ACC_DATA_PLANE_LOCK(lockVal); \
133 IX_ETH_ACC_STATS_INC(ixEthAccDataStats.addToSwQ); \
134 if ( (mbuf_list.pHead) != NULL ) \
135 { \
136 (IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add))) = (mbuf_list.pHead);\
137 (mbuf_list.pHead) = (mbuf_to_add); \
138 } \
139 else { \
140 (mbuf_list.pTail) = (mbuf_list.pHead) = (mbuf_to_add); \
141 IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add)) = NULL; \
142 } \
143 IX_ETH_ACC_DATA_PLANE_UNLOCK(lockVal); \
144 } while(0)
145
146
147#define IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_TAIL(mbuf_list,mbuf_to_add) \
148 do { \
149 int lockVal; \
150 IX_ETH_ACC_DATA_PLANE_LOCK(lockVal); \
151 IX_ETH_ACC_STATS_INC(ixEthAccDataStats.addToSwQ); \
152 if ( (mbuf_list.pHead) == NULL ) \
153 { \
154 (mbuf_list.pHead) = mbuf_to_add; \
155 IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add)) = NULL; \
156 } \
157 else { \
158 IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_list.pTail)) = (mbuf_to_add); \
159 IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_add)) = NULL; \
160 } \
161 (mbuf_list.pTail) = mbuf_to_add; \
162 IX_ETH_ACC_DATA_PLANE_UNLOCK(lockVal); \
163 } while (0)
164
165
166#define IX_ETH_ACC_DATAPLANE_REMOVE_MBUF_FROM_Q_HEAD(mbuf_list,mbuf_to_rem) \
167 do { \
168 int lockVal; \
169 IX_ETH_ACC_DATA_PLANE_LOCK(lockVal); \
170 if ( (mbuf_list.pHead) != NULL ) \
171 { \
172 IX_ETH_ACC_STATS_INC(ixEthAccDataStats.removeFromSwQ); \
173 (mbuf_to_rem) = (mbuf_list.pHead) ; \
174 (mbuf_list.pHead) = (IX_ETH_ACC_MBUF_NEXT_PKT_CHAIN_MEMBER((mbuf_to_rem)));\
175 } \
176 else { \
177 (mbuf_to_rem) = NULL; \
178 } \
179 IX_ETH_ACC_DATA_PLANE_UNLOCK(lockVal); \
180 } while (0)
181
182
183/**
184 * @brief message handler QManager entries for NPE id => port ID conversion (NPE_B => 0, NPE_C => 1)
185 */
186#define IX_ETH_ACC_PORT_TO_NPE_ID(port) \
187 ixEthAccPortData[(port)].npeId
188
189#define IX_ETH_ACC_NPE_TO_PORT_ID(npe) ((npe == 0 ? 2 : (npe == 1 ? 0 : ( npe == 2 ? 1 : -1 ))))
190
191#define IX_ETH_ACC_PORT_TO_TX_Q_ID(port) \
192 ixEthAccPortData[(port)].ixEthAccTxData.txQueue
193
194#define IX_ETH_ACC_PORT_TO_RX_FREE_Q_ID(port) \
195 ixEthAccPortData[(port)].ixEthAccRxData.rxFreeQueue
196
197#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))
198
199#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 ))
200
201/* Flush the mbufs chain and all data pointed to by the mbuf */
202
203#ifndef NDEBUG
204#define IX_ETH_ACC_STATS_INC(x) (x++)
205#else
206#define IX_ETH_ACC_STATS_INC(x)
207#endif
208
209#define IX_ETH_ACC_MAX_TX_FRAMES_TO_SUBMIT 128
210
211void ixEthRxFrameQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
212void ixEthRxMultiBufferQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
213void ixEthTxFrameDoneQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
214
215#endif /* IxEthAccDataPlane_p_H */
216
217
218/**
219 *@}
220 */
221