1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits * Copyright 2008-2012 Freescale Semiconductor Inc.
30aeed3e9SJustin Hibbits *
40aeed3e9SJustin Hibbits * Redistribution and use in source and binary forms, with or without
50aeed3e9SJustin Hibbits * modification, are permitted provided that the following conditions are met:
60aeed3e9SJustin Hibbits * * Redistributions of source code must retain the above copyright
70aeed3e9SJustin Hibbits * notice, this list of conditions and the following disclaimer.
80aeed3e9SJustin Hibbits * * Redistributions in binary form must reproduce the above copyright
90aeed3e9SJustin Hibbits * notice, this list of conditions and the following disclaimer in the
100aeed3e9SJustin Hibbits * documentation and/or other materials provided with the distribution.
110aeed3e9SJustin Hibbits * * Neither the name of Freescale Semiconductor nor the
120aeed3e9SJustin Hibbits * names of its contributors may be used to endorse or promote products
130aeed3e9SJustin Hibbits * derived from this software without specific prior written permission.
140aeed3e9SJustin Hibbits *
150aeed3e9SJustin Hibbits *
160aeed3e9SJustin Hibbits * ALTERNATIVELY, this software may be distributed under the terms of the
170aeed3e9SJustin Hibbits * GNU General Public License ("GPL") as published by the Free Software
180aeed3e9SJustin Hibbits * Foundation, either version 2 of that License or (at your option) any
190aeed3e9SJustin Hibbits * later version.
200aeed3e9SJustin Hibbits *
210aeed3e9SJustin Hibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
220aeed3e9SJustin Hibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
230aeed3e9SJustin Hibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
240aeed3e9SJustin Hibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
250aeed3e9SJustin Hibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
260aeed3e9SJustin Hibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
270aeed3e9SJustin Hibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
280aeed3e9SJustin Hibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
290aeed3e9SJustin Hibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
300aeed3e9SJustin Hibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
310aeed3e9SJustin Hibbits */
320aeed3e9SJustin Hibbits
33*852ba100SJustin Hibbits
340aeed3e9SJustin Hibbits /******************************************************************************
350aeed3e9SJustin Hibbits @File fm_manip.c
360aeed3e9SJustin Hibbits
370aeed3e9SJustin Hibbits @Description FM PCD manip ...
380aeed3e9SJustin Hibbits *//***************************************************************************/
390aeed3e9SJustin Hibbits #include "std_ext.h"
400aeed3e9SJustin Hibbits #include "error_ext.h"
410aeed3e9SJustin Hibbits #include "string_ext.h"
420aeed3e9SJustin Hibbits #include "debug_ext.h"
430aeed3e9SJustin Hibbits #include "fm_pcd_ext.h"
44*852ba100SJustin Hibbits #include "fm_port_ext.h"
450aeed3e9SJustin Hibbits #include "fm_muram_ext.h"
460aeed3e9SJustin Hibbits #include "memcpy_ext.h"
470aeed3e9SJustin Hibbits
480aeed3e9SJustin Hibbits #include "fm_common.h"
490aeed3e9SJustin Hibbits #include "fm_hc.h"
500aeed3e9SJustin Hibbits #include "fm_manip.h"
510aeed3e9SJustin Hibbits
52*852ba100SJustin Hibbits /****************************************/
53*852ba100SJustin Hibbits /* static functions */
54*852ba100SJustin Hibbits /****************************************/
GetManipInfo(t_FmPcdManip * p_Manip,e_ManipInfo manipInfo)55*852ba100SJustin Hibbits static t_Handle GetManipInfo(t_FmPcdManip *p_Manip, e_ManipInfo manipInfo)
560aeed3e9SJustin Hibbits {
57*852ba100SJustin Hibbits t_FmPcdManip *p_CurManip = p_Manip;
58*852ba100SJustin Hibbits
59*852ba100SJustin Hibbits if (!MANIP_IS_UNIFIED(p_Manip))
60*852ba100SJustin Hibbits p_CurManip = p_Manip;
61*852ba100SJustin Hibbits else
620aeed3e9SJustin Hibbits {
63*852ba100SJustin Hibbits /* go to first unified */
64*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))
65*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_PrevManip;
66*852ba100SJustin Hibbits }
67*852ba100SJustin Hibbits
68*852ba100SJustin Hibbits switch (manipInfo)
69*852ba100SJustin Hibbits {
70*852ba100SJustin Hibbits case (e_MANIP_HMCT):
71*852ba100SJustin Hibbits return p_CurManip->p_Hmct;
72*852ba100SJustin Hibbits case (e_MANIP_HMTD):
73*852ba100SJustin Hibbits return p_CurManip->h_Ad;
74*852ba100SJustin Hibbits case (e_MANIP_HANDLER_TABLE_OWNER):
75*852ba100SJustin Hibbits return (t_Handle)p_CurManip;
76*852ba100SJustin Hibbits default:
77*852ba100SJustin Hibbits return NULL;
780aeed3e9SJustin Hibbits }
790aeed3e9SJustin Hibbits }
800aeed3e9SJustin Hibbits
GetHmctSize(t_FmPcdManip * p_Manip)81*852ba100SJustin Hibbits static uint16_t GetHmctSize(t_FmPcdManip *p_Manip)
820aeed3e9SJustin Hibbits {
83*852ba100SJustin Hibbits uint16_t size = 0;
84*852ba100SJustin Hibbits t_FmPcdManip *p_CurManip = p_Manip;
85*852ba100SJustin Hibbits
86*852ba100SJustin Hibbits if (!MANIP_IS_UNIFIED(p_Manip))
87*852ba100SJustin Hibbits return p_Manip->tableSize;
88*852ba100SJustin Hibbits
89*852ba100SJustin Hibbits /* accumulate sizes, starting with the first node */
90*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))
91*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_PrevManip;
92*852ba100SJustin Hibbits
93*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
940aeed3e9SJustin Hibbits {
95*852ba100SJustin Hibbits size += p_CurManip->tableSize;
96*852ba100SJustin Hibbits p_CurManip = (t_FmPcdManip *)p_CurManip->h_NextManip;
97*852ba100SJustin Hibbits }
98*852ba100SJustin Hibbits size += p_CurManip->tableSize; /* add last size */
99*852ba100SJustin Hibbits
100*852ba100SJustin Hibbits return (size);
1010aeed3e9SJustin Hibbits }
1020aeed3e9SJustin Hibbits
GetDataSize(t_FmPcdManip * p_Manip)103*852ba100SJustin Hibbits static uint16_t GetDataSize(t_FmPcdManip *p_Manip)
104*852ba100SJustin Hibbits {
105*852ba100SJustin Hibbits uint16_t size = 0;
106*852ba100SJustin Hibbits t_FmPcdManip *p_CurManip = p_Manip;
107*852ba100SJustin Hibbits
108*852ba100SJustin Hibbits if (!MANIP_IS_UNIFIED(p_Manip))
109*852ba100SJustin Hibbits return p_Manip->dataSize;
110*852ba100SJustin Hibbits
111*852ba100SJustin Hibbits /* accumulate sizes, starting with the first node */
112*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))
113*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_PrevManip;
114*852ba100SJustin Hibbits
115*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
116*852ba100SJustin Hibbits {
117*852ba100SJustin Hibbits size += p_CurManip->dataSize;
118*852ba100SJustin Hibbits p_CurManip = (t_FmPcdManip *)p_CurManip->h_NextManip;
119*852ba100SJustin Hibbits }
120*852ba100SJustin Hibbits size += p_CurManip->dataSize; /* add last size */
121*852ba100SJustin Hibbits
122*852ba100SJustin Hibbits return (size);
1230aeed3e9SJustin Hibbits }
1240aeed3e9SJustin Hibbits
CalculateTableSize(t_FmPcdManipParams * p_FmPcdManipParams,uint16_t * p_TableSize,uint8_t * p_DataSize)125*852ba100SJustin Hibbits static t_Error CalculateTableSize(t_FmPcdManipParams *p_FmPcdManipParams,
126*852ba100SJustin Hibbits uint16_t *p_TableSize, uint8_t *p_DataSize)
1270aeed3e9SJustin Hibbits {
128*852ba100SJustin Hibbits uint8_t localDataSize, remain, tableSize = 0, dataSize = 0;
1290aeed3e9SJustin Hibbits
130*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.rmv)
131*852ba100SJustin Hibbits {
132*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.rmvParams.type)
133*852ba100SJustin Hibbits {
134*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_GENERIC):
135*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE;
136*852ba100SJustin Hibbits break;
137*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR):
138*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.type)
139*852ba100SJustin Hibbits {
140*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2):
141*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
142*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP):
143*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START):
144*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
145*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE;
146*852ba100SJustin Hibbits break;
147*852ba100SJustin Hibbits default:
148*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
149*852ba100SJustin Hibbits ("Unknown byHdr.type"));
150*852ba100SJustin Hibbits }
151*852ba100SJustin Hibbits break;
152*852ba100SJustin Hibbits default:
153*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
154*852ba100SJustin Hibbits ("Unknown rmvParams.type"));
155*852ba100SJustin Hibbits }
156*852ba100SJustin Hibbits }
157*852ba100SJustin Hibbits
158*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrt)
159*852ba100SJustin Hibbits {
160*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.insrtParams.type)
161*852ba100SJustin Hibbits {
162*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_GENERIC):
163*852ba100SJustin Hibbits remain =
164*852ba100SJustin Hibbits (uint8_t)(p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size
165*852ba100SJustin Hibbits % 4);
166*852ba100SJustin Hibbits if (remain)
167*852ba100SJustin Hibbits localDataSize =
168*852ba100SJustin Hibbits (uint8_t)(p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size
169*852ba100SJustin Hibbits + 4 - remain);
170*852ba100SJustin Hibbits else
171*852ba100SJustin Hibbits localDataSize =
172*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size;
173*852ba100SJustin Hibbits tableSize += (uint8_t)(HMCD_BASIC_SIZE + localDataSize);
174*852ba100SJustin Hibbits break;
175*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR):
176*852ba100SJustin Hibbits {
177*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.type)
178*852ba100SJustin Hibbits {
179*852ba100SJustin Hibbits
180*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2):
181*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE + HMCD_PTR_SIZE;
182*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.specificL2)
183*852ba100SJustin Hibbits {
184*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_INSRT_MPLS):
185*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_INSRT_PPPOE):
186*852ba100SJustin Hibbits dataSize +=
187*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.size;
188*852ba100SJustin Hibbits break;
189*852ba100SJustin Hibbits default:
190*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
191*852ba100SJustin Hibbits }
192*852ba100SJustin Hibbits break;
193*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
194*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_IP):
195*852ba100SJustin Hibbits tableSize +=
196*852ba100SJustin Hibbits (HMCD_BASIC_SIZE + HMCD_PTR_SIZE
197*852ba100SJustin Hibbits + HMCD_PARAM_SIZE
198*852ba100SJustin Hibbits + p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size);
199*852ba100SJustin Hibbits dataSize += 2;
200*852ba100SJustin Hibbits break;
201*852ba100SJustin Hibbits
202*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP):
203*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE):
204*852ba100SJustin Hibbits tableSize += (HMCD_BASIC_SIZE + HMCD_L4_HDR_SIZE);
205*852ba100SJustin Hibbits
206*852ba100SJustin Hibbits break;
207*852ba100SJustin Hibbits
208*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP):
209*852ba100SJustin Hibbits tableSize +=
210*852ba100SJustin Hibbits (HMCD_BASIC_SIZE
211*852ba100SJustin Hibbits + p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size);
212*852ba100SJustin Hibbits break;
213*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
214*852ba100SJustin Hibbits default:
215*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
216*852ba100SJustin Hibbits ("Unknown byHdr.type"));
217*852ba100SJustin Hibbits }
218*852ba100SJustin Hibbits }
219*852ba100SJustin Hibbits break;
220*852ba100SJustin Hibbits default:
221*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
222*852ba100SJustin Hibbits ("Unknown insrtParams.type"));
223*852ba100SJustin Hibbits }
224*852ba100SJustin Hibbits }
225*852ba100SJustin Hibbits
226*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdate)
227*852ba100SJustin Hibbits {
228*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.fieldUpdateParams.type)
229*852ba100SJustin Hibbits {
230*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN):
231*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE;
232*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType
233*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)
234*852ba100SJustin Hibbits {
235*852ba100SJustin Hibbits tableSize += HMCD_PTR_SIZE;
236*852ba100SJustin Hibbits dataSize += DSCP_TO_VLAN_TABLE_SIZE;
237*852ba100SJustin Hibbits }
238*852ba100SJustin Hibbits break;
239*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4):
240*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE;
241*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
242*852ba100SJustin Hibbits & HDR_MANIP_IPV4_ID)
243*852ba100SJustin Hibbits {
244*852ba100SJustin Hibbits tableSize += HMCD_PARAM_SIZE;
245*852ba100SJustin Hibbits dataSize += 2;
246*852ba100SJustin Hibbits }
247*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
248*852ba100SJustin Hibbits & HDR_MANIP_IPV4_SRC)
249*852ba100SJustin Hibbits tableSize += HMCD_IPV4_ADDR_SIZE;
250*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
251*852ba100SJustin Hibbits & HDR_MANIP_IPV4_DST)
252*852ba100SJustin Hibbits tableSize += HMCD_IPV4_ADDR_SIZE;
253*852ba100SJustin Hibbits break;
254*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6):
255*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE;
256*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
257*852ba100SJustin Hibbits & HDR_MANIP_IPV6_SRC)
258*852ba100SJustin Hibbits tableSize += HMCD_IPV6_ADDR_SIZE;
259*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
260*852ba100SJustin Hibbits & HDR_MANIP_IPV6_DST)
261*852ba100SJustin Hibbits tableSize += HMCD_IPV6_ADDR_SIZE;
262*852ba100SJustin Hibbits break;
263*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP):
264*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates
265*852ba100SJustin Hibbits == HDR_MANIP_TCP_UDP_CHECKSUM)
266*852ba100SJustin Hibbits /* we implement this case with the update-checksum descriptor */
267*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE;
268*852ba100SJustin Hibbits else
269*852ba100SJustin Hibbits /* we implement this case with the TCP/UDP-update descriptor */
270*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE;
271*852ba100SJustin Hibbits break;
272*852ba100SJustin Hibbits default:
273*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
274*852ba100SJustin Hibbits ("Unknown fieldUpdateParams.type"));
275*852ba100SJustin Hibbits }
276*852ba100SJustin Hibbits }
277*852ba100SJustin Hibbits
278*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.custom)
279*852ba100SJustin Hibbits {
280*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.customParams.type)
281*852ba100SJustin Hibbits {
282*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE):
283*852ba100SJustin Hibbits {
284*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE + HMCD_PARAM_SIZE;
285*852ba100SJustin Hibbits dataSize +=
286*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdrSize;
287*852ba100SJustin Hibbits if ((p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType
288*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)
289*852ba100SJustin Hibbits && (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id))
290*852ba100SJustin Hibbits dataSize += 2;
291*852ba100SJustin Hibbits }
292*852ba100SJustin Hibbits break;
293*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE):
294*852ba100SJustin Hibbits tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE;
295*852ba100SJustin Hibbits break;
296*852ba100SJustin Hibbits default:
297*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
298*852ba100SJustin Hibbits ("Unknown customParams.type"));
299*852ba100SJustin Hibbits }
300*852ba100SJustin Hibbits }
301*852ba100SJustin Hibbits
302*852ba100SJustin Hibbits *p_TableSize = tableSize;
303*852ba100SJustin Hibbits *p_DataSize = dataSize;
3040aeed3e9SJustin Hibbits
3050aeed3e9SJustin Hibbits return E_OK;
3060aeed3e9SJustin Hibbits }
3070aeed3e9SJustin Hibbits
GetPrOffsetByHeaderOrField(t_FmManipHdrInfo * p_HdrInfo,uint8_t * parseArrayOffset)308*852ba100SJustin Hibbits static t_Error GetPrOffsetByHeaderOrField(t_FmManipHdrInfo *p_HdrInfo,
309*852ba100SJustin Hibbits uint8_t *parseArrayOffset)
310*852ba100SJustin Hibbits {
311*852ba100SJustin Hibbits e_NetHeaderType hdr = p_HdrInfo->hdr;
312*852ba100SJustin Hibbits e_FmPcdHdrIndex hdrIndex = p_HdrInfo->hdrIndex;
313*852ba100SJustin Hibbits bool byField = p_HdrInfo->byField;
314*852ba100SJustin Hibbits t_FmPcdFields field;
315*852ba100SJustin Hibbits
316*852ba100SJustin Hibbits if (byField)
317*852ba100SJustin Hibbits field = p_HdrInfo->fullField;
318*852ba100SJustin Hibbits
319*852ba100SJustin Hibbits if (byField)
320*852ba100SJustin Hibbits {
321*852ba100SJustin Hibbits switch (hdr)
322*852ba100SJustin Hibbits {
323*852ba100SJustin Hibbits case (HEADER_TYPE_ETH):
324*852ba100SJustin Hibbits switch (field.eth)
325*852ba100SJustin Hibbits {
326*852ba100SJustin Hibbits case (NET_HEADER_FIELD_ETH_TYPE):
327*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_ETYPE_LAST_OFFSET;
328*852ba100SJustin Hibbits break;
329*852ba100SJustin Hibbits default:
330*852ba100SJustin Hibbits RETURN_ERROR(
331*852ba100SJustin Hibbits MAJOR,
332*852ba100SJustin Hibbits E_NOT_SUPPORTED,
333*852ba100SJustin Hibbits ("Header manipulation of the type Ethernet with this field not supported"));
334*852ba100SJustin Hibbits }
335*852ba100SJustin Hibbits break;
336*852ba100SJustin Hibbits case (HEADER_TYPE_VLAN):
337*852ba100SJustin Hibbits switch (field.vlan)
338*852ba100SJustin Hibbits {
339*852ba100SJustin Hibbits case (NET_HEADER_FIELD_VLAN_TCI):
340*852ba100SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)
341*852ba100SJustin Hibbits || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
342*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_VLAN1_OFFSET;
343*852ba100SJustin Hibbits else
344*852ba100SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
345*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_VLAN2_OFFSET;
346*852ba100SJustin Hibbits break;
347*852ba100SJustin Hibbits default:
348*852ba100SJustin Hibbits RETURN_ERROR(
349*852ba100SJustin Hibbits MAJOR,
350*852ba100SJustin Hibbits E_NOT_SUPPORTED,
351*852ba100SJustin Hibbits ("Header manipulation of the type VLAN with this field not supported"));
352*852ba100SJustin Hibbits }
353*852ba100SJustin Hibbits break;
354*852ba100SJustin Hibbits default:
355*852ba100SJustin Hibbits RETURN_ERROR(
356*852ba100SJustin Hibbits MAJOR,
357*852ba100SJustin Hibbits E_NOT_SUPPORTED,
358*852ba100SJustin Hibbits ("Header manipulation of this header by field not supported"));
359*852ba100SJustin Hibbits }
360*852ba100SJustin Hibbits }
361*852ba100SJustin Hibbits else
362*852ba100SJustin Hibbits {
363*852ba100SJustin Hibbits switch (hdr)
364*852ba100SJustin Hibbits {
365*852ba100SJustin Hibbits case (HEADER_TYPE_ETH):
366*852ba100SJustin Hibbits *parseArrayOffset = (uint8_t)CC_PC_PR_ETH_OFFSET;
367*852ba100SJustin Hibbits break;
368*852ba100SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_SHIM1):
369*852ba100SJustin Hibbits *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM1_OFFSET;
370*852ba100SJustin Hibbits break;
371*852ba100SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_SHIM2):
372*852ba100SJustin Hibbits *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM2_OFFSET;
373*852ba100SJustin Hibbits break;
374*852ba100SJustin Hibbits case (HEADER_TYPE_LLC_SNAP):
375*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_USER_LLC_SNAP_OFFSET;
376*852ba100SJustin Hibbits break;
377*852ba100SJustin Hibbits case (HEADER_TYPE_PPPoE):
378*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_PPPOE_OFFSET;
379*852ba100SJustin Hibbits break;
380*852ba100SJustin Hibbits case (HEADER_TYPE_MPLS):
381*852ba100SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)
382*852ba100SJustin Hibbits || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
383*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_MPLS1_OFFSET;
384*852ba100SJustin Hibbits else
385*852ba100SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
386*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_MPLS_LAST_OFFSET;
387*852ba100SJustin Hibbits break;
388*852ba100SJustin Hibbits case (HEADER_TYPE_IPv4):
389*852ba100SJustin Hibbits case (HEADER_TYPE_IPv6):
390*852ba100SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)
391*852ba100SJustin Hibbits || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
392*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_IP1_OFFSET;
393*852ba100SJustin Hibbits else
394*852ba100SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_2)
395*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_IP_LAST_OFFSET;
396*852ba100SJustin Hibbits break;
397*852ba100SJustin Hibbits case (HEADER_TYPE_MINENCAP):
398*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_MINENC_OFFSET;
399*852ba100SJustin Hibbits break;
400*852ba100SJustin Hibbits case (HEADER_TYPE_GRE):
401*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_GRE_OFFSET;
402*852ba100SJustin Hibbits break;
403*852ba100SJustin Hibbits case (HEADER_TYPE_TCP):
404*852ba100SJustin Hibbits case (HEADER_TYPE_UDP):
405*852ba100SJustin Hibbits case (HEADER_TYPE_IPSEC_AH):
406*852ba100SJustin Hibbits case (HEADER_TYPE_IPSEC_ESP):
407*852ba100SJustin Hibbits case (HEADER_TYPE_DCCP):
408*852ba100SJustin Hibbits case (HEADER_TYPE_SCTP):
409*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_L4_OFFSET;
410*852ba100SJustin Hibbits break;
411*852ba100SJustin Hibbits case (HEADER_TYPE_CAPWAP):
412*852ba100SJustin Hibbits case (HEADER_TYPE_CAPWAP_DTLS):
413*852ba100SJustin Hibbits *parseArrayOffset = CC_PC_PR_NEXT_HEADER_OFFSET;
414*852ba100SJustin Hibbits break;
415*852ba100SJustin Hibbits default:
416*852ba100SJustin Hibbits RETURN_ERROR(
417*852ba100SJustin Hibbits MAJOR,
418*852ba100SJustin Hibbits E_NOT_SUPPORTED,
419*852ba100SJustin Hibbits ("Header manipulation of this header is not supported"));
420*852ba100SJustin Hibbits }
421*852ba100SJustin Hibbits }
422*852ba100SJustin Hibbits return E_OK;
423*852ba100SJustin Hibbits }
424*852ba100SJustin Hibbits
BuildHmct(t_FmPcdManip * p_Manip,t_FmPcdManipParams * p_FmPcdManipParams,uint8_t * p_DestHmct,uint8_t * p_DestData,bool new)425*852ba100SJustin Hibbits static t_Error BuildHmct(t_FmPcdManip *p_Manip,
426*852ba100SJustin Hibbits t_FmPcdManipParams *p_FmPcdManipParams,
427*852ba100SJustin Hibbits uint8_t *p_DestHmct, uint8_t *p_DestData, bool new)
428*852ba100SJustin Hibbits {
429*852ba100SJustin Hibbits uint32_t *p_TmpHmct = (uint32_t*)p_DestHmct, *p_LocalData;
430*852ba100SJustin Hibbits uint32_t tmpReg = 0, *p_Last = NULL, tmp_ipv6_addr;
431*852ba100SJustin Hibbits uint8_t remain, i, size = 0, origSize, *p_UsrData = NULL, *p_TmpData =
432*852ba100SJustin Hibbits p_DestData;
433*852ba100SJustin Hibbits t_Handle h_FmPcd = p_Manip->h_FmPcd;
434*852ba100SJustin Hibbits uint8_t j = 0;
435*852ba100SJustin Hibbits
436*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.rmv)
437*852ba100SJustin Hibbits {
438*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.rmvParams.type
439*852ba100SJustin Hibbits == e_FM_PCD_MANIP_RMV_GENERIC)
440*852ba100SJustin Hibbits {
441*852ba100SJustin Hibbits /* initialize HMCD */
442*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_RMV) << HMCD_OC_SHIFT;
443*852ba100SJustin Hibbits /* tmp, should be conditional */
444*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.rmvParams.u.generic.offset
445*852ba100SJustin Hibbits << HMCD_RMV_OFFSET_SHIFT;
446*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.rmvParams.u.generic.size
447*852ba100SJustin Hibbits << HMCD_RMV_SIZE_SHIFT;
448*852ba100SJustin Hibbits }
449*852ba100SJustin Hibbits else
450*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.rmvParams.type
451*852ba100SJustin Hibbits == e_FM_PCD_MANIP_RMV_BY_HDR)
452*852ba100SJustin Hibbits {
453*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.type)
454*852ba100SJustin Hibbits {
455*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2):
456*852ba100SJustin Hibbits {
457*852ba100SJustin Hibbits uint8_t hmcdOpt;
458*852ba100SJustin Hibbits
459*852ba100SJustin Hibbits /* initialize HMCD */
460*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_L2_RMV) << HMCD_OC_SHIFT;
461*852ba100SJustin Hibbits
462*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.u.specificL2)
463*852ba100SJustin Hibbits {
464*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_RMV_ETHERNET):
465*852ba100SJustin Hibbits hmcdOpt = HMCD_RMV_L2_ETHERNET;
466*852ba100SJustin Hibbits break;
467*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_RMV_STACKED_QTAGS):
468*852ba100SJustin Hibbits hmcdOpt = HMCD_RMV_L2_STACKED_QTAGS;
469*852ba100SJustin Hibbits break;
470*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_RMV_ETHERNET_AND_MPLS):
471*852ba100SJustin Hibbits hmcdOpt = HMCD_RMV_L2_ETHERNET_AND_MPLS;
472*852ba100SJustin Hibbits break;
473*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_RMV_MPLS):
474*852ba100SJustin Hibbits hmcdOpt = HMCD_RMV_L2_MPLS;
475*852ba100SJustin Hibbits break;
476*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_RMV_PPPOE):
477*852ba100SJustin Hibbits hmcdOpt = HMCD_RMV_L2_PPPOE;
478*852ba100SJustin Hibbits break;
479*852ba100SJustin Hibbits default:
480*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
481*852ba100SJustin Hibbits }
482*852ba100SJustin Hibbits tmpReg |= hmcdOpt << HMCD_L2_MODE_SHIFT;
483*852ba100SJustin Hibbits break;
484*852ba100SJustin Hibbits }
485*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
486*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP):
487*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_CAPWAP_RMV)
488*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
489*852ba100SJustin Hibbits break;
490*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START):
491*852ba100SJustin Hibbits {
492*852ba100SJustin Hibbits uint8_t prsArrayOffset;
493*852ba100SJustin Hibbits t_Error err = E_OK;
494*852ba100SJustin Hibbits
495*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_RMV_TILL)
496*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
497*852ba100SJustin Hibbits
498*852ba100SJustin Hibbits err =
499*852ba100SJustin Hibbits GetPrOffsetByHeaderOrField(
500*852ba100SJustin Hibbits &p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.u.hdrInfo,
501*852ba100SJustin Hibbits &prsArrayOffset);
502*852ba100SJustin Hibbits ASSERT_COND(!err);
503*852ba100SJustin Hibbits /* was previously checked */
504*852ba100SJustin Hibbits
505*852ba100SJustin Hibbits tmpReg |= ((uint32_t)prsArrayOffset << 16);
506*852ba100SJustin Hibbits }
507*852ba100SJustin Hibbits break;
508*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
509*852ba100SJustin Hibbits default:
510*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
511*852ba100SJustin Hibbits ("manip header remove by hdr type!"));
512*852ba100SJustin Hibbits }
513*852ba100SJustin Hibbits }
514*852ba100SJustin Hibbits
515*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
516*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
517*852ba100SJustin Hibbits p_Last = p_TmpHmct;
518*852ba100SJustin Hibbits /* advance to next command */
519*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
520*852ba100SJustin Hibbits }
521*852ba100SJustin Hibbits
522*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrt)
523*852ba100SJustin Hibbits {
524*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.type
525*852ba100SJustin Hibbits == e_FM_PCD_MANIP_INSRT_GENERIC)
526*852ba100SJustin Hibbits {
527*852ba100SJustin Hibbits /* initialize HMCD */
528*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.u.generic.replace)
529*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_REPLACE)
530*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
531*852ba100SJustin Hibbits else
532*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_INSRT) << HMCD_OC_SHIFT;
533*852ba100SJustin Hibbits
534*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.insrtParams.u.generic.offset
535*852ba100SJustin Hibbits << HMCD_INSRT_OFFSET_SHIFT;
536*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size
537*852ba100SJustin Hibbits << HMCD_INSRT_SIZE_SHIFT;
538*852ba100SJustin Hibbits
539*852ba100SJustin Hibbits size = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size;
540*852ba100SJustin Hibbits p_UsrData = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.p_Data;
541*852ba100SJustin Hibbits
542*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
543*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
544*852ba100SJustin Hibbits p_Last = p_TmpHmct;
545*852ba100SJustin Hibbits
546*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
547*852ba100SJustin Hibbits
548*852ba100SJustin Hibbits /* initialize data to be inserted */
549*852ba100SJustin Hibbits /* if size is not a multiple of 4, padd with 0's */
550*852ba100SJustin Hibbits origSize = size;
551*852ba100SJustin Hibbits remain = (uint8_t)(size % 4);
552*852ba100SJustin Hibbits if (remain)
553*852ba100SJustin Hibbits {
554*852ba100SJustin Hibbits size += (uint8_t)(4 - remain);
555*852ba100SJustin Hibbits p_LocalData = (uint32_t *)XX_Malloc(size);
556*852ba100SJustin Hibbits memset((uint8_t *)p_LocalData, 0, size);
557*852ba100SJustin Hibbits memcpy((uint8_t *)p_LocalData, p_UsrData, origSize);
558*852ba100SJustin Hibbits }
559*852ba100SJustin Hibbits else
560*852ba100SJustin Hibbits p_LocalData = (uint32_t*)p_UsrData;
561*852ba100SJustin Hibbits
562*852ba100SJustin Hibbits /* initialize data and advance pointer to next command */
563*852ba100SJustin Hibbits MemCpy8(p_TmpHmct, p_LocalData, size);
564*852ba100SJustin Hibbits p_TmpHmct += size / sizeof(uint32_t);
565*852ba100SJustin Hibbits
566*852ba100SJustin Hibbits if (remain)
567*852ba100SJustin Hibbits XX_Free(p_LocalData);
568*852ba100SJustin Hibbits }
569*852ba100SJustin Hibbits
570*852ba100SJustin Hibbits else
571*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.type
572*852ba100SJustin Hibbits == e_FM_PCD_MANIP_INSRT_BY_HDR)
573*852ba100SJustin Hibbits {
574*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.type)
575*852ba100SJustin Hibbits {
576*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2):
577*852ba100SJustin Hibbits {
578*852ba100SJustin Hibbits uint8_t hmcdOpt;
579*852ba100SJustin Hibbits
580*852ba100SJustin Hibbits /* initialize HMCD */
581*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_L2_INSRT)
582*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
583*852ba100SJustin Hibbits
584*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.specificL2)
585*852ba100SJustin Hibbits {
586*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_INSRT_MPLS):
587*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.update)
588*852ba100SJustin Hibbits hmcdOpt = HMCD_INSRT_N_UPDATE_L2_MPLS;
589*852ba100SJustin Hibbits else
590*852ba100SJustin Hibbits hmcdOpt = HMCD_INSRT_L2_MPLS;
591*852ba100SJustin Hibbits break;
592*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_INSRT_PPPOE):
593*852ba100SJustin Hibbits hmcdOpt = HMCD_INSRT_L2_PPPOE;
594*852ba100SJustin Hibbits break;
595*852ba100SJustin Hibbits default:
596*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
597*852ba100SJustin Hibbits }
598*852ba100SJustin Hibbits tmpReg |= hmcdOpt << HMCD_L2_MODE_SHIFT;
599*852ba100SJustin Hibbits
600*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
601*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
602*852ba100SJustin Hibbits p_Last = p_TmpHmct;
603*852ba100SJustin Hibbits
604*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
605*852ba100SJustin Hibbits
606*852ba100SJustin Hibbits /* set size and pointer of user's data */
607*852ba100SJustin Hibbits size =
608*852ba100SJustin Hibbits (uint8_t)p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.size;
609*852ba100SJustin Hibbits
610*852ba100SJustin Hibbits ASSERT_COND(p_TmpData);
611*852ba100SJustin Hibbits MemCpy8(
612*852ba100SJustin Hibbits p_TmpData,
613*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.p_Data,
614*852ba100SJustin Hibbits size);
615*852ba100SJustin Hibbits tmpReg =
616*852ba100SJustin Hibbits (size << HMCD_INSRT_L2_SIZE_SHIFT)
617*852ba100SJustin Hibbits | (uint32_t)(XX_VirtToPhys(p_TmpData)
618*852ba100SJustin Hibbits - (((t_FmPcd*)h_FmPcd)->physicalMuramBase));
619*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
620*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
621*852ba100SJustin Hibbits p_TmpData += size;
622*852ba100SJustin Hibbits }
623*852ba100SJustin Hibbits break;
624*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
625*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_IP):
626*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_IP_INSRT)
627*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
628*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.calcL4Checksum)
629*852ba100SJustin Hibbits tmpReg |= HMCD_IP_L4_CS_CALC;
630*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.mappingMode
631*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_QOS_MAPPING_AS_IS)
632*852ba100SJustin Hibbits tmpReg |= HMCD_IP_OR_QOS;
633*852ba100SJustin Hibbits tmpReg |=
634*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.lastPidOffset
635*852ba100SJustin Hibbits & HMCD_IP_LAST_PID_MASK;
636*852ba100SJustin Hibbits tmpReg |=
637*852ba100SJustin Hibbits ((p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size
638*852ba100SJustin Hibbits << HMCD_IP_SIZE_SHIFT)
639*852ba100SJustin Hibbits & HMCD_IP_SIZE_MASK);
640*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.dontFragOverwrite)
641*852ba100SJustin Hibbits tmpReg |= HMCD_IP_DF_MODE;
642*852ba100SJustin Hibbits
643*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
644*852ba100SJustin Hibbits
645*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
646*852ba100SJustin Hibbits p_Last = p_TmpHmct;
647*852ba100SJustin Hibbits
648*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
649*852ba100SJustin Hibbits
650*852ba100SJustin Hibbits /* set IP id */
651*852ba100SJustin Hibbits ASSERT_COND(p_TmpData);
652*852ba100SJustin Hibbits WRITE_UINT16(
653*852ba100SJustin Hibbits *(uint16_t*)p_TmpData,
654*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.id);
655*852ba100SJustin Hibbits WRITE_UINT32(
656*852ba100SJustin Hibbits *p_TmpHmct,
657*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));
658*852ba100SJustin Hibbits p_TmpData += 2;
659*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
660*852ba100SJustin Hibbits
661*852ba100SJustin Hibbits WRITE_UINT8(*p_TmpHmct, p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.lastDstOffset);
662*852ba100SJustin Hibbits p_TmpHmct += HMCD_PARAM_SIZE / 4;
663*852ba100SJustin Hibbits
664*852ba100SJustin Hibbits MemCpy8(
665*852ba100SJustin Hibbits p_TmpHmct,
666*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.p_Data,
667*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size);
668*852ba100SJustin Hibbits p_TmpHmct +=
669*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size
670*852ba100SJustin Hibbits / 4;
671*852ba100SJustin Hibbits break;
672*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE):
673*852ba100SJustin Hibbits tmpReg = HMCD_INSRT_UDP_LITE;
674*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP):
675*852ba100SJustin Hibbits tmpReg |= (uint32_t)(HMCD_OPCODE_UDP_INSRT)
676*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
677*852ba100SJustin Hibbits
678*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
679*852ba100SJustin Hibbits
680*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
681*852ba100SJustin Hibbits p_Last = p_TmpHmct;
682*852ba100SJustin Hibbits
683*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
684*852ba100SJustin Hibbits
685*852ba100SJustin Hibbits MemCpy8(
686*852ba100SJustin Hibbits p_TmpHmct,
687*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.p_Data,
688*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size);
689*852ba100SJustin Hibbits p_TmpHmct +=
690*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size
691*852ba100SJustin Hibbits / 4;
692*852ba100SJustin Hibbits break;
693*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP):
694*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_CAPWAP_INSRT)
695*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
696*852ba100SJustin Hibbits tmpReg |= HMCD_CAPWAP_INSRT;
697*852ba100SJustin Hibbits
698*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
699*852ba100SJustin Hibbits
700*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
701*852ba100SJustin Hibbits p_Last = p_TmpHmct;
702*852ba100SJustin Hibbits
703*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
704*852ba100SJustin Hibbits
705*852ba100SJustin Hibbits MemCpy8(
706*852ba100SJustin Hibbits p_TmpHmct,
707*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.p_Data,
708*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size);
709*852ba100SJustin Hibbits p_TmpHmct +=
710*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size
711*852ba100SJustin Hibbits / 4;
712*852ba100SJustin Hibbits break;
713*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
714*852ba100SJustin Hibbits default:
715*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
716*852ba100SJustin Hibbits ("manip header insert by header type!"));
717*852ba100SJustin Hibbits
718*852ba100SJustin Hibbits }
719*852ba100SJustin Hibbits }
720*852ba100SJustin Hibbits }
721*852ba100SJustin Hibbits
722*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdate)
723*852ba100SJustin Hibbits {
724*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.fieldUpdateParams.type)
725*852ba100SJustin Hibbits {
726*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN):
727*852ba100SJustin Hibbits /* set opcode */
728*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_VLAN_PRI_UPDATE)
729*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
730*852ba100SJustin Hibbits
731*852ba100SJustin Hibbits /* set mode & table pointer */
732*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType
733*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)
734*852ba100SJustin Hibbits {
735*852ba100SJustin Hibbits /* set Mode */
736*852ba100SJustin Hibbits tmpReg |= (uint32_t)(HMCD_VLAN_PRI_UPDATE_DSCP_TO_VPRI)
737*852ba100SJustin Hibbits << HMCD_VLAN_PRI_REP_MODE_SHIFT;
738*852ba100SJustin Hibbits /* set VPRI default */
739*852ba100SJustin Hibbits tmpReg |=
740*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.vpriDefVal;
741*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
742*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
743*852ba100SJustin Hibbits p_Last = p_TmpHmct;
744*852ba100SJustin Hibbits /* write the table pointer into the Manip descriptor */
745*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
746*852ba100SJustin Hibbits
747*852ba100SJustin Hibbits tmpReg = 0;
748*852ba100SJustin Hibbits ASSERT_COND(p_TmpData);
749*852ba100SJustin Hibbits for (i = 0; i < HMCD_DSCP_VALUES; i++)
750*852ba100SJustin Hibbits {
751*852ba100SJustin Hibbits /* first we build from each 8 values a 32bit register */
752*852ba100SJustin Hibbits tmpReg |=
753*852ba100SJustin Hibbits (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.dscpToVpriTable[i])
754*852ba100SJustin Hibbits << (32 - 4 * (j + 1));
755*852ba100SJustin Hibbits j++;
756*852ba100SJustin Hibbits /* Than we write this register to the next table word
757*852ba100SJustin Hibbits * (i=7-->word 0, i=15-->word 1,... i=63-->word 7) */
758*852ba100SJustin Hibbits if ((i % 8) == 7)
759*852ba100SJustin Hibbits {
760*852ba100SJustin Hibbits WRITE_UINT32(*((uint32_t*)p_TmpData + (i+1)/8-1),
761*852ba100SJustin Hibbits tmpReg);
762*852ba100SJustin Hibbits tmpReg = 0;
763*852ba100SJustin Hibbits j = 0;
764*852ba100SJustin Hibbits }
765*852ba100SJustin Hibbits }
766*852ba100SJustin Hibbits
767*852ba100SJustin Hibbits WRITE_UINT32(
768*852ba100SJustin Hibbits *p_TmpHmct,
769*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase)));
770*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
771*852ba100SJustin Hibbits
772*852ba100SJustin Hibbits p_TmpData += DSCP_TO_VLAN_TABLE_SIZE;
773*852ba100SJustin Hibbits }
774*852ba100SJustin Hibbits else
775*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType
776*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI)
777*852ba100SJustin Hibbits {
778*852ba100SJustin Hibbits /* set Mode */
779*852ba100SJustin Hibbits /* line commented out as it has no-side-effect ('0' value). */
780*852ba100SJustin Hibbits /*tmpReg |= HMCD_VLAN_PRI_UPDATE << HMCD_VLAN_PRI_REP_MODE_SHIFT*/;
781*852ba100SJustin Hibbits /* set VPRI parameter */
782*852ba100SJustin Hibbits tmpReg |=
783*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.vpri;
784*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
785*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
786*852ba100SJustin Hibbits p_Last = p_TmpHmct;
787*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
788*852ba100SJustin Hibbits }
789*852ba100SJustin Hibbits break;
790*852ba100SJustin Hibbits
791*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4):
792*852ba100SJustin Hibbits /* set opcode */
793*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_IPV4_UPDATE) << HMCD_OC_SHIFT;
794*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
795*852ba100SJustin Hibbits & HDR_MANIP_IPV4_TTL)
796*852ba100SJustin Hibbits tmpReg |= HMCD_IPV4_UPDATE_TTL;
797*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
798*852ba100SJustin Hibbits & HDR_MANIP_IPV4_TOS)
799*852ba100SJustin Hibbits {
800*852ba100SJustin Hibbits tmpReg |= HMCD_IPV4_UPDATE_TOS;
801*852ba100SJustin Hibbits tmpReg |=
802*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.tos
803*852ba100SJustin Hibbits << HMCD_IPV4_UPDATE_TOS_SHIFT;
804*852ba100SJustin Hibbits }
805*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
806*852ba100SJustin Hibbits & HDR_MANIP_IPV4_ID)
807*852ba100SJustin Hibbits tmpReg |= HMCD_IPV4_UPDATE_ID;
808*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
809*852ba100SJustin Hibbits & HDR_MANIP_IPV4_SRC)
810*852ba100SJustin Hibbits tmpReg |= HMCD_IPV4_UPDATE_SRC;
811*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
812*852ba100SJustin Hibbits & HDR_MANIP_IPV4_DST)
813*852ba100SJustin Hibbits tmpReg |= HMCD_IPV4_UPDATE_DST;
814*852ba100SJustin Hibbits /* write the first 4 bytes of the descriptor */
815*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
816*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
817*852ba100SJustin Hibbits p_Last = p_TmpHmct;
818*852ba100SJustin Hibbits
819*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
820*852ba100SJustin Hibbits
821*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
822*852ba100SJustin Hibbits & HDR_MANIP_IPV4_ID)
823*852ba100SJustin Hibbits {
824*852ba100SJustin Hibbits ASSERT_COND(p_TmpData);
825*852ba100SJustin Hibbits WRITE_UINT16(
826*852ba100SJustin Hibbits *(uint16_t*)p_TmpData,
827*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.id);
828*852ba100SJustin Hibbits WRITE_UINT32(
829*852ba100SJustin Hibbits *p_TmpHmct,
830*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));
831*852ba100SJustin Hibbits p_TmpData += 2;
832*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
833*852ba100SJustin Hibbits }
834*852ba100SJustin Hibbits
835*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
836*852ba100SJustin Hibbits & HDR_MANIP_IPV4_SRC)
837*852ba100SJustin Hibbits {
838*852ba100SJustin Hibbits WRITE_UINT32(
839*852ba100SJustin Hibbits *p_TmpHmct,
840*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.src);
841*852ba100SJustin Hibbits p_TmpHmct += HMCD_IPV4_ADDR_SIZE / 4;
842*852ba100SJustin Hibbits }
843*852ba100SJustin Hibbits
844*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates
845*852ba100SJustin Hibbits & HDR_MANIP_IPV4_DST)
846*852ba100SJustin Hibbits {
847*852ba100SJustin Hibbits WRITE_UINT32(
848*852ba100SJustin Hibbits *p_TmpHmct,
849*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.dst);
850*852ba100SJustin Hibbits p_TmpHmct += HMCD_IPV4_ADDR_SIZE / 4;
851*852ba100SJustin Hibbits }
852*852ba100SJustin Hibbits break;
853*852ba100SJustin Hibbits
854*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6):
855*852ba100SJustin Hibbits /* set opcode */
856*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_IPV6_UPDATE) << HMCD_OC_SHIFT;
857*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates
858*852ba100SJustin Hibbits & HDR_MANIP_IPV6_HL)
859*852ba100SJustin Hibbits tmpReg |= HMCD_IPV6_UPDATE_HL;
860*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates
861*852ba100SJustin Hibbits & HDR_MANIP_IPV6_TC)
862*852ba100SJustin Hibbits {
863*852ba100SJustin Hibbits tmpReg |= HMCD_IPV6_UPDATE_TC;
864*852ba100SJustin Hibbits tmpReg |=
865*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.trafficClass
866*852ba100SJustin Hibbits << HMCD_IPV6_UPDATE_TC_SHIFT;
867*852ba100SJustin Hibbits }
868*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates
869*852ba100SJustin Hibbits & HDR_MANIP_IPV6_SRC)
870*852ba100SJustin Hibbits tmpReg |= HMCD_IPV6_UPDATE_SRC;
871*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates
872*852ba100SJustin Hibbits & HDR_MANIP_IPV6_DST)
873*852ba100SJustin Hibbits tmpReg |= HMCD_IPV6_UPDATE_DST;
874*852ba100SJustin Hibbits /* write the first 4 bytes of the descriptor */
875*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
876*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
877*852ba100SJustin Hibbits p_Last = p_TmpHmct;
878*852ba100SJustin Hibbits
879*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
880*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates
881*852ba100SJustin Hibbits & HDR_MANIP_IPV6_SRC)
882*852ba100SJustin Hibbits {
883*852ba100SJustin Hibbits for (i = 0; i < NET_HEADER_FIELD_IPv6_ADDR_SIZE; i += 4)
884*852ba100SJustin Hibbits {
885*852ba100SJustin Hibbits memcpy(&tmp_ipv6_addr,
886*852ba100SJustin Hibbits &p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.src[i],
887*852ba100SJustin Hibbits sizeof(uint32_t));
888*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmp_ipv6_addr);
889*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
890*852ba100SJustin Hibbits }
891*852ba100SJustin Hibbits }
892*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates
893*852ba100SJustin Hibbits & HDR_MANIP_IPV6_DST)
894*852ba100SJustin Hibbits {
895*852ba100SJustin Hibbits for (i = 0; i < NET_HEADER_FIELD_IPv6_ADDR_SIZE; i += 4)
896*852ba100SJustin Hibbits {
897*852ba100SJustin Hibbits memcpy(&tmp_ipv6_addr,
898*852ba100SJustin Hibbits &p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.dst[i],
899*852ba100SJustin Hibbits sizeof(uint32_t));
900*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmp_ipv6_addr);
901*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
902*852ba100SJustin Hibbits }
903*852ba100SJustin Hibbits }
904*852ba100SJustin Hibbits break;
905*852ba100SJustin Hibbits
906*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP):
907*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates
908*852ba100SJustin Hibbits == HDR_MANIP_TCP_UDP_CHECKSUM)
909*852ba100SJustin Hibbits {
910*852ba100SJustin Hibbits /* we implement this case with the update-checksum descriptor */
911*852ba100SJustin Hibbits /* set opcode */
912*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_TCP_UDP_CHECKSUM)
913*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
914*852ba100SJustin Hibbits /* write the first 4 bytes of the descriptor */
915*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
916*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
917*852ba100SJustin Hibbits p_Last = p_TmpHmct;
918*852ba100SJustin Hibbits
919*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
920*852ba100SJustin Hibbits }
921*852ba100SJustin Hibbits else
922*852ba100SJustin Hibbits {
923*852ba100SJustin Hibbits /* we implement this case with the TCP/UDP update descriptor */
924*852ba100SJustin Hibbits /* set opcode */
925*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_TCP_UDP_UPDATE)
926*852ba100SJustin Hibbits << HMCD_OC_SHIFT;
927*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates
928*852ba100SJustin Hibbits & HDR_MANIP_TCP_UDP_DST)
929*852ba100SJustin Hibbits tmpReg |= HMCD_TCP_UDP_UPDATE_DST;
930*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates
931*852ba100SJustin Hibbits & HDR_MANIP_TCP_UDP_SRC)
932*852ba100SJustin Hibbits tmpReg |= HMCD_TCP_UDP_UPDATE_SRC;
933*852ba100SJustin Hibbits /* write the first 4 bytes of the descriptor */
934*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
935*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
936*852ba100SJustin Hibbits p_Last = p_TmpHmct;
937*852ba100SJustin Hibbits
938*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
939*852ba100SJustin Hibbits
940*852ba100SJustin Hibbits tmpReg = 0;
941*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates
942*852ba100SJustin Hibbits & HDR_MANIP_TCP_UDP_SRC)
943*852ba100SJustin Hibbits tmpReg |=
944*852ba100SJustin Hibbits ((uint32_t)p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.src)
945*852ba100SJustin Hibbits << HMCD_TCP_UDP_UPDATE_SRC_SHIFT;
946*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates
947*852ba100SJustin Hibbits & HDR_MANIP_TCP_UDP_DST)
948*852ba100SJustin Hibbits tmpReg |=
949*852ba100SJustin Hibbits ((uint32_t)p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.dst);
950*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
951*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
952*852ba100SJustin Hibbits }
953*852ba100SJustin Hibbits break;
954*852ba100SJustin Hibbits
955*852ba100SJustin Hibbits default:
956*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
957*852ba100SJustin Hibbits ("Unknown fieldUpdateParams.type"));
958*852ba100SJustin Hibbits }
959*852ba100SJustin Hibbits }
960*852ba100SJustin Hibbits
961*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.custom)
962*852ba100SJustin Hibbits {
963*852ba100SJustin Hibbits switch (p_FmPcdManipParams->u.hdr.customParams.type)
964*852ba100SJustin Hibbits {
965*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE):
966*852ba100SJustin Hibbits /* set opcode */
967*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_REPLACE_IP) << HMCD_OC_SHIFT;
968*852ba100SJustin Hibbits
969*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.decTtlHl)
970*852ba100SJustin Hibbits tmpReg |= HMCD_IP_REPLACE_TTL_HL;
971*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType
972*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV4_BY_IPV6)
973*852ba100SJustin Hibbits /* line commented out as it has no-side-effect ('0' value). */
974*852ba100SJustin Hibbits /*tmpReg |= HMCD_IP_REPLACE_REPLACE_IPV4*/;
975*852ba100SJustin Hibbits else
976*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType
977*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)
978*852ba100SJustin Hibbits {
979*852ba100SJustin Hibbits tmpReg |= HMCD_IP_REPLACE_REPLACE_IPV6;
980*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id)
981*852ba100SJustin Hibbits tmpReg |= HMCD_IP_REPLACE_ID;
982*852ba100SJustin Hibbits }
983*852ba100SJustin Hibbits else
984*852ba100SJustin Hibbits RETURN_ERROR(
985*852ba100SJustin Hibbits MINOR,
986*852ba100SJustin Hibbits E_NOT_SUPPORTED,
987*852ba100SJustin Hibbits ("One flag out of HDR_MANIP_IP_REPLACE_IPV4, HDR_MANIP_IP_REPLACE_IPV6 - must be set."));
988*852ba100SJustin Hibbits
989*852ba100SJustin Hibbits /* write the first 4 bytes of the descriptor */
990*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
991*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
992*852ba100SJustin Hibbits p_Last = p_TmpHmct;
993*852ba100SJustin Hibbits
994*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE / 4;
995*852ba100SJustin Hibbits
996*852ba100SJustin Hibbits size =
997*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdrSize;
998*852ba100SJustin Hibbits ASSERT_COND(p_TmpData);
999*852ba100SJustin Hibbits MemCpy8(
1000*852ba100SJustin Hibbits p_TmpData,
1001*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdr,
1002*852ba100SJustin Hibbits size);
1003*852ba100SJustin Hibbits tmpReg = (uint32_t)(size << HMCD_IP_REPLACE_L3HDRSIZE_SHIFT);
1004*852ba100SJustin Hibbits tmpReg |= (uint32_t)(XX_VirtToPhys(p_TmpData)
1005*852ba100SJustin Hibbits - (((t_FmPcd*)h_FmPcd)->physicalMuramBase));
1006*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
1007*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
1008*852ba100SJustin Hibbits p_TmpData += size;
1009*852ba100SJustin Hibbits
1010*852ba100SJustin Hibbits if ((p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType
1011*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)
1012*852ba100SJustin Hibbits && (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id))
1013*852ba100SJustin Hibbits {
1014*852ba100SJustin Hibbits WRITE_UINT16(
1015*852ba100SJustin Hibbits *(uint16_t*)p_TmpData,
1016*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.id);
1017*852ba100SJustin Hibbits WRITE_UINT32(
1018*852ba100SJustin Hibbits *p_TmpHmct,
1019*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase)));
1020*852ba100SJustin Hibbits p_TmpData += 2;
1021*852ba100SJustin Hibbits }
1022*852ba100SJustin Hibbits p_TmpHmct += HMCD_PTR_SIZE / 4;
1023*852ba100SJustin Hibbits break;
1024*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE):
1025*852ba100SJustin Hibbits /* set opcode */
1026*852ba100SJustin Hibbits tmpReg = (uint32_t)(HMCD_OPCODE_GEN_FIELD_REPLACE) << HMCD_OC_SHIFT;
1027*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.size << HMCD_GEN_FIELD_SIZE_SHIFT;
1028*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset << HMCD_GEN_FIELD_SRC_OFF_SHIFT;
1029*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.dstOffset << HMCD_GEN_FIELD_DST_OFF_SHIFT;
1030*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask)
1031*852ba100SJustin Hibbits tmpReg |= HMCD_GEN_FIELD_MASK_EN;
1032*852ba100SJustin Hibbits
1033*852ba100SJustin Hibbits /* write the first 4 bytes of the descriptor */
1034*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
1035*852ba100SJustin Hibbits /* save a pointer to the "last" indication word */
1036*852ba100SJustin Hibbits p_Last = p_TmpHmct;
1037*852ba100SJustin Hibbits
1038*852ba100SJustin Hibbits p_TmpHmct += HMCD_BASIC_SIZE/4;
1039*852ba100SJustin Hibbits
1040*852ba100SJustin Hibbits if (p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask)
1041*852ba100SJustin Hibbits {
1042*852ba100SJustin Hibbits tmpReg = p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask << HMCD_GEN_FIELD_MASK_SHIFT;
1043*852ba100SJustin Hibbits tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.maskOffset << HMCD_GEN_FIELD_MASK_OFF_SHIFT;
1044*852ba100SJustin Hibbits /* write the next 4 bytes of the descriptor */
1045*852ba100SJustin Hibbits WRITE_UINT32(*p_TmpHmct, tmpReg);
1046*852ba100SJustin Hibbits }
1047*852ba100SJustin Hibbits p_TmpHmct += HMCD_PARAM_SIZE/4;
1048*852ba100SJustin Hibbits break;
1049*852ba100SJustin Hibbits default:
1050*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION,
1051*852ba100SJustin Hibbits ("Unknown customParams.type"));
1052*852ba100SJustin Hibbits }
1053*852ba100SJustin Hibbits }
1054*852ba100SJustin Hibbits
1055*852ba100SJustin Hibbits /* If this node has a nextManip, and no parsing is required, the old table must be copied to the new table
1056*852ba100SJustin Hibbits the old table and should be freed */
1057*852ba100SJustin Hibbits if (p_FmPcdManipParams->h_NextManip
1058*852ba100SJustin Hibbits && (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR)
1059*852ba100SJustin Hibbits && (MANIP_DONT_REPARSE(p_Manip)))
1060*852ba100SJustin Hibbits {
1061*852ba100SJustin Hibbits if (new)
1062*852ba100SJustin Hibbits {
1063*852ba100SJustin Hibbits /* If this is the first time this manip is created we need to free unused memory. If it
1064*852ba100SJustin Hibbits * is a dynamic changes case, the memory used is either the CC shadow or the existing
1065*852ba100SJustin Hibbits * table - no allocation, no free */
1066*852ba100SJustin Hibbits MANIP_UPDATE_UNIFIED_POSITION(p_FmPcdManipParams->h_NextManip);
1067*852ba100SJustin Hibbits
1068*852ba100SJustin Hibbits p_Manip->unifiedPosition = e_MANIP_UNIFIED_FIRST;
1069*852ba100SJustin Hibbits }
1070*852ba100SJustin Hibbits }
1071*852ba100SJustin Hibbits else
1072*852ba100SJustin Hibbits {
1073*852ba100SJustin Hibbits ASSERT_COND(p_Last);
1074*852ba100SJustin Hibbits /* set the "last" indication on the last command of the current table */
1075*852ba100SJustin Hibbits WRITE_UINT32(*p_Last, GET_UINT32(*p_Last) | HMCD_LAST);
1076*852ba100SJustin Hibbits }
1077*852ba100SJustin Hibbits
1078*852ba100SJustin Hibbits return E_OK;
1079*852ba100SJustin Hibbits }
1080*852ba100SJustin Hibbits
CreateManipActionNew(t_FmPcdManip * p_Manip,t_FmPcdManipParams * p_FmPcdManipParams)1081*852ba100SJustin Hibbits static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip,
1082*852ba100SJustin Hibbits t_FmPcdManipParams *p_FmPcdManipParams)
1083*852ba100SJustin Hibbits {
1084*852ba100SJustin Hibbits t_FmPcdManip *p_CurManip;
1085*852ba100SJustin Hibbits t_Error err;
1086*852ba100SJustin Hibbits uint32_t nextSize = 0, totalSize;
1087*852ba100SJustin Hibbits uint16_t tmpReg;
1088*852ba100SJustin Hibbits uint8_t *p_OldHmct, *p_TmpHmctPtr, *p_TmpDataPtr;
1089*852ba100SJustin Hibbits
1090*852ba100SJustin Hibbits /* set Manip structure */
1091*852ba100SJustin Hibbits
1092*852ba100SJustin Hibbits p_Manip->dontParseAfterManip =
1093*852ba100SJustin Hibbits p_FmPcdManipParams->u.hdr.dontParseAfterManip;
1094*852ba100SJustin Hibbits
1095*852ba100SJustin Hibbits if (p_FmPcdManipParams->h_NextManip)
1096*852ba100SJustin Hibbits { /* Next Header manipulation exists */
1097*852ba100SJustin Hibbits p_Manip->nextManipType = MANIP_GET_TYPE(p_FmPcdManipParams->h_NextManip);
1098*852ba100SJustin Hibbits
1099*852ba100SJustin Hibbits if ((p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && p_Manip->dontParseAfterManip)
1100*852ba100SJustin Hibbits nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip)
1101*852ba100SJustin Hibbits + GetDataSize(p_FmPcdManipParams->h_NextManip));
1102*852ba100SJustin Hibbits else /* either parsing is required or next manip is Frag; no table merging. */
1103*852ba100SJustin Hibbits p_Manip->cascaded = TRUE;
1104*852ba100SJustin Hibbits /* pass up the "cascaded" attribute. The whole chain is cascaded
1105*852ba100SJustin Hibbits * if something is cascaded along the way. */
1106*852ba100SJustin Hibbits if (MANIP_IS_CASCADED(p_FmPcdManipParams->h_NextManip))
1107*852ba100SJustin Hibbits p_Manip->cascaded = TRUE;
1108*852ba100SJustin Hibbits }
1109*852ba100SJustin Hibbits
1110*852ba100SJustin Hibbits /* Allocate new table */
1111*852ba100SJustin Hibbits /* calculate table size according to manip parameters */
1112*852ba100SJustin Hibbits err = CalculateTableSize(p_FmPcdManipParams, &p_Manip->tableSize,
1113*852ba100SJustin Hibbits &p_Manip->dataSize);
1114*852ba100SJustin Hibbits if (err)
1115*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
1116*852ba100SJustin Hibbits
1117*852ba100SJustin Hibbits totalSize = (uint16_t)(p_Manip->tableSize + p_Manip->dataSize + nextSize);
1118*852ba100SJustin Hibbits
1119*852ba100SJustin Hibbits p_Manip->p_Hmct = (uint8_t*)FM_MURAM_AllocMem(
1120*852ba100SJustin Hibbits ((t_FmPcd *)p_Manip->h_FmPcd)->h_FmMuram, totalSize, 4);
1121*852ba100SJustin Hibbits if (!p_Manip->p_Hmct)
1122*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc failed"));
1123*852ba100SJustin Hibbits
1124*852ba100SJustin Hibbits if (p_Manip->dataSize)
1125*852ba100SJustin Hibbits p_Manip->p_Data =
1126*852ba100SJustin Hibbits (uint8_t*)PTR_MOVE(p_Manip->p_Hmct, (p_Manip->tableSize + nextSize));
1127*852ba100SJustin Hibbits
1128*852ba100SJustin Hibbits /* update shadow size to allow runtime replacement of Header manipulation */
1129*852ba100SJustin Hibbits /* The allocated shadow is divided as follows:
1130*852ba100SJustin Hibbits 0 . . . 16 . . .
1131*852ba100SJustin Hibbits --------------------------------
1132*852ba100SJustin Hibbits | Shadow | Shadow HMTD |
1133*852ba100SJustin Hibbits | HMTD | Match Table |
1134*852ba100SJustin Hibbits | (16 bytes) | (maximal size) |
1135*852ba100SJustin Hibbits --------------------------------
1136*852ba100SJustin Hibbits */
1137*852ba100SJustin Hibbits
1138*852ba100SJustin Hibbits err = FmPcdUpdateCcShadow(p_Manip->h_FmPcd, (uint32_t)(totalSize + 16),
1139*852ba100SJustin Hibbits (uint16_t)FM_PCD_CC_AD_TABLE_ALIGN);
1140*852ba100SJustin Hibbits if (err != E_OK)
1141*852ba100SJustin Hibbits {
1142*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_Manip->h_FmPcd, p_Manip->p_Hmct);
1143*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
1144*852ba100SJustin Hibbits ("MURAM allocation for HdrManip node shadow"));
1145*852ba100SJustin Hibbits }
1146*852ba100SJustin Hibbits
1147*852ba100SJustin Hibbits if (p_FmPcdManipParams->h_NextManip
1148*852ba100SJustin Hibbits && (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR)
1149*852ba100SJustin Hibbits && (MANIP_DONT_REPARSE(p_Manip)))
1150*852ba100SJustin Hibbits {
1151*852ba100SJustin Hibbits p_OldHmct = (uint8_t *)GetManipInfo(p_FmPcdManipParams->h_NextManip,
1152*852ba100SJustin Hibbits e_MANIP_HMCT);
1153*852ba100SJustin Hibbits p_CurManip = p_FmPcdManipParams->h_NextManip;
1154*852ba100SJustin Hibbits /* Run till the last Manip (which is the first to configure) */
1155*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
1156*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_NextManip;
1157*852ba100SJustin Hibbits
1158*852ba100SJustin Hibbits while (p_CurManip)
1159*852ba100SJustin Hibbits {
1160*852ba100SJustin Hibbits /* If this is a unified table, point to the part of the table
1161*852ba100SJustin Hibbits * which is the relative offset in HMCT.
1162*852ba100SJustin Hibbits */
1163*852ba100SJustin Hibbits p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct,
1164*852ba100SJustin Hibbits (p_Manip->tableSize +
1165*852ba100SJustin Hibbits (PTR_TO_UINT(p_CurManip->p_Hmct) -
1166*852ba100SJustin Hibbits PTR_TO_UINT(p_OldHmct))));
1167*852ba100SJustin Hibbits if (p_CurManip->p_Data)
1168*852ba100SJustin Hibbits p_TmpDataPtr = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct,
1169*852ba100SJustin Hibbits (p_Manip->tableSize +
1170*852ba100SJustin Hibbits (PTR_TO_UINT(p_CurManip->p_Data) -
1171*852ba100SJustin Hibbits PTR_TO_UINT(p_OldHmct))));
1172*852ba100SJustin Hibbits else
1173*852ba100SJustin Hibbits p_TmpDataPtr = NULL;
1174*852ba100SJustin Hibbits
1175*852ba100SJustin Hibbits BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr,
1176*852ba100SJustin Hibbits p_TmpDataPtr, FALSE);
1177*852ba100SJustin Hibbits /* update old manip table pointer */
1178*852ba100SJustin Hibbits MANIP_SET_HMCT_PTR(p_CurManip, p_TmpHmctPtr);
1179*852ba100SJustin Hibbits MANIP_SET_DATA_PTR(p_CurManip, p_TmpDataPtr);
1180*852ba100SJustin Hibbits
1181*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_PrevManip;
1182*852ba100SJustin Hibbits }
1183*852ba100SJustin Hibbits /* We copied the HMCT to create a new large HMCT so we can free the old one */
1184*852ba100SJustin Hibbits FM_MURAM_FreeMem(MANIP_GET_MURAM(p_FmPcdManipParams->h_NextManip),
1185*852ba100SJustin Hibbits p_OldHmct);
1186*852ba100SJustin Hibbits }
1187*852ba100SJustin Hibbits
1188*852ba100SJustin Hibbits /* Fill table */
1189*852ba100SJustin Hibbits err = BuildHmct(p_Manip, p_FmPcdManipParams, p_Manip->p_Hmct,
1190*852ba100SJustin Hibbits p_Manip->p_Data, TRUE);
1191*852ba100SJustin Hibbits if (err)
1192*852ba100SJustin Hibbits {
1193*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_Manip->h_FmPcd, p_Manip->p_Hmct);
1194*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
1195*852ba100SJustin Hibbits }
1196*852ba100SJustin Hibbits
1197*852ba100SJustin Hibbits /* Build HMTD (table descriptor) */
1198*852ba100SJustin Hibbits tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */
1199*852ba100SJustin Hibbits
1200*852ba100SJustin Hibbits /* add parseAfterManip */
1201*852ba100SJustin Hibbits if (!p_Manip->dontParseAfterManip)
1202*852ba100SJustin Hibbits tmpReg |= HMTD_CFG_PRS_AFTER_HM;
1203*852ba100SJustin Hibbits
1204*852ba100SJustin Hibbits /* create cascade */
1205*852ba100SJustin Hibbits /*if (p_FmPcdManipParams->h_NextManip
1206*852ba100SJustin Hibbits && (!MANIP_DONT_REPARSE(p_Manip) || (p_Manip->nextManipType != e_FM_PCD_MANIP_HDR)))*/
1207*852ba100SJustin Hibbits if (p_Manip->cascaded)
1208*852ba100SJustin Hibbits {
1209*852ba100SJustin Hibbits uint16_t nextAd;
1210*852ba100SJustin Hibbits /* indicate that there's another HM table descriptor */
1211*852ba100SJustin Hibbits tmpReg |= HMTD_CFG_NEXT_AD_EN;
1212*852ba100SJustin Hibbits /* get address of next HMTD (table descriptor; h_Ad).
1213*852ba100SJustin Hibbits * If the next HMTD was removed due to table unifing, get the address
1214*852ba100SJustin Hibbits * of the "next next" as written in the h_Ad of the next h_Manip node.
1215*852ba100SJustin Hibbits */
1216*852ba100SJustin Hibbits if (p_Manip->unifiedPosition != e_MANIP_UNIFIED_FIRST)
1217*852ba100SJustin Hibbits nextAd = (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4);
1218*852ba100SJustin Hibbits else
1219*852ba100SJustin Hibbits nextAd = ((t_Hmtd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad)->nextAdIdx;
1220*852ba100SJustin Hibbits
1221*852ba100SJustin Hibbits WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx, nextAd);
1222*852ba100SJustin Hibbits }
1223*852ba100SJustin Hibbits
1224*852ba100SJustin Hibbits WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->cfg, tmpReg);
1225*852ba100SJustin Hibbits WRITE_UINT32(
1226*852ba100SJustin Hibbits ((t_Hmtd *)p_Manip->h_Ad)->hmcdBasePtr,
1227*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_Manip->p_Hmct) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));
1228*852ba100SJustin Hibbits
1229*852ba100SJustin Hibbits WRITE_UINT8(((t_Hmtd *)p_Manip->h_Ad)->opCode, HMAN_OC);
1230*852ba100SJustin Hibbits
1231*852ba100SJustin Hibbits if (p_Manip->unifiedPosition == e_MANIP_UNIFIED_FIRST)
1232*852ba100SJustin Hibbits {
1233*852ba100SJustin Hibbits /* The HMTD of the next Manip is never going to be used */
1234*852ba100SJustin Hibbits if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate)
1235*852ba100SJustin Hibbits FM_MURAM_FreeMem(
1236*852ba100SJustin Hibbits ((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram,
1237*852ba100SJustin Hibbits ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
1238*852ba100SJustin Hibbits else
1239*852ba100SJustin Hibbits XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
1240*852ba100SJustin Hibbits ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL;
1241*852ba100SJustin Hibbits }
1242*852ba100SJustin Hibbits
1243*852ba100SJustin Hibbits return E_OK;
1244*852ba100SJustin Hibbits }
1245*852ba100SJustin Hibbits
CreateManipActionShadow(t_FmPcdManip * p_Manip,t_FmPcdManipParams * p_FmPcdManipParams)1246*852ba100SJustin Hibbits static t_Error CreateManipActionShadow(t_FmPcdManip *p_Manip,
1247*852ba100SJustin Hibbits t_FmPcdManipParams *p_FmPcdManipParams)
1248*852ba100SJustin Hibbits {
1249*852ba100SJustin Hibbits uint8_t *p_WholeHmct, *p_TmpHmctPtr, newDataSize, *p_TmpDataPtr = NULL;
1250*852ba100SJustin Hibbits uint16_t newSize;
1251*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
1252*852ba100SJustin Hibbits t_Error err;
1253*852ba100SJustin Hibbits t_FmPcdManip *p_CurManip = p_Manip;
1254*852ba100SJustin Hibbits
1255*852ba100SJustin Hibbits err = CalculateTableSize(p_FmPcdManipParams, &newSize, &newDataSize);
1256*852ba100SJustin Hibbits if (err)
1257*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
1258*852ba100SJustin Hibbits
1259*852ba100SJustin Hibbits /* check coherency of new table parameters */
1260*852ba100SJustin Hibbits if (newSize > p_Manip->tableSize)
1261*852ba100SJustin Hibbits RETURN_ERROR(
1262*852ba100SJustin Hibbits MINOR,
1263*852ba100SJustin Hibbits E_INVALID_VALUE,
1264*852ba100SJustin Hibbits ("New Hdr Manip configuration requires larger size than current one (command table)."));
1265*852ba100SJustin Hibbits if (newDataSize > p_Manip->dataSize)
1266*852ba100SJustin Hibbits RETURN_ERROR(
1267*852ba100SJustin Hibbits MINOR,
1268*852ba100SJustin Hibbits E_INVALID_VALUE,
1269*852ba100SJustin Hibbits ("New Hdr Manip configuration requires larger size than current one (data)."));
1270*852ba100SJustin Hibbits if (p_FmPcdManipParams->h_NextManip)
1271*852ba100SJustin Hibbits RETURN_ERROR(
1272*852ba100SJustin Hibbits MINOR, E_INVALID_VALUE,
1273*852ba100SJustin Hibbits ("New Hdr Manip configuration can not contain h_NextManip."));
1274*852ba100SJustin Hibbits if (MANIP_IS_UNIFIED(p_Manip) && (newSize != p_Manip->tableSize))
1275*852ba100SJustin Hibbits RETURN_ERROR(
1276*852ba100SJustin Hibbits MINOR,
1277*852ba100SJustin Hibbits E_INVALID_VALUE,
1278*852ba100SJustin Hibbits ("New Hdr Manip configuration in a chained manipulation requires different size than current one."));
1279*852ba100SJustin Hibbits if (p_Manip->dontParseAfterManip
1280*852ba100SJustin Hibbits != p_FmPcdManipParams->u.hdr.dontParseAfterManip)
1281*852ba100SJustin Hibbits RETURN_ERROR(
1282*852ba100SJustin Hibbits MINOR,
1283*852ba100SJustin Hibbits E_INVALID_VALUE,
1284*852ba100SJustin Hibbits ("New Hdr Manip configuration differs in dontParseAfterManip value."));
1285*852ba100SJustin Hibbits
1286*852ba100SJustin Hibbits p_Manip->tableSize = newSize;
1287*852ba100SJustin Hibbits p_Manip->dataSize = newDataSize;
1288*852ba100SJustin Hibbits
1289*852ba100SJustin Hibbits /* Build the new table in the shadow */
1290*852ba100SJustin Hibbits if (!MANIP_IS_UNIFIED(p_Manip))
1291*852ba100SJustin Hibbits {
1292*852ba100SJustin Hibbits p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow, 16);
1293*852ba100SJustin Hibbits if (p_Manip->p_Data)
1294*852ba100SJustin Hibbits p_TmpDataPtr =
1295*852ba100SJustin Hibbits (uint8_t*)PTR_MOVE(p_TmpHmctPtr,
1296*852ba100SJustin Hibbits (PTR_TO_UINT(p_Manip->p_Data) - PTR_TO_UINT(p_Manip->p_Hmct)));
1297*852ba100SJustin Hibbits
1298*852ba100SJustin Hibbits BuildHmct(p_Manip, p_FmPcdManipParams, p_TmpHmctPtr, p_Manip->p_Data,
1299*852ba100SJustin Hibbits FALSE);
1300*852ba100SJustin Hibbits }
1301*852ba100SJustin Hibbits else
1302*852ba100SJustin Hibbits {
1303*852ba100SJustin Hibbits p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);
1304*852ba100SJustin Hibbits ASSERT_COND(p_WholeHmct);
1305*852ba100SJustin Hibbits
1306*852ba100SJustin Hibbits /* Run till the last Manip (which is the first to configure) */
1307*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
1308*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_NextManip;
1309*852ba100SJustin Hibbits
1310*852ba100SJustin Hibbits while (p_CurManip)
1311*852ba100SJustin Hibbits {
1312*852ba100SJustin Hibbits /* If this is a non-head node in a unified table, point to the part of the shadow
1313*852ba100SJustin Hibbits * which is the relative offset in HMCT.
1314*852ba100SJustin Hibbits * else, point to the beginning of the
1315*852ba100SJustin Hibbits * shadow table (we save 16 for the HMTD.
1316*852ba100SJustin Hibbits */
1317*852ba100SJustin Hibbits p_TmpHmctPtr =
1318*852ba100SJustin Hibbits (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow,
1319*852ba100SJustin Hibbits (16 + PTR_TO_UINT(p_CurManip->p_Hmct) - PTR_TO_UINT(p_WholeHmct)));
1320*852ba100SJustin Hibbits if (p_CurManip->p_Data)
1321*852ba100SJustin Hibbits p_TmpDataPtr =
1322*852ba100SJustin Hibbits (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow,
1323*852ba100SJustin Hibbits (16 + PTR_TO_UINT(p_CurManip->p_Data) - PTR_TO_UINT(p_WholeHmct)));
1324*852ba100SJustin Hibbits
1325*852ba100SJustin Hibbits BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr,
1326*852ba100SJustin Hibbits p_TmpDataPtr, FALSE);
1327*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_PrevManip;
1328*852ba100SJustin Hibbits }
1329*852ba100SJustin Hibbits }
1330*852ba100SJustin Hibbits
1331*852ba100SJustin Hibbits return E_OK;
1332*852ba100SJustin Hibbits }
1333*852ba100SJustin Hibbits
CreateManipActionBackToOrig(t_FmPcdManip * p_Manip,t_FmPcdManipParams * p_FmPcdManipParams)1334*852ba100SJustin Hibbits static t_Error CreateManipActionBackToOrig(
1335*852ba100SJustin Hibbits t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_FmPcdManipParams)
1336*852ba100SJustin Hibbits {
1337*852ba100SJustin Hibbits uint8_t *p_WholeHmct = NULL, *p_TmpHmctPtr, *p_TmpDataPtr;
1338*852ba100SJustin Hibbits t_FmPcdManip *p_CurManip = p_Manip;
1339*852ba100SJustin Hibbits
1340*852ba100SJustin Hibbits /* Build the new table in the shadow */
1341*852ba100SJustin Hibbits if (!MANIP_IS_UNIFIED(p_Manip))
1342*852ba100SJustin Hibbits BuildHmct(p_Manip, p_FmPcdManipParams, p_Manip->p_Hmct, p_Manip->p_Data,
1343*852ba100SJustin Hibbits FALSE);
1344*852ba100SJustin Hibbits else
1345*852ba100SJustin Hibbits {
1346*852ba100SJustin Hibbits p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);
1347*852ba100SJustin Hibbits ASSERT_COND(p_WholeHmct);
1348*852ba100SJustin Hibbits
1349*852ba100SJustin Hibbits /* Run till the last Manip (which is the first to configure) */
1350*852ba100SJustin Hibbits while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
1351*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_NextManip;
1352*852ba100SJustin Hibbits
1353*852ba100SJustin Hibbits while (p_CurManip)
1354*852ba100SJustin Hibbits {
1355*852ba100SJustin Hibbits /* If this is a unified table, point to the part of the table
1356*852ba100SJustin Hibbits * which is the relative offset in HMCT.
1357*852ba100SJustin Hibbits */
1358*852ba100SJustin Hibbits p_TmpHmctPtr = p_CurManip->p_Hmct; /*- (uint32_t)p_WholeHmct*/
1359*852ba100SJustin Hibbits p_TmpDataPtr = p_CurManip->p_Data; /*- (uint32_t)p_WholeHmct*/
1360*852ba100SJustin Hibbits
1361*852ba100SJustin Hibbits BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr,
1362*852ba100SJustin Hibbits p_TmpDataPtr, FALSE);
1363*852ba100SJustin Hibbits
1364*852ba100SJustin Hibbits p_CurManip = p_CurManip->h_PrevManip;
1365*852ba100SJustin Hibbits }
1366*852ba100SJustin Hibbits }
1367*852ba100SJustin Hibbits
1368*852ba100SJustin Hibbits return E_OK;
1369*852ba100SJustin Hibbits }
1370*852ba100SJustin Hibbits
1371*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
UpdateManipIc(t_Handle h_Manip,uint8_t icOffset)13720aeed3e9SJustin Hibbits static t_Error UpdateManipIc(t_Handle h_Manip, uint8_t icOffset)
13730aeed3e9SJustin Hibbits {
13740aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
13750aeed3e9SJustin Hibbits t_Handle p_Ad;
13760aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
13770aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);
13780aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);
13790aeed3e9SJustin Hibbits
1380*852ba100SJustin Hibbits switch (p_Manip->opcode)
13810aeed3e9SJustin Hibbits {
13820aeed3e9SJustin Hibbits case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
13830aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
13840aeed3e9SJustin Hibbits if (p_Manip->updateParams & INTERNAL_CONTEXT_OFFSET)
13850aeed3e9SJustin Hibbits {
1386*852ba100SJustin Hibbits tmpReg32 =
1387*852ba100SJustin Hibbits *(uint32_t *)&((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets;
13880aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)((uint32_t)icOffset << 16);
1389*852ba100SJustin Hibbits *(uint32_t *)&((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets =
1390*852ba100SJustin Hibbits tmpReg32;
13910aeed3e9SJustin Hibbits p_Manip->updateParams &= ~INTERNAL_CONTEXT_OFFSET;
13920aeed3e9SJustin Hibbits p_Manip->icOffset = icOffset;
13930aeed3e9SJustin Hibbits }
13940aeed3e9SJustin Hibbits else
13950aeed3e9SJustin Hibbits {
13960aeed3e9SJustin Hibbits if (p_Manip->icOffset != icOffset)
1397*852ba100SJustin Hibbits RETURN_ERROR(
1398*852ba100SJustin Hibbits MAJOR,
1399*852ba100SJustin Hibbits E_INVALID_VALUE,
1400*852ba100SJustin Hibbits ("this manipulation was updated previously by different value"););
14010aeed3e9SJustin Hibbits }
14020aeed3e9SJustin Hibbits break;
14030aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
14040aeed3e9SJustin Hibbits if (p_Manip->h_Frag)
14050aeed3e9SJustin Hibbits {
14060aeed3e9SJustin Hibbits if (p_Manip->updateParams & INTERNAL_CONTEXT_OFFSET)
14070aeed3e9SJustin Hibbits {
14080aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
14090aeed3e9SJustin Hibbits tmpReg32 |= GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets);
14100aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)((uint32_t)icOffset << 16);
14110aeed3e9SJustin Hibbits WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets, tmpReg32);
14120aeed3e9SJustin Hibbits p_Manip->updateParams &= ~INTERNAL_CONTEXT_OFFSET;
14130aeed3e9SJustin Hibbits p_Manip->icOffset = icOffset;
14140aeed3e9SJustin Hibbits }
14150aeed3e9SJustin Hibbits else
14160aeed3e9SJustin Hibbits {
14170aeed3e9SJustin Hibbits if (p_Manip->icOffset != icOffset)
14180aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("this manipulation was updated previousely by different value"););
14190aeed3e9SJustin Hibbits }
14200aeed3e9SJustin Hibbits }
14210aeed3e9SJustin Hibbits break;
14220aeed3e9SJustin Hibbits }
14230aeed3e9SJustin Hibbits
14240aeed3e9SJustin Hibbits return E_OK;
14250aeed3e9SJustin Hibbits }
14260aeed3e9SJustin Hibbits
UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(t_Handle h_FmPort,t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate)1427*852ba100SJustin Hibbits static t_Error UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(
1428*852ba100SJustin Hibbits t_Handle h_FmPort, t_FmPcdManip *p_Manip, t_Handle h_Ad, bool validate)
14290aeed3e9SJustin Hibbits {
14300aeed3e9SJustin Hibbits
14310aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)h_Ad;
14320aeed3e9SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
14330aeed3e9SJustin Hibbits t_Error err;
14340aeed3e9SJustin Hibbits uint32_t tmpReg32;
14350aeed3e9SJustin Hibbits
14360aeed3e9SJustin Hibbits memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
14370aeed3e9SJustin Hibbits
14380aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
1439*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
1440*852ba100SJustin Hibbits (p_Manip->opcode & HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX),
1441*852ba100SJustin Hibbits E_INVALID_STATE);
14420aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Manip->muramAllocate, E_INVALID_STATE);
14430aeed3e9SJustin Hibbits
14440aeed3e9SJustin Hibbits if (p_Manip->updateParams)
14450aeed3e9SJustin Hibbits {
1446*852ba100SJustin Hibbits if ((!(p_Manip->updateParams & OFFSET_OF_PR))
1447*852ba100SJustin Hibbits || (p_Manip->shadowUpdateParams & OFFSET_OF_PR))
1448*852ba100SJustin Hibbits RETURN_ERROR(
1449*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
1450*852ba100SJustin Hibbits ("in this stage parameters from Port has not be updated"));
14510aeed3e9SJustin Hibbits
14520aeed3e9SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
14530aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_PSO;
14540aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.psoSize = 16;
14550aeed3e9SJustin Hibbits
14560aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
14570aeed3e9SJustin Hibbits if (err)
14580aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
14590aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR)
1460*852ba100SJustin Hibbits RETURN_ERROR(
1461*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
1462*852ba100SJustin Hibbits ("Parser result offset wasn't configured previousely"));
14630aeed3e9SJustin Hibbits #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
14640aeed3e9SJustin Hibbits ASSERT_COND(!(fmPortGetSetCcParams.getCcParams.prOffset % 16));
14650aeed3e9SJustin Hibbits #endif
14660aeed3e9SJustin Hibbits }
1467*852ba100SJustin Hibbits else
1468*852ba100SJustin Hibbits if (validate)
14690aeed3e9SJustin Hibbits {
1470*852ba100SJustin Hibbits if ((!(p_Manip->shadowUpdateParams & OFFSET_OF_PR))
1471*852ba100SJustin Hibbits || (p_Manip->updateParams & OFFSET_OF_PR))
1472*852ba100SJustin Hibbits RETURN_ERROR(
1473*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
1474*852ba100SJustin Hibbits ("in this stage parameters from Port has be updated"));
14750aeed3e9SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
14760aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_PSO;
14770aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.psoSize = 16;
14780aeed3e9SJustin Hibbits
14790aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
14800aeed3e9SJustin Hibbits if (err)
14810aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
14820aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR)
1483*852ba100SJustin Hibbits RETURN_ERROR(
1484*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
1485*852ba100SJustin Hibbits ("Parser result offset wasn't configured previousely"));
14860aeed3e9SJustin Hibbits
14870aeed3e9SJustin Hibbits }
14880aeed3e9SJustin Hibbits
1489*852ba100SJustin Hibbits ASSERT_COND(p_Ad);
1490*852ba100SJustin Hibbits
14910aeed3e9SJustin Hibbits if (p_Manip->updateParams & OFFSET_OF_PR)
14920aeed3e9SJustin Hibbits {
14930aeed3e9SJustin Hibbits tmpReg32 = 0;
14940aeed3e9SJustin Hibbits tmpReg32 |= fmPortGetSetCcParams.getCcParams.prOffset;
1495*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->matchTblPtr,
1496*852ba100SJustin Hibbits (GET_UINT32(p_Ad->matchTblPtr) | tmpReg32));
14970aeed3e9SJustin Hibbits p_Manip->updateParams &= ~OFFSET_OF_PR;
14980aeed3e9SJustin Hibbits p_Manip->shadowUpdateParams |= OFFSET_OF_PR;
14990aeed3e9SJustin Hibbits }
1500*852ba100SJustin Hibbits else
1501*852ba100SJustin Hibbits if (validate)
15020aeed3e9SJustin Hibbits {
15030aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_Ad->matchTblPtr);
15040aeed3e9SJustin Hibbits if ((uint8_t)tmpReg32 != fmPortGetSetCcParams.getCcParams.prOffset)
1505*852ba100SJustin Hibbits RETURN_ERROR(
1506*852ba100SJustin Hibbits MAJOR,
1507*852ba100SJustin Hibbits E_INVALID_STATE,
1508*852ba100SJustin Hibbits ("this manipulation was updated previousely by different value"););
15090aeed3e9SJustin Hibbits }
15100aeed3e9SJustin Hibbits
15110aeed3e9SJustin Hibbits return E_OK;
15120aeed3e9SJustin Hibbits }
15130aeed3e9SJustin Hibbits
UpdateModifyCapwapFragmenation(t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate,t_Handle h_FmTree)15140aeed3e9SJustin Hibbits static t_Error UpdateModifyCapwapFragmenation(t_FmPcdManip *p_Manip, t_Handle h_Ad, bool validate,t_Handle h_FmTree)
15150aeed3e9SJustin Hibbits {
15160aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)h_Ad;
15170aeed3e9SJustin Hibbits t_FmPcdCcSavedManipParams *p_SavedManipParams = NULL;
15180aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
15190aeed3e9SJustin Hibbits
15200aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
15210aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);
15220aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->frag,E_INVALID_HANDLE);
1523*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION) || (p_Manip->opcode == HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER)), E_INVALID_STATE);
15240aeed3e9SJustin Hibbits
15250aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;
15260aeed3e9SJustin Hibbits
15270aeed3e9SJustin Hibbits if (p_Manip->updateParams)
15280aeed3e9SJustin Hibbits {
15290aeed3e9SJustin Hibbits
1530*852ba100SJustin Hibbits if ((!(p_Manip->updateParams & OFFSET_OF_DATA)) ||
1531*852ba100SJustin Hibbits ((p_Manip->shadowUpdateParams & OFFSET_OF_DATA)))
15320aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
1533*852ba100SJustin Hibbits p_SavedManipParams = FmPcdCcTreeGetSavedManipParams(h_FmTree);
15340aeed3e9SJustin Hibbits if (!p_SavedManipParams)
15350aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for this manipulation tree has to be configured previosely with this type"));
1536*852ba100SJustin Hibbits p_Manip->capwapFragParams.dataOffset = p_SavedManipParams->capwapParams.dataOffset;
15370aeed3e9SJustin Hibbits
15380aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_Ad->pcAndOffsets);
1539*852ba100SJustin Hibbits tmpReg32 |= ((uint32_t)p_Manip->capwapFragParams.dataOffset<< 16);
15400aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets,tmpReg32);
15410aeed3e9SJustin Hibbits
15420aeed3e9SJustin Hibbits p_Manip->updateParams &= ~OFFSET_OF_DATA;
1543*852ba100SJustin Hibbits p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;
15440aeed3e9SJustin Hibbits }
15450aeed3e9SJustin Hibbits else if (validate)
15460aeed3e9SJustin Hibbits {
15470aeed3e9SJustin Hibbits
1548*852ba100SJustin Hibbits p_SavedManipParams = FmPcdCcTreeGetSavedManipParams(h_FmTree);
15490aeed3e9SJustin Hibbits if (!p_SavedManipParams)
15500aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for this manipulation tree has to be configured previosely with this type"));
1551*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.dataOffset != p_SavedManipParams->capwapParams.dataOffset)
15520aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"));
15530aeed3e9SJustin Hibbits }
15540aeed3e9SJustin Hibbits
15550aeed3e9SJustin Hibbits return E_OK;
15560aeed3e9SJustin Hibbits }
15570aeed3e9SJustin Hibbits
UpdateInitCapwapFragmentation(t_Handle h_FmPort,t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate,t_Handle h_FmTree)1558*852ba100SJustin Hibbits static t_Error UpdateInitCapwapFragmentation(t_Handle h_FmPort,
1559*852ba100SJustin Hibbits t_FmPcdManip *p_Manip,
1560*852ba100SJustin Hibbits t_Handle h_Ad,
1561*852ba100SJustin Hibbits bool validate,
1562*852ba100SJustin Hibbits t_Handle h_FmTree)
15630aeed3e9SJustin Hibbits {
15640aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
15650aeed3e9SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
15660aeed3e9SJustin Hibbits t_Error err;
15670aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
15680aeed3e9SJustin Hibbits t_FmPcdCcSavedManipParams *p_SavedManipParams;
15690aeed3e9SJustin Hibbits
15700aeed3e9SJustin Hibbits UNUSED(h_Ad);
15710aeed3e9SJustin Hibbits
15720aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
15730aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);
15740aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->frag,E_INVALID_HANDLE);
1575*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION) ||
1576*852ba100SJustin Hibbits (p_Manip->opcode == HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER)), E_INVALID_STATE);
15770aeed3e9SJustin Hibbits
15780aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;
15790aeed3e9SJustin Hibbits
15800aeed3e9SJustin Hibbits if (p_Manip->updateParams)
15810aeed3e9SJustin Hibbits {
1582*852ba100SJustin Hibbits if ((!(p_Manip->updateParams & OFFSET_OF_DATA)) ||
1583*852ba100SJustin Hibbits ((p_Manip->shadowUpdateParams & OFFSET_OF_DATA)))
15840aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
15850aeed3e9SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
15860aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN | UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;
1587*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;
1588*852ba100SJustin Hibbits /* For CAPWAP Rassembly used FMAN_CTRL2 hardcoded - so for fragmentation its better to use FMAN_CTRL1 */
1589*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.orFmanCtrl = FPM_PORT_FM_CTL1;
1590*852ba100SJustin Hibbits
15910aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
15920aeed3e9SJustin Hibbits if (err)
15930aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
15940aeed3e9SJustin Hibbits
15950aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
15960aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Data offset wasn't configured previousely"));
15970aeed3e9SJustin Hibbits
15980aeed3e9SJustin Hibbits p_SavedManipParams = (t_FmPcdCcSavedManipParams *)XX_Malloc(sizeof(t_FmPcdCcSavedManipParams));
15990aeed3e9SJustin Hibbits p_SavedManipParams->capwapParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;
16000aeed3e9SJustin Hibbits
16010aeed3e9SJustin Hibbits #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
16020aeed3e9SJustin Hibbits ASSERT_COND(!(p_SavedManipParams->capwapParams.dataOffset % 16));
1603*852ba100SJustin Hibbits #endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
16040aeed3e9SJustin Hibbits
1605*852ba100SJustin Hibbits FmPcdCcTreeSetSavedManipParams(h_FmTree, (t_Handle)p_SavedManipParams);
16060aeed3e9SJustin Hibbits }
16070aeed3e9SJustin Hibbits else if (validate)
16080aeed3e9SJustin Hibbits {
1609*852ba100SJustin Hibbits if ((!(p_Manip->shadowUpdateParams & OFFSET_OF_DATA)) ||
1610*852ba100SJustin Hibbits ((p_Manip->updateParams & OFFSET_OF_DATA)))
16110aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));
16120aeed3e9SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
16130aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN | UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;
1614*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;
16150aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
16160aeed3e9SJustin Hibbits if (err)
16170aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
16180aeed3e9SJustin Hibbits
16190aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
16200aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Data offset wasn't configured previousely"));
16210aeed3e9SJustin Hibbits }
16220aeed3e9SJustin Hibbits
16230aeed3e9SJustin Hibbits if (p_Manip->updateParams)
16240aeed3e9SJustin Hibbits {
16250aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_Ad->pcAndOffsets);
16260aeed3e9SJustin Hibbits tmpReg32 |= ((uint32_t)fmPortGetSetCcParams.getCcParams.dataOffset<< 16);
16270aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets,tmpReg32);
16280aeed3e9SJustin Hibbits
16290aeed3e9SJustin Hibbits p_Manip->updateParams &= ~OFFSET_OF_DATA;
1630*852ba100SJustin Hibbits p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;
1631*852ba100SJustin Hibbits p_Manip->capwapFragParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;
16320aeed3e9SJustin Hibbits }
16330aeed3e9SJustin Hibbits else if (validate)
16340aeed3e9SJustin Hibbits {
1635*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.dataOffset != fmPortGetSetCcParams.getCcParams.dataOffset)
16360aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"));
16370aeed3e9SJustin Hibbits }
16380aeed3e9SJustin Hibbits
16390aeed3e9SJustin Hibbits return E_OK;
16400aeed3e9SJustin Hibbits }
16410aeed3e9SJustin Hibbits
UpdateInitCapwapReasm(t_Handle h_FmPcd,t_Handle h_FmPort,t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate)16420aeed3e9SJustin Hibbits static t_Error UpdateInitCapwapReasm(t_Handle h_FmPcd,
16430aeed3e9SJustin Hibbits t_Handle h_FmPort,
16440aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip,
16450aeed3e9SJustin Hibbits t_Handle h_Ad,
16460aeed3e9SJustin Hibbits bool validate)
16470aeed3e9SJustin Hibbits {
16480aeed3e9SJustin Hibbits t_CapwapReasmPram *p_ReassmTbl;
16490aeed3e9SJustin Hibbits t_Error err;
16500aeed3e9SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
16510aeed3e9SJustin Hibbits uint8_t i = 0;
16520aeed3e9SJustin Hibbits uint16_t size;
16530aeed3e9SJustin Hibbits uint32_t tmpReg32;
16540aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
16550aeed3e9SJustin Hibbits t_FmPcdCcCapwapReassmTimeoutParams ccCapwapReassmTimeoutParams;
16560aeed3e9SJustin Hibbits
16570aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
16580aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);
16590aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Manip->frag,E_INVALID_HANDLE);
1660*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST), E_INVALID_STATE);
16610aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_HANDLE);
16620aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc,E_INVALID_HANDLE);
16630aeed3e9SJustin Hibbits
16640aeed3e9SJustin Hibbits if (p_Manip->h_FmPcd != h_FmPcd)
1665*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
1666*852ba100SJustin Hibbits ("handler of PCD previously was initiated by different value"));
16670aeed3e9SJustin Hibbits
16680aeed3e9SJustin Hibbits UNUSED(h_Ad);
16690aeed3e9SJustin Hibbits
16700aeed3e9SJustin Hibbits memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
16710aeed3e9SJustin Hibbits p_ReassmTbl = (t_CapwapReasmPram *)p_Manip->h_Frag;
16720aeed3e9SJustin Hibbits
16730aeed3e9SJustin Hibbits if (p_Manip->updateParams)
16740aeed3e9SJustin Hibbits {
1675*852ba100SJustin Hibbits if ((!(p_Manip->updateParams & NUM_OF_TASKS) &&
1676*852ba100SJustin Hibbits !(p_Manip->updateParams & OFFSET_OF_DATA) &&
1677*852ba100SJustin Hibbits !(p_Manip->updateParams & OFFSET_OF_PR) &&
16780aeed3e9SJustin Hibbits !(p_Manip->updateParams & HW_PORT_ID)) ||
1679*852ba100SJustin Hibbits ((p_Manip->shadowUpdateParams & NUM_OF_TASKS) ||
1680*852ba100SJustin Hibbits (p_Manip->shadowUpdateParams & OFFSET_OF_DATA) || (p_Manip->shadowUpdateParams & OFFSET_OF_PR) ||
1681*852ba100SJustin Hibbits (p_Manip->shadowUpdateParams & HW_PORT_ID)))
16820aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
16830aeed3e9SJustin Hibbits
16840aeed3e9SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
16850aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN;
1686*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;
1687*852ba100SJustin Hibbits
16880aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
16890aeed3e9SJustin Hibbits if (err)
16900aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
1691*852ba100SJustin Hibbits
16920aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & NUM_OF_TASKS)
16930aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Num of tasks wasn't configured previousely"));
16940aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
16950aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previousely"));
16960aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & HW_PORT_ID)
16970aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("hwPortId wasn't updated"));
16980aeed3e9SJustin Hibbits #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
16990aeed3e9SJustin Hibbits ASSERT_COND((fmPortGetSetCcParams.getCcParams.dataOffset % 16) == 0);
1700*852ba100SJustin Hibbits #endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
17010aeed3e9SJustin Hibbits }
17020aeed3e9SJustin Hibbits else if (validate)
17030aeed3e9SJustin Hibbits {
1704*852ba100SJustin Hibbits if ((!(p_Manip->shadowUpdateParams & NUM_OF_TASKS) &&
1705*852ba100SJustin Hibbits !(p_Manip->shadowUpdateParams & OFFSET_OF_DATA) &&
1706*852ba100SJustin Hibbits !(p_Manip->shadowUpdateParams & OFFSET_OF_PR) &&
1707*852ba100SJustin Hibbits !(p_Manip->shadowUpdateParams & HW_PORT_ID)) &&
17080aeed3e9SJustin Hibbits ((p_Manip->updateParams & NUM_OF_TASKS) ||
17090aeed3e9SJustin Hibbits (p_Manip->updateParams & OFFSET_OF_DATA) || (p_Manip->updateParams & OFFSET_OF_PR) ||
17100aeed3e9SJustin Hibbits (p_Manip->updateParams & HW_PORT_ID)))
17110aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));
1712*852ba100SJustin Hibbits
17130aeed3e9SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
17140aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN;
1715*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;
1716*852ba100SJustin Hibbits
17170aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
17180aeed3e9SJustin Hibbits if (err)
17190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
1720*852ba100SJustin Hibbits
17210aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & NUM_OF_TASKS)
1722*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("NumOfTasks wasn't configured previously"));
17230aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
1724*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previously"));
17250aeed3e9SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type & HW_PORT_ID)
17260aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("hwPortId wasn't updated"));
17270aeed3e9SJustin Hibbits }
17280aeed3e9SJustin Hibbits
17290aeed3e9SJustin Hibbits if (p_Manip->updateParams)
17300aeed3e9SJustin Hibbits {
17310aeed3e9SJustin Hibbits if (p_Manip->updateParams & NUM_OF_TASKS)
17320aeed3e9SJustin Hibbits {
1733*852ba100SJustin Hibbits /*recommendation of Microcode team - (maxNumFramesInProcess * 2) */
1734*852ba100SJustin Hibbits size = (uint16_t)(p_Manip->capwapFragParams.maxNumFramesInProcess*2 + fmPortGetSetCcParams.getCcParams.numOfTasks);
17350aeed3e9SJustin Hibbits if (size > 255)
17360aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("numOfOpenReassmEntries + numOfTasks per port can not be greater than 256"));
17370aeed3e9SJustin Hibbits
1738*852ba100SJustin Hibbits p_Manip->capwapFragParams.numOfTasks = fmPortGetSetCcParams.getCcParams.numOfTasks;
17390aeed3e9SJustin Hibbits
17400aeed3e9SJustin Hibbits /*p_ReassmFrmDescrIndxPoolTbl*/
1741*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl =
1742*852ba100SJustin Hibbits (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
17430aeed3e9SJustin Hibbits (uint32_t)(size + 1),
17440aeed3e9SJustin Hibbits 4);
1745*852ba100SJustin Hibbits if (!p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl)
1746*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly frame buffer index pool table"));
17470aeed3e9SJustin Hibbits
1748*852ba100SJustin Hibbits MemSet8(p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl, 0, (uint32_t)(size + 1));
17490aeed3e9SJustin Hibbits
17500aeed3e9SJustin Hibbits for ( i = 0; i < size; i++)
1751*852ba100SJustin Hibbits WRITE_UINT8(*(uint8_t *)PTR_MOVE(p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl, i), (uint8_t)(i+1));
17520aeed3e9SJustin Hibbits
1753*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl) - p_FmPcd->physicalMuramBase);
17540aeed3e9SJustin Hibbits
17550aeed3e9SJustin Hibbits WRITE_UINT32(p_ReassmTbl->reasmFrmDescIndexPoolTblPtr, tmpReg32);
17560aeed3e9SJustin Hibbits
17570aeed3e9SJustin Hibbits /*p_ReassmFrmDescrPoolTbl*/
1758*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl =
1759*852ba100SJustin Hibbits (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
17600aeed3e9SJustin Hibbits (uint32_t)((size + 1) * FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE),
17610aeed3e9SJustin Hibbits 4);
17620aeed3e9SJustin Hibbits
1763*852ba100SJustin Hibbits if (!p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl)
1764*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly frame buffer pool table"));
17650aeed3e9SJustin Hibbits
1766*852ba100SJustin Hibbits MemSet8(p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl, 0, (uint32_t)((size +1)* FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE));
17670aeed3e9SJustin Hibbits
1768*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl) - p_FmPcd->physicalMuramBase);
17690aeed3e9SJustin Hibbits
17700aeed3e9SJustin Hibbits WRITE_UINT32(p_ReassmTbl->reasmFrmDescPoolTblPtr, tmpReg32);
17710aeed3e9SJustin Hibbits
17720aeed3e9SJustin Hibbits /*p_TimeOutTbl*/
17730aeed3e9SJustin Hibbits
1774*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_TimeOutTbl =
1775*852ba100SJustin Hibbits (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
17760aeed3e9SJustin Hibbits (uint32_t)((size + 1)* FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE),
17770aeed3e9SJustin Hibbits 4);
17780aeed3e9SJustin Hibbits
1779*852ba100SJustin Hibbits if (!p_Manip->capwapFragParams.p_TimeOutTbl)
1780*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly timeout table"));
17810aeed3e9SJustin Hibbits
1782*852ba100SJustin Hibbits MemSet8(p_Manip->capwapFragParams.p_TimeOutTbl, 0, (uint16_t)((size + 1)*FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE));
17830aeed3e9SJustin Hibbits
1784*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_TimeOutTbl) - p_FmPcd->physicalMuramBase);
17850aeed3e9SJustin Hibbits WRITE_UINT32(p_ReassmTbl->timeOutTblPtr, tmpReg32);
17860aeed3e9SJustin Hibbits
17870aeed3e9SJustin Hibbits p_Manip->updateParams &= ~NUM_OF_TASKS;
17880aeed3e9SJustin Hibbits p_Manip->shadowUpdateParams |= NUM_OF_TASKS;
17890aeed3e9SJustin Hibbits }
17900aeed3e9SJustin Hibbits
17910aeed3e9SJustin Hibbits if (p_Manip->updateParams & OFFSET_OF_DATA)
17920aeed3e9SJustin Hibbits {
1793*852ba100SJustin Hibbits p_Manip->capwapFragParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;
17940aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_ReassmTbl->mode);
1795*852ba100SJustin Hibbits tmpReg32|= p_Manip->capwapFragParams.dataOffset;
17960aeed3e9SJustin Hibbits WRITE_UINT32(p_ReassmTbl->mode, tmpReg32);
17970aeed3e9SJustin Hibbits p_Manip->updateParams &= ~OFFSET_OF_DATA;
17980aeed3e9SJustin Hibbits p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;
17990aeed3e9SJustin Hibbits }
1800*852ba100SJustin Hibbits
18010aeed3e9SJustin Hibbits if (!(fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR))
18020aeed3e9SJustin Hibbits {
1803*852ba100SJustin Hibbits p_Manip->capwapFragParams.prOffset = fmPortGetSetCcParams.getCcParams.prOffset;
18040aeed3e9SJustin Hibbits
18050aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_ReassmTbl->mode);
18060aeed3e9SJustin Hibbits tmpReg32|= FM_PCD_MANIP_CAPWAP_REASM_PR_COPY;
18070aeed3e9SJustin Hibbits WRITE_UINT32(p_ReassmTbl->mode, tmpReg32);
18080aeed3e9SJustin Hibbits
18090aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_ReassmTbl->intStatsTblPtr);
1810*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)p_Manip->capwapFragParams.prOffset << 24;
18110aeed3e9SJustin Hibbits WRITE_UINT32(p_ReassmTbl->intStatsTblPtr, tmpReg32);
18120aeed3e9SJustin Hibbits p_Manip->updateParams &= ~OFFSET_OF_PR;
18130aeed3e9SJustin Hibbits p_Manip->shadowUpdateParams |= OFFSET_OF_PR;
18140aeed3e9SJustin Hibbits }
18150aeed3e9SJustin Hibbits else
18160aeed3e9SJustin Hibbits {
1817*852ba100SJustin Hibbits p_Manip->capwapFragParams.prOffset = 0xff;
18180aeed3e9SJustin Hibbits p_Manip->updateParams &= ~OFFSET_OF_PR;
18190aeed3e9SJustin Hibbits p_Manip->shadowUpdateParams |= OFFSET_OF_PR;
18200aeed3e9SJustin Hibbits }
18210aeed3e9SJustin Hibbits
1822*852ba100SJustin Hibbits p_Manip->capwapFragParams.hwPortId = fmPortGetSetCcParams.getCcParams.hardwarePortId;
18230aeed3e9SJustin Hibbits p_Manip->updateParams &= ~HW_PORT_ID;
18240aeed3e9SJustin Hibbits p_Manip->shadowUpdateParams |= HW_PORT_ID;
18250aeed3e9SJustin Hibbits
18260aeed3e9SJustin Hibbits /*timeout hc */
1827*852ba100SJustin Hibbits ccCapwapReassmTimeoutParams.fqidForTimeOutFrames = p_Manip->capwapFragParams.fqidForTimeOutFrames;
1828*852ba100SJustin Hibbits ccCapwapReassmTimeoutParams.portIdAndCapwapReassmTbl = (uint32_t)p_Manip->capwapFragParams.hwPortId << 24;
18290aeed3e9SJustin Hibbits ccCapwapReassmTimeoutParams.portIdAndCapwapReassmTbl |= (uint32_t)((XX_VirtToPhys(p_ReassmTbl) - p_FmPcd->physicalMuramBase));
1830*852ba100SJustin Hibbits ccCapwapReassmTimeoutParams.timeoutRequestTime = (((uint32_t)1<<p_Manip->capwapFragParams.bitFor1Micro) * p_Manip->capwapFragParams.timeoutRoutineRequestTime)/2;
18310aeed3e9SJustin Hibbits return FmHcPcdCcCapwapTimeoutReassm(p_FmPcd->h_Hc,&ccCapwapReassmTimeoutParams);
18320aeed3e9SJustin Hibbits }
1833*852ba100SJustin Hibbits
18340aeed3e9SJustin Hibbits else if (validate)
18350aeed3e9SJustin Hibbits {
1836*852ba100SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.hardwarePortId != p_Manip->capwapFragParams.hwPortId)
18370aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Reassembly manipulation previously was assigned to another port"));
1838*852ba100SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.numOfTasks != p_Manip->capwapFragParams.numOfTasks)
18390aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfTasks for this manipulation previously was defined by another value "));
18400aeed3e9SJustin Hibbits
18410aeed3e9SJustin Hibbits if (!(fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR))
18420aeed3e9SJustin Hibbits {
1843*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.prOffset != fmPortGetSetCcParams.getCcParams.prOffset)
18440aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Parse result offset previously was defined by another value "));
18450aeed3e9SJustin Hibbits }
18460aeed3e9SJustin Hibbits else
18470aeed3e9SJustin Hibbits {
1848*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.prOffset != 0xff)
18490aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Parse result offset previously was defined by another value "));
18500aeed3e9SJustin Hibbits }
1851*852ba100SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.dataOffset != p_Manip->capwapFragParams.dataOffset)
18520aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Data offset previously was defined by another value "));
18530aeed3e9SJustin Hibbits }
18540aeed3e9SJustin Hibbits
18550aeed3e9SJustin Hibbits return E_OK;
18560aeed3e9SJustin Hibbits }
1857*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
18580aeed3e9SJustin Hibbits
FmPcdRegisterReassmPort(t_Handle h_FmPcd,t_Handle h_ReasmCommonPramTbl)1859*852ba100SJustin Hibbits t_Error FmPcdRegisterReassmPort(t_Handle h_FmPcd, t_Handle h_ReasmCommonPramTbl)
18600aeed3e9SJustin Hibbits {
1861*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1862*852ba100SJustin Hibbits t_FmPcdCcReassmTimeoutParams ccReassmTimeoutParams = { 0 };
1863*852ba100SJustin Hibbits t_Error err = E_OK;
1864*852ba100SJustin Hibbits uint8_t result;
1865*852ba100SJustin Hibbits uint32_t bitFor1Micro, tsbs, log2num;
18660aeed3e9SJustin Hibbits
1867*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
1868*852ba100SJustin Hibbits ASSERT_COND(h_ReasmCommonPramTbl);
18690aeed3e9SJustin Hibbits
1870*852ba100SJustin Hibbits bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);
1871*852ba100SJustin Hibbits if (bitFor1Micro == 0)
1872*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Timestamp scale"));
18730aeed3e9SJustin Hibbits
1874*852ba100SJustin Hibbits bitFor1Micro = 32 - bitFor1Micro;
1875*852ba100SJustin Hibbits LOG2(FM_PCD_MANIP_REASM_TIMEOUT_THREAD_THRESH, log2num);
1876*852ba100SJustin Hibbits tsbs = bitFor1Micro - log2num;
18770aeed3e9SJustin Hibbits
1878*852ba100SJustin Hibbits ccReassmTimeoutParams.iprcpt = (uint32_t)(XX_VirtToPhys(
1879*852ba100SJustin Hibbits h_ReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);
1880*852ba100SJustin Hibbits ccReassmTimeoutParams.tsbs = (uint8_t)tsbs;
1881*852ba100SJustin Hibbits ccReassmTimeoutParams.activate = TRUE;
1882*852ba100SJustin Hibbits if ((err = FmHcPcdCcTimeoutReassm(p_FmPcd->h_Hc, &ccReassmTimeoutParams,
1883*852ba100SJustin Hibbits &result)) != E_OK)
18840aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
18850aeed3e9SJustin Hibbits
1886*852ba100SJustin Hibbits switch (result)
1887*852ba100SJustin Hibbits {
1888*852ba100SJustin Hibbits case (0):
1889*852ba100SJustin Hibbits return E_OK;
1890*852ba100SJustin Hibbits case (1):
1891*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("failed to allocate TNUM"));
1892*852ba100SJustin Hibbits case (2):
1893*852ba100SJustin Hibbits RETURN_ERROR(
1894*852ba100SJustin Hibbits MAJOR, E_NO_MEMORY,
1895*852ba100SJustin Hibbits ("failed to allocate internal buffer from the HC-Port"));
1896*852ba100SJustin Hibbits case (3):
1897*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE,
1898*852ba100SJustin Hibbits ("'Disable Timeout Task' with invalid IPRCPT"));
1899*852ba100SJustin Hibbits case (4):
1900*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_FULL, ("too many timeout tasks"));
1901*852ba100SJustin Hibbits case (5):
1902*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("invalid sub command"));
1903*852ba100SJustin Hibbits default:
1904*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
1905*852ba100SJustin Hibbits }
19060aeed3e9SJustin Hibbits return E_OK;
19070aeed3e9SJustin Hibbits }
19080aeed3e9SJustin Hibbits
CreateReassCommonTable(t_FmPcdManip * p_Manip)1909*852ba100SJustin Hibbits static t_Error CreateReassCommonTable(t_FmPcdManip *p_Manip)
19100aeed3e9SJustin Hibbits {
1911*852ba100SJustin Hibbits uint32_t tmpReg32 = 0, i, bitFor1Micro;
19120aeed3e9SJustin Hibbits uint64_t tmpReg64, size;
1913*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
1914*852ba100SJustin Hibbits t_Error err = E_OK;
19150aeed3e9SJustin Hibbits
1916*852ba100SJustin Hibbits bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);
1917*852ba100SJustin Hibbits if (bitFor1Micro == 0)
1918*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Timestamp scale"));
19190aeed3e9SJustin Hibbits
1920*852ba100SJustin Hibbits /* Allocation of the Reassembly Common Parameters table. This table is located in the
1921*852ba100SJustin Hibbits MURAM. Its size is 64 bytes and its base address should be 8-byte aligned. */
1922*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl =
1923*852ba100SJustin Hibbits (t_ReassCommonTbl *)FM_MURAM_AllocMem(
1924*852ba100SJustin Hibbits p_FmPcd->h_FmMuram,
1925*852ba100SJustin Hibbits FM_PCD_MANIP_REASM_COMMON_PARAM_TABLE_SIZE,
1926*852ba100SJustin Hibbits FM_PCD_MANIP_REASM_COMMON_PARAM_TABLE_ALIGN);
19270aeed3e9SJustin Hibbits
1928*852ba100SJustin Hibbits if (!p_Manip->reassmParams.p_ReassCommonTbl)
1929*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
1930*852ba100SJustin Hibbits ("MURAM alloc for Reassembly common parameters table"));
19310aeed3e9SJustin Hibbits
1932*852ba100SJustin Hibbits MemSet8(p_Manip->reassmParams.p_ReassCommonTbl, 0,
1933*852ba100SJustin Hibbits FM_PCD_MANIP_REASM_COMMON_PARAM_TABLE_SIZE);
19340aeed3e9SJustin Hibbits
1935*852ba100SJustin Hibbits /* Setting the TimeOut Mode.*/
19360aeed3e9SJustin Hibbits tmpReg32 = 0;
1937*852ba100SJustin Hibbits if (p_Manip->reassmParams.timeOutMode
1938*852ba100SJustin Hibbits == e_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES)
1939*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_REASM_TIME_OUT_BETWEEN_FRAMES;
19400aeed3e9SJustin Hibbits
1941*852ba100SJustin Hibbits /* Setting TimeOut FQID - Frames that time out are enqueued to this FQID.
1942*852ba100SJustin Hibbits In order to cause TimeOut frames to be discarded, this queue should be configured accordingly*/
1943*852ba100SJustin Hibbits tmpReg32 |= p_Manip->reassmParams.fqidForTimeOutFrames;
1944*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->timeoutModeAndFqid,
1945*852ba100SJustin Hibbits tmpReg32);
19460aeed3e9SJustin Hibbits
1947*852ba100SJustin Hibbits /* Calculation the size of IP Reassembly Frame Descriptor - number of frames that are allowed to be reassembled simultaneously + 129.*/
1948*852ba100SJustin Hibbits size = p_Manip->reassmParams.maxNumFramesInProcess + 129;
19490aeed3e9SJustin Hibbits
1950*852ba100SJustin Hibbits /*Allocation of IP Reassembly Frame Descriptor Indexes Pool - This pool resides in the MURAM */
1951*852ba100SJustin Hibbits p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr =
1952*852ba100SJustin Hibbits PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
19530aeed3e9SJustin Hibbits (uint32_t)(size * 2),
1954*852ba100SJustin Hibbits 256));
1955*852ba100SJustin Hibbits if (!p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr)
1956*852ba100SJustin Hibbits RETURN_ERROR(
1957*852ba100SJustin Hibbits MAJOR, E_NO_MEMORY,
1958*852ba100SJustin Hibbits ("MURAM alloc for Reassembly frame descriptor indexes pool"));
19590aeed3e9SJustin Hibbits
1960*852ba100SJustin Hibbits MemSet8(UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr),
1961*852ba100SJustin Hibbits 0, (uint32_t)(size * 2));
19620aeed3e9SJustin Hibbits
1963*852ba100SJustin Hibbits /* The entries in IP Reassembly Frame Descriptor Indexes Pool contains indexes starting with 1 up to
1964*852ba100SJustin Hibbits the maximum number of frames that are allowed to be reassembled simultaneously + 128.
1965*852ba100SJustin Hibbits The last entry in this pool must contain the index zero*/
1966*852ba100SJustin Hibbits for (i = 0; i < (size - 1); i++)
1967*852ba100SJustin Hibbits WRITE_UINT16(
1968*852ba100SJustin Hibbits *(uint16_t *)PTR_MOVE(UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr), (i<<1)),
1969*852ba100SJustin Hibbits (uint16_t)(i+1));
19700aeed3e9SJustin Hibbits
1971*852ba100SJustin Hibbits /* Sets the IP Reassembly Frame Descriptor Indexes Pool offset from MURAM */
1972*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(
1973*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr))
1974*852ba100SJustin Hibbits - p_FmPcd->physicalMuramBase);
1975*852ba100SJustin Hibbits WRITE_UINT32(
1976*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl->reassFrmDescIndexPoolTblPtr,
1977*852ba100SJustin Hibbits tmpReg32);
19780aeed3e9SJustin Hibbits
1979*852ba100SJustin Hibbits /* Allocation of the Reassembly Frame Descriptors Pool - This pool resides in external memory.
1980*852ba100SJustin Hibbits The number of entries in this pool should be equal to the number of entries in IP Reassembly Frame Descriptor Indexes Pool.*/
1981*852ba100SJustin Hibbits p_Manip->reassmParams.reassFrmDescrPoolTblAddr =
1982*852ba100SJustin Hibbits PTR_TO_UINT(XX_MallocSmart((uint32_t)(size * 64), p_Manip->reassmParams.dataMemId, 64));
19830aeed3e9SJustin Hibbits
1984*852ba100SJustin Hibbits if (!p_Manip->reassmParams.reassFrmDescrPoolTblAddr)
19850aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));
19860aeed3e9SJustin Hibbits
1987*852ba100SJustin Hibbits MemSet8(UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrPoolTblAddr), 0,
1988*852ba100SJustin Hibbits (uint32_t)(size * 64));
19890aeed3e9SJustin Hibbits
1990*852ba100SJustin Hibbits /* Sets the Reassembly Frame Descriptors Pool and liodn offset*/
1991*852ba100SJustin Hibbits tmpReg64 = (uint64_t)(XX_VirtToPhys(
1992*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrPoolTblAddr)));
1993*852ba100SJustin Hibbits tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset
1994*852ba100SJustin Hibbits & FM_PCD_MANIP_REASM_LIODN_MASK)
1995*852ba100SJustin Hibbits << (uint64_t)FM_PCD_MANIP_REASM_LIODN_SHIFT);
1996*852ba100SJustin Hibbits tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset
1997*852ba100SJustin Hibbits & FM_PCD_MANIP_REASM_ELIODN_MASK)
1998*852ba100SJustin Hibbits << (uint64_t)FM_PCD_MANIP_REASM_ELIODN_SHIFT);
1999*852ba100SJustin Hibbits WRITE_UINT32(
2000*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl->liodnAndReassFrmDescPoolPtrHi,
2001*852ba100SJustin Hibbits (uint32_t)(tmpReg64 >> 32));
2002*852ba100SJustin Hibbits WRITE_UINT32(
2003*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl->reassFrmDescPoolPtrLow,
2004*852ba100SJustin Hibbits (uint32_t)tmpReg64);
20050aeed3e9SJustin Hibbits
2006*852ba100SJustin Hibbits /*Allocation of the TimeOut table - This table resides in the MURAM.
2007*852ba100SJustin Hibbits The number of entries in this table is identical to the number of entries in the Reassembly Frame Descriptors Pool*/
2008*852ba100SJustin Hibbits p_Manip->reassmParams.timeOutTblAddr =
2009*852ba100SJustin Hibbits PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, (uint32_t)(size * 8),8));
20100aeed3e9SJustin Hibbits
2011*852ba100SJustin Hibbits if (!p_Manip->reassmParams.timeOutTblAddr)
2012*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
2013*852ba100SJustin Hibbits ("MURAM alloc for Reassembly timeout table"));
20140aeed3e9SJustin Hibbits
2015*852ba100SJustin Hibbits MemSet8(UINT_TO_PTR(p_Manip->reassmParams.timeOutTblAddr), 0,
2016*852ba100SJustin Hibbits (uint16_t)(size * 8));
20170aeed3e9SJustin Hibbits
2018*852ba100SJustin Hibbits /* Sets the TimeOut table offset from MURAM */
2019*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(
2020*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.timeOutTblAddr))
2021*852ba100SJustin Hibbits - p_FmPcd->physicalMuramBase);
2022*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->timeOutTblPtr,
2023*852ba100SJustin Hibbits tmpReg32);
20240aeed3e9SJustin Hibbits
2025*852ba100SJustin Hibbits /* Sets the Expiration Delay */
20260aeed3e9SJustin Hibbits tmpReg32 = 0;
2027*852ba100SJustin Hibbits tmpReg32 |= (((uint32_t)(1 << bitFor1Micro))
2028*852ba100SJustin Hibbits * p_Manip->reassmParams.timeoutThresholdForReassmProcess);
2029*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->expirationDelay,
2030*852ba100SJustin Hibbits tmpReg32);
20310aeed3e9SJustin Hibbits
2032*852ba100SJustin Hibbits err = FmPcdRegisterReassmPort(p_FmPcd,
2033*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl);
2034*852ba100SJustin Hibbits if (err != E_OK)
2035*852ba100SJustin Hibbits {
2036*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2037*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl);
2038*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, ("port registration"));
20390aeed3e9SJustin Hibbits }
20400aeed3e9SJustin Hibbits
2041*852ba100SJustin Hibbits return err;
2042*852ba100SJustin Hibbits }
2043*852ba100SJustin Hibbits
CreateReassTable(t_FmPcdManip * p_Manip,e_NetHeaderType hdr)2044*852ba100SJustin Hibbits static t_Error CreateReassTable(t_FmPcdManip *p_Manip, e_NetHeaderType hdr)
20450aeed3e9SJustin Hibbits {
20460aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = p_Manip->h_FmPcd;
20470aeed3e9SJustin Hibbits uint32_t tmpReg32, autoLearnHashTblSize;
2048*852ba100SJustin Hibbits uint32_t numOfWays, setSize, setSizeCode, keySize;
2049*852ba100SJustin Hibbits uint32_t waySize, numOfSets, numOfEntries;
20500aeed3e9SJustin Hibbits uint64_t tmpReg64;
2051*852ba100SJustin Hibbits uint16_t minFragSize;
2052*852ba100SJustin Hibbits uint16_t maxReassemSize;
2053*852ba100SJustin Hibbits uintptr_t *p_AutoLearnHashTblAddr, *p_AutoLearnSetLockTblAddr;
2054*852ba100SJustin Hibbits t_ReassTbl **p_ReassTbl;
20550aeed3e9SJustin Hibbits
2056*852ba100SJustin Hibbits switch (hdr)
2057*852ba100SJustin Hibbits {
2058*852ba100SJustin Hibbits case HEADER_TYPE_IPv4:
2059*852ba100SJustin Hibbits p_ReassTbl = &p_Manip->reassmParams.ip.p_Ipv4ReassTbl;
2060*852ba100SJustin Hibbits p_AutoLearnHashTblAddr =
2061*852ba100SJustin Hibbits &p_Manip->reassmParams.ip.ipv4AutoLearnHashTblAddr;
2062*852ba100SJustin Hibbits p_AutoLearnSetLockTblAddr =
2063*852ba100SJustin Hibbits &p_Manip->reassmParams.ip.ipv4AutoLearnSetLockTblAddr;
2064*852ba100SJustin Hibbits minFragSize = p_Manip->reassmParams.ip.minFragSize[0];
2065*852ba100SJustin Hibbits maxReassemSize = 0;
2066*852ba100SJustin Hibbits numOfWays = p_Manip->reassmParams.ip.numOfFramesPerHashEntry[0];
2067*852ba100SJustin Hibbits keySize = 4 + 4 + 1 + 2; /* 3-tuple + IP-Id */
2068*852ba100SJustin Hibbits break;
2069*852ba100SJustin Hibbits case HEADER_TYPE_IPv6:
2070*852ba100SJustin Hibbits p_ReassTbl = &p_Manip->reassmParams.ip.p_Ipv6ReassTbl;
2071*852ba100SJustin Hibbits p_AutoLearnHashTblAddr =
2072*852ba100SJustin Hibbits &p_Manip->reassmParams.ip.ipv6AutoLearnHashTblAddr;
2073*852ba100SJustin Hibbits p_AutoLearnSetLockTblAddr =
2074*852ba100SJustin Hibbits &p_Manip->reassmParams.ip.ipv6AutoLearnSetLockTblAddr;
2075*852ba100SJustin Hibbits minFragSize = p_Manip->reassmParams.ip.minFragSize[1];
2076*852ba100SJustin Hibbits maxReassemSize = 0;
2077*852ba100SJustin Hibbits numOfWays = p_Manip->reassmParams.ip.numOfFramesPerHashEntry[1];
2078*852ba100SJustin Hibbits keySize = 16 + 16 + 4; /* 2-tuple + IP-Id */
2079*852ba100SJustin Hibbits if (numOfWays > e_FM_PCD_MANIP_SIX_WAYS_HASH)
2080*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("num of ways"));
2081*852ba100SJustin Hibbits break;
2082*852ba100SJustin Hibbits case HEADER_TYPE_CAPWAP:
2083*852ba100SJustin Hibbits p_ReassTbl = &p_Manip->reassmParams.capwap.p_ReassTbl;
2084*852ba100SJustin Hibbits p_AutoLearnHashTblAddr =
2085*852ba100SJustin Hibbits &p_Manip->reassmParams.capwap.autoLearnHashTblAddr;
2086*852ba100SJustin Hibbits p_AutoLearnSetLockTblAddr =
2087*852ba100SJustin Hibbits &p_Manip->reassmParams.capwap.autoLearnSetLockTblAddr;
2088*852ba100SJustin Hibbits minFragSize = 0;
2089*852ba100SJustin Hibbits maxReassemSize = p_Manip->reassmParams.capwap.maxRessembledsSize;
2090*852ba100SJustin Hibbits numOfWays = p_Manip->reassmParams.capwap.numOfFramesPerHashEntry;
2091*852ba100SJustin Hibbits keySize = 4;
2092*852ba100SJustin Hibbits break;
2093*852ba100SJustin Hibbits default:
2094*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("header type"));
2095*852ba100SJustin Hibbits }
2096*852ba100SJustin Hibbits keySize += 2; /* 2 bytes reserved for RFDIndex */
2097*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2098*852ba100SJustin Hibbits keySize += 2; /* 2 bytes reserved */
2099*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2100*852ba100SJustin Hibbits waySize = ROUND_UP(keySize, 8);
21010aeed3e9SJustin Hibbits
2102*852ba100SJustin Hibbits /* Allocates the Reassembly Parameters Table - This table is located in the MURAM.*/
2103*852ba100SJustin Hibbits *p_ReassTbl = (t_ReassTbl *)FM_MURAM_AllocMem(
2104*852ba100SJustin Hibbits p_FmPcd->h_FmMuram, FM_PCD_MANIP_REASM_TABLE_SIZE,
2105*852ba100SJustin Hibbits FM_PCD_MANIP_REASM_TABLE_ALIGN);
2106*852ba100SJustin Hibbits if (!*p_ReassTbl)
2107*852ba100SJustin Hibbits RETURN_ERROR( MAJOR, E_NO_MEMORY,
2108*852ba100SJustin Hibbits ("MURAM alloc for Reassembly specific parameters table"));
2109*852ba100SJustin Hibbits memset(*p_ReassTbl, 0, sizeof(t_ReassTbl));
21100aeed3e9SJustin Hibbits
2111*852ba100SJustin Hibbits /* Sets the Reassembly common Parameters table offset from MURAM in the Reassembly Table descriptor*/
2112*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->reassmParams.p_ReassCommonTbl)
2113*852ba100SJustin Hibbits - p_FmPcd->physicalMuramBase);
2114*852ba100SJustin Hibbits WRITE_UINT32((*p_ReassTbl)->reassCommonPrmTblPtr, tmpReg32);
21150aeed3e9SJustin Hibbits
2116*852ba100SJustin Hibbits /* Calculate set size (set size is rounded-up to next power of 2) */
2117*852ba100SJustin Hibbits NEXT_POWER_OF_2(numOfWays * waySize, setSize);
21180aeed3e9SJustin Hibbits
2119*852ba100SJustin Hibbits /* Get set size code */
2120*852ba100SJustin Hibbits LOG2(setSize, setSizeCode);
21210aeed3e9SJustin Hibbits
2122*852ba100SJustin Hibbits /* Sets ways number and set size code */
2123*852ba100SJustin Hibbits WRITE_UINT16((*p_ReassTbl)->waysNumAndSetSize,
2124*852ba100SJustin Hibbits (uint16_t)((numOfWays << 8) | setSizeCode));
21250aeed3e9SJustin Hibbits
21260aeed3e9SJustin Hibbits /* It is recommended that the total number of entries in this table
21270aeed3e9SJustin Hibbits (number of sets * number of ways) will be twice the number of frames that
21280aeed3e9SJustin Hibbits are expected to be reassembled simultaneously.*/
2129*852ba100SJustin Hibbits numOfEntries = (uint32_t)(p_Manip->reassmParams.maxNumFramesInProcess * 2);
21300aeed3e9SJustin Hibbits
21310aeed3e9SJustin Hibbits /* sets number calculation - number of entries = number of sets * number of ways */
21320aeed3e9SJustin Hibbits numOfSets = numOfEntries / numOfWays;
21330aeed3e9SJustin Hibbits
2134*852ba100SJustin Hibbits /* Sets AutoLearnHashKeyMask*/
2135*852ba100SJustin Hibbits NEXT_POWER_OF_2(numOfSets, numOfSets);
21360aeed3e9SJustin Hibbits
2137*852ba100SJustin Hibbits WRITE_UINT16((*p_ReassTbl)->autoLearnHashKeyMask,
2138*852ba100SJustin Hibbits (uint16_t)(numOfSets - 1));
21390aeed3e9SJustin Hibbits
2140*852ba100SJustin Hibbits /* Allocation of Reassembly Automatic Learning Hash Table - This table resides in external memory.
2141*852ba100SJustin Hibbits The size of this table is determined by the number of sets and the set size.
21420aeed3e9SJustin Hibbits Table size = set size * number of sets
2143*852ba100SJustin Hibbits This table base address should be aligned to SetSize.*/
21440aeed3e9SJustin Hibbits autoLearnHashTblSize = numOfSets * setSize;
21450aeed3e9SJustin Hibbits
2146*852ba100SJustin Hibbits *p_AutoLearnHashTblAddr =
2147*852ba100SJustin Hibbits PTR_TO_UINT(XX_MallocSmart(autoLearnHashTblSize, p_Manip->reassmParams.dataMemId, setSize));
2148*852ba100SJustin Hibbits if (!*p_AutoLearnHashTblAddr)
2149*852ba100SJustin Hibbits {
2150*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, *p_ReassTbl);
2151*852ba100SJustin Hibbits *p_ReassTbl = NULL;
21520aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));
2153*852ba100SJustin Hibbits }
2154*852ba100SJustin Hibbits MemSet8(UINT_TO_PTR(*p_AutoLearnHashTblAddr), 0, autoLearnHashTblSize);
21550aeed3e9SJustin Hibbits
2156*852ba100SJustin Hibbits /* Sets the Reassembly Automatic Learning Hash Table and liodn offset */
2157*852ba100SJustin Hibbits tmpReg64 = ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset
2158*852ba100SJustin Hibbits & FM_PCD_MANIP_REASM_LIODN_MASK)
2159*852ba100SJustin Hibbits << (uint64_t)FM_PCD_MANIP_REASM_LIODN_SHIFT);
2160*852ba100SJustin Hibbits tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset
2161*852ba100SJustin Hibbits & FM_PCD_MANIP_REASM_ELIODN_MASK)
2162*852ba100SJustin Hibbits << (uint64_t)FM_PCD_MANIP_REASM_ELIODN_SHIFT);
2163*852ba100SJustin Hibbits tmpReg64 |= XX_VirtToPhys(UINT_TO_PTR(*p_AutoLearnHashTblAddr));
2164*852ba100SJustin Hibbits WRITE_UINT32( (*p_ReassTbl)->liodnAlAndAutoLearnHashTblPtrHi,
2165*852ba100SJustin Hibbits (uint32_t)(tmpReg64 >> 32));
2166*852ba100SJustin Hibbits WRITE_UINT32((*p_ReassTbl)->autoLearnHashTblPtrLow, (uint32_t)tmpReg64);
21670aeed3e9SJustin Hibbits
2168*852ba100SJustin Hibbits /* Allocation of the Set Lock table - This table resides in external memory
2169*852ba100SJustin Hibbits The size of this table is (number of sets in the Reassembly Automatic Learning Hash table)*4 bytes.
2170*852ba100SJustin Hibbits This table resides in external memory and its base address should be 4-byte aligned */
2171*852ba100SJustin Hibbits *p_AutoLearnSetLockTblAddr =
2172*852ba100SJustin Hibbits PTR_TO_UINT(XX_MallocSmart((uint32_t)(numOfSets * 4), p_Manip->reassmParams.dataMemId, 4));
2173*852ba100SJustin Hibbits if (!*p_AutoLearnSetLockTblAddr)
2174*852ba100SJustin Hibbits {
2175*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, *p_ReassTbl);
2176*852ba100SJustin Hibbits *p_ReassTbl = NULL;
2177*852ba100SJustin Hibbits XX_FreeSmart(UINT_TO_PTR(*p_AutoLearnHashTblAddr));
2178*852ba100SJustin Hibbits *p_AutoLearnHashTblAddr = 0;
21790aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));
2180*852ba100SJustin Hibbits }
2181*852ba100SJustin Hibbits MemSet8(UINT_TO_PTR(*p_AutoLearnSetLockTblAddr), 0, (numOfSets * 4));
21820aeed3e9SJustin Hibbits
2183*852ba100SJustin Hibbits /* sets Set Lock table pointer and liodn offset*/
2184*852ba100SJustin Hibbits tmpReg64 = ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset
2185*852ba100SJustin Hibbits & FM_PCD_MANIP_REASM_LIODN_MASK)
2186*852ba100SJustin Hibbits << (uint64_t)FM_PCD_MANIP_REASM_LIODN_SHIFT);
2187*852ba100SJustin Hibbits tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset
2188*852ba100SJustin Hibbits & FM_PCD_MANIP_REASM_ELIODN_MASK)
2189*852ba100SJustin Hibbits << (uint64_t)FM_PCD_MANIP_REASM_ELIODN_SHIFT);
2190*852ba100SJustin Hibbits tmpReg64 |= XX_VirtToPhys(UINT_TO_PTR(*p_AutoLearnSetLockTblAddr));
2191*852ba100SJustin Hibbits WRITE_UINT32( (*p_ReassTbl)->liodnSlAndAutoLearnSetLockTblPtrHi,
2192*852ba100SJustin Hibbits (uint32_t)(tmpReg64 >> 32));
2193*852ba100SJustin Hibbits WRITE_UINT32((*p_ReassTbl)->autoLearnSetLockTblPtrLow, (uint32_t)tmpReg64);
21940aeed3e9SJustin Hibbits
2195*852ba100SJustin Hibbits /* Sets user's requested minimum fragment size (in Bytes) for First/Middle fragment */
2196*852ba100SJustin Hibbits WRITE_UINT16((*p_ReassTbl)->minFragSize, minFragSize);
21970aeed3e9SJustin Hibbits
2198*852ba100SJustin Hibbits WRITE_UINT16((*p_ReassTbl)->maxReassemblySize, maxReassemSize);
21990aeed3e9SJustin Hibbits
22000aeed3e9SJustin Hibbits return E_OK;
22010aeed3e9SJustin Hibbits }
22020aeed3e9SJustin Hibbits
UpdateInitReasm(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate)2203*852ba100SJustin Hibbits static t_Error UpdateInitReasm(t_Handle h_FmPcd, t_Handle h_PcdParams,
2204*852ba100SJustin Hibbits t_Handle h_FmPort, t_FmPcdManip *p_Manip,
2205*852ba100SJustin Hibbits t_Handle h_Ad, bool validate)
22060aeed3e9SJustin Hibbits {
22070aeed3e9SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
22080aeed3e9SJustin Hibbits uint32_t tmpReg32;
22090aeed3e9SJustin Hibbits t_Error err;
2210*852ba100SJustin Hibbits t_FmPortPcdParams *p_PcdParams = (t_FmPortPcdParams *)h_PcdParams;
2211*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2212*852ba100SJustin Hibbits t_FmPcdCtrlParamsPage *p_ParamsPage;
2213*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
22140aeed3e9SJustin Hibbits
22150aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
22160aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Manip->frag, E_INVALID_HANDLE);
2217*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
2218*852ba100SJustin Hibbits (p_Manip->opcode == HMAN_OC_IP_REASSEMBLY) || (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY),
2219*852ba100SJustin Hibbits E_INVALID_STATE);
22200aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
2221*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Manip->updateParams || h_PcdParams,
2222*852ba100SJustin Hibbits E_INVALID_HANDLE);
22230aeed3e9SJustin Hibbits
22240aeed3e9SJustin Hibbits UNUSED(h_Ad);
22250aeed3e9SJustin Hibbits
2226*852ba100SJustin Hibbits if (!p_Manip->updateParams)
2227*852ba100SJustin Hibbits return E_OK;
2228*852ba100SJustin Hibbits
22290aeed3e9SJustin Hibbits if (p_Manip->h_FmPcd != h_FmPcd)
2230*852ba100SJustin Hibbits RETURN_ERROR(
2231*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
2232*852ba100SJustin Hibbits ("handler of PCD previously was initiated by different value"));
22330aeed3e9SJustin Hibbits
22340aeed3e9SJustin Hibbits if (p_Manip->updateParams)
22350aeed3e9SJustin Hibbits {
2236*852ba100SJustin Hibbits if ((!(p_Manip->updateParams
2237*852ba100SJustin Hibbits & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK)))
2238*852ba100SJustin Hibbits || ((p_Manip->shadowUpdateParams
2239*852ba100SJustin Hibbits & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK))))
2240*852ba100SJustin Hibbits RETURN_ERROR(
2241*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
2242*852ba100SJustin Hibbits ("in this stage parameters from Port has not be updated"));
22430aeed3e9SJustin Hibbits
2244*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = 0;
2245*852ba100SJustin Hibbits if (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY)
2246*852ba100SJustin Hibbits {
2247*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.type |= UPDATE_OFP_DPTE;
2248*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.ofpDpde = 0xF;
2249*852ba100SJustin Hibbits }
2250*852ba100SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams | FM_REV;
2251*852ba100SJustin Hibbits if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams))
2252*852ba100SJustin Hibbits != E_OK)
22530aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2254*852ba100SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.type
2255*852ba100SJustin Hibbits & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK | FM_REV))
2256*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
2257*852ba100SJustin Hibbits ("offset of the data wasn't configured previously"));
2258*852ba100SJustin Hibbits if (p_Manip->updateParams
2259*852ba100SJustin Hibbits & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK))
22600aeed3e9SJustin Hibbits {
2261*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2262*852ba100SJustin Hibbits uint8_t *p_Ptr, i, totalNumOfTnums;
22630aeed3e9SJustin Hibbits
2264*852ba100SJustin Hibbits totalNumOfTnums =
2265*852ba100SJustin Hibbits (uint8_t)(fmPortGetSetCcParams.getCcParams.numOfTasks
2266*852ba100SJustin Hibbits + fmPortGetSetCcParams.getCcParams.numOfExtraTasks);
2267*852ba100SJustin Hibbits
2268*852ba100SJustin Hibbits p_Manip->reassmParams.internalBufferPoolAddr =
2269*852ba100SJustin Hibbits PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
2270*852ba100SJustin Hibbits (uint32_t)(totalNumOfTnums * BMI_FIFO_UNITS),
2271*852ba100SJustin Hibbits BMI_FIFO_UNITS));
2272*852ba100SJustin Hibbits if (!p_Manip->reassmParams.internalBufferPoolAddr)
2273*852ba100SJustin Hibbits RETURN_ERROR(
2274*852ba100SJustin Hibbits MAJOR, E_NO_MEMORY,
2275*852ba100SJustin Hibbits ("MURAM alloc for Reassembly internal buffers pool"));
2276*852ba100SJustin Hibbits MemSet8(
2277*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolAddr),
2278*852ba100SJustin Hibbits 0, (uint32_t)(totalNumOfTnums * BMI_FIFO_UNITS));
2279*852ba100SJustin Hibbits
2280*852ba100SJustin Hibbits p_Manip->reassmParams.internalBufferPoolManagementIndexAddr =
2281*852ba100SJustin Hibbits PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
2282*852ba100SJustin Hibbits (uint32_t)(5 + totalNumOfTnums),
2283*852ba100SJustin Hibbits 4));
2284*852ba100SJustin Hibbits if (!p_Manip->reassmParams.internalBufferPoolManagementIndexAddr)
2285*852ba100SJustin Hibbits RETURN_ERROR(
2286*852ba100SJustin Hibbits MAJOR,
2287*852ba100SJustin Hibbits E_NO_MEMORY,
2288*852ba100SJustin Hibbits ("MURAM alloc for Reassembly internal buffers management"));
2289*852ba100SJustin Hibbits
2290*852ba100SJustin Hibbits p_Ptr =
2291*852ba100SJustin Hibbits (uint8_t*)UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolManagementIndexAddr);
2292*852ba100SJustin Hibbits WRITE_UINT32(
2293*852ba100SJustin Hibbits *(uint32_t*)p_Ptr,
2294*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolAddr)) - p_FmPcd->physicalMuramBase));
2295*852ba100SJustin Hibbits for (i = 0, p_Ptr += 4; i < totalNumOfTnums; i++, p_Ptr++)
2296*852ba100SJustin Hibbits WRITE_UINT8(*p_Ptr, i);
2297*852ba100SJustin Hibbits WRITE_UINT8(*p_Ptr, 0xFF);
2298*852ba100SJustin Hibbits
2299*852ba100SJustin Hibbits tmpReg32 =
2300*852ba100SJustin Hibbits (4 << FM_PCD_MANIP_REASM_COMMON_INT_BUFFER_IDX_SHIFT)
2301*852ba100SJustin Hibbits | ((uint32_t)(XX_VirtToPhys(
2302*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolManagementIndexAddr))
2303*852ba100SJustin Hibbits - p_FmPcd->physicalMuramBase));
2304*852ba100SJustin Hibbits WRITE_UINT32(
2305*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl->internalBufferManagement,
2306*852ba100SJustin Hibbits tmpReg32);
2307*852ba100SJustin Hibbits
2308*852ba100SJustin Hibbits p_Manip->updateParams &= ~(NUM_OF_TASKS | NUM_OF_EXTRA_TASKS
2309*852ba100SJustin Hibbits | DISCARD_MASK);
2310*852ba100SJustin Hibbits p_Manip->shadowUpdateParams |= (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS
2311*852ba100SJustin Hibbits | DISCARD_MASK);
2312*852ba100SJustin Hibbits }
23130aeed3e9SJustin Hibbits }
23140aeed3e9SJustin Hibbits
2315*852ba100SJustin Hibbits if (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY)
23160aeed3e9SJustin Hibbits {
2317*852ba100SJustin Hibbits if (p_Manip->reassmParams.capwap.h_Scheme)
23180aeed3e9SJustin Hibbits {
2319*852ba100SJustin Hibbits p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] =
2320*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.h_Scheme;
2321*852ba100SJustin Hibbits p_PcdParams->p_KgParams->numOfSchemes++;
23220aeed3e9SJustin Hibbits }
23230aeed3e9SJustin Hibbits
23240aeed3e9SJustin Hibbits }
23250aeed3e9SJustin Hibbits else
23260aeed3e9SJustin Hibbits {
2327*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv4Scheme)
23280aeed3e9SJustin Hibbits {
2329*852ba100SJustin Hibbits p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] =
2330*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv4Scheme;
2331*852ba100SJustin Hibbits p_PcdParams->p_KgParams->numOfSchemes++;
2332*852ba100SJustin Hibbits }
2333*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv6Scheme)
23340aeed3e9SJustin Hibbits {
2335*852ba100SJustin Hibbits p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] =
2336*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv6Scheme;
2337*852ba100SJustin Hibbits p_PcdParams->p_KgParams->numOfSchemes++;
23380aeed3e9SJustin Hibbits }
2339*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2340*852ba100SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.revInfo.majorRev >= 6)
23410aeed3e9SJustin Hibbits {
2342*852ba100SJustin Hibbits if ((err = FmPortSetGprFunc(h_FmPort, e_FM_PORT_GPR_MURAM_PAGE,
2343*852ba100SJustin Hibbits (void**)&p_ParamsPage)) != E_OK)
2344*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
23450aeed3e9SJustin Hibbits
2346*852ba100SJustin Hibbits tmpReg32 = NIA_ENG_KG;
2347*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv4Scheme)
2348*852ba100SJustin Hibbits {
2349*852ba100SJustin Hibbits tmpReg32 |= NIA_KG_DIRECT;
2350*852ba100SJustin Hibbits tmpReg32 |= NIA_KG_CC_EN;
2351*852ba100SJustin Hibbits tmpReg32 |= FmPcdKgGetSchemeId(
2352*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv4Scheme);
2353*852ba100SJustin Hibbits WRITE_UINT32(p_ParamsPage->iprIpv4Nia, tmpReg32);
2354*852ba100SJustin Hibbits }
2355*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv6Scheme)
2356*852ba100SJustin Hibbits {
2357*852ba100SJustin Hibbits tmpReg32 &= ~NIA_AC_MASK;
2358*852ba100SJustin Hibbits tmpReg32 |= NIA_KG_DIRECT;
2359*852ba100SJustin Hibbits tmpReg32 |= NIA_KG_CC_EN;
2360*852ba100SJustin Hibbits tmpReg32 |= FmPcdKgGetSchemeId(
2361*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv6Scheme);
2362*852ba100SJustin Hibbits WRITE_UINT32(p_ParamsPage->iprIpv6Nia, tmpReg32);
23630aeed3e9SJustin Hibbits }
23640aeed3e9SJustin Hibbits }
2365*852ba100SJustin Hibbits #else
2366*852ba100SJustin Hibbits if (fmPortGetSetCcParams.getCcParams.revInfo.majorRev < 6)
2367*852ba100SJustin Hibbits {
2368*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->discardMask,
2369*852ba100SJustin Hibbits fmPortGetSetCcParams.getCcParams.discardMask);
2370*852ba100SJustin Hibbits }
2371*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2372*852ba100SJustin Hibbits }
2373*852ba100SJustin Hibbits return E_OK;
2374*852ba100SJustin Hibbits }
2375*852ba100SJustin Hibbits
2376*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
FmPcdFragHcScratchPoolFill(t_Handle h_FmPcd,uint8_t scratchBpid)2377*852ba100SJustin Hibbits static t_Error FmPcdFragHcScratchPoolFill(t_Handle h_FmPcd, uint8_t scratchBpid)
2378*852ba100SJustin Hibbits {
2379*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2380*852ba100SJustin Hibbits t_FmPcdCcFragScratchPoolCmdParams fmPcdCcFragScratchPoolCmdParams;
2381*852ba100SJustin Hibbits t_Error err;
2382*852ba100SJustin Hibbits
2383*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2384*852ba100SJustin Hibbits
2385*852ba100SJustin Hibbits memset(&fmPcdCcFragScratchPoolCmdParams, 0, sizeof(t_FmPcdCcFragScratchPoolCmdParams));
2386*852ba100SJustin Hibbits
2387*852ba100SJustin Hibbits fmPcdCcFragScratchPoolCmdParams.numOfBuffers = NUM_OF_SCRATCH_POOL_BUFFERS;
2388*852ba100SJustin Hibbits fmPcdCcFragScratchPoolCmdParams.bufferPoolId = scratchBpid;
2389*852ba100SJustin Hibbits if ((err = FmHcPcdCcIpFragScratchPollCmd(p_FmPcd->h_Hc, TRUE, &fmPcdCcFragScratchPoolCmdParams)) != E_OK)
2390*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2391*852ba100SJustin Hibbits
2392*852ba100SJustin Hibbits if (fmPcdCcFragScratchPoolCmdParams.numOfBuffers != 0)
2393*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Fill scratch pool failed,"
2394*852ba100SJustin Hibbits "Failed to release %d buffers to the BM (missing FBPRs)",
2395*852ba100SJustin Hibbits fmPcdCcFragScratchPoolCmdParams.numOfBuffers));
23960aeed3e9SJustin Hibbits
23970aeed3e9SJustin Hibbits return E_OK;
23980aeed3e9SJustin Hibbits }
2399*852ba100SJustin Hibbits
FmPcdFragHcScratchPoolEmpty(t_Handle h_FmPcd,uint8_t scratchBpid)2400*852ba100SJustin Hibbits static t_Error FmPcdFragHcScratchPoolEmpty(t_Handle h_FmPcd, uint8_t scratchBpid)
2401*852ba100SJustin Hibbits {
2402*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2403*852ba100SJustin Hibbits t_FmPcdCcFragScratchPoolCmdParams fmPcdCcFragScratchPoolCmdParams;
2404*852ba100SJustin Hibbits t_Error err;
2405*852ba100SJustin Hibbits
2406*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2407*852ba100SJustin Hibbits
2408*852ba100SJustin Hibbits memset(&fmPcdCcFragScratchPoolCmdParams, 0, sizeof(t_FmPcdCcFragScratchPoolCmdParams));
2409*852ba100SJustin Hibbits
2410*852ba100SJustin Hibbits fmPcdCcFragScratchPoolCmdParams.bufferPoolId = scratchBpid;
2411*852ba100SJustin Hibbits if ((err = FmHcPcdCcIpFragScratchPollCmd(p_FmPcd->h_Hc, FALSE, &fmPcdCcFragScratchPoolCmdParams)) != E_OK)
2412*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2413*852ba100SJustin Hibbits
2414*852ba100SJustin Hibbits return E_OK;
2415*852ba100SJustin Hibbits }
2416*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
24170aeed3e9SJustin Hibbits
ReleaseManipHandler(t_FmPcdManip * p_Manip,t_FmPcd * p_FmPcd)24180aeed3e9SJustin Hibbits static void ReleaseManipHandler(t_FmPcdManip *p_Manip, t_FmPcd *p_FmPcd)
24190aeed3e9SJustin Hibbits {
24200aeed3e9SJustin Hibbits if (p_Manip->h_Ad)
24210aeed3e9SJustin Hibbits {
24220aeed3e9SJustin Hibbits if (p_Manip->muramAllocate)
24230aeed3e9SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->h_Ad);
24240aeed3e9SJustin Hibbits else
24250aeed3e9SJustin Hibbits XX_Free(p_Manip->h_Ad);
24260aeed3e9SJustin Hibbits p_Manip->h_Ad = NULL;
24270aeed3e9SJustin Hibbits }
24280aeed3e9SJustin Hibbits if (p_Manip->p_Template)
24290aeed3e9SJustin Hibbits {
24300aeed3e9SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->p_Template);
24310aeed3e9SJustin Hibbits p_Manip->p_Template = NULL;
24320aeed3e9SJustin Hibbits }
2433*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
24340aeed3e9SJustin Hibbits if (p_Manip->h_Frag)
24350aeed3e9SJustin Hibbits {
2436*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.p_AutoLearnHashTbl)
2437*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2438*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_AutoLearnHashTbl);
2439*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl)
2440*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2441*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl);
2442*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl)
2443*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2444*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl);
2445*852ba100SJustin Hibbits if (p_Manip->capwapFragParams.p_TimeOutTbl)
2446*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2447*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_TimeOutTbl);
24480aeed3e9SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->h_Frag);
24490aeed3e9SJustin Hibbits
24500aeed3e9SJustin Hibbits }
2451*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
2452*852ba100SJustin Hibbits if (p_Manip->frag)
24530aeed3e9SJustin Hibbits {
2454*852ba100SJustin Hibbits if (p_Manip->fragParams.p_Frag)
2455*852ba100SJustin Hibbits {
2456*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
2457*852ba100SJustin Hibbits FmPcdFragHcScratchPoolEmpty((t_Handle)p_FmPcd, p_Manip->fragParams.scratchBpid);
2458*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
2459*852ba100SJustin Hibbits
2460*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_Frag);
24610aeed3e9SJustin Hibbits }
2462*852ba100SJustin Hibbits }
2463*852ba100SJustin Hibbits else
24640aeed3e9SJustin Hibbits if (p_Manip->reassm)
24650aeed3e9SJustin Hibbits {
2466*852ba100SJustin Hibbits FmPcdUnregisterReassmPort(p_FmPcd,
2467*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl);
2468*852ba100SJustin Hibbits
2469*852ba100SJustin Hibbits if (p_Manip->reassmParams.timeOutTblAddr)
2470*852ba100SJustin Hibbits FM_MURAM_FreeMem(
2471*852ba100SJustin Hibbits p_FmPcd->h_FmMuram,
2472*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.timeOutTblAddr));
2473*852ba100SJustin Hibbits if (p_Manip->reassmParams.reassFrmDescrPoolTblAddr)
2474*852ba100SJustin Hibbits XX_FreeSmart(
2475*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrPoolTblAddr));
2476*852ba100SJustin Hibbits if (p_Manip->reassmParams.p_ReassCommonTbl)
2477*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2478*852ba100SJustin Hibbits p_Manip->reassmParams.p_ReassCommonTbl);
2479*852ba100SJustin Hibbits if (p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr)
2480*852ba100SJustin Hibbits FM_MURAM_FreeMem(
2481*852ba100SJustin Hibbits p_FmPcd->h_FmMuram,
2482*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr));
2483*852ba100SJustin Hibbits if (p_Manip->reassmParams.internalBufferPoolManagementIndexAddr)
2484*852ba100SJustin Hibbits FM_MURAM_FreeMem(
2485*852ba100SJustin Hibbits p_FmPcd->h_FmMuram,
2486*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolManagementIndexAddr));
2487*852ba100SJustin Hibbits if (p_Manip->reassmParams.internalBufferPoolAddr)
2488*852ba100SJustin Hibbits FM_MURAM_FreeMem(
2489*852ba100SJustin Hibbits p_FmPcd->h_FmMuram,
2490*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolAddr));
2491*852ba100SJustin Hibbits if (p_Manip->reassmParams.hdr == HEADER_TYPE_CAPWAP)
2492*852ba100SJustin Hibbits {
2493*852ba100SJustin Hibbits
24940aeed3e9SJustin Hibbits }
2495*852ba100SJustin Hibbits else
2496*852ba100SJustin Hibbits {
2497*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.ipv4AutoLearnHashTblAddr)
2498*852ba100SJustin Hibbits XX_FreeSmart(
2499*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.ip.ipv4AutoLearnHashTblAddr));
2500*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.ipv6AutoLearnHashTblAddr)
2501*852ba100SJustin Hibbits XX_FreeSmart(
2502*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.ip.ipv6AutoLearnHashTblAddr));
2503*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.ipv4AutoLearnSetLockTblAddr)
2504*852ba100SJustin Hibbits XX_FreeSmart(
2505*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.ip.ipv4AutoLearnSetLockTblAddr));
2506*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.ipv6AutoLearnSetLockTblAddr)
2507*852ba100SJustin Hibbits XX_FreeSmart(
2508*852ba100SJustin Hibbits UINT_TO_PTR(p_Manip->reassmParams.ip.ipv6AutoLearnSetLockTblAddr));
2509*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.p_Ipv4ReassTbl)
2510*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2511*852ba100SJustin Hibbits p_Manip->reassmParams.ip.p_Ipv4ReassTbl);
2512*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.p_Ipv6ReassTbl)
2513*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,
2514*852ba100SJustin Hibbits p_Manip->reassmParams.ip.p_Ipv6ReassTbl);
2515*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv6Ad)
2516*852ba100SJustin Hibbits XX_FreeSmart(p_Manip->reassmParams.ip.h_Ipv6Ad);
2517*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv4Ad)
2518*852ba100SJustin Hibbits XX_FreeSmart(p_Manip->reassmParams.ip.h_Ipv4Ad);
2519*852ba100SJustin Hibbits }
2520*852ba100SJustin Hibbits }
2521*852ba100SJustin Hibbits
25220aeed3e9SJustin Hibbits if (p_Manip->p_StatsTbl)
25230aeed3e9SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->p_StatsTbl);
25240aeed3e9SJustin Hibbits }
25250aeed3e9SJustin Hibbits
2526*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
CheckManipParamsAndSetType(t_FmPcdManip * p_Manip,t_FmPcdManipParams * p_ManipParams)25270aeed3e9SJustin Hibbits static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_ManipParams)
25280aeed3e9SJustin Hibbits {
2529*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.rmv)
25300aeed3e9SJustin Hibbits {
2531*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.rmvParams.type)
25320aeed3e9SJustin Hibbits {
2533*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR):
2534*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.type)
25350aeed3e9SJustin Hibbits {
2536*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START) :
2537*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.include)
2538*852ba100SJustin Hibbits {
2539*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.hdrInfo.hdr)
25400aeed3e9SJustin Hibbits {
25410aeed3e9SJustin Hibbits case (HEADER_TYPE_CAPWAP_DTLS) :
2542*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;
25430aeed3e9SJustin Hibbits p_Manip->muramAllocate = TRUE;
2544*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.insrt)
25450aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for CAPWAP_DTLS_HDR remove can not be insrt manipualtion after"));
25460aeed3e9SJustin Hibbits if (p_ManipParams->fragOrReasm)
25470aeed3e9SJustin Hibbits {
25480aeed3e9SJustin Hibbits if (!p_ManipParams->fragOrReasmParams.frag)
25490aeed3e9SJustin Hibbits {
25500aeed3e9SJustin Hibbits switch (p_ManipParams->fragOrReasmParams.hdr)
25510aeed3e9SJustin Hibbits {
25520aeed3e9SJustin Hibbits case (HEADER_TYPE_CAPWAP):
2553*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_REASSEMBLY;
25540aeed3e9SJustin Hibbits break;
25550aeed3e9SJustin Hibbits default:
25560aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("unsupported header for Reassembly"));
25570aeed3e9SJustin Hibbits }
25580aeed3e9SJustin Hibbits }
25590aeed3e9SJustin Hibbits else
25600aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for this type of manipulation frag can not be TRUE"));
25610aeed3e9SJustin Hibbits }
25620aeed3e9SJustin Hibbits break;
25630aeed3e9SJustin Hibbits default:
25640aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("non valid net header of remove location"));
25650aeed3e9SJustin Hibbits }
25660aeed3e9SJustin Hibbits }
2567*852ba100SJustin Hibbits else
2568*852ba100SJustin Hibbits {
2569*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.hdrInfo.hdr)
2570*852ba100SJustin Hibbits {
2571*852ba100SJustin Hibbits case (HEADER_TYPE_CAPWAP_DTLS) :
2572*852ba100SJustin Hibbits case (HEADER_TYPE_CAPWAP) :
2573*852ba100SJustin Hibbits if (p_ManipParams->fragOrReasm || p_ManipParams->u.hdr.insrt)
2574*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for the type of remove e_FM_PCD_MANIP_RMV_FROM_START_OF_FRAME_TILL_CAPWAP can not be insert or fragOrReasm TRUE"));
2575*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR;
25760aeed3e9SJustin Hibbits p_Manip->muramAllocate = TRUE;
2577*852ba100SJustin Hibbits p_ManipParams->u.hdr.insrt = TRUE; //internal frame header
25780aeed3e9SJustin Hibbits break;
25790aeed3e9SJustin Hibbits default :
25800aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
25810aeed3e9SJustin Hibbits }
25820aeed3e9SJustin Hibbits }
2583*852ba100SJustin Hibbits break;
2584*852ba100SJustin Hibbits default :
2585*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
2586*852ba100SJustin Hibbits }
2587*852ba100SJustin Hibbits break;
2588*852ba100SJustin Hibbits default:
2589*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
2590*852ba100SJustin Hibbits }
2591*852ba100SJustin Hibbits }
2592*852ba100SJustin Hibbits else if (p_ManipParams->u.hdr.insrt)
25930aeed3e9SJustin Hibbits {
2594*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.insrtParams.type)
25950aeed3e9SJustin Hibbits {
2596*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_TEMPLATE) :
25970aeed3e9SJustin Hibbits
2598*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;
25990aeed3e9SJustin Hibbits p_Manip->muramAllocate = FALSE;
26000aeed3e9SJustin Hibbits if (p_ManipParams->fragOrReasm)
26010aeed3e9SJustin Hibbits {
26020aeed3e9SJustin Hibbits if (p_ManipParams->fragOrReasmParams.frag)
26030aeed3e9SJustin Hibbits {
26040aeed3e9SJustin Hibbits switch (p_ManipParams->fragOrReasmParams.hdr)
26050aeed3e9SJustin Hibbits {
26060aeed3e9SJustin Hibbits case (HEADER_TYPE_CAPWAP):
2607*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;
26080aeed3e9SJustin Hibbits break;
26090aeed3e9SJustin Hibbits default:
26100aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid header for fragmentation"));
26110aeed3e9SJustin Hibbits }
26120aeed3e9SJustin Hibbits }
26130aeed3e9SJustin Hibbits else
26140aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,("can not reach this point"));
26150aeed3e9SJustin Hibbits }
26160aeed3e9SJustin Hibbits break;
2617*852ba100SJustin Hibbits
26180aeed3e9SJustin Hibbits default:
26190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for only isert manipulation unsupported type"));
26200aeed3e9SJustin Hibbits }
26210aeed3e9SJustin Hibbits }
26220aeed3e9SJustin Hibbits else if (p_ManipParams->fragOrReasm)
26230aeed3e9SJustin Hibbits {
26240aeed3e9SJustin Hibbits if (p_ManipParams->fragOrReasmParams.frag)
26250aeed3e9SJustin Hibbits {
26260aeed3e9SJustin Hibbits switch (p_ManipParams->fragOrReasmParams.hdr)
26270aeed3e9SJustin Hibbits {
26280aeed3e9SJustin Hibbits case (HEADER_TYPE_CAPWAP):
2629*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;
26300aeed3e9SJustin Hibbits p_Manip->muramAllocate = FALSE;
26310aeed3e9SJustin Hibbits break;
26320aeed3e9SJustin Hibbits default:
26330aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported header for fragmentation"));
26340aeed3e9SJustin Hibbits }
26350aeed3e9SJustin Hibbits }
26360aeed3e9SJustin Hibbits else
26370aeed3e9SJustin Hibbits {
26380aeed3e9SJustin Hibbits switch (p_ManipParams->fragOrReasmParams.hdr)
26390aeed3e9SJustin Hibbits {
26400aeed3e9SJustin Hibbits case (HEADER_TYPE_CAPWAP):
26410aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Reassembly has to be with additional operation - rmv = TRUE, type of remove - e_FM_PCD_MANIP_RMV_FROM_START_OF_FRAME_INCLUDE_SPECIFIC_LOCATION,type = e_FM_PCD_MANIP_LOC_BY_HDR, hdr = HEADER_TYPE_CAPWAP_DTLS"));
26420aeed3e9SJustin Hibbits default:
26430aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported header for reassembly"));
26440aeed3e9SJustin Hibbits }
26450aeed3e9SJustin Hibbits }
26460aeed3e9SJustin Hibbits
26470aeed3e9SJustin Hibbits }
26480aeed3e9SJustin Hibbits else
26490aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("User didn't ask for any manipulation"));
26500aeed3e9SJustin Hibbits
2651*852ba100SJustin Hibbits p_Manip->insrt = p_ManipParams->u.hdr.insrt;
2652*852ba100SJustin Hibbits p_Manip->rmv = p_ManipParams->u.hdr.rmv;
26530aeed3e9SJustin Hibbits
26540aeed3e9SJustin Hibbits return E_OK;
26550aeed3e9SJustin Hibbits }
2656*852ba100SJustin Hibbits
2657*852ba100SJustin Hibbits #else /* not (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
CheckManipParamsAndSetType(t_FmPcdManip * p_Manip,t_FmPcdManipParams * p_ManipParams)2658*852ba100SJustin Hibbits static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip,
2659*852ba100SJustin Hibbits t_FmPcdManipParams *p_ManipParams)
2660*852ba100SJustin Hibbits {
2661*852ba100SJustin Hibbits switch (p_ManipParams->type)
2662*852ba100SJustin Hibbits {
2663*852ba100SJustin Hibbits case e_FM_PCD_MANIP_HDR:
2664*852ba100SJustin Hibbits /* Check that next-manip is not already used */
2665*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
2666*852ba100SJustin Hibbits {
2667*852ba100SJustin Hibbits if (!MANIP_IS_FIRST(p_ManipParams->h_NextManip))
2668*852ba100SJustin Hibbits RETURN_ERROR(
2669*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
2670*852ba100SJustin Hibbits ("h_NextManip is already a part of another chain"));
2671*852ba100SJustin Hibbits if ((MANIP_GET_TYPE(p_ManipParams->h_NextManip)
2672*852ba100SJustin Hibbits != e_FM_PCD_MANIP_HDR) &&
2673*852ba100SJustin Hibbits (MANIP_GET_TYPE(p_ManipParams->h_NextManip)
2674*852ba100SJustin Hibbits != e_FM_PCD_MANIP_FRAG))
2675*852ba100SJustin Hibbits RETURN_ERROR(
2676*852ba100SJustin Hibbits MAJOR,
2677*852ba100SJustin Hibbits E_NOT_SUPPORTED,
2678*852ba100SJustin Hibbits ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation or Fragmentation."));
2679*852ba100SJustin Hibbits }
2680*852ba100SJustin Hibbits
2681*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.rmv)
2682*852ba100SJustin Hibbits {
2683*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.rmvParams.type)
2684*852ba100SJustin Hibbits {
2685*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR):
2686*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.type)
2687*852ba100SJustin Hibbits {
2688*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2):
2689*852ba100SJustin Hibbits break;
2690*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2691*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP):
2692*852ba100SJustin Hibbits break;
2693*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START):
2694*852ba100SJustin Hibbits {
2695*852ba100SJustin Hibbits t_Error err;
2696*852ba100SJustin Hibbits uint8_t prsArrayOffset;
2697*852ba100SJustin Hibbits
2698*852ba100SJustin Hibbits err =
2699*852ba100SJustin Hibbits GetPrOffsetByHeaderOrField(
2700*852ba100SJustin Hibbits &p_ManipParams->u.hdr.rmvParams.u.byHdr.u.hdrInfo,
2701*852ba100SJustin Hibbits &prsArrayOffset);
2702*852ba100SJustin Hibbits if (err)
2703*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2704*852ba100SJustin Hibbits break;
2705*852ba100SJustin Hibbits }
2706*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2707*852ba100SJustin Hibbits default:
2708*852ba100SJustin Hibbits RETURN_ERROR(
2709*852ba100SJustin Hibbits MAJOR,
2710*852ba100SJustin Hibbits E_INVALID_STATE,
2711*852ba100SJustin Hibbits ("invalid type of remove manipulation"));
2712*852ba100SJustin Hibbits }
2713*852ba100SJustin Hibbits break;
2714*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_RMV_GENERIC):
2715*852ba100SJustin Hibbits break;
2716*852ba100SJustin Hibbits default:
2717*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
2718*852ba100SJustin Hibbits ("invalid type of remove manipulation"));
2719*852ba100SJustin Hibbits }
2720*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC;
2721*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2722*852ba100SJustin Hibbits p_Manip->rmv = TRUE;
2723*852ba100SJustin Hibbits }
2724*852ba100SJustin Hibbits else
2725*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.insrt)
2726*852ba100SJustin Hibbits {
2727*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.insrtParams.type)
2728*852ba100SJustin Hibbits {
2729*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR):
2730*852ba100SJustin Hibbits {
2731*852ba100SJustin Hibbits switch (p_ManipParams->u.hdr.insrtParams.u.byHdr.type)
2732*852ba100SJustin Hibbits {
2733*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2):
2734*852ba100SJustin Hibbits /* nothing to check */
2735*852ba100SJustin Hibbits break;
2736*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2737*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_IP):
2738*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size
2739*852ba100SJustin Hibbits % 4)
2740*852ba100SJustin Hibbits RETURN_ERROR(
2741*852ba100SJustin Hibbits MAJOR,
2742*852ba100SJustin Hibbits E_INVALID_VALUE,
2743*852ba100SJustin Hibbits ("IP inserted header must be of size which is a multiple of four bytes"));
2744*852ba100SJustin Hibbits break;
2745*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP):
2746*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size
2747*852ba100SJustin Hibbits % 4)
2748*852ba100SJustin Hibbits RETURN_ERROR(
2749*852ba100SJustin Hibbits MAJOR,
2750*852ba100SJustin Hibbits E_INVALID_VALUE,
2751*852ba100SJustin Hibbits ("CAPWAP inserted header must be of size which is a multiple of four bytes"));
2752*852ba100SJustin Hibbits break;
2753*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP):
2754*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE):
2755*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size
2756*852ba100SJustin Hibbits != 8)
2757*852ba100SJustin Hibbits RETURN_ERROR(
2758*852ba100SJustin Hibbits MAJOR,
2759*852ba100SJustin Hibbits E_INVALID_VALUE,
2760*852ba100SJustin Hibbits ("Inserted header must be of size 8"));
2761*852ba100SJustin Hibbits break;
2762*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2763*852ba100SJustin Hibbits default:
2764*852ba100SJustin Hibbits RETURN_ERROR(
2765*852ba100SJustin Hibbits MAJOR,
2766*852ba100SJustin Hibbits E_INVALID_STATE,
2767*852ba100SJustin Hibbits ("unsupported insert by header type"));
2768*852ba100SJustin Hibbits }
2769*852ba100SJustin Hibbits }
2770*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_INSRT_GENERIC):
2771*852ba100SJustin Hibbits break;
2772*852ba100SJustin Hibbits default:
2773*852ba100SJustin Hibbits RETURN_ERROR(
2774*852ba100SJustin Hibbits MAJOR,
2775*852ba100SJustin Hibbits E_INVALID_STATE,
2776*852ba100SJustin Hibbits ("for only insert manipulation unsupported type"));
2777*852ba100SJustin Hibbits }
2778*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC;
2779*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2780*852ba100SJustin Hibbits p_Manip->insrt = TRUE;
2781*852ba100SJustin Hibbits }
2782*852ba100SJustin Hibbits else
2783*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.fieldUpdate)
2784*852ba100SJustin Hibbits {
2785*852ba100SJustin Hibbits /* Check parameters */
2786*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.fieldUpdateParams.type
2787*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN)
2788*852ba100SJustin Hibbits {
2789*852ba100SJustin Hibbits if ((p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType
2790*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI)
2791*852ba100SJustin Hibbits && (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.vpri
2792*852ba100SJustin Hibbits > 7))
2793*852ba100SJustin Hibbits RETURN_ERROR(
2794*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
2795*852ba100SJustin Hibbits ("vpri should get values of 0-7 "));
2796*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType
2797*852ba100SJustin Hibbits == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)
2798*852ba100SJustin Hibbits {
2799*852ba100SJustin Hibbits int i;
2800*852ba100SJustin Hibbits
2801*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.vpriDefVal
2802*852ba100SJustin Hibbits > 7)
2803*852ba100SJustin Hibbits RETURN_ERROR(
2804*852ba100SJustin Hibbits MAJOR,
2805*852ba100SJustin Hibbits E_INVALID_VALUE,
2806*852ba100SJustin Hibbits ("vpriDefVal should get values of 0-7 "));
2807*852ba100SJustin Hibbits for (i = 0; i < FM_PCD_MANIP_DSCP_TO_VLAN_TRANS;
2808*852ba100SJustin Hibbits i++)
2809*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.dscpToVpriTable[i]
2810*852ba100SJustin Hibbits & 0xf0)
2811*852ba100SJustin Hibbits RETURN_ERROR(
2812*852ba100SJustin Hibbits MAJOR,
2813*852ba100SJustin Hibbits E_INVALID_VALUE,
2814*852ba100SJustin Hibbits ("dscpToVpriTabl value out of range (0-15)"));
2815*852ba100SJustin Hibbits }
2816*852ba100SJustin Hibbits
2817*852ba100SJustin Hibbits }
2818*852ba100SJustin Hibbits
2819*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC;
2820*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2821*852ba100SJustin Hibbits p_Manip->fieldUpdate = TRUE;
2822*852ba100SJustin Hibbits }
2823*852ba100SJustin Hibbits else
2824*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.custom)
2825*852ba100SJustin Hibbits {
2826*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.customParams.type == e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE)
2827*852ba100SJustin Hibbits {
2828*852ba100SJustin Hibbits
2829*852ba100SJustin Hibbits if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.size == 0) ||
2830*852ba100SJustin Hibbits (p_ManipParams->u.hdr.customParams.u.genFieldReplace.size > 8))
2831*852ba100SJustin Hibbits RETURN_ERROR(
2832*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
2833*852ba100SJustin Hibbits ("size should get values of 1-8 "));
2834*852ba100SJustin Hibbits
2835*852ba100SJustin Hibbits if (p_ManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset > 7)
2836*852ba100SJustin Hibbits RETURN_ERROR(
2837*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
2838*852ba100SJustin Hibbits ("srcOffset should be <= 7"));
2839*852ba100SJustin Hibbits
2840*852ba100SJustin Hibbits if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset +
2841*852ba100SJustin Hibbits p_ManipParams->u.hdr.customParams.u.genFieldReplace.size) > 8)
2842*852ba100SJustin Hibbits RETURN_ERROR(
2843*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
2844*852ba100SJustin Hibbits ("(srcOffset + size) should be <= 8"));
2845*852ba100SJustin Hibbits
2846*852ba100SJustin Hibbits if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.dstOffset +
2847*852ba100SJustin Hibbits p_ManipParams->u.hdr.customParams.u.genFieldReplace.size) > 256)
2848*852ba100SJustin Hibbits RETURN_ERROR(
2849*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
2850*852ba100SJustin Hibbits ("(dstOffset + size) should be <= 256"));
2851*852ba100SJustin Hibbits
2852*852ba100SJustin Hibbits }
2853*852ba100SJustin Hibbits
2854*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC;
2855*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2856*852ba100SJustin Hibbits p_Manip->custom = TRUE;
2857*852ba100SJustin Hibbits }
2858*852ba100SJustin Hibbits break;
2859*852ba100SJustin Hibbits case e_FM_PCD_MANIP_REASSEM:
2860*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
2861*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2862*852ba100SJustin Hibbits ("next manip with reassembly"));
2863*852ba100SJustin Hibbits switch (p_ManipParams->u.reassem.hdr)
2864*852ba100SJustin Hibbits {
2865*852ba100SJustin Hibbits case (HEADER_TYPE_IPv4):
2866*852ba100SJustin Hibbits p_Manip->reassmParams.hdr = HEADER_TYPE_IPv4;
2867*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_IP_REASSEMBLY;
2868*852ba100SJustin Hibbits break;
2869*852ba100SJustin Hibbits case (HEADER_TYPE_IPv6):
2870*852ba100SJustin Hibbits p_Manip->reassmParams.hdr = HEADER_TYPE_IPv6;
2871*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_IP_REASSEMBLY;
2872*852ba100SJustin Hibbits break;
2873*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2874*852ba100SJustin Hibbits case (HEADER_TYPE_CAPWAP):
2875*852ba100SJustin Hibbits p_Manip->reassmParams.hdr = HEADER_TYPE_CAPWAP;
2876*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_REASSEMBLY;
2877*852ba100SJustin Hibbits break;
2878*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2879*852ba100SJustin Hibbits default:
2880*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2881*852ba100SJustin Hibbits ("header for reassembly"));
2882*852ba100SJustin Hibbits }
2883*852ba100SJustin Hibbits break;
2884*852ba100SJustin Hibbits case e_FM_PCD_MANIP_FRAG:
2885*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
2886*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2887*852ba100SJustin Hibbits ("next manip with fragmentation"));
2888*852ba100SJustin Hibbits switch (p_ManipParams->u.frag.hdr)
2889*852ba100SJustin Hibbits {
2890*852ba100SJustin Hibbits case (HEADER_TYPE_IPv4):
2891*852ba100SJustin Hibbits case (HEADER_TYPE_IPv6):
2892*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_IP_FRAGMENTATION;
2893*852ba100SJustin Hibbits break;
2894*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2895*852ba100SJustin Hibbits case (HEADER_TYPE_CAPWAP):
2896*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;
2897*852ba100SJustin Hibbits break;
2898*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2899*852ba100SJustin Hibbits default:
2900*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2901*852ba100SJustin Hibbits ("header for fragmentation"));
2902*852ba100SJustin Hibbits }
2903*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2904*852ba100SJustin Hibbits break;
2905*852ba100SJustin Hibbits case e_FM_PCD_MANIP_SPECIAL_OFFLOAD:
2906*852ba100SJustin Hibbits switch (p_ManipParams->u.specialOffload.type)
2907*852ba100SJustin Hibbits {
2908*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_SPECIAL_OFFLOAD_IPSEC):
2909*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_IPSEC_MANIP;
2910*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2911*852ba100SJustin Hibbits break;
2912*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2913*852ba100SJustin Hibbits case (e_FM_PCD_MANIP_SPECIAL_OFFLOAD_CAPWAP):
2914*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_MANIP;
2915*852ba100SJustin Hibbits p_Manip->muramAllocate = TRUE;
2916*852ba100SJustin Hibbits break;
2917*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2918*852ba100SJustin Hibbits default:
2919*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2920*852ba100SJustin Hibbits ("special offload type"));
2921*852ba100SJustin Hibbits }
2922*852ba100SJustin Hibbits break;
2923*852ba100SJustin Hibbits default:
2924*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("manip type"));
2925*852ba100SJustin Hibbits }
2926*852ba100SJustin Hibbits
2927*852ba100SJustin Hibbits return E_OK;
2928*852ba100SJustin Hibbits }
2929*852ba100SJustin Hibbits #endif /* not (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
2930*852ba100SJustin Hibbits
2931*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
2932*852ba100SJustin Hibbits
UpdateIndxStats(t_Handle h_FmPcd,t_Handle h_FmPort,t_FmPcdManip * p_Manip)29330aeed3e9SJustin Hibbits static t_Error UpdateIndxStats(t_Handle h_FmPcd,
29340aeed3e9SJustin Hibbits t_Handle h_FmPort,
29350aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip)
29360aeed3e9SJustin Hibbits {
29370aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
29380aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
29390aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
29400aeed3e9SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
29410aeed3e9SJustin Hibbits t_Error err;
29420aeed3e9SJustin Hibbits
29430aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
29440aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
29450aeed3e9SJustin Hibbits
29460aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
29470aeed3e9SJustin Hibbits if (p_Manip->h_FmPcd != h_FmPcd)
29480aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
29490aeed3e9SJustin Hibbits ("handler of PCD previously was initiated by different value"));
29500aeed3e9SJustin Hibbits
29510aeed3e9SJustin Hibbits memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
29520aeed3e9SJustin Hibbits
29530aeed3e9SJustin Hibbits if (!p_Manip->p_StatsTbl)
29540aeed3e9SJustin Hibbits {
29550aeed3e9SJustin Hibbits
29560aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNDN;
29570aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_CC;
29580aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
29590aeed3e9SJustin Hibbits if (err)
29600aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
29610aeed3e9SJustin Hibbits
29620aeed3e9SJustin Hibbits tmpReg32 = GET_UINT32(p_Ad->ccAdBase);
29630aeed3e9SJustin Hibbits
2964*852ba100SJustin Hibbits p_Manip->p_StatsTbl =
2965*852ba100SJustin Hibbits (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
29660aeed3e9SJustin Hibbits (uint32_t)p_Manip->owner * FM_PCD_MANIP_INDEXED_STATS_ENTRY_SIZE,
29670aeed3e9SJustin Hibbits 4);
29680aeed3e9SJustin Hibbits if (!p_Manip->p_StatsTbl)
2969*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Manipulation indexed statistics table"));
29700aeed3e9SJustin Hibbits
2971*852ba100SJustin Hibbits MemSet8(p_Manip->p_StatsTbl, 0, (uint32_t)(p_Manip->owner * 4));
29720aeed3e9SJustin Hibbits
29730aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->p_StatsTbl) - p_FmPcd->physicalMuramBase);
29740aeed3e9SJustin Hibbits
29750aeed3e9SJustin Hibbits if (p_Manip->cnia)
29760aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_INDEXED_STATS_CNIA;
29770aeed3e9SJustin Hibbits
29780aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_INDEXED_STATS_DPD;
29790aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
29800aeed3e9SJustin Hibbits }
29810aeed3e9SJustin Hibbits else
29820aeed3e9SJustin Hibbits {
29830aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNDN;
29840aeed3e9SJustin Hibbits fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_CC;
29850aeed3e9SJustin Hibbits err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
29860aeed3e9SJustin Hibbits if (err)
29870aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
29880aeed3e9SJustin Hibbits }
2989*852ba100SJustin Hibbits
29900aeed3e9SJustin Hibbits return E_OK;
29910aeed3e9SJustin Hibbits }
29920aeed3e9SJustin Hibbits
RmvHdrTillSpecLocNOrInsrtIntFrmHdr(t_FmPcdManipHdrRmvParams * p_ManipParams,t_FmPcdManip * p_Manip)2993*852ba100SJustin Hibbits static t_Error RmvHdrTillSpecLocNOrInsrtIntFrmHdr(t_FmPcdManipHdrRmvParams *p_ManipParams, t_FmPcdManip *p_Manip)
29940aeed3e9SJustin Hibbits {
29950aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
29960aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
29970aeed3e9SJustin Hibbits uint8_t prsArrayOffset = 0;
29980aeed3e9SJustin Hibbits t_Error err;
29990aeed3e9SJustin Hibbits
30000aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip,E_NULL_POINTER);
30010aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_NULL_POINTER);
30020aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
30030aeed3e9SJustin Hibbits
30040aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
30050aeed3e9SJustin Hibbits if (p_Manip->rmv)
30060aeed3e9SJustin Hibbits {
3007*852ba100SJustin Hibbits err = GetPrOffsetByHeaderOrField(&p_ManipParams->u.byHdr.u.fromStartByHdr.hdrInfo, &prsArrayOffset);
30080aeed3e9SJustin Hibbits if (err)
30090aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
30100aeed3e9SJustin Hibbits
30110aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)prsArrayOffset << 24;
30120aeed3e9SJustin Hibbits tmpReg32 |= HMAN_RMV_HDR;
30130aeed3e9SJustin Hibbits }
30140aeed3e9SJustin Hibbits
30150aeed3e9SJustin Hibbits if (p_Manip->insrt)
30160aeed3e9SJustin Hibbits tmpReg32 |= HMAN_INSRT_INT_FRM_HDR;
30170aeed3e9SJustin Hibbits
30180aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR;
30190aeed3e9SJustin Hibbits
30200aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
30210aeed3e9SJustin Hibbits
30220aeed3e9SJustin Hibbits tmpReg32 = 0;
30230aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
30240aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
30250aeed3e9SJustin Hibbits
30260aeed3e9SJustin Hibbits return E_OK;
30270aeed3e9SJustin Hibbits }
30280aeed3e9SJustin Hibbits
MvIntFrameHeaderFromFrameToBufferPrefix(t_FmPcdManip * p_Manip,bool caamUsed)3029*852ba100SJustin Hibbits static t_Error MvIntFrameHeaderFromFrameToBufferPrefix(t_FmPcdManip *p_Manip,
3030*852ba100SJustin Hibbits bool caamUsed)
30310aeed3e9SJustin Hibbits {
30320aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
30330aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
30340aeed3e9SJustin Hibbits
30350aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Ad, E_INVALID_HANDLE);
30360aeed3e9SJustin Hibbits
30370aeed3e9SJustin Hibbits p_Manip->updateParams |= OFFSET_OF_PR | INTERNAL_CONTEXT_OFFSET;
30380aeed3e9SJustin Hibbits
30390aeed3e9SJustin Hibbits tmpReg32 = 0;
30400aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
30410aeed3e9SJustin Hibbits *(uint32_t *)&p_Ad->ccAdBase = tmpReg32;
30420aeed3e9SJustin Hibbits
30430aeed3e9SJustin Hibbits tmpReg32 = 0;
30440aeed3e9SJustin Hibbits tmpReg32 |= HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX;
30450aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)0x16 << 16;
30460aeed3e9SJustin Hibbits *(uint32_t *)&p_Ad->pcAndOffsets = tmpReg32;
30470aeed3e9SJustin Hibbits
30480aeed3e9SJustin Hibbits if (caamUsed)
30490aeed3e9SJustin Hibbits *(uint32_t *)&p_Ad->gmask = 0xf0000000;
30500aeed3e9SJustin Hibbits
30510aeed3e9SJustin Hibbits return E_OK;
30520aeed3e9SJustin Hibbits }
30530aeed3e9SJustin Hibbits
CapwapRmvDtlsHdr(t_FmPcd * p_FmPcd,t_FmPcdManip * p_Manip)30540aeed3e9SJustin Hibbits static t_Error CapwapRmvDtlsHdr(t_FmPcd *p_FmPcd, t_FmPcdManip *p_Manip)
30550aeed3e9SJustin Hibbits {
30560aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
30570aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
30580aeed3e9SJustin Hibbits t_Error err = E_OK;
30590aeed3e9SJustin Hibbits
30600aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
30610aeed3e9SJustin Hibbits
30620aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
30630aeed3e9SJustin Hibbits
30640aeed3e9SJustin Hibbits tmpReg32 = 0;
30650aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;
30660aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
30670aeed3e9SJustin Hibbits
30680aeed3e9SJustin Hibbits tmpReg32 = 0;
30690aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
30700aeed3e9SJustin Hibbits
30710aeed3e9SJustin Hibbits
30720aeed3e9SJustin Hibbits if (p_Manip->h_Frag)
30730aeed3e9SJustin Hibbits {
30740aeed3e9SJustin Hibbits p_Manip->updateParams |= INTERNAL_CONTEXT_OFFSET;
30750aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->h_Frag) - (p_FmPcd->physicalMuramBase));
30760aeed3e9SJustin Hibbits }
30770aeed3e9SJustin Hibbits
30780aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
30790aeed3e9SJustin Hibbits
30800aeed3e9SJustin Hibbits return err;
30810aeed3e9SJustin Hibbits }
30820aeed3e9SJustin Hibbits
CapwapReassembly(t_CapwapReassemblyParams * p_ManipParams,t_FmPcdManip * p_Manip,t_FmPcd * p_FmPcd,uint8_t poolId)3083*852ba100SJustin Hibbits static t_Error CapwapReassembly(t_CapwapReassemblyParams *p_ManipParams,
3084*852ba100SJustin Hibbits t_FmPcdManip *p_Manip,
3085*852ba100SJustin Hibbits t_FmPcd *p_FmPcd,
3086*852ba100SJustin Hibbits uint8_t poolId)
30870aeed3e9SJustin Hibbits {
30880aeed3e9SJustin Hibbits t_Handle p_Table;
30890aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
30900aeed3e9SJustin Hibbits int i = 0;
30910aeed3e9SJustin Hibbits uint8_t log2Num;
30920aeed3e9SJustin Hibbits uint8_t numOfSets;
30930aeed3e9SJustin Hibbits uint32_t j = 0;
3094*852ba100SJustin Hibbits uint32_t bitFor1Micro;
30950aeed3e9SJustin Hibbits
30960aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);
30970aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
30980aeed3e9SJustin Hibbits
30990aeed3e9SJustin Hibbits if (!p_FmPcd->h_Hc)
31000aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE,("hc port has to be initialized in this mode"));
31010aeed3e9SJustin Hibbits if (!POWER_OF_2(p_ManipParams->timeoutRoutineRequestTime))
31020aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("timeoutRoutineRequestTime has to be power of 2"));
31030aeed3e9SJustin Hibbits if (!POWER_OF_2(p_ManipParams->maxNumFramesInProcess))
31040aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE,("maxNumFramesInProcess has to be power of 2"));
31050aeed3e9SJustin Hibbits if (!p_ManipParams->timeoutRoutineRequestTime && p_ManipParams->timeoutThresholdForReassmProcess)
31060aeed3e9SJustin Hibbits DBG(WARNING, ("if timeoutRoutineRequestTime 0, timeoutThresholdForReassmProcess is uselessly"));
31070aeed3e9SJustin Hibbits if (p_ManipParams->numOfFramesPerHashEntry == e_FM_PCD_MANIP_FOUR_WAYS_HASH)
31080aeed3e9SJustin Hibbits {
31090aeed3e9SJustin Hibbits if ((p_ManipParams->maxNumFramesInProcess < 4) ||
31100aeed3e9SJustin Hibbits (p_ManipParams->maxNumFramesInProcess > 512))
31110aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("In the case of numOfFramesPerHashEntry = e_FM_PCD_MANIP_EIGHT_WAYS_HASH maxNumFramesInProcess has to be in the range 4-512"));
31120aeed3e9SJustin Hibbits }
31130aeed3e9SJustin Hibbits else
31140aeed3e9SJustin Hibbits {
31150aeed3e9SJustin Hibbits if ((p_ManipParams->maxNumFramesInProcess < 8) ||
31160aeed3e9SJustin Hibbits (p_ManipParams->maxNumFramesInProcess > 2048))
31170aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("In the case of numOfFramesPerHashEntry = e_FM_PCD_MANIP_FOUR_WAYS_HASH maxNumFramesInProcess has to be in the range 8-2048"));
31180aeed3e9SJustin Hibbits }
31190aeed3e9SJustin Hibbits
3120*852ba100SJustin Hibbits bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);
3121*852ba100SJustin Hibbits if (bitFor1Micro == 0)
3122*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Timestamp scale"));
3123*852ba100SJustin Hibbits
3124*852ba100SJustin Hibbits p_Manip->updateParams |= (NUM_OF_TASKS | OFFSET_OF_PR | OFFSET_OF_DATA | HW_PORT_ID);
31250aeed3e9SJustin Hibbits
31260aeed3e9SJustin Hibbits p_Manip->h_Frag = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
31270aeed3e9SJustin Hibbits FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE,
31280aeed3e9SJustin Hibbits FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN);
31290aeed3e9SJustin Hibbits if (!p_Manip->h_Frag)
3130*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc CAPWAP reassembly parameters table"));
31310aeed3e9SJustin Hibbits
3132*852ba100SJustin Hibbits MemSet8(p_Manip->h_Frag, 0, FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE);
31330aeed3e9SJustin Hibbits
31340aeed3e9SJustin Hibbits p_Table = (t_CapwapReasmPram *)p_Manip->h_Frag;
31350aeed3e9SJustin Hibbits
3136*852ba100SJustin Hibbits p_Manip->capwapFragParams.p_AutoLearnHashTbl =
3137*852ba100SJustin Hibbits (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
31380aeed3e9SJustin Hibbits (uint32_t)(p_ManipParams->maxNumFramesInProcess * 2 * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE),
31390aeed3e9SJustin Hibbits FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN);
31400aeed3e9SJustin Hibbits
3141*852ba100SJustin Hibbits if (!p_Manip->capwapFragParams.p_AutoLearnHashTbl)
3142*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,("MURAM alloc for CAPWAP automatic learning hash table"));
31430aeed3e9SJustin Hibbits
3144*852ba100SJustin Hibbits MemSet8(p_Manip->capwapFragParams.p_AutoLearnHashTbl, 0, (uint32_t)(p_ManipParams->maxNumFramesInProcess * 2 * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE));
31450aeed3e9SJustin Hibbits
3146*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_AutoLearnHashTbl) - p_FmPcd->physicalMuramBase);
31470aeed3e9SJustin Hibbits
31480aeed3e9SJustin Hibbits WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->autoLearnHashTblPtr, tmpReg32);
31490aeed3e9SJustin Hibbits
31500aeed3e9SJustin Hibbits tmpReg32 = 0;
31510aeed3e9SJustin Hibbits if (p_ManipParams->timeOutMode == e_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES)
31520aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_BETWEEN_FRAMES;
31530aeed3e9SJustin Hibbits if (p_ManipParams->haltOnDuplicationFrag)
31540aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_HALT_ON_DUPLICATE_FRAG;
31550aeed3e9SJustin Hibbits if (p_ManipParams->numOfFramesPerHashEntry == e_FM_PCD_MANIP_EIGHT_WAYS_HASH)
31560aeed3e9SJustin Hibbits {
31570aeed3e9SJustin Hibbits i = 8;
31580aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_AUTOMATIC_LEARNIN_HASH_8_WAYS;
31590aeed3e9SJustin Hibbits }
31600aeed3e9SJustin Hibbits else
31610aeed3e9SJustin Hibbits i = 4;
31620aeed3e9SJustin Hibbits
31630aeed3e9SJustin Hibbits numOfSets = (uint8_t)((p_ManipParams->maxNumFramesInProcess * 2) / i);
31640aeed3e9SJustin Hibbits LOG2(numOfSets, log2Num);
31650aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)(log2Num - 1) << 24;
31660aeed3e9SJustin Hibbits
31670aeed3e9SJustin Hibbits WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->mode, tmpReg32);
31680aeed3e9SJustin Hibbits
31690aeed3e9SJustin Hibbits for (j=0; j<p_ManipParams->maxNumFramesInProcess*2; j++)
31700aeed3e9SJustin Hibbits if (((j / i) % 2)== 0)
3171*852ba100SJustin Hibbits WRITE_UINT32(*(uint32_t *)PTR_MOVE(p_Manip->capwapFragParams.p_AutoLearnHashTbl, j * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE), 0x80000000);
31720aeed3e9SJustin Hibbits
3173*852ba100SJustin Hibbits tmpReg32 = 0x00008000;
3174*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)poolId << 16;
3175*852ba100SJustin Hibbits WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->bufferPoolIdAndRisc1SetIndexes, tmpReg32);
31760aeed3e9SJustin Hibbits WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->risc23SetIndexes, 0x80008000);
31770aeed3e9SJustin Hibbits WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->risc4SetIndexesAndExtendedStatsTblPtr, 0x80000000);
31780aeed3e9SJustin Hibbits
3179*852ba100SJustin Hibbits p_Manip->capwapFragParams.maxNumFramesInProcess = p_ManipParams->maxNumFramesInProcess;
31800aeed3e9SJustin Hibbits
3181*852ba100SJustin Hibbits p_Manip->capwapFragParams.sgBpid = poolId;
31820aeed3e9SJustin Hibbits
3183*852ba100SJustin Hibbits p_Manip->capwapFragParams.fqidForTimeOutFrames = p_ManipParams->fqidForTimeOutFrames;
3184*852ba100SJustin Hibbits p_Manip->capwapFragParams.timeoutRoutineRequestTime = p_ManipParams->timeoutRoutineRequestTime;
3185*852ba100SJustin Hibbits p_Manip->capwapFragParams.bitFor1Micro = bitFor1Micro;
31860aeed3e9SJustin Hibbits
31870aeed3e9SJustin Hibbits tmpReg32 = 0;
3188*852ba100SJustin Hibbits tmpReg32 |= (((uint32_t)1<<p_Manip->capwapFragParams.bitFor1Micro) * p_ManipParams->timeoutThresholdForReassmProcess);
31890aeed3e9SJustin Hibbits WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->expirationDelay, tmpReg32);
31900aeed3e9SJustin Hibbits
31910aeed3e9SJustin Hibbits return E_OK;
31920aeed3e9SJustin Hibbits }
31930aeed3e9SJustin Hibbits
CapwapFragmentation(t_CapwapFragmentationParams * p_ManipParams,t_FmPcdManip * p_Manip,t_FmPcd * p_FmPcd,uint8_t poolId)3194*852ba100SJustin Hibbits static t_Error CapwapFragmentation(t_CapwapFragmentationParams *p_ManipParams,
3195*852ba100SJustin Hibbits t_FmPcdManip *p_Manip,
3196*852ba100SJustin Hibbits t_FmPcd *p_FmPcd,
3197*852ba100SJustin Hibbits uint8_t poolId)
31980aeed3e9SJustin Hibbits {
31990aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
32000aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
32010aeed3e9SJustin Hibbits
32020aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
32030aeed3e9SJustin Hibbits
3204*852ba100SJustin Hibbits p_Manip->updateParams |= OFFSET_OF_DATA;
32050aeed3e9SJustin Hibbits
32060aeed3e9SJustin Hibbits p_Manip->frag = TRUE;
32070aeed3e9SJustin Hibbits
32080aeed3e9SJustin Hibbits p_Manip->h_Frag = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
32090aeed3e9SJustin Hibbits FM_PCD_CC_AD_ENTRY_SIZE,
32100aeed3e9SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
32110aeed3e9SJustin Hibbits if (!p_Manip->h_Frag)
3212*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP fragmentation table descriptor"));
32130aeed3e9SJustin Hibbits
3214*852ba100SJustin Hibbits MemSet8(p_Manip->h_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);
32150aeed3e9SJustin Hibbits
32160aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;
32170aeed3e9SJustin Hibbits
32180aeed3e9SJustin Hibbits tmpReg32 = 0;
32190aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_FRAGMENTATION;
32200aeed3e9SJustin Hibbits
32210aeed3e9SJustin Hibbits if (p_ManipParams->headerOptionsCompr)
3222*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_CAPWAP_FRAG_COMPR_OPTION_FIELD_EN;
3223*852ba100SJustin Hibbits tmpReg32 |= ((uint32_t)poolId << 8);
32240aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
32250aeed3e9SJustin Hibbits
32260aeed3e9SJustin Hibbits tmpReg32 = 0;
32270aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
32280aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
32290aeed3e9SJustin Hibbits
32300aeed3e9SJustin Hibbits p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;
3231*852ba100SJustin Hibbits p_Manip->capwapFragParams.sgBpid = poolId;
32320aeed3e9SJustin Hibbits
32330aeed3e9SJustin Hibbits return E_OK;
32340aeed3e9SJustin Hibbits }
32350aeed3e9SJustin Hibbits
IndxStats(t_FmPcdStatsParams * p_StatsParams,t_FmPcdManip * p_Manip,t_FmPcd * p_FmPcd)32360aeed3e9SJustin Hibbits static t_Error IndxStats(t_FmPcdStatsParams *p_StatsParams,t_FmPcdManip *p_Manip,t_FmPcd *p_FmPcd)
32370aeed3e9SJustin Hibbits {
32380aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
32390aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0;
32400aeed3e9SJustin Hibbits
32410aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
32420aeed3e9SJustin Hibbits
32430aeed3e9SJustin Hibbits UNUSED(p_FmPcd);
32440aeed3e9SJustin Hibbits
32450aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
32460aeed3e9SJustin Hibbits
32470aeed3e9SJustin Hibbits tmpReg32 = 0;
32480aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_INDEXED_STATS;
32490aeed3e9SJustin Hibbits if (p_StatsParams->type == e_FM_PCD_STATS_PER_FLOWID)
32500aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)0x16 << 16;
32510aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
32520aeed3e9SJustin Hibbits
32530aeed3e9SJustin Hibbits tmpReg32 = 0;
32540aeed3e9SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
32550aeed3e9SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
32560aeed3e9SJustin Hibbits
32570aeed3e9SJustin Hibbits return E_OK;
32580aeed3e9SJustin Hibbits }
32590aeed3e9SJustin Hibbits
InsrtHdrByTempl(t_FmPcdManipHdrInsrtParams * p_ManipParams,t_FmPcdManip * p_Manip,t_FmPcd * p_FmPcd)3260*852ba100SJustin Hibbits static t_Error InsrtHdrByTempl(t_FmPcdManipHdrInsrtParams *p_ManipParams, t_FmPcdManip *p_Manip, t_FmPcd *p_FmPcd)
32610aeed3e9SJustin Hibbits {
3262*852ba100SJustin Hibbits t_FmPcdManipHdrInsrtByTemplateParams *p_InsrtByTemplate = &p_ManipParams->u.byTemplate;
32630aeed3e9SJustin Hibbits uint8_t tmpReg8 = 0xff;
32640aeed3e9SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
32650aeed3e9SJustin Hibbits bool ipModify = FALSE;
32660aeed3e9SJustin Hibbits uint32_t tmpReg32 = 0, tmpRegNia = 0;
32670aeed3e9SJustin Hibbits uint16_t tmpReg16 = 0;
32680aeed3e9SJustin Hibbits t_Error err = E_OK;
3269*852ba100SJustin Hibbits uint8_t extraAddedBytes = 0, blockSize = 0, extraAddedBytesAlignedToBlockSize = 0, log2Num = 0;
32700aeed3e9SJustin Hibbits uint8_t *p_Template = NULL;
32710aeed3e9SJustin Hibbits
32720aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_NULL_POINTER);
32730aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip,E_NULL_POINTER);
32740aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
32750aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd,E_NULL_POINTER);
32760aeed3e9SJustin Hibbits
32770aeed3e9SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
32780aeed3e9SJustin Hibbits if (p_Manip->insrt)
32790aeed3e9SJustin Hibbits {
32800aeed3e9SJustin Hibbits if ((!p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterIp) ||
32810aeed3e9SJustin Hibbits (!p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterVlan))
32820aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : asking for header template modifications with no template for insertion (template size)"));
32830aeed3e9SJustin Hibbits
32840aeed3e9SJustin Hibbits if (p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterIp && (p_InsrtByTemplate->size <= p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset))
32850aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : size of template < ipOuterOffset"));
32860aeed3e9SJustin Hibbits
32870aeed3e9SJustin Hibbits if (p_InsrtByTemplate->size > 128)
32880aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Size of header template for insertion can not be more than 128"));
32890aeed3e9SJustin Hibbits
32900aeed3e9SJustin Hibbits if (p_InsrtByTemplate->size)
32910aeed3e9SJustin Hibbits {
32920aeed3e9SJustin Hibbits p_Manip->p_Template = (uint8_t *)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
32930aeed3e9SJustin Hibbits p_InsrtByTemplate->size,
32940aeed3e9SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
32950aeed3e9SJustin Hibbits if(!p_Manip->p_Template)
32960aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation in MURAM FAILED"));
32970aeed3e9SJustin Hibbits
32980aeed3e9SJustin Hibbits tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->p_Template) - (p_FmPcd->physicalMuramBase));
32990aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)p_InsrtByTemplate->size << 24;
33000aeed3e9SJustin Hibbits *(uint32_t *)&p_Ad->matchTblPtr = tmpReg32;
33010aeed3e9SJustin Hibbits }
33020aeed3e9SJustin Hibbits
33030aeed3e9SJustin Hibbits tmpReg32 = 0;
33040aeed3e9SJustin Hibbits
33050aeed3e9SJustin Hibbits p_Template = (uint8_t *)XX_Malloc(p_InsrtByTemplate->size * sizeof(uint8_t));
33060aeed3e9SJustin Hibbits
33070aeed3e9SJustin Hibbits if (!p_Template)
33080aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("XX_Malloc allocation FAILED"));
33090aeed3e9SJustin Hibbits
33100aeed3e9SJustin Hibbits memcpy(p_Template, p_InsrtByTemplate->hdrTemplate, p_InsrtByTemplate->size * sizeof(uint8_t));
33110aeed3e9SJustin Hibbits
33120aeed3e9SJustin Hibbits if (p_InsrtByTemplate->modifyOuterIp)
33130aeed3e9SJustin Hibbits {
33140aeed3e9SJustin Hibbits ipModify = TRUE;
33150aeed3e9SJustin Hibbits
33160aeed3e9SJustin Hibbits tmpReg8 = (uint8_t)p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset];
33170aeed3e9SJustin Hibbits
33180aeed3e9SJustin Hibbits if((tmpReg8 & 0xf0) == 0x40)
33190aeed3e9SJustin Hibbits tmpReg8 = 4;
33200aeed3e9SJustin Hibbits else if((tmpReg8 & 0xf0) == 0x60)
33210aeed3e9SJustin Hibbits tmpReg8 = 6;
33220aeed3e9SJustin Hibbits else
33230aeed3e9SJustin Hibbits tmpReg8 = 0xff;
33240aeed3e9SJustin Hibbits
3325*852ba100SJustin Hibbits if (tmpReg8 != 0xff)
33260aeed3e9SJustin Hibbits {
33270aeed3e9SJustin Hibbits if(p_InsrtByTemplate->modifyOuterIpParams.dscpEcn & 0xff00)
33280aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : IPV4 present in header template, dscpEcn has to be only 1 byte"));
33290aeed3e9SJustin Hibbits if(p_InsrtByTemplate->modifyOuterIpParams.recalculateLength)
33300aeed3e9SJustin Hibbits {
33310aeed3e9SJustin Hibbits
33320aeed3e9SJustin Hibbits if((p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize + p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedNotAlignedToBlockSize) > 255)
33330aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("extra Byte added can not be more than 256 bytes"));
33340aeed3e9SJustin Hibbits extraAddedBytes = (uint8_t) (p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize + p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedNotAlignedToBlockSize);
33350aeed3e9SJustin Hibbits blockSize = p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.blockSize;
33360aeed3e9SJustin Hibbits extraAddedBytesAlignedToBlockSize = p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize;
33370aeed3e9SJustin Hibbits /*IP header template - IP totalLength -
33380aeed3e9SJustin Hibbits (1 byte) extraByteForIp = headerTemplateSize - ipOffset + insertedBytesAfterThisStage ,
33390aeed3e9SJustin Hibbits in the case of SEC insertedBytesAfterThisStage - SEC trailer (21/31) + header(13)
33400aeed3e9SJustin Hibbits second byte - extraByteForIp = headerTemplate - ipOffset + insertedBytesAfterThisStage*/
33410aeed3e9SJustin Hibbits }
33420aeed3e9SJustin Hibbits if (blockSize)
33430aeed3e9SJustin Hibbits {
33440aeed3e9SJustin Hibbits if (!POWER_OF_2(blockSize))
33450aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("inputFrmPaddingUpToBlockSize has to be power of 2"));
33460aeed3e9SJustin Hibbits }
33470aeed3e9SJustin Hibbits
3348*852ba100SJustin Hibbits }
3349*852ba100SJustin Hibbits if (tmpReg8 == 4)
3350*852ba100SJustin Hibbits {
3351*852ba100SJustin Hibbits if ((IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP + p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset) > p_InsrtByTemplate->size)
3352*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : IP present in header template, user asked for IP modifications but ipOffset + ipTotalLengthFieldOffset in header template bigger than template size"));
3353*852ba100SJustin Hibbits
3354*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_DSCECN_FIELD_OFFSET_FROM_IP] = (uint8_t)p_InsrtByTemplate->modifyOuterIpParams.dscpEcn;
3355*852ba100SJustin Hibbits
3356*852ba100SJustin Hibbits if (blockSize)
3357*852ba100SJustin Hibbits blockSize -= 1;
3358*852ba100SJustin Hibbits
33590aeed3e9SJustin Hibbits if ((p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes) > 255)
33600aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes has to be less than 255"));
33610aeed3e9SJustin Hibbits
3362*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP + 1] = blockSize; // IPV6 - in AD instead of SEQ IND
3363*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP] = (uint8_t)(p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes);// for IPV6 decrement additional 40 bytes of IPV6 heade size
33640aeed3e9SJustin Hibbits
3365*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_ID_FIELD_OFFSET_FROM_IP] = 0x00;
3366*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_ID_FIELD_OFFSET_FROM_IP + 1] = extraAddedBytesAlignedToBlockSize;
33670aeed3e9SJustin Hibbits
33680aeed3e9SJustin Hibbits /*IP header template - relevant only for ipv4 CheckSum = 0*/
3369*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP] = 0x00;
3370*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP + 1] = 0x00;
33710aeed3e9SJustin Hibbits
33720aeed3e9SJustin Hibbits /*UDP checksum has to be 0*/
33730aeed3e9SJustin Hibbits if (p_InsrtByTemplate->modifyOuterIpParams.udpPresent)
33740aeed3e9SJustin Hibbits {
3375*852ba100SJustin Hibbits if ((p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + UDP_CHECKSUM_FIELD_SIZE) > p_InsrtByTemplate->size)
33760aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : UDP present according to user but (UDP offset + UDP header size) < size of header template"));
33770aeed3e9SJustin Hibbits
3378*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP ] = 0x00;
3379*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + 1] = 0x00;
33800aeed3e9SJustin Hibbits
33810aeed3e9SJustin Hibbits }
33820aeed3e9SJustin Hibbits
33830aeed3e9SJustin Hibbits if (p_InsrtByTemplate->modifyOuterIpParams.ipIdentGenId > 7)
33840aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("ipIdentGenId has to be one out of 8 sequence number generators (0 - 7) for IP identification field"));
33850aeed3e9SJustin Hibbits
33860aeed3e9SJustin Hibbits tmpRegNia |= (uint32_t)p_InsrtByTemplate->modifyOuterIpParams.ipIdentGenId<<24;
33870aeed3e9SJustin Hibbits }
3388*852ba100SJustin Hibbits else if (tmpReg8 == 6)
3389*852ba100SJustin Hibbits {
3390*852ba100SJustin Hibbits /*TODO - add check for maximum value of blockSize;*/
3391*852ba100SJustin Hibbits if (blockSize)
3392*852ba100SJustin Hibbits LOG2(blockSize, log2Num);
3393*852ba100SJustin Hibbits tmpRegNia |= (uint32_t)log2Num << 24;
3394*852ba100SJustin Hibbits
3395*852ba100SJustin Hibbits // for IPV6 decrement additional 40 bytes of IPV6 heade size - because IPV6 header size is not included in payloadLength
3396*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP] = (uint8_t)(p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes - 40);
3397*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP + 1] = extraAddedBytesAlignedToBlockSize;
3398*852ba100SJustin Hibbits if (p_InsrtByTemplate->modifyOuterIpParams.udpPresent)
3399*852ba100SJustin Hibbits {
3400*852ba100SJustin Hibbits if ((p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + UDP_CHECKSUM_FIELD_SIZE) > p_InsrtByTemplate->size)
3401*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : UDP present according to user but (UDP offset + UDP header size) < size of header template"));
3402*852ba100SJustin Hibbits if (p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_NEXT_HEADER_OFFSET_FROM_IP] != 0x88)
3403*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("OUr suppport is only IPv6/UDPLite"));
3404*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_LENGTH_FIELD_OFFSET_FROM_UDP] = 0x00;
3405*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_LENGTH_FIELD_OFFSET_FROM_UDP + 1] = 0x08;
3406*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP] = 0x00;
3407*852ba100SJustin Hibbits p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + 1] = 0x00;
3408*852ba100SJustin Hibbits }
3409*852ba100SJustin Hibbits }
34100aeed3e9SJustin Hibbits else
34110aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("IP version supported only IPV4"));
34120aeed3e9SJustin Hibbits }
34130aeed3e9SJustin Hibbits
34140aeed3e9SJustin Hibbits tmpReg32 = tmpReg16 = tmpReg8 = 0;
34150aeed3e9SJustin Hibbits /*TODO - check it*/
34160aeed3e9SJustin Hibbits if (p_InsrtByTemplate->modifyOuterVlan)
34170aeed3e9SJustin Hibbits {
34180aeed3e9SJustin Hibbits if (p_InsrtByTemplate->modifyOuterVlanParams.vpri & ~0x07)
34190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,("Inconsistent parameters : user asked for VLAN modifications but VPRI more than 3 bits"));
34200aeed3e9SJustin Hibbits
34210aeed3e9SJustin Hibbits memcpy(&tmpReg16, &p_Template[VLAN_TAG_FIELD_OFFSET_FROM_ETH], 2*(sizeof(uint8_t)));
34220aeed3e9SJustin Hibbits if ((tmpReg16 != 0x9100) && (tmpReg16!= 0x9200) && (tmpReg16 != 0x8100))
34230aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,("Inconsistent parameters : user asked for VLAN modifications but Tag Protocol identifier is not VLAN "));
34240aeed3e9SJustin Hibbits
34250aeed3e9SJustin Hibbits memcpy(&tmpReg8, &p_Template[14],1*(sizeof(uint8_t)));
34260aeed3e9SJustin Hibbits tmpReg8 &= 0x1f;
34270aeed3e9SJustin Hibbits tmpReg8 |= (uint8_t)(p_InsrtByTemplate->modifyOuterVlanParams.vpri << 5);
34280aeed3e9SJustin Hibbits
34290aeed3e9SJustin Hibbits p_Template[14] = tmpReg8;
34300aeed3e9SJustin Hibbits }
34310aeed3e9SJustin Hibbits
3432*852ba100SJustin Hibbits MemCpy8(p_Manip->p_Template, p_Template, p_InsrtByTemplate->size);
34330aeed3e9SJustin Hibbits
34340aeed3e9SJustin Hibbits XX_Free(p_Template);
34350aeed3e9SJustin Hibbits }
34360aeed3e9SJustin Hibbits
34370aeed3e9SJustin Hibbits tmpReg32 = 0;
34380aeed3e9SJustin Hibbits if (p_Manip->h_Frag)
34390aeed3e9SJustin Hibbits {
34400aeed3e9SJustin Hibbits tmpRegNia |= (uint32_t)(XX_VirtToPhys(p_Manip->h_Frag) - (p_FmPcd->physicalMuramBase));
34410aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)p_Manip->sizeForFragmentation << 16;
34420aeed3e9SJustin Hibbits }
34430aeed3e9SJustin Hibbits else
34440aeed3e9SJustin Hibbits tmpReg32 = 0xffff0000;
34450aeed3e9SJustin Hibbits
34460aeed3e9SJustin Hibbits if (ipModify)
34470aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset << 8;
34480aeed3e9SJustin Hibbits else
34490aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)0x0000ff00;
34500aeed3e9SJustin Hibbits
34510aeed3e9SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;
34520aeed3e9SJustin Hibbits *(uint32_t *)&p_Ad->pcAndOffsets = tmpReg32;
34530aeed3e9SJustin Hibbits
34540aeed3e9SJustin Hibbits tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;
34550aeed3e9SJustin Hibbits *(uint32_t *)&p_Ad->ccAdBase = tmpRegNia;
34560aeed3e9SJustin Hibbits
34570aeed3e9SJustin Hibbits return err;
34580aeed3e9SJustin Hibbits }
34590aeed3e9SJustin Hibbits
CheckStatsParamsAndSetType(t_FmPcdManip * p_Manip,t_FmPcdStatsParams * p_StatsParams)34600aeed3e9SJustin Hibbits static t_Error CheckStatsParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdStatsParams *p_StatsParams)
34610aeed3e9SJustin Hibbits {
34620aeed3e9SJustin Hibbits
34630aeed3e9SJustin Hibbits switch (p_StatsParams->type)
34640aeed3e9SJustin Hibbits {
34650aeed3e9SJustin Hibbits case (e_FM_PCD_STATS_PER_FLOWID):
3466*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_INDEXED_STATS;
34670aeed3e9SJustin Hibbits p_Manip->muramAllocate = TRUE;
34680aeed3e9SJustin Hibbits break;
34690aeed3e9SJustin Hibbits default:
34700aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported statistics type"));
34710aeed3e9SJustin Hibbits }
34720aeed3e9SJustin Hibbits
34730aeed3e9SJustin Hibbits return E_OK;
34740aeed3e9SJustin Hibbits }
3475*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
34760aeed3e9SJustin Hibbits
FillReassmManipParams(t_FmPcdManip * p_Manip,e_NetHeaderType hdr)3477*852ba100SJustin Hibbits static t_Error FillReassmManipParams(t_FmPcdManip *p_Manip, e_NetHeaderType hdr)
3478*852ba100SJustin Hibbits {
3479*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
3480*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
3481*852ba100SJustin Hibbits uint32_t tmpReg32;
3482*852ba100SJustin Hibbits t_Error err = E_OK;
3483*852ba100SJustin Hibbits
3484*852ba100SJustin Hibbits /* Creates the Reassembly Parameters table. It contains parameters that are specific to either the IPv4 reassembly
3485*852ba100SJustin Hibbits function or to the IPv6 reassembly function. If both IPv4 reassembly and IPv6 reassembly are required, then
3486*852ba100SJustin Hibbits two separate IP Reassembly Parameter tables are required.*/
3487*852ba100SJustin Hibbits if ((err = CreateReassTable(p_Manip, hdr)) != E_OK)
3488*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
3489*852ba100SJustin Hibbits
3490*852ba100SJustin Hibbits /* Sets the first Ad register (ccAdBase) - Action Descriptor Type and Pointer to the Reassembly Parameters Table offset from MURAM*/
3491*852ba100SJustin Hibbits tmpReg32 = 0;
3492*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
3493*852ba100SJustin Hibbits
3494*852ba100SJustin Hibbits /* Gets the required Action descriptor table pointer */
3495*852ba100SJustin Hibbits switch (hdr)
3496*852ba100SJustin Hibbits {
3497*852ba100SJustin Hibbits case HEADER_TYPE_IPv4:
3498*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->reassmParams.ip.h_Ipv4Ad;
3499*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)(XX_VirtToPhys(
3500*852ba100SJustin Hibbits p_Manip->reassmParams.ip.p_Ipv4ReassTbl)
3501*852ba100SJustin Hibbits - (p_FmPcd->physicalMuramBase));
3502*852ba100SJustin Hibbits break;
3503*852ba100SJustin Hibbits case HEADER_TYPE_IPv6:
3504*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->reassmParams.ip.h_Ipv6Ad;
3505*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)(XX_VirtToPhys(
3506*852ba100SJustin Hibbits p_Manip->reassmParams.ip.p_Ipv6ReassTbl)
3507*852ba100SJustin Hibbits - (p_FmPcd->physicalMuramBase));
3508*852ba100SJustin Hibbits break;
3509*852ba100SJustin Hibbits case HEADER_TYPE_CAPWAP:
3510*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->reassmParams.capwap.h_Ad;
3511*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)(XX_VirtToPhys(
3512*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.p_ReassTbl)
3513*852ba100SJustin Hibbits - (p_FmPcd->physicalMuramBase));
3514*852ba100SJustin Hibbits break;
3515*852ba100SJustin Hibbits default:
3516*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("header type"));
3517*852ba100SJustin Hibbits }
3518*852ba100SJustin Hibbits
3519*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
3520*852ba100SJustin Hibbits
3521*852ba100SJustin Hibbits /* Sets the second Ad register (matchTblPtr) - Buffer pool ID (BPID for V2) and Scatter/Gather table offset*/
3522*852ba100SJustin Hibbits /* mark the Scatter/Gather table offset to be set later on when the port will be known */
3523*852ba100SJustin Hibbits p_Manip->updateParams = (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK);
3524*852ba100SJustin Hibbits
3525*852ba100SJustin Hibbits if ((hdr == HEADER_TYPE_IPv6) || (hdr == HEADER_TYPE_IPv4))
3526*852ba100SJustin Hibbits {
3527*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
3528*852ba100SJustin Hibbits tmpReg32 = (uint32_t)(p_Manip->reassmParams.sgBpid << 8);
3529*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->matchTblPtr, tmpReg32);
3530*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
3531*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3532*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.nonConsistentSpFqid != 0)
3533*852ba100SJustin Hibbits {
3534*852ba100SJustin Hibbits tmpReg32 = FM_PCD_AD_NCSPFQIDM_MASK
3535*852ba100SJustin Hibbits | (uint32_t)(p_Manip->reassmParams.ip.nonConsistentSpFqid);
3536*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->gmask, tmpReg32);
3537*852ba100SJustin Hibbits }
3538*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3539*852ba100SJustin Hibbits /* Sets the third Ad register (pcAndOffsets)- IP Reassemble Operation Code*/
3540*852ba100SJustin Hibbits tmpReg32 = 0;
3541*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_IP_REASSEMBLY;
3542*852ba100SJustin Hibbits }
3543*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3544*852ba100SJustin Hibbits else
3545*852ba100SJustin Hibbits if (hdr == HEADER_TYPE_CAPWAP)
3546*852ba100SJustin Hibbits {
3547*852ba100SJustin Hibbits tmpReg32 = 0;
3548*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_REASSEMBLY;
3549*852ba100SJustin Hibbits }
3550*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3551*852ba100SJustin Hibbits
3552*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
3553*852ba100SJustin Hibbits
3554*852ba100SJustin Hibbits p_Manip->reassm = TRUE;
3555*852ba100SJustin Hibbits
3556*852ba100SJustin Hibbits return E_OK;
3557*852ba100SJustin Hibbits }
3558*852ba100SJustin Hibbits
SetIpv4ReassmManip(t_FmPcdManip * p_Manip)3559*852ba100SJustin Hibbits static t_Error SetIpv4ReassmManip(t_FmPcdManip *p_Manip)
3560*852ba100SJustin Hibbits {
3561*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
3562*852ba100SJustin Hibbits
3563*852ba100SJustin Hibbits /* Allocation if IPv4 Action descriptor */
3564*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv4Ad = (t_Handle)XX_MallocSmart(
3565*852ba100SJustin Hibbits FM_PCD_CC_AD_ENTRY_SIZE, p_Manip->reassmParams.dataMemId,
3566*852ba100SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
3567*852ba100SJustin Hibbits if (!p_Manip->reassmParams.ip.h_Ipv4Ad)
3568*852ba100SJustin Hibbits {
3569*852ba100SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
3570*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
3571*852ba100SJustin Hibbits ("Allocation of IPv4 table descriptor"));
3572*852ba100SJustin Hibbits }
3573*852ba100SJustin Hibbits
3574*852ba100SJustin Hibbits memset(p_Manip->reassmParams.ip.h_Ipv4Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
3575*852ba100SJustin Hibbits
3576*852ba100SJustin Hibbits /* Fill reassembly manipulation parameter in the IP Reassembly Action Descriptor */
3577*852ba100SJustin Hibbits return FillReassmManipParams(p_Manip, HEADER_TYPE_IPv4);
3578*852ba100SJustin Hibbits }
3579*852ba100SJustin Hibbits
SetIpv6ReassmManip(t_FmPcdManip * p_Manip)3580*852ba100SJustin Hibbits static t_Error SetIpv6ReassmManip(t_FmPcdManip *p_Manip)
3581*852ba100SJustin Hibbits {
3582*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
3583*852ba100SJustin Hibbits
3584*852ba100SJustin Hibbits /* Allocation if IPv6 Action descriptor */
3585*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv6Ad = (t_Handle)XX_MallocSmart(
3586*852ba100SJustin Hibbits FM_PCD_CC_AD_ENTRY_SIZE, p_Manip->reassmParams.dataMemId,
3587*852ba100SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
3588*852ba100SJustin Hibbits if (!p_Manip->reassmParams.ip.h_Ipv6Ad)
3589*852ba100SJustin Hibbits {
3590*852ba100SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
3591*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
3592*852ba100SJustin Hibbits ("Allocation of IPv6 table descriptor"));
3593*852ba100SJustin Hibbits }
3594*852ba100SJustin Hibbits
3595*852ba100SJustin Hibbits memset(p_Manip->reassmParams.ip.h_Ipv6Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
3596*852ba100SJustin Hibbits
3597*852ba100SJustin Hibbits /* Fill reassembly manipulation parameter in the IP Reassembly Action Descriptor */
3598*852ba100SJustin Hibbits return FillReassmManipParams(p_Manip, HEADER_TYPE_IPv6);
3599*852ba100SJustin Hibbits }
3600*852ba100SJustin Hibbits
IpReassembly(t_FmPcdManipReassemParams * p_ManipReassmParams,t_FmPcdManip * p_Manip)3601*852ba100SJustin Hibbits static t_Error IpReassembly(t_FmPcdManipReassemParams *p_ManipReassmParams,
3602*852ba100SJustin Hibbits t_FmPcdManip *p_Manip)
3603*852ba100SJustin Hibbits {
3604*852ba100SJustin Hibbits uint32_t maxSetNumber = 10000;
3605*852ba100SJustin Hibbits t_FmPcdManipReassemIpParams reassmManipParams =
3606*852ba100SJustin Hibbits p_ManipReassmParams->u.ipReassem;
3607*852ba100SJustin Hibbits t_Error res;
3608*852ba100SJustin Hibbits
3609*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_FmPcd, E_INVALID_HANDLE);
3610*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(((t_FmPcd *)p_Manip->h_FmPcd)->h_Hc,
3611*852ba100SJustin Hibbits E_INVALID_HANDLE);
3612*852ba100SJustin Hibbits
3613*852ba100SJustin Hibbits /* Check validation of user's parameter.*/
3614*852ba100SJustin Hibbits if ((reassmManipParams.timeoutThresholdForReassmProcess < 1000)
3615*852ba100SJustin Hibbits || (reassmManipParams.timeoutThresholdForReassmProcess > 8000000))
3616*852ba100SJustin Hibbits RETURN_ERROR(
3617*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
3618*852ba100SJustin Hibbits ("timeoutThresholdForReassmProcess should be 1msec - 8sec"));
3619*852ba100SJustin Hibbits /* It is recommended that the total number of entries in this table (number of sets * number of ways)
3620*852ba100SJustin Hibbits will be twice the number of frames that are expected to be reassembled simultaneously.*/
3621*852ba100SJustin Hibbits if (reassmManipParams.maxNumFramesInProcess
3622*852ba100SJustin Hibbits > (reassmManipParams.maxNumFramesInProcess * maxSetNumber / 2))
3623*852ba100SJustin Hibbits RETURN_ERROR(
3624*852ba100SJustin Hibbits MAJOR,
3625*852ba100SJustin Hibbits E_INVALID_VALUE,
3626*852ba100SJustin Hibbits ("maxNumFramesInProcess has to be less than (maximun set number * number of ways / 2)"));
3627*852ba100SJustin Hibbits
3628*852ba100SJustin Hibbits if ((p_ManipReassmParams->hdr == HEADER_TYPE_IPv6)
3629*852ba100SJustin Hibbits && (reassmManipParams.minFragSize[1] < 256))
3630*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("minFragSize[1] must be >= 256"));
3631*852ba100SJustin Hibbits
3632*852ba100SJustin Hibbits /* Saves user's reassembly manipulation parameters */
3633*852ba100SJustin Hibbits p_Manip->reassmParams.ip.relativeSchemeId[0] =
3634*852ba100SJustin Hibbits reassmManipParams.relativeSchemeId[0];
3635*852ba100SJustin Hibbits p_Manip->reassmParams.ip.relativeSchemeId[1] =
3636*852ba100SJustin Hibbits reassmManipParams.relativeSchemeId[1];
3637*852ba100SJustin Hibbits p_Manip->reassmParams.ip.numOfFramesPerHashEntry[0] =
3638*852ba100SJustin Hibbits reassmManipParams.numOfFramesPerHashEntry[0];
3639*852ba100SJustin Hibbits p_Manip->reassmParams.ip.numOfFramesPerHashEntry[1] =
3640*852ba100SJustin Hibbits reassmManipParams.numOfFramesPerHashEntry[1];
3641*852ba100SJustin Hibbits p_Manip->reassmParams.ip.minFragSize[0] = reassmManipParams.minFragSize[0];
3642*852ba100SJustin Hibbits p_Manip->reassmParams.ip.minFragSize[1] = reassmManipParams.minFragSize[1];
3643*852ba100SJustin Hibbits p_Manip->reassmParams.maxNumFramesInProcess =
3644*852ba100SJustin Hibbits reassmManipParams.maxNumFramesInProcess;
3645*852ba100SJustin Hibbits p_Manip->reassmParams.timeOutMode = reassmManipParams.timeOutMode;
3646*852ba100SJustin Hibbits p_Manip->reassmParams.fqidForTimeOutFrames =
3647*852ba100SJustin Hibbits reassmManipParams.fqidForTimeOutFrames;
3648*852ba100SJustin Hibbits p_Manip->reassmParams.timeoutThresholdForReassmProcess =
3649*852ba100SJustin Hibbits reassmManipParams.timeoutThresholdForReassmProcess;
3650*852ba100SJustin Hibbits p_Manip->reassmParams.dataMemId = reassmManipParams.dataMemId;
3651*852ba100SJustin Hibbits p_Manip->reassmParams.dataLiodnOffset = reassmManipParams.dataLiodnOffset;
3652*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
3653*852ba100SJustin Hibbits p_Manip->reassmParams.sgBpid = reassmManipParams.sgBpid;
3654*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
3655*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3656*852ba100SJustin Hibbits if (reassmManipParams.nonConsistentSpFqid != 0)
3657*852ba100SJustin Hibbits {
3658*852ba100SJustin Hibbits p_Manip->reassmParams.ip.nonConsistentSpFqid =
3659*852ba100SJustin Hibbits reassmManipParams.nonConsistentSpFqid;
3660*852ba100SJustin Hibbits }
3661*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3662*852ba100SJustin Hibbits
3663*852ba100SJustin Hibbits /* Creates and initializes the IP Reassembly common parameter table */
3664*852ba100SJustin Hibbits CreateReassCommonTable(p_Manip);
3665*852ba100SJustin Hibbits
3666*852ba100SJustin Hibbits /* Creation of IPv4 reassembly manipulation */
3667*852ba100SJustin Hibbits if ((p_Manip->reassmParams.hdr == HEADER_TYPE_IPv6)
3668*852ba100SJustin Hibbits || (p_Manip->reassmParams.hdr == HEADER_TYPE_IPv4))
3669*852ba100SJustin Hibbits {
3670*852ba100SJustin Hibbits res = SetIpv4ReassmManip(p_Manip);
3671*852ba100SJustin Hibbits if (res != E_OK)
3672*852ba100SJustin Hibbits return res;
3673*852ba100SJustin Hibbits }
3674*852ba100SJustin Hibbits
3675*852ba100SJustin Hibbits /* Creation of IPv6 reassembly manipulation */
3676*852ba100SJustin Hibbits if (p_Manip->reassmParams.hdr == HEADER_TYPE_IPv6)
3677*852ba100SJustin Hibbits {
3678*852ba100SJustin Hibbits res = SetIpv6ReassmManip(p_Manip);
3679*852ba100SJustin Hibbits if (res != E_OK)
3680*852ba100SJustin Hibbits return res;
3681*852ba100SJustin Hibbits }
3682*852ba100SJustin Hibbits
3683*852ba100SJustin Hibbits return E_OK;
3684*852ba100SJustin Hibbits }
3685*852ba100SJustin Hibbits
setIpReassmSchemeParams(t_FmPcd * p_FmPcd,t_FmPcdKgSchemeParams * p_Scheme,t_Handle h_CcTree,bool ipv4,uint8_t groupId)3686*852ba100SJustin Hibbits static void setIpReassmSchemeParams(t_FmPcd* p_FmPcd,
3687*852ba100SJustin Hibbits t_FmPcdKgSchemeParams *p_Scheme,
3688*852ba100SJustin Hibbits t_Handle h_CcTree, bool ipv4,
3689*852ba100SJustin Hibbits uint8_t groupId)
3690*852ba100SJustin Hibbits {
3691*852ba100SJustin Hibbits uint32_t j;
3692*852ba100SJustin Hibbits uint8_t res;
3693*852ba100SJustin Hibbits
3694*852ba100SJustin Hibbits /* Configures scheme's network environment parameters */
3695*852ba100SJustin Hibbits p_Scheme->netEnvParams.numOfDistinctionUnits = 2;
3696*852ba100SJustin Hibbits if (ipv4)
3697*852ba100SJustin Hibbits res = FmPcdNetEnvGetUnitId(
3698*852ba100SJustin Hibbits p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),
3699*852ba100SJustin Hibbits HEADER_TYPE_IPv4, FALSE, 0);
3700*852ba100SJustin Hibbits else
3701*852ba100SJustin Hibbits res = FmPcdNetEnvGetUnitId(
3702*852ba100SJustin Hibbits p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),
3703*852ba100SJustin Hibbits HEADER_TYPE_IPv6, FALSE, 0);
3704*852ba100SJustin Hibbits ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
3705*852ba100SJustin Hibbits p_Scheme->netEnvParams.unitIds[0] = res;
3706*852ba100SJustin Hibbits
3707*852ba100SJustin Hibbits res = FmPcdNetEnvGetUnitId(
3708*852ba100SJustin Hibbits p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),
3709*852ba100SJustin Hibbits HEADER_TYPE_USER_DEFINED_SHIM2, FALSE, 0);
3710*852ba100SJustin Hibbits ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
3711*852ba100SJustin Hibbits p_Scheme->netEnvParams.unitIds[1] = res;
3712*852ba100SJustin Hibbits
3713*852ba100SJustin Hibbits /* Configures scheme's next engine parameters*/
3714*852ba100SJustin Hibbits p_Scheme->nextEngine = e_FM_PCD_CC;
3715*852ba100SJustin Hibbits p_Scheme->kgNextEngineParams.cc.h_CcTree = h_CcTree;
3716*852ba100SJustin Hibbits p_Scheme->kgNextEngineParams.cc.grpId = groupId;
3717*852ba100SJustin Hibbits p_Scheme->useHash = TRUE;
3718*852ba100SJustin Hibbits
3719*852ba100SJustin Hibbits /* Configures scheme's key*/
3720*852ba100SJustin Hibbits if (ipv4 == TRUE)
3721*852ba100SJustin Hibbits {
3722*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 4;
3723*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].type =
3724*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3725*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.type =
3726*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FULL_FIELD;
3727*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.hdr =
3728*852ba100SJustin Hibbits HEADER_TYPE_IPv4;
3729*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.extractByHdrType.fullField.ipv4 =
3730*852ba100SJustin Hibbits NET_HEADER_FIELD_IPv4_DST_IP;
3731*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].type =
3732*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3733*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.type =
3734*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FULL_FIELD;
3735*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.hdr =
3736*852ba100SJustin Hibbits HEADER_TYPE_IPv4;
3737*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.extractByHdrType.fullField.ipv4 =
3738*852ba100SJustin Hibbits NET_HEADER_FIELD_IPv4_SRC_IP;
3739*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].type =
3740*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3741*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.type =
3742*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FULL_FIELD;
3743*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.hdr =
3744*852ba100SJustin Hibbits HEADER_TYPE_IPv4;
3745*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fullField.ipv4 =
3746*852ba100SJustin Hibbits NET_HEADER_FIELD_IPv4_PROTO;
3747*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[3].type =
3748*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3749*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.hdr =
3750*852ba100SJustin Hibbits HEADER_TYPE_IPv4;
3751*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.type =
3752*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FROM_HDR;
3753*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.ignoreProtocolValidation =
3754*852ba100SJustin Hibbits FALSE;
3755*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.extractByHdrType.fromHdr.size =
3756*852ba100SJustin Hibbits 2;
3757*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.extractByHdrType.fromHdr.offset =
3758*852ba100SJustin Hibbits 4;
3759*852ba100SJustin Hibbits }
3760*852ba100SJustin Hibbits else /* IPv6 */
3761*852ba100SJustin Hibbits {
3762*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 3;
3763*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].type =
3764*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3765*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.type =
3766*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FULL_FIELD;
3767*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.hdr =
3768*852ba100SJustin Hibbits HEADER_TYPE_IPv6;
3769*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.extractByHdrType.fullField.ipv6 =
3770*852ba100SJustin Hibbits NET_HEADER_FIELD_IPv6_DST_IP;
3771*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].type =
3772*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3773*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.type =
3774*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FULL_FIELD;
3775*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.hdr =
3776*852ba100SJustin Hibbits HEADER_TYPE_IPv6;
3777*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.extractByHdrType.fullField.ipv6 =
3778*852ba100SJustin Hibbits NET_HEADER_FIELD_IPv6_SRC_IP;
3779*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].type =
3780*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_BY_HDR;
3781*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.hdr =
3782*852ba100SJustin Hibbits HEADER_TYPE_USER_DEFINED_SHIM2;
3783*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.type =
3784*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FROM_HDR;
3785*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fromHdr.size =
3786*852ba100SJustin Hibbits 4;
3787*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fromHdr.offset =
3788*852ba100SJustin Hibbits 4;
3789*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.ignoreProtocolValidation =
3790*852ba100SJustin Hibbits TRUE;
3791*852ba100SJustin Hibbits }
3792*852ba100SJustin Hibbits
3793*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.privateDflt0 = 0x01020304;
3794*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.privateDflt1 = 0x11121314;
3795*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.numOfUsedDflts =
3796*852ba100SJustin Hibbits FM_PCD_KG_NUM_OF_DEFAULT_GROUPS;
3797*852ba100SJustin Hibbits for (j = 0; j < FM_PCD_KG_NUM_OF_DEFAULT_GROUPS; j++)
3798*852ba100SJustin Hibbits {
3799*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.dflts[j].type =
3800*852ba100SJustin Hibbits (e_FmPcdKgKnownFieldsDfltTypes)j; /* all types */
3801*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.dflts[j].dfltSelect =
3802*852ba100SJustin Hibbits e_FM_PCD_KG_DFLT_GBL_0;
3803*852ba100SJustin Hibbits }
3804*852ba100SJustin Hibbits }
3805*852ba100SJustin Hibbits
IpReassemblyStats(t_FmPcdManip * p_Manip,t_FmPcdManipReassemIpStats * p_Stats)3806*852ba100SJustin Hibbits static t_Error IpReassemblyStats(t_FmPcdManip *p_Manip,
3807*852ba100SJustin Hibbits t_FmPcdManipReassemIpStats *p_Stats)
3808*852ba100SJustin Hibbits {
3809*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
3810*852ba100SJustin Hibbits ASSERT_COND(p_Stats);
3811*852ba100SJustin Hibbits ASSERT_COND(p_Manip->reassmParams.p_ReassCommonTbl);
3812*852ba100SJustin Hibbits
3813*852ba100SJustin Hibbits p_Stats->timeout =
3814*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalTimeOutCounter);
3815*852ba100SJustin Hibbits p_Stats->rfdPoolBusy =
3816*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalRfdPoolBusyCounter);
3817*852ba100SJustin Hibbits p_Stats->internalBufferBusy =
3818*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalInternalBufferBusy);
3819*852ba100SJustin Hibbits p_Stats->externalBufferBusy =
3820*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalExternalBufferBusy);
3821*852ba100SJustin Hibbits p_Stats->sgFragments =
3822*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalSgFragmentCounter);
3823*852ba100SJustin Hibbits p_Stats->dmaSemaphoreDepletion =
3824*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalDmaSemaphoreDepletionCounter);
3825*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3826*852ba100SJustin Hibbits p_Stats->nonConsistentSp =
3827*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalNCSPCounter);
3828*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3829*852ba100SJustin Hibbits
3830*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.p_Ipv4ReassTbl)
3831*852ba100SJustin Hibbits {
3832*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].successfullyReassembled =
3833*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalSuccessfullyReasmFramesCounter);
3834*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].validFragments =
3835*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalValidFragmentCounter);
3836*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].processedFragments =
3837*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalProcessedFragCounter);
3838*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].malformedFragments =
3839*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalMalformdFragCounter);
3840*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].autoLearnBusy =
3841*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalSetBusyCounter);
3842*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].discardedFragments =
3843*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalDiscardedFragsCounter);
3844*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[0].moreThan16Fragments =
3845*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalMoreThan16FramesCounter);
3846*852ba100SJustin Hibbits }
3847*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.p_Ipv6ReassTbl)
3848*852ba100SJustin Hibbits {
3849*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].successfullyReassembled =
3850*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalSuccessfullyReasmFramesCounter);
3851*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].validFragments =
3852*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalValidFragmentCounter);
3853*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].processedFragments =
3854*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalProcessedFragCounter);
3855*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].malformedFragments =
3856*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalMalformdFragCounter);
3857*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].autoLearnBusy =
3858*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalSetBusyCounter);
3859*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].discardedFragments =
3860*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalDiscardedFragsCounter);
3861*852ba100SJustin Hibbits p_Stats->specificHdrStatistics[1].moreThan16Fragments =
3862*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalMoreThan16FramesCounter);
3863*852ba100SJustin Hibbits }
3864*852ba100SJustin Hibbits return E_OK;
3865*852ba100SJustin Hibbits }
3866*852ba100SJustin Hibbits
IpFragmentationStats(t_FmPcdManip * p_Manip,t_FmPcdManipFragIpStats * p_Stats)3867*852ba100SJustin Hibbits static t_Error IpFragmentationStats(t_FmPcdManip *p_Manip,
3868*852ba100SJustin Hibbits t_FmPcdManipFragIpStats *p_Stats)
3869*852ba100SJustin Hibbits {
3870*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
3871*852ba100SJustin Hibbits
3872*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
3873*852ba100SJustin Hibbits ASSERT_COND(p_Stats);
3874*852ba100SJustin Hibbits ASSERT_COND(p_Manip->h_Ad);
3875*852ba100SJustin Hibbits ASSERT_COND(p_Manip->fragParams.p_Frag);
3876*852ba100SJustin Hibbits
3877*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
3878*852ba100SJustin Hibbits
3879*852ba100SJustin Hibbits p_Stats->totalFrames = GET_UINT32(p_Ad->gmask);
3880*852ba100SJustin Hibbits p_Stats->fragmentedFrames = GET_UINT32(p_Manip->fragParams.p_Frag->ccAdBase)
3881*852ba100SJustin Hibbits & 0x00ffffff;
3882*852ba100SJustin Hibbits p_Stats->generatedFragments =
3883*852ba100SJustin Hibbits GET_UINT32(p_Manip->fragParams.p_Frag->matchTblPtr);
3884*852ba100SJustin Hibbits
3885*852ba100SJustin Hibbits return E_OK;
3886*852ba100SJustin Hibbits }
3887*852ba100SJustin Hibbits
IpFragmentation(t_FmPcdManipFragIpParams * p_ManipParams,t_FmPcdManip * p_Manip)3888*852ba100SJustin Hibbits static t_Error IpFragmentation(t_FmPcdManipFragIpParams *p_ManipParams,
3889*852ba100SJustin Hibbits t_FmPcdManip *p_Manip)
3890*852ba100SJustin Hibbits {
3891*852ba100SJustin Hibbits uint32_t pcAndOffsetsReg = 0, ccAdBaseReg = 0, gmaskReg = 0;
3892*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
3893*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
3894*852ba100SJustin Hibbits t_Error err = E_OK;
3895*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
3896*852ba100SJustin Hibbits
3897*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);
3898*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams->sizeForFragmentation != 0xFFFF,
3899*852ba100SJustin Hibbits E_INVALID_VALUE);
3900*852ba100SJustin Hibbits
3901*852ba100SJustin Hibbits p_FmPcd = p_Manip->h_FmPcd;
3902*852ba100SJustin Hibbits /* Allocation of fragmentation Action Descriptor */
3903*852ba100SJustin Hibbits p_Manip->fragParams.p_Frag = (t_AdOfTypeContLookup *)FM_MURAM_AllocMem(
3904*852ba100SJustin Hibbits p_FmPcd->h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE,
3905*852ba100SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
3906*852ba100SJustin Hibbits if (!p_Manip->fragParams.p_Frag)
3907*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
3908*852ba100SJustin Hibbits ("MURAM alloc for Fragmentation table descriptor"));
3909*852ba100SJustin Hibbits MemSet8(p_Manip->fragParams.p_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);
3910*852ba100SJustin Hibbits
3911*852ba100SJustin Hibbits /* Prepare the third Ad register (pcAndOffsets)- OperationCode */
3912*852ba100SJustin Hibbits pcAndOffsetsReg = (uint32_t)HMAN_OC_IP_FRAGMENTATION;
3913*852ba100SJustin Hibbits
3914*852ba100SJustin Hibbits /* Prepare the first Ad register (ccAdBase) - Don't frag action and Action descriptor type*/
3915*852ba100SJustin Hibbits ccAdBaseReg = FM_PCD_AD_CONT_LOOKUP_TYPE;
3916*852ba100SJustin Hibbits ccAdBaseReg |= (p_ManipParams->dontFragAction
3917*852ba100SJustin Hibbits << FM_PCD_MANIP_IP_FRAG_DF_SHIFT);
3918*852ba100SJustin Hibbits
3919*852ba100SJustin Hibbits
3920*852ba100SJustin Hibbits /* Set Scatter/Gather BPid */
3921*852ba100SJustin Hibbits if (p_ManipParams->sgBpidEn)
3922*852ba100SJustin Hibbits {
3923*852ba100SJustin Hibbits ccAdBaseReg |= FM_PCD_MANIP_IP_FRAG_SG_BDID_EN;
3924*852ba100SJustin Hibbits pcAndOffsetsReg |= ((p_ManipParams->sgBpid
3925*852ba100SJustin Hibbits << FM_PCD_MANIP_IP_FRAG_SG_BDID_SHIFT)
3926*852ba100SJustin Hibbits & FM_PCD_MANIP_IP_FRAG_SG_BDID_MASK);
3927*852ba100SJustin Hibbits }
3928*852ba100SJustin Hibbits
3929*852ba100SJustin Hibbits /* Prepare the first Ad register (gmask) - scratch buffer pool id and Pointer to fragment ID */
3930*852ba100SJustin Hibbits gmaskReg = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr))
3931*852ba100SJustin Hibbits - p_FmPcd->physicalMuramBase);
3932*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
3933*852ba100SJustin Hibbits gmaskReg |= p_ManipParams->scratchBpid << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;
3934*852ba100SJustin Hibbits #else
3935*852ba100SJustin Hibbits gmaskReg |= (0xFF) << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;
3936*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
3937*852ba100SJustin Hibbits
3938*852ba100SJustin Hibbits /* Set all Ad registers */
3939*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->fragParams.p_Frag->pcAndOffsets, pcAndOffsetsReg);
3940*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->fragParams.p_Frag->ccAdBase, ccAdBaseReg);
3941*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->fragParams.p_Frag->gmask, gmaskReg);
3942*852ba100SJustin Hibbits
3943*852ba100SJustin Hibbits /* Saves user's fragmentation manipulation parameters */
3944*852ba100SJustin Hibbits p_Manip->frag = TRUE;
3945*852ba100SJustin Hibbits p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;
3946*852ba100SJustin Hibbits
3947*852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
3948*852ba100SJustin Hibbits p_Manip->fragParams.scratchBpid = p_ManipParams->scratchBpid;
3949*852ba100SJustin Hibbits
3950*852ba100SJustin Hibbits /* scratch buffer pool initialization */
3951*852ba100SJustin Hibbits if ((err = FmPcdFragHcScratchPoolFill((t_Handle)p_FmPcd, p_ManipParams->scratchBpid)) != E_OK)
3952*852ba100SJustin Hibbits {
3953*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_Frag);
3954*852ba100SJustin Hibbits p_Manip->fragParams.p_Frag = NULL;
3955*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
3956*852ba100SJustin Hibbits }
3957*852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
3958*852ba100SJustin Hibbits
3959*852ba100SJustin Hibbits return E_OK;
3960*852ba100SJustin Hibbits }
3961*852ba100SJustin Hibbits
IPManip(t_FmPcdManip * p_Manip)3962*852ba100SJustin Hibbits static t_Error IPManip(t_FmPcdManip *p_Manip)
3963*852ba100SJustin Hibbits {
3964*852ba100SJustin Hibbits t_Error err = E_OK;
3965*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
3966*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
3967*852ba100SJustin Hibbits uint32_t tmpReg32 = 0, tmpRegNia = 0;
3968*852ba100SJustin Hibbits
3969*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
3970*852ba100SJustin Hibbits p_FmPcd = p_Manip->h_FmPcd;
3971*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
3972*852ba100SJustin Hibbits
3973*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
3974*852ba100SJustin Hibbits
3975*852ba100SJustin Hibbits tmpReg32 = FM_PCD_MANIP_IP_NO_FRAGMENTATION;
3976*852ba100SJustin Hibbits if (p_Manip->frag == TRUE)
3977*852ba100SJustin Hibbits {
3978*852ba100SJustin Hibbits tmpRegNia = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_Frag)
3979*852ba100SJustin Hibbits - (p_FmPcd->physicalMuramBase));
3980*852ba100SJustin Hibbits tmpReg32 = (uint32_t)p_Manip->sizeForFragmentation
3981*852ba100SJustin Hibbits << FM_PCD_MANIP_IP_MTU_SHIFT;
3982*852ba100SJustin Hibbits }
3983*852ba100SJustin Hibbits
3984*852ba100SJustin Hibbits tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;
3985*852ba100SJustin Hibbits tmpReg32 |= HMAN_OC_IP_MANIP;
3986*852ba100SJustin Hibbits
3987*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3988*852ba100SJustin Hibbits tmpRegNia |= FM_PCD_MANIP_IP_CNIA;
3989*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3990*852ba100SJustin Hibbits
3991*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
3992*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpRegNia);
3993*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->gmask, 0);
3994*852ba100SJustin Hibbits /* Total frame counter - MUST be initialized to zero.*/
3995*852ba100SJustin Hibbits
3996*852ba100SJustin Hibbits return err;
3997*852ba100SJustin Hibbits }
3998*852ba100SJustin Hibbits
UpdateInitIpFrag(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate)3999*852ba100SJustin Hibbits static t_Error UpdateInitIpFrag(t_Handle h_FmPcd, t_Handle h_PcdParams,
4000*852ba100SJustin Hibbits t_Handle h_FmPort, t_FmPcdManip *p_Manip,
4001*852ba100SJustin Hibbits t_Handle h_Ad, bool validate)
4002*852ba100SJustin Hibbits {
4003*852ba100SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
4004*852ba100SJustin Hibbits t_Error err;
4005*852ba100SJustin Hibbits
4006*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
4007*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_IP_FRAGMENTATION),
4008*852ba100SJustin Hibbits E_INVALID_STATE);
4009*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
4010*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE);
4011*852ba100SJustin Hibbits
4012*852ba100SJustin Hibbits UNUSED(h_FmPcd);
4013*852ba100SJustin Hibbits UNUSED(h_Ad);
4014*852ba100SJustin Hibbits UNUSED(h_PcdParams);
4015*852ba100SJustin Hibbits UNUSED(validate);
4016*852ba100SJustin Hibbits UNUSED(p_Manip);
4017*852ba100SJustin Hibbits
4018*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = 0;
4019*852ba100SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = MANIP_EXTRA_SPACE;
4020*852ba100SJustin Hibbits if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)
4021*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
4022*852ba100SJustin Hibbits
4023*852ba100SJustin Hibbits if (!fmPortGetSetCcParams.getCcParams.internalBufferOffset)
4024*852ba100SJustin Hibbits DBG(WARNING, ("manipExtraSpace must be larger than '0'"));
4025*852ba100SJustin Hibbits
4026*852ba100SJustin Hibbits return E_OK;
4027*852ba100SJustin Hibbits }
4028*852ba100SJustin Hibbits
IPSecManip(t_FmPcdManipParams * p_ManipParams,t_FmPcdManip * p_Manip)4029*852ba100SJustin Hibbits static t_Error IPSecManip(t_FmPcdManipParams *p_ManipParams,
4030*852ba100SJustin Hibbits t_FmPcdManip *p_Manip)
4031*852ba100SJustin Hibbits {
4032*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
4033*852ba100SJustin Hibbits t_FmPcdManipSpecialOffloadIPSecParams *p_IPSecParams;
4034*852ba100SJustin Hibbits t_Error err = E_OK;
4035*852ba100SJustin Hibbits uint32_t tmpReg32 = 0;
4036*852ba100SJustin Hibbits uint32_t power;
4037*852ba100SJustin Hibbits
4038*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
4039*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE);
4040*852ba100SJustin Hibbits
4041*852ba100SJustin Hibbits p_IPSecParams = &p_ManipParams->u.specialOffload.u.ipsec;
4042*852ba100SJustin Hibbits
4043*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
4044*852ba100SJustin Hibbits !p_IPSecParams->variableIpHdrLen || p_IPSecParams->decryption,
4045*852ba100SJustin Hibbits E_INVALID_VALUE);
4046*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
4047*852ba100SJustin Hibbits !p_IPSecParams->variableIpVersion || !p_IPSecParams->decryption,
4048*852ba100SJustin Hibbits E_INVALID_VALUE);
4049*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
4050*852ba100SJustin Hibbits !p_IPSecParams->variableIpVersion || p_IPSecParams->outerIPHdrLen,
4051*852ba100SJustin Hibbits E_INVALID_VALUE);
4052*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
4053*852ba100SJustin Hibbits !p_IPSecParams->arwSize || p_IPSecParams->arwAddr,
4054*852ba100SJustin Hibbits E_INVALID_VALUE);
4055*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(
4056*852ba100SJustin Hibbits !p_IPSecParams->arwSize || p_IPSecParams->decryption,
4057*852ba100SJustin Hibbits E_INVALID_VALUE);
4058*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR((p_IPSecParams->arwSize % 16) == 0, E_INVALID_VALUE);
4059*852ba100SJustin Hibbits
4060*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
4061*852ba100SJustin Hibbits
4062*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
4063*852ba100SJustin Hibbits tmpReg32 |= (p_IPSecParams->decryption) ? FM_PCD_MANIP_IPSEC_DEC : 0;
4064*852ba100SJustin Hibbits tmpReg32 |= (p_IPSecParams->ecnCopy) ? FM_PCD_MANIP_IPSEC_ECN_EN : 0;
4065*852ba100SJustin Hibbits tmpReg32 |= (p_IPSecParams->dscpCopy) ? FM_PCD_MANIP_IPSEC_DSCP_EN : 0;
4066*852ba100SJustin Hibbits tmpReg32 |=
4067*852ba100SJustin Hibbits (p_IPSecParams->variableIpHdrLen) ? FM_PCD_MANIP_IPSEC_VIPL_EN : 0;
4068*852ba100SJustin Hibbits tmpReg32 |=
4069*852ba100SJustin Hibbits (p_IPSecParams->variableIpVersion) ? FM_PCD_MANIP_IPSEC_VIPV_EN : 0;
4070*852ba100SJustin Hibbits if (p_IPSecParams->arwSize)
4071*852ba100SJustin Hibbits tmpReg32 |= (uint32_t)((XX_VirtToPhys(UINT_TO_PTR(p_IPSecParams->arwAddr))-FM_MM_MURAM)
4072*852ba100SJustin Hibbits & (FM_MURAM_SIZE-1));
4073*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
4074*852ba100SJustin Hibbits
4075*852ba100SJustin Hibbits tmpReg32 = 0;
4076*852ba100SJustin Hibbits if (p_IPSecParams->arwSize) {
4077*852ba100SJustin Hibbits NEXT_POWER_OF_2((p_IPSecParams->arwSize + 32), power);
4078*852ba100SJustin Hibbits LOG2(power, power);
4079*852ba100SJustin Hibbits tmpReg32 = (p_IPSecParams->arwSize | (power - 5)) << FM_PCD_MANIP_IPSEC_ARW_SIZE_SHIFT;
4080*852ba100SJustin Hibbits }
4081*852ba100SJustin Hibbits
4082*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
4083*852ba100SJustin Hibbits tmpReg32 |=
4084*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)-
4085*852ba100SJustin Hibbits (((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4;
4086*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->matchTblPtr, tmpReg32);
4087*852ba100SJustin Hibbits
4088*852ba100SJustin Hibbits tmpReg32 = HMAN_OC_IPSEC_MANIP;
4089*852ba100SJustin Hibbits tmpReg32 |= p_IPSecParams->outerIPHdrLen
4090*852ba100SJustin Hibbits << FM_PCD_MANIP_IPSEC_IP_HDR_LEN_SHIFT;
4091*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
4092*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_IPSEC_NADEN;
4093*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
4094*852ba100SJustin Hibbits
4095*852ba100SJustin Hibbits return err;
4096*852ba100SJustin Hibbits }
4097*852ba100SJustin Hibbits
SetCapwapReassmManip(t_FmPcdManip * p_Manip)4098*852ba100SJustin Hibbits static t_Error SetCapwapReassmManip(t_FmPcdManip *p_Manip)
4099*852ba100SJustin Hibbits {
4100*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
4101*852ba100SJustin Hibbits
4102*852ba100SJustin Hibbits /* Allocation if CAPWAP Action descriptor */
4103*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.h_Ad = (t_Handle)XX_MallocSmart(
4104*852ba100SJustin Hibbits FM_PCD_CC_AD_ENTRY_SIZE, p_Manip->reassmParams.dataMemId,
4105*852ba100SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
4106*852ba100SJustin Hibbits if (!p_Manip->reassmParams.capwap.h_Ad)
4107*852ba100SJustin Hibbits {
4108*852ba100SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
4109*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
4110*852ba100SJustin Hibbits ("Allocation of CAPWAP table descriptor"));
4111*852ba100SJustin Hibbits }
4112*852ba100SJustin Hibbits
4113*852ba100SJustin Hibbits memset(p_Manip->reassmParams.capwap.h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
4114*852ba100SJustin Hibbits
4115*852ba100SJustin Hibbits /* Fill reassembly manipulation parameter in the Reassembly Action Descriptor */
4116*852ba100SJustin Hibbits return FillReassmManipParams(p_Manip, HEADER_TYPE_CAPWAP);
4117*852ba100SJustin Hibbits }
4118*852ba100SJustin Hibbits
setCapwapReassmSchemeParams(t_FmPcd * p_FmPcd,t_FmPcdKgSchemeParams * p_Scheme,t_Handle h_CcTree,uint8_t groupId)4119*852ba100SJustin Hibbits static void setCapwapReassmSchemeParams(t_FmPcd* p_FmPcd,
4120*852ba100SJustin Hibbits t_FmPcdKgSchemeParams *p_Scheme,
4121*852ba100SJustin Hibbits t_Handle h_CcTree, uint8_t groupId)
4122*852ba100SJustin Hibbits {
4123*852ba100SJustin Hibbits uint8_t res;
4124*852ba100SJustin Hibbits
4125*852ba100SJustin Hibbits /* Configures scheme's network environment parameters */
4126*852ba100SJustin Hibbits p_Scheme->netEnvParams.numOfDistinctionUnits = 1;
4127*852ba100SJustin Hibbits res = FmPcdNetEnvGetUnitId(
4128*852ba100SJustin Hibbits p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),
4129*852ba100SJustin Hibbits HEADER_TYPE_USER_DEFINED_SHIM2, FALSE, 0);
4130*852ba100SJustin Hibbits ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
4131*852ba100SJustin Hibbits p_Scheme->netEnvParams.unitIds[0] = res;
4132*852ba100SJustin Hibbits
4133*852ba100SJustin Hibbits /* Configures scheme's next engine parameters*/
4134*852ba100SJustin Hibbits p_Scheme->nextEngine = e_FM_PCD_CC;
4135*852ba100SJustin Hibbits p_Scheme->kgNextEngineParams.cc.h_CcTree = h_CcTree;
4136*852ba100SJustin Hibbits p_Scheme->kgNextEngineParams.cc.grpId = groupId;
4137*852ba100SJustin Hibbits p_Scheme->useHash = TRUE;
4138*852ba100SJustin Hibbits
4139*852ba100SJustin Hibbits /* Configures scheme's key*/
4140*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 2;
4141*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].type =
4142*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_NON_HDR;
4143*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.src =
4144*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FROM_PARSE_RESULT;
4145*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.action =
4146*852ba100SJustin Hibbits e_FM_PCD_ACTION_NONE;
4147*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.offset = 20;
4148*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.size = 4;
4149*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].type =
4150*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_NON_HDR;
4151*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.src =
4152*852ba100SJustin Hibbits e_FM_PCD_EXTRACT_FROM_DFLT_VALUE;
4153*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.action =
4154*852ba100SJustin Hibbits e_FM_PCD_ACTION_NONE;
4155*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.offset = 0;
4156*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.size = 1;
4157*852ba100SJustin Hibbits
4158*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.privateDflt0 = 0x0;
4159*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.privateDflt1 = 0x0;
4160*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.numOfUsedDflts = 1;
4161*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.dflts[0].type = e_FM_PCD_KG_GENERIC_NOT_FROM_DATA;
4162*852ba100SJustin Hibbits p_Scheme->keyExtractAndHashParams.dflts[0].dfltSelect = e_FM_PCD_KG_DFLT_PRIVATE_0;
4163*852ba100SJustin Hibbits }
4164*852ba100SJustin Hibbits
4165*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
CapwapReassemblyStats(t_FmPcdManip * p_Manip,t_FmPcdManipReassemCapwapStats * p_Stats)4166*852ba100SJustin Hibbits static t_Error CapwapReassemblyStats(t_FmPcdManip *p_Manip,
4167*852ba100SJustin Hibbits t_FmPcdManipReassemCapwapStats *p_Stats)
4168*852ba100SJustin Hibbits {
4169*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
4170*852ba100SJustin Hibbits ASSERT_COND(p_Stats);
4171*852ba100SJustin Hibbits ASSERT_COND(p_Manip->reassmParams.p_ReassCommonTbl);
4172*852ba100SJustin Hibbits
4173*852ba100SJustin Hibbits p_Stats->timeout =
4174*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalTimeOutCounter);
4175*852ba100SJustin Hibbits p_Stats->rfdPoolBusy =
4176*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalRfdPoolBusyCounter);
4177*852ba100SJustin Hibbits p_Stats->internalBufferBusy =
4178*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalInternalBufferBusy);
4179*852ba100SJustin Hibbits p_Stats->externalBufferBusy =
4180*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalExternalBufferBusy);
4181*852ba100SJustin Hibbits p_Stats->sgFragments =
4182*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalSgFragmentCounter);
4183*852ba100SJustin Hibbits p_Stats->dmaSemaphoreDepletion =
4184*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalDmaSemaphoreDepletionCounter);
4185*852ba100SJustin Hibbits p_Stats->exceedMaxReassemblyFrameLen =
4186*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalNCSPCounter);
4187*852ba100SJustin Hibbits
4188*852ba100SJustin Hibbits p_Stats->successfullyReassembled =
4189*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalSuccessfullyReasmFramesCounter);
4190*852ba100SJustin Hibbits p_Stats->validFragments =
4191*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalValidFragmentCounter);
4192*852ba100SJustin Hibbits p_Stats->processedFragments =
4193*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalProcessedFragCounter);
4194*852ba100SJustin Hibbits p_Stats->malformedFragments =
4195*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalMalformdFragCounter);
4196*852ba100SJustin Hibbits p_Stats->autoLearnBusy =
4197*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalSetBusyCounter);
4198*852ba100SJustin Hibbits p_Stats->discardedFragments =
4199*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalDiscardedFragsCounter);
4200*852ba100SJustin Hibbits p_Stats->moreThan16Fragments =
4201*852ba100SJustin Hibbits GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalMoreThan16FramesCounter);
4202*852ba100SJustin Hibbits
4203*852ba100SJustin Hibbits return E_OK;
4204*852ba100SJustin Hibbits }
4205*852ba100SJustin Hibbits
CapwapFragmentationStats(t_FmPcdManip * p_Manip,t_FmPcdManipFragCapwapStats * p_Stats)4206*852ba100SJustin Hibbits static t_Error CapwapFragmentationStats(t_FmPcdManip *p_Manip,
4207*852ba100SJustin Hibbits t_FmPcdManipFragCapwapStats *p_Stats)
4208*852ba100SJustin Hibbits {
4209*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
4210*852ba100SJustin Hibbits
4211*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
4212*852ba100SJustin Hibbits ASSERT_COND(p_Stats);
4213*852ba100SJustin Hibbits ASSERT_COND(p_Manip->h_Ad);
4214*852ba100SJustin Hibbits ASSERT_COND(p_Manip->fragParams.p_Frag);
4215*852ba100SJustin Hibbits
4216*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
4217*852ba100SJustin Hibbits
4218*852ba100SJustin Hibbits p_Stats->totalFrames = GET_UINT32(p_Ad->gmask);
4219*852ba100SJustin Hibbits
4220*852ba100SJustin Hibbits return E_OK;
4221*852ba100SJustin Hibbits }
4222*852ba100SJustin Hibbits
CapwapReassembly(t_FmPcdManipReassemParams * p_ManipReassmParams,t_FmPcdManip * p_Manip)4223*852ba100SJustin Hibbits static t_Error CapwapReassembly(t_FmPcdManipReassemParams *p_ManipReassmParams,
4224*852ba100SJustin Hibbits t_FmPcdManip *p_Manip)
4225*852ba100SJustin Hibbits {
4226*852ba100SJustin Hibbits uint32_t maxSetNumber = 10000;
4227*852ba100SJustin Hibbits t_FmPcdManipReassemCapwapParams reassmManipParams =
4228*852ba100SJustin Hibbits p_ManipReassmParams->u.capwapReassem;
4229*852ba100SJustin Hibbits t_Error res;
4230*852ba100SJustin Hibbits
4231*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_FmPcd, E_INVALID_HANDLE);
4232*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(((t_FmPcd *)p_Manip->h_FmPcd)->h_Hc,
4233*852ba100SJustin Hibbits E_INVALID_HANDLE);
4234*852ba100SJustin Hibbits
4235*852ba100SJustin Hibbits /* Check validation of user's parameter.*/
4236*852ba100SJustin Hibbits if ((reassmManipParams.timeoutThresholdForReassmProcess < 1000)
4237*852ba100SJustin Hibbits || (reassmManipParams.timeoutThresholdForReassmProcess > 8000000))
4238*852ba100SJustin Hibbits RETURN_ERROR(
4239*852ba100SJustin Hibbits MAJOR, E_INVALID_VALUE,
4240*852ba100SJustin Hibbits ("timeoutThresholdForReassmProcess should be 1msec - 8sec"));
4241*852ba100SJustin Hibbits /* It is recommended that the total number of entries in this table (number of sets * number of ways)
4242*852ba100SJustin Hibbits will be twice the number of frames that are expected to be reassembled simultaneously.*/
4243*852ba100SJustin Hibbits if (reassmManipParams.maxNumFramesInProcess
4244*852ba100SJustin Hibbits > (reassmManipParams.maxNumFramesInProcess * maxSetNumber / 2))
4245*852ba100SJustin Hibbits RETURN_ERROR(
4246*852ba100SJustin Hibbits MAJOR,
4247*852ba100SJustin Hibbits E_INVALID_VALUE,
4248*852ba100SJustin Hibbits ("maxNumFramesInProcess has to be less than (maximun set number * number of ways / 2)"));
4249*852ba100SJustin Hibbits
4250*852ba100SJustin Hibbits /* Saves user's reassembly manipulation parameters */
4251*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.relativeSchemeId =
4252*852ba100SJustin Hibbits reassmManipParams.relativeSchemeId;
4253*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.numOfFramesPerHashEntry =
4254*852ba100SJustin Hibbits reassmManipParams.numOfFramesPerHashEntry;
4255*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.maxRessembledsSize =
4256*852ba100SJustin Hibbits reassmManipParams.maxReassembledFrameLength;
4257*852ba100SJustin Hibbits p_Manip->reassmParams.maxNumFramesInProcess =
4258*852ba100SJustin Hibbits reassmManipParams.maxNumFramesInProcess;
4259*852ba100SJustin Hibbits p_Manip->reassmParams.timeOutMode = reassmManipParams.timeOutMode;
4260*852ba100SJustin Hibbits p_Manip->reassmParams.fqidForTimeOutFrames =
4261*852ba100SJustin Hibbits reassmManipParams.fqidForTimeOutFrames;
4262*852ba100SJustin Hibbits p_Manip->reassmParams.timeoutThresholdForReassmProcess =
4263*852ba100SJustin Hibbits reassmManipParams.timeoutThresholdForReassmProcess;
4264*852ba100SJustin Hibbits p_Manip->reassmParams.dataMemId = reassmManipParams.dataMemId;
4265*852ba100SJustin Hibbits p_Manip->reassmParams.dataLiodnOffset = reassmManipParams.dataLiodnOffset;
4266*852ba100SJustin Hibbits
4267*852ba100SJustin Hibbits /* Creates and initializes the Reassembly common parameter table */
4268*852ba100SJustin Hibbits CreateReassCommonTable(p_Manip);
4269*852ba100SJustin Hibbits
4270*852ba100SJustin Hibbits res = SetCapwapReassmManip(p_Manip);
4271*852ba100SJustin Hibbits if (res != E_OK)
4272*852ba100SJustin Hibbits return res;
4273*852ba100SJustin Hibbits
4274*852ba100SJustin Hibbits return E_OK;
4275*852ba100SJustin Hibbits }
4276*852ba100SJustin Hibbits
CapwapFragmentation(t_FmPcdManipFragCapwapParams * p_ManipParams,t_FmPcdManip * p_Manip)4277*852ba100SJustin Hibbits static t_Error CapwapFragmentation(t_FmPcdManipFragCapwapParams *p_ManipParams,
4278*852ba100SJustin Hibbits t_FmPcdManip *p_Manip)
4279*852ba100SJustin Hibbits {
4280*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
4281*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
4282*852ba100SJustin Hibbits uint32_t pcAndOffsetsReg = 0, ccAdBaseReg = 0, gmaskReg = 0;
4283*852ba100SJustin Hibbits uint32_t tmpReg32 = 0, tmpRegNia = 0;
4284*852ba100SJustin Hibbits
4285*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);
4286*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams->sizeForFragmentation != 0xFFFF,
4287*852ba100SJustin Hibbits E_INVALID_VALUE);
4288*852ba100SJustin Hibbits p_FmPcd = p_Manip->h_FmPcd;
4289*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
4290*852ba100SJustin Hibbits
4291*852ba100SJustin Hibbits /* Allocation of fragmentation Action Descriptor */
4292*852ba100SJustin Hibbits p_Manip->fragParams.p_Frag = (t_AdOfTypeContLookup *)FM_MURAM_AllocMem(
4293*852ba100SJustin Hibbits p_FmPcd->h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE,
4294*852ba100SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
4295*852ba100SJustin Hibbits if (!p_Manip->fragParams.p_Frag)
4296*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
4297*852ba100SJustin Hibbits ("MURAM alloc for Fragmentation table descriptor"));
4298*852ba100SJustin Hibbits MemSet8(p_Manip->fragParams.p_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);
4299*852ba100SJustin Hibbits
4300*852ba100SJustin Hibbits /* Prepare the third Ad register (pcAndOffsets)- OperationCode */
4301*852ba100SJustin Hibbits pcAndOffsetsReg = (uint32_t)HMAN_OC_CAPWAP_FRAGMENTATION;
4302*852ba100SJustin Hibbits
4303*852ba100SJustin Hibbits /* Prepare the first Ad register (ccAdBase) - Don't frag action and Action descriptor type*/
4304*852ba100SJustin Hibbits ccAdBaseReg = FM_PCD_AD_CONT_LOOKUP_TYPE;
4305*852ba100SJustin Hibbits ccAdBaseReg |=
4306*852ba100SJustin Hibbits (p_ManipParams->compressModeEn) ? FM_PCD_MANIP_CAPWAP_FRAG_COMPRESS_EN :
4307*852ba100SJustin Hibbits 0;
4308*852ba100SJustin Hibbits
4309*852ba100SJustin Hibbits /* Set Scatter/Gather BPid */
4310*852ba100SJustin Hibbits if (p_ManipParams->sgBpidEn)
4311*852ba100SJustin Hibbits {
4312*852ba100SJustin Hibbits ccAdBaseReg |= FM_PCD_MANIP_CAPWAP_FRAG_SG_BDID_EN;
4313*852ba100SJustin Hibbits pcAndOffsetsReg |= ((p_ManipParams->sgBpid
4314*852ba100SJustin Hibbits << FM_PCD_MANIP_CAPWAP_FRAG_SG_BDID_SHIFT)
4315*852ba100SJustin Hibbits & FM_PCD_MANIP_CAPWAP_FRAG_SG_BDID_MASK);
4316*852ba100SJustin Hibbits }
4317*852ba100SJustin Hibbits
4318*852ba100SJustin Hibbits /* Prepare the first Ad register (gmask) - scratch buffer pool id and Pointer to fragment ID */
4319*852ba100SJustin Hibbits gmaskReg = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr))
4320*852ba100SJustin Hibbits - p_FmPcd->physicalMuramBase);
4321*852ba100SJustin Hibbits gmaskReg |= (0xFF) << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;
4322*852ba100SJustin Hibbits
4323*852ba100SJustin Hibbits /* Set all Ad registers */
4324*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->fragParams.p_Frag->pcAndOffsets, pcAndOffsetsReg);
4325*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->fragParams.p_Frag->ccAdBase, ccAdBaseReg);
4326*852ba100SJustin Hibbits WRITE_UINT32(p_Manip->fragParams.p_Frag->gmask, gmaskReg);
4327*852ba100SJustin Hibbits
4328*852ba100SJustin Hibbits /* Saves user's fragmentation manipulation parameters */
4329*852ba100SJustin Hibbits p_Manip->frag = TRUE;
4330*852ba100SJustin Hibbits p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;
4331*852ba100SJustin Hibbits
4332*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
4333*852ba100SJustin Hibbits
4334*852ba100SJustin Hibbits tmpRegNia = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_Frag)
4335*852ba100SJustin Hibbits - (p_FmPcd->physicalMuramBase));
4336*852ba100SJustin Hibbits tmpReg32 = (uint32_t)p_Manip->sizeForFragmentation
4337*852ba100SJustin Hibbits << FM_PCD_MANIP_CAPWAP_FRAG_CHECK_MTU_SHIFT;
4338*852ba100SJustin Hibbits
4339*852ba100SJustin Hibbits tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;
4340*852ba100SJustin Hibbits tmpReg32 |= HMAN_OC_CAPWAP_FRAG_CHECK;
4341*852ba100SJustin Hibbits
4342*852ba100SJustin Hibbits tmpRegNia |= FM_PCD_MANIP_CAPWAP_FRAG_CHECK_CNIA;
4343*852ba100SJustin Hibbits
4344*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
4345*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpRegNia);
4346*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->gmask, 0);
4347*852ba100SJustin Hibbits /* Total frame counter - MUST be initialized to zero.*/
4348*852ba100SJustin Hibbits
4349*852ba100SJustin Hibbits return E_OK;
4350*852ba100SJustin Hibbits }
4351*852ba100SJustin Hibbits
UpdateInitCapwapFrag(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_FmPcdManip * p_Manip,t_Handle h_Ad,bool validate)4352*852ba100SJustin Hibbits static t_Error UpdateInitCapwapFrag(t_Handle h_FmPcd, t_Handle h_PcdParams,
4353*852ba100SJustin Hibbits t_Handle h_FmPort, t_FmPcdManip *p_Manip,
4354*852ba100SJustin Hibbits t_Handle h_Ad, bool validate)
4355*852ba100SJustin Hibbits {
4356*852ba100SJustin Hibbits t_FmPortGetSetCcParams fmPortGetSetCcParams;
4357*852ba100SJustin Hibbits t_Error err;
4358*852ba100SJustin Hibbits
4359*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
4360*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION),
4361*852ba100SJustin Hibbits E_INVALID_STATE);
4362*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
4363*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE);
4364*852ba100SJustin Hibbits
4365*852ba100SJustin Hibbits UNUSED(h_FmPcd);
4366*852ba100SJustin Hibbits UNUSED(h_Ad);
4367*852ba100SJustin Hibbits UNUSED(h_PcdParams);
4368*852ba100SJustin Hibbits UNUSED(validate);
4369*852ba100SJustin Hibbits UNUSED(p_Manip);
4370*852ba100SJustin Hibbits
4371*852ba100SJustin Hibbits fmPortGetSetCcParams.setCcParams.type = 0;
4372*852ba100SJustin Hibbits fmPortGetSetCcParams.getCcParams.type = MANIP_EXTRA_SPACE;
4373*852ba100SJustin Hibbits if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)
4374*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
4375*852ba100SJustin Hibbits
4376*852ba100SJustin Hibbits if (!fmPortGetSetCcParams.getCcParams.internalBufferOffset)
4377*852ba100SJustin Hibbits DBG(WARNING, ("manipExtraSpace must be larger than '0'"));
4378*852ba100SJustin Hibbits
4379*852ba100SJustin Hibbits return E_OK;
4380*852ba100SJustin Hibbits }
4381*852ba100SJustin Hibbits
CapwapManip(t_FmPcdManipParams * p_ManipParams,t_FmPcdManip * p_Manip)4382*852ba100SJustin Hibbits static t_Error CapwapManip(t_FmPcdManipParams *p_ManipParams,
4383*852ba100SJustin Hibbits t_FmPcdManip *p_Manip)
4384*852ba100SJustin Hibbits {
4385*852ba100SJustin Hibbits t_AdOfTypeContLookup *p_Ad;
4386*852ba100SJustin Hibbits t_FmPcdManipSpecialOffloadCapwapParams *p_Params;
4387*852ba100SJustin Hibbits t_Error err = E_OK;
4388*852ba100SJustin Hibbits uint32_t tmpReg32 = 0;
4389*852ba100SJustin Hibbits
4390*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
4391*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE);
4392*852ba100SJustin Hibbits
4393*852ba100SJustin Hibbits p_Params = &p_ManipParams->u.specialOffload.u.capwap;
4394*852ba100SJustin Hibbits
4395*852ba100SJustin Hibbits p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
4396*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
4397*852ba100SJustin Hibbits tmpReg32 |= (p_Params->dtls) ? FM_PCD_MANIP_CAPWAP_DTLS : 0;
4398*852ba100SJustin Hibbits /* TODO - add 'qosSrc' */
4399*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
4400*852ba100SJustin Hibbits
4401*852ba100SJustin Hibbits tmpReg32 = HMAN_OC_CAPWAP_MANIP;
4402*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
4403*852ba100SJustin Hibbits {
4404*852ba100SJustin Hibbits WRITE_UINT32(
4405*852ba100SJustin Hibbits p_Ad->matchTblPtr,
4406*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)- (((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4);
4407*852ba100SJustin Hibbits
4408*852ba100SJustin Hibbits tmpReg32 |= FM_PCD_MANIP_CAPWAP_NADEN;
4409*852ba100SJustin Hibbits }
4410*852ba100SJustin Hibbits
4411*852ba100SJustin Hibbits WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
4412*852ba100SJustin Hibbits
4413*852ba100SJustin Hibbits return err;
4414*852ba100SJustin Hibbits }
4415*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4416*852ba100SJustin Hibbits
ManipOrStatsSetNode(t_Handle h_FmPcd,t_Handle * p_Params,bool stats)4417*852ba100SJustin Hibbits static t_Handle ManipOrStatsSetNode(t_Handle h_FmPcd, t_Handle *p_Params,
4418*852ba100SJustin Hibbits bool stats)
44190aeed3e9SJustin Hibbits {
44200aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip;
44210aeed3e9SJustin Hibbits t_Error err;
44220aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
44230aeed3e9SJustin Hibbits
44240aeed3e9SJustin Hibbits p_Manip = (t_FmPcdManip*)XX_Malloc(sizeof(t_FmPcdManip));
44250aeed3e9SJustin Hibbits if (!p_Manip)
44260aeed3e9SJustin Hibbits {
44270aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
44280aeed3e9SJustin Hibbits return NULL;
44290aeed3e9SJustin Hibbits }
44300aeed3e9SJustin Hibbits memset(p_Manip, 0, sizeof(t_FmPcdManip));
44310aeed3e9SJustin Hibbits
4432*852ba100SJustin Hibbits p_Manip->type = ((t_FmPcdManipParams *)p_Params)->type;
4433*852ba100SJustin Hibbits memcpy((uint8_t*)&p_Manip->manipParams, p_Params,
4434*852ba100SJustin Hibbits sizeof(p_Manip->manipParams));
4435*852ba100SJustin Hibbits
44360aeed3e9SJustin Hibbits if (!stats)
4437*852ba100SJustin Hibbits err = CheckManipParamsAndSetType(p_Manip,
4438*852ba100SJustin Hibbits (t_FmPcdManipParams *)p_Params);
4439*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
4440*852ba100SJustin Hibbits else
4441*852ba100SJustin Hibbits err = CheckStatsParamsAndSetType(p_Manip, (t_FmPcdStatsParams *)p_Params);
4442*852ba100SJustin Hibbits #else /* not (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
44430aeed3e9SJustin Hibbits else
44440aeed3e9SJustin Hibbits {
4445*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Statistics node!"));
4446*852ba100SJustin Hibbits XX_Free(p_Manip);
4447*852ba100SJustin Hibbits return NULL;
44480aeed3e9SJustin Hibbits }
4449*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
44500aeed3e9SJustin Hibbits if (err)
44510aeed3e9SJustin Hibbits {
4452*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Invalid header manipulation type"));
44530aeed3e9SJustin Hibbits XX_Free(p_Manip);
44540aeed3e9SJustin Hibbits return NULL;
44550aeed3e9SJustin Hibbits }
44560aeed3e9SJustin Hibbits
4457*852ba100SJustin Hibbits if ((p_Manip->opcode != HMAN_OC_IP_REASSEMBLY) && (p_Manip->opcode != HMAN_OC_CAPWAP_REASSEMBLY))
44580aeed3e9SJustin Hibbits {
4459*852ba100SJustin Hibbits /* In Case of reassembly manipulation the reassembly action descriptor will
4460*852ba100SJustin Hibbits be defines later on */
44610aeed3e9SJustin Hibbits if (p_Manip->muramAllocate)
44620aeed3e9SJustin Hibbits {
4463*852ba100SJustin Hibbits p_Manip->h_Ad = (t_Handle)FM_MURAM_AllocMem(
4464*852ba100SJustin Hibbits p_FmPcd->h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE,
44650aeed3e9SJustin Hibbits FM_PCD_CC_AD_TABLE_ALIGN);
44660aeed3e9SJustin Hibbits if (!p_Manip->h_Ad)
44670aeed3e9SJustin Hibbits {
4468*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Manipulation action descriptor"));
44690aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
44700aeed3e9SJustin Hibbits XX_Free(p_Manip);
44710aeed3e9SJustin Hibbits return NULL;
44720aeed3e9SJustin Hibbits }
44730aeed3e9SJustin Hibbits
4474*852ba100SJustin Hibbits MemSet8(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
44750aeed3e9SJustin Hibbits }
44760aeed3e9SJustin Hibbits else
44770aeed3e9SJustin Hibbits {
4478*852ba100SJustin Hibbits p_Manip->h_Ad = (t_Handle)XX_Malloc(
4479*852ba100SJustin Hibbits FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
44800aeed3e9SJustin Hibbits if (!p_Manip->h_Ad)
44810aeed3e9SJustin Hibbits {
4482*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of Manipulation action descriptor"));
44830aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
44840aeed3e9SJustin Hibbits XX_Free(p_Manip);
44850aeed3e9SJustin Hibbits return NULL;
44860aeed3e9SJustin Hibbits }
44870aeed3e9SJustin Hibbits
44880aeed3e9SJustin Hibbits memset(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
44890aeed3e9SJustin Hibbits }
44900aeed3e9SJustin Hibbits }
4491*852ba100SJustin Hibbits
44920aeed3e9SJustin Hibbits p_Manip->h_FmPcd = h_FmPcd;
44930aeed3e9SJustin Hibbits
44940aeed3e9SJustin Hibbits return p_Manip;
44950aeed3e9SJustin Hibbits }
44960aeed3e9SJustin Hibbits
UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(t_FmPcdManip * p_CrntMdfManip,t_List * h_NodesLst)4497*852ba100SJustin Hibbits static void UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(
4498*852ba100SJustin Hibbits t_FmPcdManip *p_CrntMdfManip, t_List *h_NodesLst)
4499*852ba100SJustin Hibbits {
4500*852ba100SJustin Hibbits t_CcNodeInformation *p_CcNodeInformation;
4501*852ba100SJustin Hibbits t_FmPcdCcNode *p_NodePtrOnCurrentMdfManip = NULL;
4502*852ba100SJustin Hibbits t_List *p_Pos;
4503*852ba100SJustin Hibbits int i = 0;
4504*852ba100SJustin Hibbits t_Handle p_AdTablePtOnCrntCurrentMdfNode/*, p_AdTableNewModified*/;
4505*852ba100SJustin Hibbits t_CcNodeInformation ccNodeInfo;
45060aeed3e9SJustin Hibbits
4507*852ba100SJustin Hibbits NCSW_LIST_FOR_EACH(p_Pos, &p_CrntMdfManip->nodesLst)
4508*852ba100SJustin Hibbits {
4509*852ba100SJustin Hibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
4510*852ba100SJustin Hibbits p_NodePtrOnCurrentMdfManip =
4511*852ba100SJustin Hibbits (t_FmPcdCcNode *)p_CcNodeInformation->h_CcNode;
4512*852ba100SJustin Hibbits
4513*852ba100SJustin Hibbits ASSERT_COND(p_NodePtrOnCurrentMdfManip);
4514*852ba100SJustin Hibbits
4515*852ba100SJustin Hibbits /* Search in the previous node which exact index points on this current modified node for getting AD */
4516*852ba100SJustin Hibbits for (i = 0; i < p_NodePtrOnCurrentMdfManip->numOfKeys + 1; i++)
4517*852ba100SJustin Hibbits {
4518*852ba100SJustin Hibbits if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].nextEngineParams.nextEngine
4519*852ba100SJustin Hibbits == e_FM_PCD_CC)
4520*852ba100SJustin Hibbits {
4521*852ba100SJustin Hibbits if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].nextEngineParams.h_Manip
4522*852ba100SJustin Hibbits == (t_Handle)p_CrntMdfManip)
4523*852ba100SJustin Hibbits {
4524*852ba100SJustin Hibbits if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].p_StatsObj)
4525*852ba100SJustin Hibbits p_AdTablePtOnCrntCurrentMdfNode =
4526*852ba100SJustin Hibbits p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].p_StatsObj->h_StatsAd;
4527*852ba100SJustin Hibbits else
4528*852ba100SJustin Hibbits p_AdTablePtOnCrntCurrentMdfNode =
4529*852ba100SJustin Hibbits PTR_MOVE(p_NodePtrOnCurrentMdfManip->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);
4530*852ba100SJustin Hibbits
4531*852ba100SJustin Hibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
4532*852ba100SJustin Hibbits ccNodeInfo.h_CcNode = p_AdTablePtOnCrntCurrentMdfNode;
4533*852ba100SJustin Hibbits EnqueueNodeInfoToRelevantLst(h_NodesLst, &ccNodeInfo, NULL);
4534*852ba100SJustin Hibbits }
4535*852ba100SJustin Hibbits }
4536*852ba100SJustin Hibbits }
4537*852ba100SJustin Hibbits
4538*852ba100SJustin Hibbits ASSERT_COND(i != p_NodePtrOnCurrentMdfManip->numOfKeys);
4539*852ba100SJustin Hibbits }
4540*852ba100SJustin Hibbits }
4541*852ba100SJustin Hibbits
BuildHmtd(uint8_t * p_Dest,uint8_t * p_Src,uint8_t * p_Hmcd,t_FmPcd * p_FmPcd)4542*852ba100SJustin Hibbits static void BuildHmtd(uint8_t *p_Dest, uint8_t *p_Src, uint8_t *p_Hmcd,
4543*852ba100SJustin Hibbits t_FmPcd *p_FmPcd)
4544*852ba100SJustin Hibbits {
4545*852ba100SJustin Hibbits t_Error err;
4546*852ba100SJustin Hibbits
4547*852ba100SJustin Hibbits /* Copy the HMTD */
4548*852ba100SJustin Hibbits MemCpy8(p_Dest, (uint8_t*)p_Src, 16);
4549*852ba100SJustin Hibbits /* Replace the HMCT table pointer */
4550*852ba100SJustin Hibbits WRITE_UINT32(
4551*852ba100SJustin Hibbits ((t_Hmtd *)p_Dest)->hmcdBasePtr,
4552*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_Hmcd) - ((t_FmPcd*)p_FmPcd)->physicalMuramBase));
4553*852ba100SJustin Hibbits /* Call Host Command to replace HMTD by a new HMTD */
4554*852ba100SJustin Hibbits err = FmHcPcdCcDoDynamicChange(
4555*852ba100SJustin Hibbits p_FmPcd->h_Hc,
4556*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_Src) - p_FmPcd->physicalMuramBase),
4557*852ba100SJustin Hibbits (uint32_t)(XX_VirtToPhys(p_Dest) - p_FmPcd->physicalMuramBase));
4558*852ba100SJustin Hibbits if (err)
4559*852ba100SJustin Hibbits REPORT_ERROR(MINOR, err, ("Failed in dynamic manip change, continued to the rest of the owners."));
4560*852ba100SJustin Hibbits }
4561*852ba100SJustin Hibbits
FmPcdManipInitUpdate(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_Handle h_Manip,t_Handle h_Ad,bool validate,int level,t_Handle h_FmTree)4562*852ba100SJustin Hibbits static t_Error FmPcdManipInitUpdate(t_Handle h_FmPcd, t_Handle h_PcdParams,
4563*852ba100SJustin Hibbits t_Handle h_FmPort, t_Handle h_Manip,
4564*852ba100SJustin Hibbits t_Handle h_Ad, bool validate, int level,
4565*852ba100SJustin Hibbits t_Handle h_FmTree)
4566*852ba100SJustin Hibbits {
4567*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
4568*852ba100SJustin Hibbits t_Error err = E_OK;
4569*852ba100SJustin Hibbits
4570*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);
4571*852ba100SJustin Hibbits
4572*852ba100SJustin Hibbits UNUSED(level);
4573*852ba100SJustin Hibbits UNUSED(h_FmTree);
4574*852ba100SJustin Hibbits
4575*852ba100SJustin Hibbits switch (p_Manip->opcode)
4576*852ba100SJustin Hibbits {
4577*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
4578*852ba100SJustin Hibbits case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
4579*852ba100SJustin Hibbits err = UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(h_FmPort,
4580*852ba100SJustin Hibbits p_Manip,
4581*852ba100SJustin Hibbits h_Ad,
4582*852ba100SJustin Hibbits validate);
4583*852ba100SJustin Hibbits break;
4584*852ba100SJustin Hibbits case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
4585*852ba100SJustin Hibbits if (!p_Manip->h_Frag)
4586*852ba100SJustin Hibbits break;
4587*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
4588*852ba100SJustin Hibbits err = UpdateInitCapwapFragmentation(h_FmPort, p_Manip, h_Ad, validate, h_FmTree);
4589*852ba100SJustin Hibbits break;
4590*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
4591*852ba100SJustin Hibbits if (p_Manip->h_Frag)
4592*852ba100SJustin Hibbits err = UpdateInitCapwapReasm(h_FmPcd, h_FmPort, p_Manip, h_Ad, validate);
4593*852ba100SJustin Hibbits break;
4594*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_INDEXED_STATS):
4595*852ba100SJustin Hibbits err = UpdateIndxStats(h_FmPcd, h_FmPort, p_Manip);
4596*852ba100SJustin Hibbits break;
4597*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
4598*852ba100SJustin Hibbits case (HMAN_OC_IP_REASSEMBLY):
4599*852ba100SJustin Hibbits err = UpdateInitReasm(h_FmPcd, h_PcdParams, h_FmPort, p_Manip, h_Ad,
4600*852ba100SJustin Hibbits validate);
4601*852ba100SJustin Hibbits break;
4602*852ba100SJustin Hibbits case (HMAN_OC_IP_FRAGMENTATION):
4603*852ba100SJustin Hibbits err = UpdateInitIpFrag(h_FmPcd, h_PcdParams, h_FmPort, p_Manip,
4604*852ba100SJustin Hibbits h_Ad, validate);
4605*852ba100SJustin Hibbits break;
4606*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4607*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
4608*852ba100SJustin Hibbits err = UpdateInitCapwapFrag(h_FmPcd, h_PcdParams, h_FmPort, p_Manip,
4609*852ba100SJustin Hibbits h_Ad, validate);
4610*852ba100SJustin Hibbits break;
4611*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_REASSEMBLY):
4612*852ba100SJustin Hibbits err = UpdateInitReasm(h_FmPcd, h_PcdParams, h_FmPort, p_Manip, h_Ad,
4613*852ba100SJustin Hibbits validate);
4614*852ba100SJustin Hibbits break;
4615*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4616*852ba100SJustin Hibbits default:
4617*852ba100SJustin Hibbits return E_OK;
4618*852ba100SJustin Hibbits }
4619*852ba100SJustin Hibbits
4620*852ba100SJustin Hibbits return err;
4621*852ba100SJustin Hibbits }
4622*852ba100SJustin Hibbits
FmPcdManipModifyUpdate(t_Handle h_Manip,t_Handle h_Ad,bool validate,int level,t_Handle h_FmTree)4623*852ba100SJustin Hibbits static t_Error FmPcdManipModifyUpdate(t_Handle h_Manip, t_Handle h_Ad,
4624*852ba100SJustin Hibbits bool validate, int level,
4625*852ba100SJustin Hibbits t_Handle h_FmTree)
4626*852ba100SJustin Hibbits {
4627*852ba100SJustin Hibbits
4628*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
4629*852ba100SJustin Hibbits t_Error err = E_OK;
4630*852ba100SJustin Hibbits
4631*852ba100SJustin Hibbits UNUSED(level);
4632*852ba100SJustin Hibbits
4633*852ba100SJustin Hibbits switch (p_Manip->opcode)
4634*852ba100SJustin Hibbits {
4635*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
4636*852ba100SJustin Hibbits case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
4637*852ba100SJustin Hibbits RETURN_ERROR(
4638*852ba100SJustin Hibbits MAJOR,
4639*852ba100SJustin Hibbits E_INVALID_STATE,
4640*852ba100SJustin Hibbits ("modify node with this type of manipulation is not suppported"));
4641*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
4642*852ba100SJustin Hibbits
4643*852ba100SJustin Hibbits if (p_Manip->h_Frag)
4644*852ba100SJustin Hibbits {
4645*852ba100SJustin Hibbits if (!(p_Manip->shadowUpdateParams & NUM_OF_TASKS)
4646*852ba100SJustin Hibbits && !(p_Manip->shadowUpdateParams & OFFSET_OF_DATA)
4647*852ba100SJustin Hibbits && !(p_Manip->shadowUpdateParams & OFFSET_OF_PR))
4648*852ba100SJustin Hibbits RETURN_ERROR(
4649*852ba100SJustin Hibbits MAJOR,
4650*852ba100SJustin Hibbits E_INVALID_STATE,
4651*852ba100SJustin Hibbits ("modify node with this type of manipulation requires manipulation be updated previously in SetPcd function"));
4652*852ba100SJustin Hibbits }
4653*852ba100SJustin Hibbits break;
4654*852ba100SJustin Hibbits case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
4655*852ba100SJustin Hibbits if (p_Manip->h_Frag)
4656*852ba100SJustin Hibbits err = UpdateModifyCapwapFragmenation(p_Manip, h_Ad, validate, h_FmTree);
4657*852ba100SJustin Hibbits break;
4658*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
4659*852ba100SJustin Hibbits default:
4660*852ba100SJustin Hibbits return E_OK;
4661*852ba100SJustin Hibbits }
4662*852ba100SJustin Hibbits
4663*852ba100SJustin Hibbits return err;
4664*852ba100SJustin Hibbits }
4665*852ba100SJustin Hibbits
4666*852ba100SJustin Hibbits /*****************************************************************************/
4667*852ba100SJustin Hibbits /* Inter-module API routines */
4668*852ba100SJustin Hibbits /*****************************************************************************/
4669*852ba100SJustin Hibbits
FmPcdManipUpdate(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_Handle h_Manip,t_Handle h_Ad,bool validate,int level,t_Handle h_FmTree,bool modify)4670*852ba100SJustin Hibbits t_Error FmPcdManipUpdate(t_Handle h_FmPcd, t_Handle h_PcdParams,
4671*852ba100SJustin Hibbits t_Handle h_FmPort, t_Handle h_Manip, t_Handle h_Ad,
4672*852ba100SJustin Hibbits bool validate, int level, t_Handle h_FmTree,
4673*852ba100SJustin Hibbits bool modify)
46740aeed3e9SJustin Hibbits {
46750aeed3e9SJustin Hibbits t_Error err;
46760aeed3e9SJustin Hibbits
46770aeed3e9SJustin Hibbits if (!modify)
4678*852ba100SJustin Hibbits err = FmPcdManipInitUpdate(h_FmPcd, h_PcdParams, h_FmPort, h_Manip,
4679*852ba100SJustin Hibbits h_Ad, validate, level, h_FmTree);
46800aeed3e9SJustin Hibbits else
46810aeed3e9SJustin Hibbits err = FmPcdManipModifyUpdate(h_Manip, h_Ad, validate, level, h_FmTree);
4682*852ba100SJustin Hibbits
46830aeed3e9SJustin Hibbits return err;
46840aeed3e9SJustin Hibbits }
46850aeed3e9SJustin Hibbits
FmPcdManipUpdateOwner(t_Handle h_Manip,bool add)46860aeed3e9SJustin Hibbits void FmPcdManipUpdateOwner(t_Handle h_Manip, bool add)
46870aeed3e9SJustin Hibbits {
46880aeed3e9SJustin Hibbits
4689*852ba100SJustin Hibbits uint32_t intFlags;
4690*852ba100SJustin Hibbits
4691*852ba100SJustin Hibbits intFlags = XX_LockIntrSpinlock(((t_FmPcdManip *)h_Manip)->h_Spinlock);
46920aeed3e9SJustin Hibbits if (add)
46930aeed3e9SJustin Hibbits ((t_FmPcdManip *)h_Manip)->owner++;
46940aeed3e9SJustin Hibbits else
46950aeed3e9SJustin Hibbits {
46960aeed3e9SJustin Hibbits ASSERT_COND(((t_FmPcdManip *)h_Manip)->owner);
46970aeed3e9SJustin Hibbits ((t_FmPcdManip *)h_Manip)->owner--;
46980aeed3e9SJustin Hibbits }
4699*852ba100SJustin Hibbits XX_UnlockIntrSpinlock(((t_FmPcdManip *)h_Manip)->h_Spinlock, intFlags);
47000aeed3e9SJustin Hibbits }
47010aeed3e9SJustin Hibbits
FmPcdManipGetNodeLstPointedOnThisManip(t_Handle h_Manip)4702*852ba100SJustin Hibbits t_List *FmPcdManipGetNodeLstPointedOnThisManip(t_Handle h_Manip)
4703*852ba100SJustin Hibbits {
4704*852ba100SJustin Hibbits ASSERT_COND(h_Manip);
4705*852ba100SJustin Hibbits return &((t_FmPcdManip *)h_Manip)->nodesLst;
4706*852ba100SJustin Hibbits }
4707*852ba100SJustin Hibbits
FmPcdManipGetSpinlock(t_Handle h_Manip)4708*852ba100SJustin Hibbits t_List *FmPcdManipGetSpinlock(t_Handle h_Manip)
4709*852ba100SJustin Hibbits {
4710*852ba100SJustin Hibbits ASSERT_COND(h_Manip);
4711*852ba100SJustin Hibbits return ((t_FmPcdManip *)h_Manip)->h_Spinlock;
4712*852ba100SJustin Hibbits }
4713*852ba100SJustin Hibbits
FmPcdManipCheckParamsForCcNextEngine(t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams,uint32_t * requiredAction)4714*852ba100SJustin Hibbits t_Error FmPcdManipCheckParamsForCcNextEngine(
4715*852ba100SJustin Hibbits t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,
4716*852ba100SJustin Hibbits uint32_t *requiredAction)
47170aeed3e9SJustin Hibbits {
47180aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip;
4719*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
4720*852ba100SJustin Hibbits t_Error err = E_OK;
4721*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))*/
4722*852ba100SJustin Hibbits bool pointFromCc = TRUE;
47230aeed3e9SJustin Hibbits
47240aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
4725*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams->h_Manip,
4726*852ba100SJustin Hibbits E_NULL_POINTER);
47270aeed3e9SJustin Hibbits
47280aeed3e9SJustin Hibbits p_Manip = (t_FmPcdManip *)(p_FmPcdCcNextEngineParams->h_Manip);
47290aeed3e9SJustin Hibbits *requiredAction = 0;
4730*852ba100SJustin Hibbits
4731*852ba100SJustin Hibbits while (p_Manip)
47320aeed3e9SJustin Hibbits {
4733*852ba100SJustin Hibbits switch (p_Manip->opcode)
4734*852ba100SJustin Hibbits {
4735*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
47360aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_INDEXED_STATS):
47370aeed3e9SJustin Hibbits if (p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)
47380aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));
47390aeed3e9SJustin Hibbits if (p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)
47400aeed3e9SJustin Hibbits p_Manip->cnia = TRUE;
47410aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
47420aeed3e9SJustin Hibbits *requiredAction = UPDATE_NIA_ENQ_WITHOUT_DMA;
47430aeed3e9SJustin Hibbits case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):
47440aeed3e9SJustin Hibbits p_Manip->ownerTmp++;
47450aeed3e9SJustin Hibbits break;
47460aeed3e9SJustin Hibbits case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
4747*852ba100SJustin Hibbits if ((p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)
4748*852ba100SJustin Hibbits && !p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)
4749*852ba100SJustin Hibbits RETURN_ERROR(
4750*852ba100SJustin Hibbits MAJOR,
4751*852ba100SJustin Hibbits E_INVALID_STATE,
4752*852ba100SJustin Hibbits ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE with fqidForCtrlFlow FALSE"));
47530aeed3e9SJustin Hibbits p_Manip->ownerTmp++;
47540aeed3e9SJustin Hibbits break;
47550aeed3e9SJustin Hibbits case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
4756*852ba100SJustin Hibbits if ((p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_CC)
4757*852ba100SJustin Hibbits && (FmPcdCcGetParseCode(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)
4758*852ba100SJustin Hibbits != CC_PC_GENERIC_IC_HASH_INDEXED))
47590aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation next engine has to be CC and action = e_FM_PCD_ACTION_INDEXED_LOOKUP"));
4760*852ba100SJustin Hibbits err = UpdateManipIc(p_FmPcdCcNextEngineParams->h_Manip,
4761*852ba100SJustin Hibbits FmPcdCcGetOffset(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode));
47620aeed3e9SJustin Hibbits if (err)
47630aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
47640aeed3e9SJustin Hibbits *requiredAction = UPDATE_NIA_ENQ_WITHOUT_DMA;
47650aeed3e9SJustin Hibbits break;
4766*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
47670aeed3e9SJustin Hibbits case (HMAN_OC_IP_FRAGMENTATION):
4768*852ba100SJustin Hibbits case (HMAN_OC_IP_REASSEMBLY):
4769*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4770*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_REASSEMBLY):
4771*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
4772*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
47730aeed3e9SJustin Hibbits if (p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)
4774*852ba100SJustin Hibbits RETURN_ERROR(
4775*852ba100SJustin Hibbits MAJOR,
4776*852ba100SJustin Hibbits E_INVALID_STATE,
4777*852ba100SJustin Hibbits ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));
47780aeed3e9SJustin Hibbits p_Manip->ownerTmp++;
47790aeed3e9SJustin Hibbits break;
4780*852ba100SJustin Hibbits case (HMAN_OC_IPSEC_MANIP):
4781*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4782*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_MANIP):
4783*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4784*852ba100SJustin Hibbits p_Manip->ownerTmp++;
47850aeed3e9SJustin Hibbits break;
4786*852ba100SJustin Hibbits case (HMAN_OC):
4787*852ba100SJustin Hibbits if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC)
4788*852ba100SJustin Hibbits && MANIP_IS_CASCADED(p_Manip))
4789*852ba100SJustin Hibbits RETURN_ERROR(
4790*852ba100SJustin Hibbits MINOR,
4791*852ba100SJustin Hibbits E_INVALID_STATE,
4792*852ba100SJustin Hibbits ("Can't have a cascaded manipulation when and Next Engine is CC"));
4793*852ba100SJustin Hibbits if (!MANIP_IS_FIRST(p_Manip) && pointFromCc)
4794*852ba100SJustin Hibbits RETURN_ERROR(
4795*852ba100SJustin Hibbits MAJOR,
4796*852ba100SJustin Hibbits E_INVALID_STATE,
4797*852ba100SJustin Hibbits ("h_Manip is already used and may not be shared (no sharing of non-head manip nodes)"));
4798*852ba100SJustin Hibbits break;
47990aeed3e9SJustin Hibbits default:
4800*852ba100SJustin Hibbits RETURN_ERROR(
4801*852ba100SJustin Hibbits MAJOR, E_INVALID_STATE,
4802*852ba100SJustin Hibbits ("invalid type of header manipulation for this state"));
48030aeed3e9SJustin Hibbits }
4804*852ba100SJustin Hibbits p_Manip = p_Manip->h_NextManip;
4805*852ba100SJustin Hibbits pointFromCc = FALSE;
4806*852ba100SJustin Hibbits }
48070aeed3e9SJustin Hibbits return E_OK;
48080aeed3e9SJustin Hibbits }
48090aeed3e9SJustin Hibbits
4810*852ba100SJustin Hibbits
FmPcdManipCheckParamsWithCcNodeParams(t_Handle h_Manip,t_Handle h_FmPcdCcNode)4811*852ba100SJustin Hibbits t_Error FmPcdManipCheckParamsWithCcNodeParams(t_Handle h_Manip,
4812*852ba100SJustin Hibbits t_Handle h_FmPcdCcNode)
48130aeed3e9SJustin Hibbits {
48140aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
48150aeed3e9SJustin Hibbits t_Error err = E_OK;
48160aeed3e9SJustin Hibbits
48170aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);
48180aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcdCcNode, E_INVALID_HANDLE);
48190aeed3e9SJustin Hibbits
4820*852ba100SJustin Hibbits switch (p_Manip->opcode)
48210aeed3e9SJustin Hibbits {
4822*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
48230aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_INDEXED_STATS):
48240aeed3e9SJustin Hibbits if (p_Manip->ownerTmp != FmPcdCcGetNumOfKeys(h_FmPcdCcNode))
4825*852ba100SJustin Hibbits RETURN_ERROR(
4826*852ba100SJustin Hibbits MAJOR,
4827*852ba100SJustin Hibbits E_INVALID_VALUE,
4828*852ba100SJustin Hibbits ("The manipulation of the type statistics flowId if exist has to be pointed by all numOfKeys"));
48290aeed3e9SJustin Hibbits break;
48300aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
48310aeed3e9SJustin Hibbits if (p_Manip->h_Frag)
48320aeed3e9SJustin Hibbits {
48330aeed3e9SJustin Hibbits if (p_Manip->ownerTmp != FmPcdCcGetNumOfKeys(h_FmPcdCcNode))
4834*852ba100SJustin Hibbits RETURN_ERROR(
4835*852ba100SJustin Hibbits MAJOR,
4836*852ba100SJustin Hibbits E_INVALID_VALUE,
4837*852ba100SJustin Hibbits ("The manipulation of the type remove DTLS if exist has to be pointed by all numOfKeys"));
48380aeed3e9SJustin Hibbits err = UpdateManipIc(h_Manip, FmPcdCcGetOffset(h_FmPcdCcNode));
48390aeed3e9SJustin Hibbits if (err)
48400aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
48410aeed3e9SJustin Hibbits }
48420aeed3e9SJustin Hibbits break;
4843*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
48440aeed3e9SJustin Hibbits default:
48450aeed3e9SJustin Hibbits break;
48460aeed3e9SJustin Hibbits }
4847*852ba100SJustin Hibbits
48480aeed3e9SJustin Hibbits return err;
48490aeed3e9SJustin Hibbits }
48500aeed3e9SJustin Hibbits
FmPcdManipUpdateAdResultForCc(t_Handle h_Manip,t_FmPcdCcNextEngineParams * p_CcNextEngineParams,t_Handle p_Ad,t_Handle * p_AdNewPtr)4851*852ba100SJustin Hibbits void FmPcdManipUpdateAdResultForCc(
4852*852ba100SJustin Hibbits t_Handle h_Manip, t_FmPcdCcNextEngineParams *p_CcNextEngineParams,
4853*852ba100SJustin Hibbits t_Handle p_Ad, t_Handle *p_AdNewPtr)
48540aeed3e9SJustin Hibbits {
48550aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
48560aeed3e9SJustin Hibbits
4857*852ba100SJustin Hibbits /* This routine creates a Manip AD and can return in "p_AdNewPtr"
4858*852ba100SJustin Hibbits * either the new descriptor or NULL if it writes the Manip AD into p_AD (into the match table) */
4859*852ba100SJustin Hibbits
48600aeed3e9SJustin Hibbits ASSERT_COND(p_Manip);
4861*852ba100SJustin Hibbits ASSERT_COND(p_CcNextEngineParams);
4862*852ba100SJustin Hibbits ASSERT_COND(p_Ad);
4863*852ba100SJustin Hibbits ASSERT_COND(p_AdNewPtr);
48640aeed3e9SJustin Hibbits
48650aeed3e9SJustin Hibbits FmPcdManipUpdateOwner(h_Manip, TRUE);
48660aeed3e9SJustin Hibbits
4867*852ba100SJustin Hibbits /* According to "type", either build & initialize a new AD (p_AdNew) or initialize
4868*852ba100SJustin Hibbits * p_Ad ( the AD in the match table) and set p_AdNew = NULL. */
4869*852ba100SJustin Hibbits switch (p_Manip->opcode)
48700aeed3e9SJustin Hibbits {
4871*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
48720aeed3e9SJustin Hibbits case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):
48730aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
48740aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_INDEXED_STATS):
4875*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->h_Ad;
48760aeed3e9SJustin Hibbits break;
48770aeed3e9SJustin Hibbits case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
48780aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
4879*852ba100SJustin Hibbits WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->fqid,
4880*852ba100SJustin Hibbits ((t_AdOfTypeResult *)(p_Manip->h_Ad))->fqid);
4881*852ba100SJustin Hibbits WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->plcrProfile,
4882*852ba100SJustin Hibbits ((t_AdOfTypeResult *)(p_Manip->h_Ad))->plcrProfile);
4883*852ba100SJustin Hibbits WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->nia,
4884*852ba100SJustin Hibbits ((t_AdOfTypeResult *)(p_Manip->h_Ad))->nia);
4885*852ba100SJustin Hibbits *p_AdNewPtr = NULL;
48860aeed3e9SJustin Hibbits break;
4887*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
4888*852ba100SJustin Hibbits case (HMAN_OC_IPSEC_MANIP):
4889*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4890*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_MANIP):
4891*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4892*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->h_Ad;
4893*852ba100SJustin Hibbits break;
4894*852ba100SJustin Hibbits case (HMAN_OC_IP_FRAGMENTATION):
4895*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4896*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
4897*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4898*852ba100SJustin Hibbits if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_DONE)
4899*852ba100SJustin Hibbits && (!p_CcNextEngineParams->params.enqueueParams.overrideFqid))
4900*852ba100SJustin Hibbits {
4901*852ba100SJustin Hibbits memcpy((uint8_t *)p_Ad, (uint8_t *)p_Manip->h_Ad,
4902*852ba100SJustin Hibbits sizeof(t_AdOfTypeContLookup));
4903*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4904*852ba100SJustin Hibbits WRITE_UINT32(
4905*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,
4906*852ba100SJustin Hibbits GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase) & ~FM_PCD_MANIP_IP_CNIA);
4907*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4908*852ba100SJustin Hibbits *p_AdNewPtr = NULL;
4909*852ba100SJustin Hibbits }
4910*852ba100SJustin Hibbits else
4911*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->h_Ad;
4912*852ba100SJustin Hibbits break;
4913*852ba100SJustin Hibbits case (HMAN_OC_IP_REASSEMBLY):
4914*852ba100SJustin Hibbits if (FmPcdManipIpReassmIsIpv6Hdr(p_Manip))
4915*852ba100SJustin Hibbits {
4916*852ba100SJustin Hibbits if (!p_Manip->reassmParams.ip.ipv6Assigned)
4917*852ba100SJustin Hibbits {
4918*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->reassmParams.ip.h_Ipv6Ad;
4919*852ba100SJustin Hibbits p_Manip->reassmParams.ip.ipv6Assigned = TRUE;
4920*852ba100SJustin Hibbits FmPcdManipUpdateOwner(h_Manip, FALSE);
4921*852ba100SJustin Hibbits }
49220aeed3e9SJustin Hibbits else
49230aeed3e9SJustin Hibbits {
4924*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->reassmParams.ip.h_Ipv4Ad;
4925*852ba100SJustin Hibbits p_Manip->reassmParams.ip.ipv6Assigned = FALSE;
49260aeed3e9SJustin Hibbits }
4927*852ba100SJustin Hibbits }
4928*852ba100SJustin Hibbits else
4929*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->reassmParams.ip.h_Ipv4Ad;
4930*852ba100SJustin Hibbits memcpy((uint8_t *)p_Ad, (uint8_t *)*p_AdNewPtr,
4931*852ba100SJustin Hibbits sizeof(t_AdOfTypeContLookup));
4932*852ba100SJustin Hibbits *p_AdNewPtr = NULL;
49330aeed3e9SJustin Hibbits break;
4934*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4935*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_REASSEMBLY):
4936*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->reassmParams.capwap.h_Ad;
4937*852ba100SJustin Hibbits memcpy((uint8_t *)p_Ad, (uint8_t *)*p_AdNewPtr,
4938*852ba100SJustin Hibbits sizeof(t_AdOfTypeContLookup));
4939*852ba100SJustin Hibbits *p_AdNewPtr = NULL;
4940*852ba100SJustin Hibbits break;
4941*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4942*852ba100SJustin Hibbits case (HMAN_OC):
4943*852ba100SJustin Hibbits /* Allocate and initialize HMTD */
4944*852ba100SJustin Hibbits *p_AdNewPtr = p_Manip->h_Ad;
4945*852ba100SJustin Hibbits break;
49460aeed3e9SJustin Hibbits default:
49470aeed3e9SJustin Hibbits break;
49480aeed3e9SJustin Hibbits }
49490aeed3e9SJustin Hibbits }
49500aeed3e9SJustin Hibbits
FmPcdManipUpdateAdContLookupForCc(t_Handle h_Manip,t_Handle p_Ad,t_Handle * p_AdNewPtr,uint32_t adTableOffset)4951*852ba100SJustin Hibbits void FmPcdManipUpdateAdContLookupForCc(t_Handle h_Manip, t_Handle p_Ad,
4952*852ba100SJustin Hibbits t_Handle *p_AdNewPtr,
4953*852ba100SJustin Hibbits uint32_t adTableOffset)
4954*852ba100SJustin Hibbits {
4955*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
4956*852ba100SJustin Hibbits
4957*852ba100SJustin Hibbits /* This routine creates a Manip AD and can return in "p_AdNewPtr"
4958*852ba100SJustin Hibbits * either the new descriptor or NULL if it writes the Manip AD into p_AD (into the match table) */
4959*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
4960*852ba100SJustin Hibbits
4961*852ba100SJustin Hibbits FmPcdManipUpdateOwner(h_Manip, TRUE);
4962*852ba100SJustin Hibbits
4963*852ba100SJustin Hibbits switch (p_Manip->opcode)
4964*852ba100SJustin Hibbits {
4965*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
4966*852ba100SJustin Hibbits case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
4967*852ba100SJustin Hibbits WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,
4968*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->ccAdBase);
4969*852ba100SJustin Hibbits WRITE_UINT32(
4970*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)p_Ad)->matchTblPtr,
4971*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->matchTblPtr);
4972*852ba100SJustin Hibbits WRITE_UINT32(
4973*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets,
4974*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->pcAndOffsets);
4975*852ba100SJustin Hibbits WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->gmask,
4976*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->gmask);
4977*852ba100SJustin Hibbits WRITE_UINT32(
4978*852ba100SJustin Hibbits ((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,
4979*852ba100SJustin Hibbits (GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase) | adTableOffset));
4980*852ba100SJustin Hibbits *p_AdNewPtr = NULL;
4981*852ba100SJustin Hibbits break;
4982*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
4983*852ba100SJustin Hibbits case (HMAN_OC):
4984*852ba100SJustin Hibbits /* Initialize HMTD within the match table*/
4985*852ba100SJustin Hibbits MemSet8(p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
4986*852ba100SJustin Hibbits /* copy the existing HMTD *//* ask Alla - memcpy??? */
4987*852ba100SJustin Hibbits memcpy((uint8_t*)p_Ad, p_Manip->h_Ad, sizeof(t_Hmtd));
4988*852ba100SJustin Hibbits /* update NADEN to be "1"*/
4989*852ba100SJustin Hibbits WRITE_UINT16(
4990*852ba100SJustin Hibbits ((t_Hmtd *)p_Ad)->cfg,
4991*852ba100SJustin Hibbits (uint16_t)(GET_UINT16(((t_Hmtd *)p_Ad)->cfg) | HMTD_CFG_NEXT_AD_EN));
4992*852ba100SJustin Hibbits /* update next action descriptor */
4993*852ba100SJustin Hibbits WRITE_UINT16(((t_Hmtd *)p_Ad)->nextAdIdx,
4994*852ba100SJustin Hibbits (uint16_t)(adTableOffset >> 4));
4995*852ba100SJustin Hibbits /* mark that Manip's HMTD is not used */
4996*852ba100SJustin Hibbits *p_AdNewPtr = NULL;
4997*852ba100SJustin Hibbits break;
4998*852ba100SJustin Hibbits
4999*852ba100SJustin Hibbits default:
5000*852ba100SJustin Hibbits break;
5001*852ba100SJustin Hibbits }
5002*852ba100SJustin Hibbits }
5003*852ba100SJustin Hibbits
FmPcdManipBuildIpReassmScheme(t_FmPcd * p_FmPcd,t_Handle h_NetEnv,t_Handle h_CcTree,t_Handle h_Manip,bool isIpv4,uint8_t groupId)5004*852ba100SJustin Hibbits t_Error FmPcdManipBuildIpReassmScheme(t_FmPcd *p_FmPcd, t_Handle h_NetEnv,
5005*852ba100SJustin Hibbits t_Handle h_CcTree, t_Handle h_Manip,
5006*852ba100SJustin Hibbits bool isIpv4, uint8_t groupId)
5007*852ba100SJustin Hibbits {
5008*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
5009*852ba100SJustin Hibbits t_FmPcdKgSchemeParams *p_SchemeParams = NULL;
5010*852ba100SJustin Hibbits t_Handle h_Scheme;
5011*852ba100SJustin Hibbits
5012*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
5013*852ba100SJustin Hibbits ASSERT_COND(h_NetEnv);
5014*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
5015*852ba100SJustin Hibbits
5016*852ba100SJustin Hibbits /* scheme was already build, no need to check for IPv6 */
5017*852ba100SJustin Hibbits if (p_Manip->reassmParams.ip.h_Ipv4Scheme)
5018*852ba100SJustin Hibbits return E_OK;
5019*852ba100SJustin Hibbits
5020*852ba100SJustin Hibbits if (isIpv4) {
5021*852ba100SJustin Hibbits h_Scheme = FmPcdKgGetSchemeHandle(p_FmPcd, p_Manip->reassmParams.ip.relativeSchemeId[0]);
5022*852ba100SJustin Hibbits if (h_Scheme) {
5023*852ba100SJustin Hibbits /* scheme was found */
5024*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv4Scheme = h_Scheme;
5025*852ba100SJustin Hibbits return E_OK;
5026*852ba100SJustin Hibbits }
5027*852ba100SJustin Hibbits } else {
5028*852ba100SJustin Hibbits h_Scheme = FmPcdKgGetSchemeHandle(p_FmPcd, p_Manip->reassmParams.ip.relativeSchemeId[1]);
5029*852ba100SJustin Hibbits if (h_Scheme) {
5030*852ba100SJustin Hibbits /* scheme was found */
5031*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv6Scheme = h_Scheme;
5032*852ba100SJustin Hibbits return E_OK;
5033*852ba100SJustin Hibbits }
5034*852ba100SJustin Hibbits }
5035*852ba100SJustin Hibbits
5036*852ba100SJustin Hibbits p_SchemeParams = XX_Malloc(sizeof(t_FmPcdKgSchemeParams));
5037*852ba100SJustin Hibbits if (!p_SchemeParams)
5038*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
5039*852ba100SJustin Hibbits ("Memory allocation failed for scheme"));
5040*852ba100SJustin Hibbits
5041*852ba100SJustin Hibbits /* Configures the IPv4 or IPv6 scheme*/
5042*852ba100SJustin Hibbits memset(p_SchemeParams, 0, sizeof(t_FmPcdKgSchemeParams));
5043*852ba100SJustin Hibbits p_SchemeParams->netEnvParams.h_NetEnv = h_NetEnv;
5044*852ba100SJustin Hibbits p_SchemeParams->id.relativeSchemeId = (uint8_t)(
5045*852ba100SJustin Hibbits (isIpv4 == TRUE) ? p_Manip->reassmParams.ip.relativeSchemeId[0] :
5046*852ba100SJustin Hibbits p_Manip->reassmParams.ip.relativeSchemeId[1]);
5047*852ba100SJustin Hibbits p_SchemeParams->schemeCounter.update = TRUE;
5048*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
5049*852ba100SJustin Hibbits p_SchemeParams->alwaysDirect = TRUE;
5050*852ba100SJustin Hibbits p_SchemeParams->bypassFqidGeneration = TRUE;
5051*852ba100SJustin Hibbits #else
5052*852ba100SJustin Hibbits p_SchemeParams->keyExtractAndHashParams.hashDistributionNumOfFqids = 1;
5053*852ba100SJustin Hibbits p_SchemeParams->baseFqid = 0xFFFFFF; /*TODO- baseFqid*/
5054*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
5055*852ba100SJustin Hibbits
5056*852ba100SJustin Hibbits setIpReassmSchemeParams(p_FmPcd, p_SchemeParams, h_CcTree, isIpv4, groupId);
5057*852ba100SJustin Hibbits
5058*852ba100SJustin Hibbits /* Sets the new scheme */
5059*852ba100SJustin Hibbits if (isIpv4)
5060*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv4Scheme = FM_PCD_KgSchemeSet(
5061*852ba100SJustin Hibbits p_FmPcd, p_SchemeParams);
5062*852ba100SJustin Hibbits else
5063*852ba100SJustin Hibbits p_Manip->reassmParams.ip.h_Ipv6Scheme = FM_PCD_KgSchemeSet(
5064*852ba100SJustin Hibbits p_FmPcd, p_SchemeParams);
5065*852ba100SJustin Hibbits
5066*852ba100SJustin Hibbits XX_Free(p_SchemeParams);
5067*852ba100SJustin Hibbits
5068*852ba100SJustin Hibbits return E_OK;
5069*852ba100SJustin Hibbits }
5070*852ba100SJustin Hibbits
FmPcdManipDeleteIpReassmSchemes(t_Handle h_Manip)5071*852ba100SJustin Hibbits t_Error FmPcdManipDeleteIpReassmSchemes(t_Handle h_Manip)
50720aeed3e9SJustin Hibbits {
50730aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
50740aeed3e9SJustin Hibbits
50750aeed3e9SJustin Hibbits ASSERT_COND(p_Manip);
50760aeed3e9SJustin Hibbits
5077*852ba100SJustin Hibbits if ((p_Manip->reassmParams.ip.h_Ipv4Scheme) &&
5078*852ba100SJustin Hibbits !FmPcdKgIsSchemeHasOwners(p_Manip->reassmParams.ip.h_Ipv4Scheme))
5079*852ba100SJustin Hibbits FM_PCD_KgSchemeDelete(p_Manip->reassmParams.ip.h_Ipv4Scheme);
50800aeed3e9SJustin Hibbits
5081*852ba100SJustin Hibbits if ((p_Manip->reassmParams.ip.h_Ipv6Scheme) &&
5082*852ba100SJustin Hibbits !FmPcdKgIsSchemeHasOwners(p_Manip->reassmParams.ip.h_Ipv6Scheme))
5083*852ba100SJustin Hibbits FM_PCD_KgSchemeDelete(p_Manip->reassmParams.ip.h_Ipv6Scheme);
5084*852ba100SJustin Hibbits
5085*852ba100SJustin Hibbits return E_OK;
5086*852ba100SJustin Hibbits }
5087*852ba100SJustin Hibbits
FmPcdManipIpReassmIsIpv6Hdr(t_Handle h_Manip)5088*852ba100SJustin Hibbits bool FmPcdManipIpReassmIsIpv6Hdr(t_Handle h_Manip)
50890aeed3e9SJustin Hibbits {
5090*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
5091*852ba100SJustin Hibbits
5092*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
5093*852ba100SJustin Hibbits
5094*852ba100SJustin Hibbits return (p_Manip->reassmParams.hdr == HEADER_TYPE_IPv6);
50950aeed3e9SJustin Hibbits }
50960aeed3e9SJustin Hibbits
FmPcdManipBuildCapwapReassmScheme(t_FmPcd * p_FmPcd,t_Handle h_NetEnv,t_Handle h_CcTree,t_Handle h_Manip,uint8_t groupId)5097*852ba100SJustin Hibbits t_Error FmPcdManipBuildCapwapReassmScheme(t_FmPcd *p_FmPcd, t_Handle h_NetEnv,
5098*852ba100SJustin Hibbits t_Handle h_CcTree, t_Handle h_Manip,
5099*852ba100SJustin Hibbits uint8_t groupId)
5100*852ba100SJustin Hibbits {
5101*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
5102*852ba100SJustin Hibbits t_FmPcdKgSchemeParams *p_SchemeParams = NULL;
5103*852ba100SJustin Hibbits
5104*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
5105*852ba100SJustin Hibbits ASSERT_COND(h_NetEnv);
5106*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
5107*852ba100SJustin Hibbits
5108*852ba100SJustin Hibbits /* scheme was already build, no need to check for IPv6 */
5109*852ba100SJustin Hibbits if (p_Manip->reassmParams.capwap.h_Scheme)
5110*852ba100SJustin Hibbits return E_OK;
5111*852ba100SJustin Hibbits
5112*852ba100SJustin Hibbits p_SchemeParams = XX_Malloc(sizeof(t_FmPcdKgSchemeParams));
5113*852ba100SJustin Hibbits if (!p_SchemeParams)
5114*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY,
5115*852ba100SJustin Hibbits ("Memory allocation failed for scheme"));
5116*852ba100SJustin Hibbits
5117*852ba100SJustin Hibbits memset(p_SchemeParams, 0, sizeof(t_FmPcdKgSchemeParams));
5118*852ba100SJustin Hibbits p_SchemeParams->netEnvParams.h_NetEnv = h_NetEnv;
5119*852ba100SJustin Hibbits p_SchemeParams->id.relativeSchemeId =
5120*852ba100SJustin Hibbits (uint8_t)p_Manip->reassmParams.capwap.relativeSchemeId;
5121*852ba100SJustin Hibbits p_SchemeParams->schemeCounter.update = TRUE;
5122*852ba100SJustin Hibbits p_SchemeParams->bypassFqidGeneration = TRUE;
5123*852ba100SJustin Hibbits
5124*852ba100SJustin Hibbits setCapwapReassmSchemeParams(p_FmPcd, p_SchemeParams, h_CcTree, groupId);
5125*852ba100SJustin Hibbits
5126*852ba100SJustin Hibbits p_Manip->reassmParams.capwap.h_Scheme = FM_PCD_KgSchemeSet(p_FmPcd,
5127*852ba100SJustin Hibbits p_SchemeParams);
5128*852ba100SJustin Hibbits
5129*852ba100SJustin Hibbits XX_Free(p_SchemeParams);
5130*852ba100SJustin Hibbits
5131*852ba100SJustin Hibbits return E_OK;
5132*852ba100SJustin Hibbits }
5133*852ba100SJustin Hibbits
FmPcdManipDeleteCapwapReassmSchemes(t_Handle h_Manip)5134*852ba100SJustin Hibbits t_Error FmPcdManipDeleteCapwapReassmSchemes(t_Handle h_Manip)
5135*852ba100SJustin Hibbits {
5136*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
5137*852ba100SJustin Hibbits
5138*852ba100SJustin Hibbits ASSERT_COND(p_Manip);
5139*852ba100SJustin Hibbits
5140*852ba100SJustin Hibbits if (p_Manip->reassmParams.capwap.h_Scheme)
5141*852ba100SJustin Hibbits FM_PCD_KgSchemeDelete(p_Manip->reassmParams.capwap.h_Scheme);
5142*852ba100SJustin Hibbits
5143*852ba100SJustin Hibbits return E_OK;
5144*852ba100SJustin Hibbits }
5145*852ba100SJustin Hibbits
5146*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
FmPcdManipApplSpecificBuild(void)5147*852ba100SJustin Hibbits t_Handle FmPcdManipApplSpecificBuild(void)
5148*852ba100SJustin Hibbits {
5149*852ba100SJustin Hibbits t_FmPcdManip *p_Manip;
5150*852ba100SJustin Hibbits
5151*852ba100SJustin Hibbits p_Manip = (t_FmPcdManip*)XX_Malloc(sizeof(t_FmPcdManip));
5152*852ba100SJustin Hibbits if (!p_Manip)
5153*852ba100SJustin Hibbits {
5154*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
5155*852ba100SJustin Hibbits return NULL;
5156*852ba100SJustin Hibbits }
5157*852ba100SJustin Hibbits memset(p_Manip, 0, sizeof(t_FmPcdManip));
5158*852ba100SJustin Hibbits
5159*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX;
5160*852ba100SJustin Hibbits p_Manip->muramAllocate = FALSE;
5161*852ba100SJustin Hibbits
5162*852ba100SJustin Hibbits p_Manip->h_Ad = (t_Handle)XX_Malloc(FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
5163*852ba100SJustin Hibbits if (!p_Manip->h_Ad)
5164*852ba100SJustin Hibbits {
5165*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of Manipulation action descriptor"));
5166*852ba100SJustin Hibbits XX_Free(p_Manip);
5167*852ba100SJustin Hibbits return NULL;
5168*852ba100SJustin Hibbits }
5169*852ba100SJustin Hibbits
5170*852ba100SJustin Hibbits memset(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
5171*852ba100SJustin Hibbits
5172*852ba100SJustin Hibbits /*treatFdStatusFieldsAsErrors = TRUE hardcoded - assumption its always come after CAAM*/
5173*852ba100SJustin Hibbits /*Application specific = type of flowId index, move internal frame header from data to IC,
5174*852ba100SJustin Hibbits SEC errors check*/
5175*852ba100SJustin Hibbits if (MvIntFrameHeaderFromFrameToBufferPrefix(p_Manip, TRUE)!= E_OK)
5176*852ba100SJustin Hibbits {
5177*852ba100SJustin Hibbits XX_Free(p_Manip->h_Ad);
5178*852ba100SJustin Hibbits XX_Free(p_Manip);
5179*852ba100SJustin Hibbits return NULL;
5180*852ba100SJustin Hibbits }
5181*852ba100SJustin Hibbits return p_Manip;
5182*852ba100SJustin Hibbits }
5183*852ba100SJustin Hibbits
FmPcdManipIsCapwapApplSpecific(t_Handle h_Manip)5184*852ba100SJustin Hibbits bool FmPcdManipIsCapwapApplSpecific(t_Handle h_Manip)
5185*852ba100SJustin Hibbits {
5186*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
5187*852ba100SJustin Hibbits ASSERT_COND(h_Manip);
5188*852ba100SJustin Hibbits
5189*852ba100SJustin Hibbits return (bool)((p_Manip->opcode == HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST) ? TRUE : FALSE);
5190*852ba100SJustin Hibbits }
5191*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
5192*852ba100SJustin Hibbits /*********************** End of inter-module routines ************************/
5193*852ba100SJustin Hibbits
5194*852ba100SJustin Hibbits /****************************************/
5195*852ba100SJustin Hibbits /* API Init unit functions */
5196*852ba100SJustin Hibbits /****************************************/
5197*852ba100SJustin Hibbits
FM_PCD_ManipNodeSet(t_Handle h_FmPcd,t_FmPcdManipParams * p_ManipParams)5198*852ba100SJustin Hibbits t_Handle FM_PCD_ManipNodeSet(t_Handle h_FmPcd,
5199*852ba100SJustin Hibbits t_FmPcdManipParams *p_ManipParams)
52000aeed3e9SJustin Hibbits {
52010aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
52020aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip;
52030aeed3e9SJustin Hibbits t_Error err;
52040aeed3e9SJustin Hibbits
52050aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
52060aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_ManipParams, E_INVALID_HANDLE, NULL);
52070aeed3e9SJustin Hibbits
52080aeed3e9SJustin Hibbits p_Manip = ManipOrStatsSetNode(h_FmPcd, (t_Handle)p_ManipParams, FALSE);
52090aeed3e9SJustin Hibbits if (!p_Manip)
52100aeed3e9SJustin Hibbits return NULL;
52110aeed3e9SJustin Hibbits
5212*852ba100SJustin Hibbits if (((p_Manip->opcode == HMAN_OC_IP_REASSEMBLY)
5213*852ba100SJustin Hibbits || (p_Manip->opcode == HMAN_OC_IP_FRAGMENTATION)
5214*852ba100SJustin Hibbits || (p_Manip->opcode == HMAN_OC)
5215*852ba100SJustin Hibbits || (p_Manip->opcode == HMAN_OC_IPSEC_MANIP)
5216*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
5217*852ba100SJustin Hibbits || (p_Manip->opcode == HMAN_OC_CAPWAP_MANIP)
5218*852ba100SJustin Hibbits || (p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION)
5219*852ba100SJustin Hibbits || (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY)
5220*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
5221*852ba100SJustin Hibbits ) && (!FmPcdIsAdvancedOffloadSupported(p_FmPcd)))
52220aeed3e9SJustin Hibbits {
5223*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Advanced-offload must be enabled"));
5224*852ba100SJustin Hibbits XX_Free(p_Manip);
5225*852ba100SJustin Hibbits return NULL;
5226*852ba100SJustin Hibbits }
5227*852ba100SJustin Hibbits p_Manip->h_Spinlock = XX_InitSpinlock();
5228*852ba100SJustin Hibbits if (!p_Manip->h_Spinlock)
52290aeed3e9SJustin Hibbits {
52300aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
52310aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
52320aeed3e9SJustin Hibbits XX_Free(p_Manip);
52330aeed3e9SJustin Hibbits return NULL;
5234*852ba100SJustin Hibbits }INIT_LIST(&p_Manip->nodesLst);
5235*852ba100SJustin Hibbits
5236*852ba100SJustin Hibbits switch (p_Manip->opcode)
5237*852ba100SJustin Hibbits {
5238*852ba100SJustin Hibbits case (HMAN_OC_IP_REASSEMBLY):
5239*852ba100SJustin Hibbits /* IpReassembly */
5240*852ba100SJustin Hibbits err = IpReassembly(&p_ManipParams->u.reassem, p_Manip);
52410aeed3e9SJustin Hibbits break;
52420aeed3e9SJustin Hibbits case (HMAN_OC_IP_FRAGMENTATION):
52430aeed3e9SJustin Hibbits /* IpFragmentation */
5244*852ba100SJustin Hibbits err = IpFragmentation(&p_ManipParams->u.frag.u.ipFrag, p_Manip);
52450aeed3e9SJustin Hibbits if (err)
52460aeed3e9SJustin Hibbits break;
5247*852ba100SJustin Hibbits err = IPManip(p_Manip);
5248*852ba100SJustin Hibbits break;
5249*852ba100SJustin Hibbits case (HMAN_OC_IPSEC_MANIP):
5250*852ba100SJustin Hibbits err = IPSecManip(p_ManipParams, p_Manip);
5251*852ba100SJustin Hibbits break;
5252*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
5253*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_REASSEMBLY):
5254*852ba100SJustin Hibbits /* CapwapReassembly */
5255*852ba100SJustin Hibbits err = CapwapReassembly(&p_ManipParams->u.reassem, p_Manip);
5256*852ba100SJustin Hibbits break;
52570aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
52580aeed3e9SJustin Hibbits /* CapwapFragmentation */
5259*852ba100SJustin Hibbits err = CapwapFragmentation(&p_ManipParams->u.frag.u.capwapFrag,
5260*852ba100SJustin Hibbits p_Manip);
5261*852ba100SJustin Hibbits break;
5262*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_MANIP):
5263*852ba100SJustin Hibbits err = CapwapManip(p_ManipParams, p_Manip);
5264*852ba100SJustin Hibbits break;
5265*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
5266*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
5267*852ba100SJustin Hibbits case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):
5268*852ba100SJustin Hibbits /* HmanType1 */
5269*852ba100SJustin Hibbits err = RmvHdrTillSpecLocNOrInsrtIntFrmHdr(&p_ManipParams->u.hdr.rmvParams, p_Manip);
5270*852ba100SJustin Hibbits break;
5271*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
5272*852ba100SJustin Hibbits err = CapwapFragmentation(&p_ManipParams->fragOrReasmParams.u.capwapFragParams,
5273*852ba100SJustin Hibbits p_Manip,
5274*852ba100SJustin Hibbits p_FmPcd,
5275*852ba100SJustin Hibbits p_ManipParams->fragOrReasmParams.sgBpid);
52760aeed3e9SJustin Hibbits if (err)
52770aeed3e9SJustin Hibbits {
52780aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
52790aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
52800aeed3e9SJustin Hibbits XX_Free(p_Manip);
52810aeed3e9SJustin Hibbits return NULL;
52820aeed3e9SJustin Hibbits }
52830aeed3e9SJustin Hibbits if (p_Manip->insrt)
5284*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;
52850aeed3e9SJustin Hibbits case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
52860aeed3e9SJustin Hibbits /* HmanType2 + if user asked only for fragmentation still need to allocate HmanType2 */
5287*852ba100SJustin Hibbits err = InsrtHdrByTempl(&p_ManipParams->u.hdr.insrtParams, p_Manip, p_FmPcd);
52880aeed3e9SJustin Hibbits break;
52890aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_REASSEMBLY):
5290*852ba100SJustin Hibbits err = CapwapReassembly(&p_ManipParams->fragOrReasmParams.u.capwapReasmParams,
5291*852ba100SJustin Hibbits p_Manip,
5292*852ba100SJustin Hibbits p_FmPcd,
5293*852ba100SJustin Hibbits p_ManipParams->fragOrReasmParams.sgBpid);
52940aeed3e9SJustin Hibbits if (err)
52950aeed3e9SJustin Hibbits {
52960aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
52970aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
52980aeed3e9SJustin Hibbits XX_Free(p_Manip);
52990aeed3e9SJustin Hibbits return NULL;
53000aeed3e9SJustin Hibbits }
53010aeed3e9SJustin Hibbits if (p_Manip->rmv)
5302*852ba100SJustin Hibbits p_Manip->opcode = HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;
53030aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
53040aeed3e9SJustin Hibbits /*CAPWAP decapsulation + if user asked only for reassembly still need to allocate CAPWAP decapsulation*/
53050aeed3e9SJustin Hibbits err = CapwapRmvDtlsHdr(p_FmPcd, p_Manip);
53060aeed3e9SJustin Hibbits break;
53070aeed3e9SJustin Hibbits case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
53080aeed3e9SJustin Hibbits /*Application Specific type 1*/
5309*852ba100SJustin Hibbits err = MvIntFrameHeaderFromFrameToBufferPrefix(p_Manip, TRUE);
5310*852ba100SJustin Hibbits break;
5311*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
5312*852ba100SJustin Hibbits case (HMAN_OC):
5313*852ba100SJustin Hibbits /* New Manip */
5314*852ba100SJustin Hibbits err = CreateManipActionNew(p_Manip, p_ManipParams);
53150aeed3e9SJustin Hibbits break;
53160aeed3e9SJustin Hibbits default:
53170aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
53180aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
53190aeed3e9SJustin Hibbits XX_Free(p_Manip);
53200aeed3e9SJustin Hibbits return NULL;
53210aeed3e9SJustin Hibbits }
5322*852ba100SJustin Hibbits
53230aeed3e9SJustin Hibbits if (err)
53240aeed3e9SJustin Hibbits {
53250aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, err, NO_MSG);
53260aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
53270aeed3e9SJustin Hibbits XX_Free(p_Manip);
53280aeed3e9SJustin Hibbits return NULL;
53290aeed3e9SJustin Hibbits }
5330*852ba100SJustin Hibbits
5331*852ba100SJustin Hibbits if (p_ManipParams->h_NextManip)
5332*852ba100SJustin Hibbits {
5333*852ba100SJustin Hibbits /* in the check routine we've verified that h_NextManip has no owners
5334*852ba100SJustin Hibbits * and that only supported types are allowed. */
5335*852ba100SJustin Hibbits p_Manip->h_NextManip = p_ManipParams->h_NextManip;
5336*852ba100SJustin Hibbits /* save a "prev" pointer in h_NextManip */
5337*852ba100SJustin Hibbits MANIP_SET_PREV(p_Manip->h_NextManip, p_Manip);
5338*852ba100SJustin Hibbits FmPcdManipUpdateOwner(p_Manip->h_NextManip, TRUE);
5339*852ba100SJustin Hibbits }
5340*852ba100SJustin Hibbits
53410aeed3e9SJustin Hibbits return p_Manip;
53420aeed3e9SJustin Hibbits }
53430aeed3e9SJustin Hibbits
FM_PCD_ManipNodeReplace(t_Handle h_Manip,t_FmPcdManipParams * p_ManipParams)5344*852ba100SJustin Hibbits t_Error FM_PCD_ManipNodeReplace(t_Handle h_Manip,
5345*852ba100SJustin Hibbits t_FmPcdManipParams *p_ManipParams)
53460aeed3e9SJustin Hibbits {
5347*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip, *p_FirstManip;
5348*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)(p_Manip->h_FmPcd);
5349*852ba100SJustin Hibbits t_Error err;
5350*852ba100SJustin Hibbits uint8_t *p_WholeHmct = NULL, *p_ShadowHmct = NULL, *p_Hmtd = NULL;
5351*852ba100SJustin Hibbits t_List lstOfNodeshichPointsOnCrntMdfManip, *p_Pos;
5352*852ba100SJustin Hibbits t_CcNodeInformation *p_CcNodeInfo;
5353*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);
5354*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE);
5355*852ba100SJustin Hibbits
5356*852ba100SJustin Hibbits INIT_LIST(&lstOfNodeshichPointsOnCrntMdfManip);
5357*852ba100SJustin Hibbits
5358*852ba100SJustin Hibbits if ((p_ManipParams->type != e_FM_PCD_MANIP_HDR)
5359*852ba100SJustin Hibbits || (p_Manip->type != e_FM_PCD_MANIP_HDR))
5360*852ba100SJustin Hibbits RETURN_ERROR(
5361*852ba100SJustin Hibbits MINOR,
5362*852ba100SJustin Hibbits E_NOT_SUPPORTED,
5363*852ba100SJustin Hibbits ("FM_PCD_ManipNodeReplace Functionality supported only for Header Manipulation."));
5364*852ba100SJustin Hibbits
5365*852ba100SJustin Hibbits ASSERT_COND(p_Manip->opcode == HMAN_OC);
5366*852ba100SJustin Hibbits ASSERT_COND(p_Manip->manipParams.h_NextManip == p_Manip->h_NextManip);
5367*852ba100SJustin Hibbits memcpy((uint8_t*)&p_Manip->manipParams, p_ManipParams,
5368*852ba100SJustin Hibbits sizeof(p_Manip->manipParams));
5369*852ba100SJustin Hibbits p_Manip->manipParams.h_NextManip = p_Manip->h_NextManip;
5370*852ba100SJustin Hibbits
5371*852ba100SJustin Hibbits /* The replacement of the HdrManip depends on the node type.*/
5372*852ba100SJustin Hibbits /*
5373*852ba100SJustin Hibbits * (1) If this is an independent node, all its owners should be updated.
5374*852ba100SJustin Hibbits *
5375*852ba100SJustin Hibbits * (2) If it is the head of a cascaded chain (it does not have a "prev" but
5376*852ba100SJustin Hibbits * it has a "next" and it has a "cascaded" indication), the next
5377*852ba100SJustin Hibbits * node remains unchanged, and the behavior is as in (1).
5378*852ba100SJustin Hibbits *
5379*852ba100SJustin Hibbits * (3) If it is not the head, but a part of a cascaded chain, in can be
5380*852ba100SJustin Hibbits * also replaced as a regular node with just one owner.
5381*852ba100SJustin Hibbits *
5382*852ba100SJustin Hibbits * (4) If it is a part of a chain implemented as a unified table, the
5383*852ba100SJustin Hibbits * whole table is replaced and the owners of the head node must be updated.
5384*852ba100SJustin Hibbits *
5385*852ba100SJustin Hibbits */
5386*852ba100SJustin Hibbits /* lock shadow */
5387*852ba100SJustin Hibbits if (!p_FmPcd->p_CcShadow)
5388*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));
5389*852ba100SJustin Hibbits
5390*852ba100SJustin Hibbits if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
5391*852ba100SJustin Hibbits return ERROR_CODE(E_BUSY);
5392*852ba100SJustin Hibbits
5393*852ba100SJustin Hibbits /* this routine creates a new manip action in the CC Shadow. */
5394*852ba100SJustin Hibbits err = CreateManipActionShadow(p_Manip, p_ManipParams);
5395*852ba100SJustin Hibbits if (err)
5396*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
5397*852ba100SJustin Hibbits
5398*852ba100SJustin Hibbits /* If the owners list is empty (these are NOT the "owners" counter, but pointers from CC)
5399*852ba100SJustin Hibbits * replace only HMTD and no lcok is required. Otherwise
5400*852ba100SJustin Hibbits * lock the whole PCD
5401*852ba100SJustin Hibbits * In case 4 MANIP_IS_UNIFIED_NON_FIRST(p_Manip) - Use the head node instead. */
5402*852ba100SJustin Hibbits if (!FmPcdLockTryLockAll(p_FmPcd))
5403*852ba100SJustin Hibbits {
5404*852ba100SJustin Hibbits DBG(TRACE, ("FmPcdLockTryLockAll failed"));
5405*852ba100SJustin Hibbits return ERROR_CODE(E_BUSY);
5406*852ba100SJustin Hibbits }
5407*852ba100SJustin Hibbits
5408*852ba100SJustin Hibbits p_ShadowHmct = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow, 16);
5409*852ba100SJustin Hibbits
5410*852ba100SJustin Hibbits p_FirstManip = (t_FmPcdManip*)GetManipInfo(p_Manip,
5411*852ba100SJustin Hibbits e_MANIP_HANDLER_TABLE_OWNER);
5412*852ba100SJustin Hibbits ASSERT_COND(p_FirstManip);
5413*852ba100SJustin Hibbits
5414*852ba100SJustin Hibbits if (!NCSW_LIST_IsEmpty(&p_FirstManip->nodesLst))
5415*852ba100SJustin Hibbits UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(
5416*852ba100SJustin Hibbits p_FirstManip, &lstOfNodeshichPointsOnCrntMdfManip);
5417*852ba100SJustin Hibbits
5418*852ba100SJustin Hibbits p_Hmtd = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMTD);
5419*852ba100SJustin Hibbits ASSERT_COND(p_Hmtd);
5420*852ba100SJustin Hibbits BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_Hmtd, p_ShadowHmct,
5421*852ba100SJustin Hibbits ((t_FmPcd*)(p_Manip->h_FmPcd)));
5422*852ba100SJustin Hibbits
5423*852ba100SJustin Hibbits NCSW_LIST_FOR_EACH(p_Pos, &lstOfNodeshichPointsOnCrntMdfManip)
5424*852ba100SJustin Hibbits {
5425*852ba100SJustin Hibbits p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
5426*852ba100SJustin Hibbits BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_CcNodeInfo->h_CcNode,
5427*852ba100SJustin Hibbits p_ShadowHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));
5428*852ba100SJustin Hibbits }
5429*852ba100SJustin Hibbits
5430*852ba100SJustin Hibbits p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);
5431*852ba100SJustin Hibbits ASSERT_COND(p_WholeHmct);
5432*852ba100SJustin Hibbits
5433*852ba100SJustin Hibbits /* re-build the HMCT n the original location */
5434*852ba100SJustin Hibbits err = CreateManipActionBackToOrig(p_Manip, p_ManipParams);
5435*852ba100SJustin Hibbits if (err)
5436*852ba100SJustin Hibbits {
5437*852ba100SJustin Hibbits RELEASE_LOCK(p_FmPcd->shadowLock);
5438*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
5439*852ba100SJustin Hibbits }
5440*852ba100SJustin Hibbits
5441*852ba100SJustin Hibbits p_Hmtd = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMTD);
5442*852ba100SJustin Hibbits ASSERT_COND(p_Hmtd);
5443*852ba100SJustin Hibbits BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_Hmtd, p_WholeHmct,
5444*852ba100SJustin Hibbits ((t_FmPcd*)p_Manip->h_FmPcd));
5445*852ba100SJustin Hibbits
5446*852ba100SJustin Hibbits /* If NCSW_LIST > 0, create a list of p_Ad's that point to the HMCT. Join also t_HMTD to this list.
5447*852ba100SJustin Hibbits * For each p_Hmct (from list+fixed):
5448*852ba100SJustin Hibbits * call Host Command to replace HMTD by a new one */NCSW_LIST_FOR_EACH(p_Pos, &lstOfNodeshichPointsOnCrntMdfManip)
5449*852ba100SJustin Hibbits {
5450*852ba100SJustin Hibbits p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
5451*852ba100SJustin Hibbits BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_CcNodeInfo->h_CcNode,
5452*852ba100SJustin Hibbits p_WholeHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));
5453*852ba100SJustin Hibbits }
5454*852ba100SJustin Hibbits
5455*852ba100SJustin Hibbits
5456*852ba100SJustin Hibbits ReleaseLst(&lstOfNodeshichPointsOnCrntMdfManip);
5457*852ba100SJustin Hibbits
5458*852ba100SJustin Hibbits FmPcdLockUnlockAll(p_FmPcd);
5459*852ba100SJustin Hibbits
5460*852ba100SJustin Hibbits /* unlock shadow */
5461*852ba100SJustin Hibbits RELEASE_LOCK(p_FmPcd->shadowLock);
5462*852ba100SJustin Hibbits
5463*852ba100SJustin Hibbits return E_OK;
5464*852ba100SJustin Hibbits }
5465*852ba100SJustin Hibbits
FM_PCD_ManipNodeDelete(t_Handle h_ManipNode)5466*852ba100SJustin Hibbits t_Error FM_PCD_ManipNodeDelete(t_Handle h_ManipNode)
5467*852ba100SJustin Hibbits {
54680aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_ManipNode;
54690aeed3e9SJustin Hibbits
54700aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
54710aeed3e9SJustin Hibbits
54720aeed3e9SJustin Hibbits if (p_Manip->owner)
5473*852ba100SJustin Hibbits RETURN_ERROR(
5474*852ba100SJustin Hibbits MAJOR,
5475*852ba100SJustin Hibbits E_INVALID_STATE,
5476*852ba100SJustin Hibbits ("This manipulation node not be removed because this node is occupied, first - unbind this node "));
54770aeed3e9SJustin Hibbits
5478*852ba100SJustin Hibbits if (p_Manip->h_NextManip)
5479*852ba100SJustin Hibbits {
5480*852ba100SJustin Hibbits MANIP_SET_PREV(p_Manip->h_NextManip, NULL);
5481*852ba100SJustin Hibbits FmPcdManipUpdateOwner(p_Manip->h_NextManip, FALSE);
5482*852ba100SJustin Hibbits }
5483*852ba100SJustin Hibbits
5484*852ba100SJustin Hibbits if (p_Manip->p_Hmct
5485*852ba100SJustin Hibbits && (MANIP_IS_UNIFIED_FIRST(p_Manip) || !MANIP_IS_UNIFIED(p_Manip)))
5486*852ba100SJustin Hibbits FM_MURAM_FreeMem(((t_FmPcd *)p_Manip->h_FmPcd)->h_FmMuram,
5487*852ba100SJustin Hibbits p_Manip->p_Hmct);
5488*852ba100SJustin Hibbits
5489*852ba100SJustin Hibbits if (p_Manip->h_Spinlock)
5490*852ba100SJustin Hibbits {
5491*852ba100SJustin Hibbits XX_FreeSpinlock(p_Manip->h_Spinlock);
5492*852ba100SJustin Hibbits p_Manip->h_Spinlock = NULL;
5493*852ba100SJustin Hibbits }
5494*852ba100SJustin Hibbits
5495*852ba100SJustin Hibbits ReleaseManipHandler(p_Manip, p_Manip->h_FmPcd);
54960aeed3e9SJustin Hibbits
54970aeed3e9SJustin Hibbits XX_Free(h_ManipNode);
54980aeed3e9SJustin Hibbits
54990aeed3e9SJustin Hibbits return E_OK;
55000aeed3e9SJustin Hibbits }
55010aeed3e9SJustin Hibbits
FM_PCD_ManipGetStatistics(t_Handle h_ManipNode,t_FmPcdManipStats * p_FmPcdManipStats)5502*852ba100SJustin Hibbits t_Error FM_PCD_ManipGetStatistics(t_Handle h_ManipNode,
5503*852ba100SJustin Hibbits t_FmPcdManipStats *p_FmPcdManipStats)
5504*852ba100SJustin Hibbits {
5505*852ba100SJustin Hibbits t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_ManipNode;
5506*852ba100SJustin Hibbits
5507*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
5508*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdManipStats, E_NULL_POINTER);
5509*852ba100SJustin Hibbits
5510*852ba100SJustin Hibbits switch (p_Manip->opcode)
5511*852ba100SJustin Hibbits {
5512*852ba100SJustin Hibbits case (HMAN_OC_IP_REASSEMBLY):
5513*852ba100SJustin Hibbits return IpReassemblyStats(p_Manip,
5514*852ba100SJustin Hibbits &p_FmPcdManipStats->u.reassem.u.ipReassem);
5515*852ba100SJustin Hibbits case (HMAN_OC_IP_FRAGMENTATION):
5516*852ba100SJustin Hibbits return IpFragmentationStats(p_Manip,
5517*852ba100SJustin Hibbits &p_FmPcdManipStats->u.frag.u.ipFrag);
5518*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
5519*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_REASSEMBLY):
5520*852ba100SJustin Hibbits return CapwapReassemblyStats(
5521*852ba100SJustin Hibbits p_Manip, &p_FmPcdManipStats->u.reassem.u.capwapReassem);
5522*852ba100SJustin Hibbits case (HMAN_OC_CAPWAP_FRAGMENTATION):
5523*852ba100SJustin Hibbits return CapwapFragmentationStats(
5524*852ba100SJustin Hibbits p_Manip, &p_FmPcdManipStats->u.frag.u.capwapFrag);
5525*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
5526*852ba100SJustin Hibbits default:
5527*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
5528*852ba100SJustin Hibbits ("no statistics to this type of manip"));
5529*852ba100SJustin Hibbits }
5530*852ba100SJustin Hibbits
5531*852ba100SJustin Hibbits return E_OK;
5532*852ba100SJustin Hibbits }
5533*852ba100SJustin Hibbits
5534*852ba100SJustin Hibbits #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))
FM_PCD_StatisticsSetNode(t_Handle h_FmPcd,t_FmPcdStatsParams * p_StatsParams)55350aeed3e9SJustin Hibbits t_Handle FM_PCD_StatisticsSetNode(t_Handle h_FmPcd, t_FmPcdStatsParams *p_StatsParams)
55360aeed3e9SJustin Hibbits {
55370aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
55380aeed3e9SJustin Hibbits t_FmPcdManip *p_Manip;
55390aeed3e9SJustin Hibbits t_Error err;
55400aeed3e9SJustin Hibbits
55410aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE,NULL);
55420aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_StatsParams,E_INVALID_HANDLE,NULL);
55430aeed3e9SJustin Hibbits
55440aeed3e9SJustin Hibbits p_Manip = ManipOrStatsSetNode(h_FmPcd, (t_Handle)p_StatsParams, TRUE);
55450aeed3e9SJustin Hibbits if (!p_Manip)
55460aeed3e9SJustin Hibbits return NULL;
55470aeed3e9SJustin Hibbits
5548*852ba100SJustin Hibbits switch (p_Manip->opcode)
55490aeed3e9SJustin Hibbits {
55500aeed3e9SJustin Hibbits case (HMAN_OC_CAPWAP_INDEXED_STATS):
55510aeed3e9SJustin Hibbits /* Indexed statistics */
55520aeed3e9SJustin Hibbits err = IndxStats(p_StatsParams, p_Manip, p_FmPcd);
55530aeed3e9SJustin Hibbits break;
55540aeed3e9SJustin Hibbits default:
55550aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED Statistics type"));
55560aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
55570aeed3e9SJustin Hibbits XX_Free(p_Manip);
55580aeed3e9SJustin Hibbits return NULL;
55590aeed3e9SJustin Hibbits }
5560*852ba100SJustin Hibbits
55610aeed3e9SJustin Hibbits if (err)
55620aeed3e9SJustin Hibbits {
55630aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, err, NO_MSG);
55640aeed3e9SJustin Hibbits ReleaseManipHandler(p_Manip, p_FmPcd);
55650aeed3e9SJustin Hibbits XX_Free(p_Manip);
55660aeed3e9SJustin Hibbits return NULL;
55670aeed3e9SJustin Hibbits }
5568*852ba100SJustin Hibbits
55690aeed3e9SJustin Hibbits return p_Manip;
55700aeed3e9SJustin Hibbits }
5571*852ba100SJustin Hibbits #endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */
5572