xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/HC/hc.c (revision ec65e4f8d0654361df5e97d4de3518edebf76b46)
1 /* Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include "std_ext.h"
34 #include "error_ext.h"
35 #include "sprint_ext.h"
36 #include "string_ext.h"
37 
38 #include "fm_common.h"
39 #include "fm_hc.h"
40 
41 
42 #define HC_HCOR_OPCODE_PLCR_PRFL                                0x0
43 #define HC_HCOR_OPCODE_KG_SCM                                   0x1
44 #define HC_HCOR_OPCODE_SYNC                                     0x2
45 #define HC_HCOR_OPCODE_CC                                       0x3
46 #define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT                 0x5
47 
48 #define HC_HCOR_GBL                         0x20000000
49 
50 #define SIZE_OF_HC_FRAME_PORT_REGS          (sizeof(t_HcFrame)-sizeof(t_FmPcdKgInterModuleSchemeRegs)+sizeof(t_FmPcdKgPortRegs))
51 #define SIZE_OF_HC_FRAME_SCHEME_REGS        sizeof(t_HcFrame)
52 #define SIZE_OF_HC_FRAME_PROFILES_REGS      (sizeof(t_HcFrame)-sizeof(t_FmPcdKgInterModuleSchemeRegs)+sizeof(t_FmPcdPlcrInterModuleProfileRegs))
53 #define SIZE_OF_HC_FRAME_PROFILE_CNT        (sizeof(t_HcFrame)-sizeof(t_FmPcdPlcrInterModuleProfileRegs)+sizeof(uint32_t))
54 #define SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC 16
55 
56 #define BUILD_FD(len)                     \
57 do {                                      \
58     memset(&fmFd, 0, sizeof(t_DpaaFD));   \
59     DPAA_FD_SET_ADDR(&fmFd, p_HcFrame);    \
60     DPAA_FD_SET_OFFSET(&fmFd, 0);         \
61     DPAA_FD_SET_LENGTH(&fmFd, len);       \
62 } while (0)
63 
64 
65 #if defined(__MWERKS__) && !defined(__GNUC__)
66 #pragma pack(push,1)
67 #endif /* defined(__MWERKS__) && ... */
68 #define MEM_MAP_START
69 
70 /**************************************************************************//**
71  @Description   PCD KG scheme registers
72 *//***************************************************************************/
73 typedef _Packed struct t_FmPcdKgSchemeRegsWithoutCounter {
74     volatile uint32_t kgse_mode;    /**< MODE */
75     volatile uint32_t kgse_ekfc;    /**< Extract Known Fields Command */
76     volatile uint32_t kgse_ekdv;    /**< Extract Known Default Value */
77     volatile uint32_t kgse_bmch;    /**< Bit Mask Command High */
78     volatile uint32_t kgse_bmcl;    /**< Bit Mask Command Low */
79     volatile uint32_t kgse_fqb;     /**< Frame Queue Base */
80     volatile uint32_t kgse_hc;      /**< Hash Command */
81     volatile uint32_t kgse_ppc;     /**< Policer Profile Command */
82     volatile uint32_t kgse_gec[FM_PCD_KG_NUM_OF_GENERIC_REGS];
83                                     /**< Generic Extract Command */
84     volatile uint32_t kgse_dv0;     /**< KeyGen Scheme Entry Default Value 0 */
85     volatile uint32_t kgse_dv1;     /**< KeyGen Scheme Entry Default Value 1 */
86     volatile uint32_t kgse_ccbs;    /**< KeyGen Scheme Entry Coarse Classification Bit*/
87     volatile uint32_t kgse_mv;      /**< KeyGen Scheme Entry Match vector */
88 } _PackedType t_FmPcdKgSchemeRegsWithoutCounter;
89 
90 typedef _Packed struct t_FmPcdKgPortRegs {
91     volatile uint32_t                       spReg;
92     volatile uint32_t                       cppReg;
93 } _PackedType t_FmPcdKgPortRegs;
94 
95 typedef _Packed struct t_HcFrame {
96     volatile uint32_t                           opcode;
97     volatile uint32_t                           actionReg;
98     volatile uint32_t                           extraReg;
99     volatile uint32_t                           commandSequence;
100     union {
101         t_FmPcdKgInterModuleSchemeRegs          schemeRegs;
102         t_FmPcdKgInterModuleSchemeRegs          schemeRegsWithoutCounter;
103         t_FmPcdPlcrInterModuleProfileRegs       profileRegs;
104         volatile uint32_t                       singleRegForWrite;    /* for writing SP, CPP, profile counter */
105         t_FmPcdKgPortRegs                       portRegsForRead;
106         volatile uint32_t                       clsPlanEntries[CLS_PLAN_NUM_PER_GRP];
107         t_FmPcdCcCapwapReassmTimeoutParams      ccCapwapReassmTimeout;
108     } hcSpecificData;
109 } _PackedType t_HcFrame;
110 
111 #define MEM_MAP_END
112 #if defined(__MWERKS__) && !defined(__GNUC__)
113 #pragma pack(pop)
114 #endif /* defined(__MWERKS__) && ... */
115 
116 
117 typedef struct t_FmHc {
118     t_Handle                    h_FmPcd;
119     t_Handle                    h_HcPortDev;
120     t_FmPcdQmEnqueueCallback    *f_QmEnqueue;     /**< A callback for enqueuing frames to the QM */
121     t_Handle                    h_QmArg;          /**< A handle to the QM module */
122     uint8_t                     padTill16;
123 
124     uint32_t                    seqNum;
125     volatile bool               wait[32];
126 } t_FmHc;
127 
128 
129 static __inline__ t_Error EnQFrm(t_FmHc *p_FmHc, t_DpaaFD *p_FmFd, volatile uint32_t *p_SeqNum)
130 {
131     t_Error     err = E_OK;
132     uint32_t    savedSeqNum;
133     uint32_t    intFlags;
134     uint32_t    timeout=100;
135 
136     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
137     *p_SeqNum = p_FmHc->seqNum;
138     savedSeqNum = p_FmHc->seqNum;
139     p_FmHc->seqNum = (uint32_t)((p_FmHc->seqNum+1)%32);
140     ASSERT_COND(!p_FmHc->wait[savedSeqNum]);
141     p_FmHc->wait[savedSeqNum] = TRUE;
142     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
143     DBG(TRACE, ("Send Hc, SeqNum %d, FD@0x%x, fd offset 0x%x",
144                 savedSeqNum,DPAA_FD_GET_ADDR(p_FmFd),DPAA_FD_GET_OFFSET(p_FmFd)));
145     err = p_FmHc->f_QmEnqueue(p_FmHc->h_QmArg, (void *)p_FmFd);
146     if(err)
147         RETURN_ERROR(MINOR, err, ("HC enqueue failed"));
148 
149     while (p_FmHc->wait[savedSeqNum] && --timeout)
150         XX_UDelay(100);
151 
152     if (!timeout)
153         RETURN_ERROR(MINOR, E_TIMEOUT, ("HC Callback, timeout exceeded"));
154 
155     return err;
156 }
157 
158 static t_Error CcHcDoDynamicChange(t_FmHc *p_FmHc, t_Handle p_OldPointer, t_Handle p_NewPointer)
159 {
160     t_HcFrame               *p_HcFrame;
161     t_DpaaFD                fmFd;
162     t_Error                 err = E_OK;
163 
164     ASSERT_COND(p_FmHc);
165 
166     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
167     if (!p_HcFrame)
168         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
169 
170     memset(p_HcFrame, 0, sizeof(t_HcFrame));
171     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC);
172     p_HcFrame->actionReg  = FmPcdCcGetNodeAddrOffsetFromNodeInfo(p_FmHc->h_FmPcd, p_NewPointer);
173     if(p_HcFrame->actionReg == (uint32_t)ILLEGAL_BASE)
174     {
175         XX_FreeSmart(p_HcFrame);
176         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something wrong with base address"));
177     }
178 
179     p_HcFrame->actionReg  |=  0xc0000000;
180         p_HcFrame->extraReg   = FmPcdCcGetNodeAddrOffsetFromNodeInfo(p_FmHc->h_FmPcd, p_OldPointer);
181     if(p_HcFrame->extraReg == (uint32_t)ILLEGAL_BASE)
182     {
183         XX_FreeSmart(p_HcFrame);
184         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something wrong with base address"));
185     }
186 
187     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
188 
189     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
190     {
191         XX_FreeSmart(p_HcFrame);
192         RETURN_ERROR(MINOR, err, NO_MSG);
193     }
194 
195     XX_FreeSmart(p_HcFrame);
196 
197     return E_OK;
198 }
199 
200 static t_Error HcDynamicChange(t_FmHc *p_FmHc,t_List *h_OldPointersLst, t_List *h_NewPointersLst, t_Handle *h_Params)
201 {
202 
203     t_List      *p_PosOld, *p_PosNew;
204     uint16_t    i = 0;
205     t_Error     err = E_OK;
206     uint8_t     numOfModifiedPtr;
207 
208     SANITY_CHECK_RETURN_ERROR((LIST_NumOfObjs(h_NewPointersLst) == LIST_NumOfObjs(h_OldPointersLst)),E_INVALID_STATE);
209 
210     numOfModifiedPtr = (uint8_t)LIST_NumOfObjs(h_NewPointersLst);
211     p_PosNew = NCSW_LIST_FIRST(h_NewPointersLst);
212     p_PosOld = NCSW_LIST_FIRST(h_OldPointersLst);
213     for(i = 0; i < numOfModifiedPtr; i++)
214     {
215         err = CcHcDoDynamicChange(p_FmHc, p_PosOld, p_PosNew);
216         if(err)
217         {
218             FmPcdCcReleaseModifiedDataStructure(p_FmHc->h_FmPcd, h_OldPointersLst, h_NewPointersLst, i, h_Params);
219             RETURN_ERROR(MAJOR, err, ("For part of nodes changes are done - situation is danger"));
220         }
221         p_PosNew = NCSW_LIST_NEXT(p_PosNew);
222         p_PosOld = NCSW_LIST_NEXT(p_PosOld);
223     }
224 
225     err = FmPcdCcReleaseModifiedDataStructure(p_FmHc->h_FmPcd, h_OldPointersLst, h_NewPointersLst, i, h_Params);
226     if(err)
227         RETURN_ERROR(MAJOR, err, NO_MSG);
228 
229     return E_OK;
230 }
231 
232 
233 t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams)
234 {
235     t_FmHc          *p_FmHc;
236     t_FmPortParams  fmPortParam;
237     t_Error         err = E_OK;
238 
239     p_FmHc = (t_FmHc *)XX_Malloc(sizeof(t_FmHc));
240     if (!p_FmHc)
241     {
242         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC obj"));
243         return NULL;
244     }
245     memset(p_FmHc,0,sizeof(t_FmHc));
246 
247     p_FmHc->h_FmPcd             = p_FmHcParams->h_FmPcd;
248     p_FmHc->f_QmEnqueue         = p_FmHcParams->params.f_QmEnqueue;
249     p_FmHc->h_QmArg             = p_FmHcParams->params.h_QmArg;
250 
251     if (!FmIsMaster(p_FmHcParams->h_Fm))
252         return (t_Handle)p_FmHc;
253 
254 /*
255 TKT056919 - axi12axi0 can hang if read request follows the single byte write on the very next cycle
256 TKT038900 - FM dma lockup occur due to AXI slave protocol violation
257 */
258 #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
259     p_FmHc->padTill16 = 16 - (sizeof(t_FmHc) % 16);
260 #endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
261     memset(&fmPortParam, 0, sizeof(fmPortParam));
262     fmPortParam.baseAddr    = p_FmHcParams->params.portBaseAddr;
263     fmPortParam.portType    = e_FM_PORT_TYPE_OH_HOST_COMMAND;
264     fmPortParam.portId      = p_FmHcParams->params.portId;
265     fmPortParam.liodnBase   = p_FmHcParams->params.liodnBase;
266     fmPortParam.h_Fm        = p_FmHcParams->h_Fm;
267 
268     fmPortParam.specificParams.nonRxParams.errFqid      = p_FmHcParams->params.errFqid;
269     fmPortParam.specificParams.nonRxParams.dfltFqid     = p_FmHcParams->params.confFqid;
270     fmPortParam.specificParams.nonRxParams.qmChannel    = p_FmHcParams->params.qmChannel;
271 
272     p_FmHc->h_HcPortDev = FM_PORT_Config(&fmPortParam);
273     if(!p_FmHc->h_HcPortDev)
274     {
275         REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM HC port!"));
276         XX_Free(p_FmHc);
277         return NULL;
278     }
279 
280     /* final init */
281     if ((err = FM_PORT_Init(p_FmHc->h_HcPortDev)) != E_OK)
282     {
283         REPORT_ERROR(MAJOR, err, ("FM HC port!"));
284         FmHcFree(p_FmHc);
285         return NULL;
286     }
287 
288     if ((err = FM_PORT_Enable(p_FmHc->h_HcPortDev)) != E_OK)
289     {
290         REPORT_ERROR(MAJOR, err, ("FM HC port!"));
291         FmHcFree(p_FmHc);
292         return NULL;
293     }
294 
295     return (t_Handle)p_FmHc;
296 }
297 
298 void FmHcFree(t_Handle h_FmHc)
299 {
300     t_FmHc  *p_FmHc = (t_FmHc*)h_FmHc;
301 
302     if (!p_FmHc)
303         return;
304 
305     if (p_FmHc->h_HcPortDev)
306         FM_PORT_Free(p_FmHc->h_HcPortDev);
307 
308     XX_Free(p_FmHc);
309 }
310 
311 #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
312 t_Error FmHcDumpRegs(t_Handle h_FmHc)
313 {
314     t_FmHc  *p_FmHc = (t_FmHc*)h_FmHc;
315 
316     SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
317     SANITY_CHECK_RETURN_ERROR(p_FmHc->h_HcPortDev, E_INVALID_HANDLE);
318 
319     return  FM_PORT_DumpRegs(p_FmHc->h_HcPortDev);
320 
321 }
322 #endif /* (defined(DEBUG_ERRORS) && ... */
323 
324 void FmHcTxConf(t_Handle h_FmHc, t_DpaaFD *p_Fd)
325 {
326     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
327     t_HcFrame   *p_HcFrame;
328     uint32_t    intFlags;
329 
330     ASSERT_COND(p_FmHc);
331 
332     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
333     p_HcFrame  = (t_HcFrame *)PTR_MOVE(DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd));
334 
335     DBG(TRACE, ("Hc Conf, SeqNum %d, FD@0x%x, fd offset 0x%x",
336                 p_HcFrame->commandSequence, DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd)));
337 
338     if (!(p_FmHc->wait[p_HcFrame->commandSequence]))
339         REPORT_ERROR(MINOR, E_INVALID_FRAME, ("Not an Host-Command frame received!"));
340     else
341         p_FmHc->wait[p_HcFrame->commandSequence] = FALSE;
342     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
343 }
344 
345 t_Handle FmHcPcdKgSetScheme(t_Handle h_FmHc, t_FmPcdKgSchemeParams *p_Scheme)
346 {
347     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
348     t_Error                             err = E_OK;
349     t_FmPcdKgInterModuleSchemeRegs      schemeRegs;
350     t_HcFrame                           *p_HcFrame;
351     t_DpaaFD                            fmFd;
352     uint32_t                            intFlags;
353     uint8_t                             physicalSchemeId, relativeSchemeId;
354 
355     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
356     if (!p_HcFrame)
357     {
358         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
359         return NULL;
360     }
361 
362     if(!p_Scheme->modify)
363     {
364         /* check that schemeId is in range */
365         if(p_Scheme->id.relativeSchemeId >= FmPcdKgGetNumOfPartitionSchemes(p_FmHc->h_FmPcd))
366         {
367             REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, ("Scheme is out of range"));
368             XX_FreeSmart(p_HcFrame);
369             return NULL;
370         }
371 
372         relativeSchemeId = p_Scheme->id.relativeSchemeId;
373 
374         if (FmPcdKgSchemeTryLock(p_FmHc->h_FmPcd, relativeSchemeId, FALSE))
375         {
376             XX_FreeSmart(p_HcFrame);
377             return NULL;
378         }
379 
380         physicalSchemeId = FmPcdKgGetPhysicalSchemeId(p_FmHc->h_FmPcd, relativeSchemeId);
381 
382         memset(p_HcFrame, 0, sizeof(t_HcFrame));
383         p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
384         p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
385         p_HcFrame->extraReg = 0xFFFFF800;
386 
387         BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
388 
389         if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
390         {
391             FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
392             REPORT_ERROR(MINOR, err, NO_MSG);
393             XX_FreeSmart(p_HcFrame);
394             return NULL;
395         }
396 
397         /* check if this scheme is already used */
398         if (FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
399         {
400             FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
401             REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is already used"));
402             XX_FreeSmart(p_HcFrame);
403             return NULL;
404         }
405     }
406     else
407     {
408         intFlags = FmPcdLock(p_FmHc->h_FmPcd);
409         physicalSchemeId = (uint8_t)(PTR_TO_UINT(p_Scheme->id.h_Scheme)-1);
410         relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
411         if( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
412         {
413             FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
414             REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
415             XX_FreeSmart(p_HcFrame);
416             return NULL;
417         }
418         err = FmPcdKgSchemeTryLock(p_FmHc->h_FmPcd, relativeSchemeId, TRUE);
419         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
420         if (err)
421         {
422             XX_FreeSmart(p_HcFrame);
423             return NULL;
424         }
425     }
426 
427     err = FmPcdKgBuildScheme(p_FmHc->h_FmPcd, p_Scheme, &schemeRegs);
428     if(err)
429     {
430         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
431         REPORT_ERROR(MAJOR, err, NO_MSG);
432         XX_FreeSmart(p_HcFrame);
433         return NULL;
434     }
435 
436     memset(p_HcFrame, 0, sizeof(t_HcFrame));
437     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
438     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, p_Scheme->schemeCounter.update);
439     p_HcFrame->extraReg = 0xFFFFF800;
440     memcpy(&p_HcFrame->hcSpecificData.schemeRegs, &schemeRegs, sizeof(t_FmPcdKgInterModuleSchemeRegs));
441     if(!p_Scheme->schemeCounter.update)
442     {
443         p_HcFrame->hcSpecificData.schemeRegs.kgse_dv0   = schemeRegs.kgse_dv0;
444         p_HcFrame->hcSpecificData.schemeRegs.kgse_dv1   = schemeRegs.kgse_dv1;
445         p_HcFrame->hcSpecificData.schemeRegs.kgse_ccbs  = schemeRegs.kgse_ccbs;
446         p_HcFrame->hcSpecificData.schemeRegs.kgse_mv    = schemeRegs.kgse_mv;
447     }
448 
449     BUILD_FD(sizeof(t_HcFrame));
450 
451     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
452     {
453         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
454         REPORT_ERROR(MINOR, err, NO_MSG);
455         XX_FreeSmart(p_HcFrame);
456         return NULL;
457     }
458 
459     FmPcdKgValidateSchemeSw(p_FmHc->h_FmPcd, relativeSchemeId);
460 
461     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
462 
463     XX_FreeSmart(p_HcFrame);
464 
465     return (t_Handle)(UINT_TO_PTR(physicalSchemeId + 1));
466 }
467 
468 t_Error FmHcPcdKgDeleteScheme(t_Handle h_FmHc, t_Handle h_Scheme)
469 {
470     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
471     t_Error     err = E_OK;
472     t_HcFrame   *p_HcFrame;
473     t_DpaaFD    fmFd;
474     uint8_t     relativeSchemeId;
475     uint8_t     physicalSchemeId = (uint8_t)(PTR_TO_UINT(h_Scheme)-1);
476 
477     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
478 
479     if ((err = FmPcdKgSchemeTryLock(p_FmHc->h_FmPcd, relativeSchemeId, FALSE)) != E_OK)
480         RETURN_ERROR(MAJOR, err, NO_MSG);
481 
482     if(relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
483     {
484         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
485         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
486     }
487 
488     err = FmPcdKgCheckInvalidateSchemeSw(p_FmHc->h_FmPcd, relativeSchemeId);
489     if (err)
490     {
491         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
492         RETURN_ERROR(MAJOR, err, NO_MSG);
493     }
494 
495     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
496     if (!p_HcFrame)
497     {
498         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
499         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
500     }
501     memset(p_HcFrame, 0, sizeof(t_HcFrame));
502     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
503     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
504     p_HcFrame->extraReg = 0xFFFFF800;
505     memset(&p_HcFrame->hcSpecificData.schemeRegs, 0, sizeof(t_FmPcdKgInterModuleSchemeRegs));
506 
507     BUILD_FD(sizeof(t_HcFrame));
508 
509     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
510     {
511         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
512         XX_FreeSmart(p_HcFrame);
513         RETURN_ERROR(MINOR, err, NO_MSG);
514     }
515 
516     FmPcdKgInvalidateSchemeSw(p_FmHc->h_FmPcd, relativeSchemeId);
517 
518     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
519 
520     XX_FreeSmart(p_HcFrame);
521 
522     return E_OK;
523 }
524 
525 t_Error FmHcPcdKgCcGetSetParams(t_Handle h_FmHc, t_Handle  h_Scheme, uint32_t requiredAction)
526 {
527     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
528     t_Error     err = E_OK;
529     t_HcFrame   *p_HcFrame;
530     t_DpaaFD    fmFd;
531     uint8_t     relativeSchemeId;
532     uint8_t     physicalSchemeId = (uint8_t)(PTR_TO_UINT(h_Scheme)-1);
533     uint32_t    tmpReg32 = 0;
534 
535     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
536     if( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
537         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
538 
539     if (FmPcdKgSchemeTryLock(p_FmHc->h_FmPcd, relativeSchemeId, FALSE))
540         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Lock of the scheme FAILED"));
541 
542     if(!FmPcdKgGetPointedOwners(p_FmHc->h_FmPcd, relativeSchemeId) ||
543        !(FmPcdKgGetRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId) & requiredAction))
544     {
545 
546         if(requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
547         {
548             if((FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_DONE) && (FmPcdKgGetDoneAction(p_FmHc->h_FmPcd, relativeSchemeId) ==  e_FM_PCD_ENQ_FRAME))
549 
550             {
551                 p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
552                 if (!p_HcFrame)
553                 {
554                     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
555                     RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
556                 }
557                 memset(p_HcFrame, 0, sizeof(t_HcFrame));
558                 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
559                 p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
560                 p_HcFrame->extraReg = 0xFFFFF800;
561                 BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
562                 if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
563                 {
564                     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
565                     XX_FreeSmart(p_HcFrame);
566                     RETURN_ERROR(MINOR, err, NO_MSG);
567                 }
568 
569                 /* check if this scheme is already used */
570                 if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
571                 {
572                     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
573                     XX_FreeSmart(p_HcFrame);
574                     RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is already used"));
575                 }
576                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
577 
578                 ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
579 
580                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode =  tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
581 
582                 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
583                 p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
584                 p_HcFrame->extraReg = 0x80000000;
585 
586                 BUILD_FD(sizeof(t_HcFrame));
587 
588                 if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
589                 {
590                     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
591                     XX_FreeSmart(p_HcFrame);
592                     RETURN_ERROR(MINOR, err, NO_MSG);
593                 }
594 
595                 XX_FreeSmart(p_HcFrame);
596             }
597             else if (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_PLCR)
598             {
599 
600                 if((FmPcdKgIsDirectPlcr(p_FmHc->h_FmPcd, relativeSchemeId) == FALSE) ||
601                     (FmPcdKgIsDistrOnPlcrProfile(p_FmHc->h_FmPcd, relativeSchemeId) == TRUE))
602                  {
603                     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
604                     RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));
605                  }
606                 err = FmPcdPlcrCcGetSetParams(p_FmHc->h_FmPcd, FmPcdKgGetRelativeProfileId(p_FmHc->h_FmPcd, relativeSchemeId), requiredAction);
607                 if(err)
608                 {
609                     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
610                     RETURN_ERROR(MAJOR, err, NO_MSG);
611                 }
612         }
613       }
614     }
615 
616     FmPcdKgUpatePointedOwner(p_FmHc->h_FmPcd, relativeSchemeId,TRUE);
617     FmPcdKgUpdateRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId,requiredAction);
618     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
619 
620     return E_OK;
621 }
622 
623 uint32_t  FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme)
624 {
625     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
626     t_Error     err = E_OK;
627     t_HcFrame   *p_HcFrame;
628     t_DpaaFD    fmFd;
629     uint32_t    retVal;
630     uint8_t     relativeSchemeId;
631     uint8_t     physicalSchemeId = (uint8_t)(PTR_TO_UINT(h_Scheme)-1);
632 
633     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
634     if( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
635     {
636         REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
637         return 0;
638     }
639 
640     if ((err = FmPcdKgSchemeTryLock(p_FmHc->h_FmPcd, relativeSchemeId, FALSE)) != E_OK)
641     {
642         REPORT_ERROR(MAJOR, err, ("Scheme lock"));
643         return 0;
644     }
645 
646     /* first read scheme and check that it is valid */
647     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
648     if (!p_HcFrame)
649     {
650         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
651         return 0;
652     }
653     memset(p_HcFrame, 0, sizeof(t_HcFrame));
654     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
655     p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
656     p_HcFrame->extraReg = 0xFFFFF800;
657 
658     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
659 
660     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
661     {
662         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
663         REPORT_ERROR(MINOR, err, NO_MSG);
664         XX_FreeSmart(p_HcFrame);
665         return 0;
666     }
667 
668     if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
669     {
670         REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid"));
671         XX_FreeSmart(p_HcFrame);
672         return 0;
673     }
674 
675     retVal = p_HcFrame->hcSpecificData.schemeRegs.kgse_spc;
676 
677     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
678 
679     XX_FreeSmart(p_HcFrame);
680 
681     return retVal;
682 }
683 
684 t_Error  FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t value)
685 {
686     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
687     t_Error     err = E_OK;
688     t_HcFrame   *p_HcFrame;
689     t_DpaaFD    fmFd;
690     uint8_t     relativeSchemeId, physicalSchemeId = (uint8_t)(PTR_TO_UINT(h_Scheme)-1);
691 
692     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
693     if( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
694         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
695 
696     if ((err = FmPcdKgSchemeTryLock(p_FmHc->h_FmPcd, relativeSchemeId, FALSE)) != E_OK)
697         RETURN_ERROR(MAJOR, err, NO_MSG);
698 
699     /* first read scheme and check that it is valid */
700     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
701     if (!p_HcFrame)
702         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
703     memset(p_HcFrame, 0, sizeof(t_HcFrame));
704     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
705     p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
706     p_HcFrame->extraReg = 0xFFFFF800;
707 
708     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
709 
710     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
711     {
712         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
713         XX_FreeSmart(p_HcFrame);
714         RETURN_ERROR(MINOR, err, NO_MSG);
715     }
716 
717     /* check that scheme is valid */
718     if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
719     {
720         FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
721         XX_FreeSmart(p_HcFrame);
722         RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid"));
723     }
724 
725     /* Write scheme back, with modified counter */
726     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
727     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
728     p_HcFrame->extraReg = 0xFFFFF800;
729     /* write counter */
730     p_HcFrame->hcSpecificData.schemeRegs.kgse_spc = value;
731 
732     BUILD_FD(sizeof(t_HcFrame));
733 
734     err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence);
735 
736     FmPcdKgReleaseSchemeLock(p_FmHc->h_FmPcd, relativeSchemeId);
737     XX_FreeSmart(p_HcFrame);
738 
739     return err;
740 }
741 
742 t_Error FmHcPcdKgSetClsPlan(t_Handle h_FmHc, t_FmPcdKgInterModuleClsPlanSet *p_Set)
743 {
744     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
745     t_HcFrame               *p_HcFrame;
746     t_DpaaFD                fmFd;
747     uint32_t                i;
748     t_Error                 err = E_OK;
749 
750     ASSERT_COND(p_FmHc);
751 
752     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
753     if (!p_HcFrame)
754         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
755 
756     for(i=p_Set->baseEntry;i<p_Set->baseEntry+p_Set->numOfClsPlanEntries;i+=8)
757     {
758         memset(p_HcFrame, 0, sizeof(t_HcFrame));
759         p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
760         p_HcFrame->actionReg  = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));
761         p_HcFrame->extraReg = 0xFFFFF800;
762         memcpy((void*)&p_HcFrame->hcSpecificData.clsPlanEntries, (void *)&p_Set->vectors[i-p_Set->baseEntry], CLS_PLAN_NUM_PER_GRP*sizeof(uint32_t));
763 
764         BUILD_FD(sizeof(t_HcFrame));
765 
766         if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
767         {
768             XX_FreeSmart(p_HcFrame);
769             RETURN_ERROR(MINOR, err, NO_MSG);
770         }
771     }
772     XX_FreeSmart(p_HcFrame);
773 
774     return err;
775 }
776 
777 t_Error FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc, uint8_t  grpId)
778 {
779     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
780     t_FmPcdKgInterModuleClsPlanSet      *p_ClsPlanSet;
781 
782     /* clear clsPlan entries in memory */
783     p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
784     if (!p_ClsPlanSet)
785         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("memory allocation failed for p_ClsPlanSetd"));
786     memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
787 
788     p_ClsPlanSet->baseEntry = FmPcdKgGetClsPlanGrpBase(p_FmHc->h_FmPcd, grpId);
789     p_ClsPlanSet->numOfClsPlanEntries = FmPcdKgGetClsPlanGrpSize(p_FmHc->h_FmPcd, grpId);
790     ASSERT_COND(p_ClsPlanSet->numOfClsPlanEntries <= FM_PCD_MAX_NUM_OF_CLS_PLANS);
791 
792     if (FmHcPcdKgSetClsPlan(p_FmHc, p_ClsPlanSet) != E_OK)
793         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
794     XX_Free(p_ClsPlanSet);
795 
796     FmPcdKgDestroyClsPlanGrp(p_FmHc->h_FmPcd, grpId);
797 
798     return E_OK;
799 }
800 
801 t_Error FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcCapwapReassmTimeoutParams *p_CcCapwapReassmTimeoutParams )
802 {
803     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
804     t_HcFrame                           *p_HcFrame;
805     uint32_t                            intFlags;
806     t_DpaaFD                            fmFd;
807     t_Error                             err;
808 
809     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
810 
811     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
812     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
813     if (!p_HcFrame)
814         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
815     memset(p_HcFrame, 0, sizeof(t_HcFrame));
816     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT);
817     memcpy(&p_HcFrame->hcSpecificData.ccCapwapReassmTimeout, p_CcCapwapReassmTimeoutParams, sizeof(t_FmPcdCcCapwapReassmTimeoutParams));
818     BUILD_FD(sizeof(t_HcFrame));
819 
820     err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence);
821 
822     XX_FreeSmart(p_HcFrame);
823     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
824     return err;
825 }
826 
827 
828 t_Error FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId, uint32_t requiredAction)
829 {
830     t_FmHc              *p_FmHc = (t_FmHc*)h_FmHc;
831     t_HcFrame           *p_HcFrame;
832     t_DpaaFD            fmFd;
833     t_Error             err;
834     uint32_t            tmpReg32 = 0;
835     uint32_t            requiredActionTmp, pointedOwnersTmp;
836 
837     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
838 
839     if (absoluteProfileId >= FM_PCD_PLCR_NUM_ENTRIES)
840         RETURN_ERROR(MAJOR, E_INVALID_VALUE,("Policer profile out of range"));
841 
842     if (FmPcdPlcrProfileTryLock(p_FmHc->h_FmPcd, absoluteProfileId, FALSE))
843         return ERROR_CODE(E_BUSY);
844 
845 
846     requiredActionTmp = FmPcdPlcrGetRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId);
847     pointedOwnersTmp = FmPcdPlcrGetPointedOwners(p_FmHc->h_FmPcd, absoluteProfileId);
848 
849     if(!pointedOwnersTmp || !(requiredActionTmp & requiredAction))
850     {
851 
852         if(requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
853         {
854 
855             p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
856             if (!p_HcFrame)
857                 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
858             /* first read scheme and check that it is valid */
859             memset(p_HcFrame, 0, sizeof(t_HcFrame));
860             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
861             p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
862             p_HcFrame->extraReg = 0x00008000;
863 
864             BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
865 
866             if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
867             {
868                 FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
869                 XX_FreeSmart(p_HcFrame);
870                 RETURN_ERROR(MINOR, err, NO_MSG);
871             }
872 
873             /* check that profile is valid */
874             if (!FmPcdPlcrHwProfileIsValid(p_HcFrame->hcSpecificData.profileRegs.fmpl_pemode))
875             {
876                 FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
877                 XX_FreeSmart(p_HcFrame);
878                 RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Policer is already used"));
879             }
880 
881             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegnia;
882             if(!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
883             {
884                 XX_FreeSmart(p_HcFrame);
885                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
886             }
887             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
888 
889             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
890             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
891             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(TRUE, FALSE, FALSE);
892             p_HcFrame->extraReg = 0x00008000;
893             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
894 
895             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
896 
897             if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
898             {
899                 FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
900                 XX_FreeSmart(p_HcFrame);
901                 RETURN_ERROR(MINOR, err, NO_MSG);
902             }
903 
904             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_peynia;
905             if(!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
906             {
907                 XX_FreeSmart(p_HcFrame);
908                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
909             }
910             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
911 
912             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
913             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
914             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, TRUE, FALSE);
915             p_HcFrame->extraReg = 0x00008000;
916             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
917 
918             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
919 
920             if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
921             {
922                 FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
923                 XX_FreeSmart(p_HcFrame);
924                 RETURN_ERROR(MINOR, err, NO_MSG);
925             }
926 
927             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pernia;
928             if(!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
929             {
930                 XX_FreeSmart(p_HcFrame);
931                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
932             }
933             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
934 
935             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
936             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
937             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, FALSE, TRUE);
938             p_HcFrame->extraReg = 0x00008000;
939             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
940 
941             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
942 
943             if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
944             {
945                 FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
946                 XX_FreeSmart(p_HcFrame);
947                 RETURN_ERROR(MINOR, err, NO_MSG);
948             }
949             XX_FreeSmart(p_HcFrame);
950         }
951     }
952 
953     FmPcdPlcrUpatePointedOwner(p_FmHc->h_FmPcd, absoluteProfileId, TRUE);
954     FmPcdPlcrUpdateRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId, requiredAction);
955 
956     FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
957 
958     return E_OK;
959 }
960 
961 t_Handle FmHcPcdPlcrSetProfile(t_Handle h_FmHc,t_FmPcdPlcrProfileParams *p_Profile)
962 {
963     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
964     t_FmPcdPlcrInterModuleProfileRegs   profileRegs;
965     t_Error                             err = E_OK;
966     uint32_t                            intFlags;
967     uint16_t                            profileIndx;
968     t_HcFrame                           *p_HcFrame;
969     t_DpaaFD                            fmFd;
970 
971     if (p_Profile->modify)
972     {
973         profileIndx = (uint16_t)(PTR_TO_UINT(p_Profile->id.h_Profile)-1);
974         if (FmPcdPlcrProfileTryLock(p_FmHc->h_FmPcd, profileIndx, FALSE))
975             return NULL;
976     }
977     else
978     {
979         intFlags = FmPcdLock(p_FmHc->h_FmPcd);
980         err = FmPcdPlcrGetAbsoluteProfileId(p_FmHc->h_FmPcd,
981                                             p_Profile->id.newParams.profileType,
982                                             p_Profile->id.newParams.h_FmPort,
983                                             p_Profile->id.newParams.relativeProfileId,
984                                             &profileIndx);
985         if (err)
986         {
987             REPORT_ERROR(MAJOR, err, NO_MSG);
988             return NULL;
989         }
990         err = FmPcdPlcrProfileTryLock(p_FmHc->h_FmPcd, profileIndx, TRUE);
991         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
992         if (err)
993             return NULL;
994     }
995 
996     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
997     if (!p_HcFrame)
998     {
999         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
1000         return NULL;
1001     }
1002 
1003     if(!p_Profile->modify)
1004     {
1005         memset(p_HcFrame, 0, sizeof(t_HcFrame));
1006         p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1007         p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(profileIndx);
1008         p_HcFrame->extraReg = 0x00008000;
1009 
1010         BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
1011 
1012         if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1013         {
1014             FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, profileIndx);
1015             REPORT_ERROR(MINOR, err, NO_MSG);
1016             XX_FreeSmart(p_HcFrame);
1017             return NULL;
1018         }
1019 
1020         /* check if this scheme is already used */
1021         if (FmPcdPlcrHwProfileIsValid(p_HcFrame->hcSpecificData.profileRegs.fmpl_pemode))
1022         {
1023             FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, profileIndx);
1024             REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Policer is already used"));
1025             XX_FreeSmart(p_HcFrame);
1026             return NULL;
1027         }
1028     }
1029 
1030     memset(&profileRegs, 0, sizeof(t_FmPcdPlcrInterModuleProfileRegs));
1031     err = FmPcdPlcrBuildProfile(p_FmHc->h_FmPcd, p_Profile, &profileRegs);
1032     if(err)
1033     {
1034         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, profileIndx);
1035         REPORT_ERROR(MAJOR, err, NO_MSG);
1036         XX_FreeSmart(p_HcFrame);
1037         return NULL;
1038     }
1039 
1040     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1041     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1042     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx);
1043     p_HcFrame->extraReg = 0x00008000;
1044     memcpy(&p_HcFrame->hcSpecificData.profileRegs, &profileRegs, sizeof(t_FmPcdPlcrInterModuleProfileRegs));
1045 
1046     BUILD_FD(sizeof(t_HcFrame));
1047 
1048     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1049     {
1050         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, profileIndx);
1051         REPORT_ERROR(MINOR, err, NO_MSG);
1052         XX_FreeSmart(p_HcFrame);
1053         return NULL;
1054     }
1055 
1056     FmPcdPlcrValidateProfileSw(p_FmHc->h_FmPcd, profileIndx);
1057 
1058     FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, profileIndx);
1059 
1060     XX_FreeSmart(p_HcFrame);
1061 
1062     return UINT_TO_PTR((uint64_t)profileIndx+1);
1063 }
1064 
1065 t_Error FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc, t_Handle h_Profile)
1066 {
1067     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1068     uint16_t    absoluteProfileId = (uint16_t)(PTR_TO_UINT(h_Profile)-1);
1069     t_Error     err = E_OK;
1070     t_HcFrame   *p_HcFrame;
1071     t_DpaaFD    fmFd;
1072 
1073     if (FmPcdPlcrProfileTryLock(p_FmHc->h_FmPcd, absoluteProfileId, FALSE))
1074         return ERROR_CODE(E_BUSY);
1075 
1076     FmPcdPlcrInvalidateProfileSw(p_FmHc->h_FmPcd, absoluteProfileId);
1077 
1078     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
1079     if (!p_HcFrame)
1080         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
1081     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1082     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1083     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
1084     p_HcFrame->actionReg  |= 0x00008000;
1085     p_HcFrame->extraReg = 0x00008000;
1086     memset(&p_HcFrame->hcSpecificData.profileRegs, 0, sizeof(t_FmPcdPlcrInterModuleProfileRegs));
1087 
1088     BUILD_FD(sizeof(t_HcFrame));
1089 
1090     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1091     {
1092         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1093         XX_FreeSmart(p_HcFrame);
1094         RETURN_ERROR(MINOR, err, NO_MSG);
1095     }
1096 
1097     FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1098 
1099     XX_FreeSmart(p_HcFrame);
1100 
1101     return E_OK;
1102 }
1103 
1104 t_Error  FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value)
1105 {
1106 
1107     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1108     uint16_t    absoluteProfileId = (uint16_t)(PTR_TO_UINT(h_Profile)-1);
1109     t_Error     err = E_OK;
1110     t_HcFrame   *p_HcFrame;
1111     t_DpaaFD    fmFd;
1112 
1113     if (FmPcdPlcrProfileTryLock(p_FmHc->h_FmPcd, absoluteProfileId, FALSE))
1114         return ERROR_CODE(E_BUSY);
1115 
1116     /* first read scheme and check that it is valid */
1117     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
1118     if (!p_HcFrame)
1119         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
1120     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1121     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1122     p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
1123     p_HcFrame->extraReg = 0x00008000;
1124 
1125     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
1126 
1127     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1128     {
1129         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1130         XX_FreeSmart(p_HcFrame);
1131         RETURN_ERROR(MINOR, err, NO_MSG);
1132     }
1133 
1134     /* check that profile is valid */
1135     if (!FmPcdPlcrHwProfileIsValid(p_HcFrame->hcSpecificData.profileRegs.fmpl_pemode))
1136     {
1137         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1138         XX_FreeSmart(p_HcFrame);
1139         RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Policer is already used"));
1140     }
1141 
1142     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1143     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
1144     p_HcFrame->actionReg |= FmPcdPlcrBuildCounterProfileReg(counter);
1145     p_HcFrame->extraReg = 0x00008000;
1146     p_HcFrame->hcSpecificData.singleRegForWrite = value;
1147 
1148     BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
1149 
1150     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1151     {
1152         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1153         XX_FreeSmart(p_HcFrame);
1154         RETURN_ERROR(MINOR, err, NO_MSG);
1155     }
1156 
1157     FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1158 
1159     XX_FreeSmart(p_HcFrame);
1160 
1161     return E_OK;
1162 }
1163 
1164 uint32_t FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter)
1165 {
1166     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1167     uint16_t    absoluteProfileId = (uint16_t)(PTR_TO_UINT(h_Profile)-1);
1168     t_Error     err = E_OK;
1169     t_HcFrame   *p_HcFrame;
1170     t_DpaaFD    fmFd;
1171     uint32_t    retVal = 0;
1172 
1173     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
1174 
1175     if (FmPcdPlcrProfileTryLock(p_FmHc->h_FmPcd, absoluteProfileId, FALSE))
1176         return 0;
1177 
1178     /* first read scheme and check that it is valid */
1179     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
1180     if (!p_HcFrame)
1181     {
1182         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
1183         return 0;
1184     }
1185     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1186     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1187     p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
1188     p_HcFrame->extraReg = 0x00008000;
1189 
1190     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
1191 
1192     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1193     {
1194         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1195         REPORT_ERROR(MINOR, err, NO_MSG);
1196         XX_FreeSmart(p_HcFrame);
1197         return 0;
1198     }
1199 
1200     /* check that profile is valid */
1201     if (!FmPcdPlcrHwProfileIsValid(p_HcFrame->hcSpecificData.profileRegs.fmpl_pemode))
1202     {
1203         FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1204         XX_FreeSmart(p_HcFrame);
1205         REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("invalid Policer profile"));
1206         return 0;
1207     }
1208 
1209     switch (counter)
1210     {
1211         case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:
1212             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegpc;
1213             break;
1214         case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:
1215             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_peypc;
1216             break;
1217         case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:
1218             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perpc;
1219             break;
1220         case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:
1221             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perypc;
1222             break;
1223         case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:
1224             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perrpc;
1225             break;
1226         default:
1227             REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
1228     }
1229 
1230     FmPcdPlcrReleaseProfileLock(p_FmHc->h_FmPcd, absoluteProfileId);
1231 
1232     XX_FreeSmart(p_HcFrame);
1233 
1234     return retVal;
1235 }
1236 
1237 t_Error FmHcPcdCcModifyTreeNextEngine(t_Handle h_FmHc, t_Handle h_CcTree, uint8_t grpId, uint8_t index, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
1238 {
1239     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1240     t_Error     err = E_OK;
1241     uint32_t    intFlags;
1242     t_List      h_OldPointersLst, h_NewPointersLst;
1243     t_Handle    h_Params;
1244 
1245     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1246     err = FmPcdCcTreeTryLock(h_CcTree);
1247     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1248     if (err)
1249         return err;
1250 
1251     INIT_LIST(&h_OldPointersLst);
1252     INIT_LIST(&h_NewPointersLst);
1253 
1254     err = FmPcdCcModifyNextEngineParamTree(p_FmHc->h_FmPcd, h_CcTree, grpId, index, p_FmPcdCcNextEngineParams,
1255             &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1256     if(err)
1257     {
1258         FmPcdCcTreeReleaseLock(h_CcTree);
1259         RETURN_ERROR(MAJOR, err, NO_MSG);
1260     }
1261 
1262     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1263 
1264     FmPcdCcTreeReleaseLock(h_CcTree);
1265 
1266     return err;
1267 }
1268 
1269 
1270 t_Error FmHcPcdCcModifyNodeMissNextEngine(t_Handle h_FmHc, t_Handle h_CcNode, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
1271 {
1272     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1273     t_Handle    h_Params;
1274     t_List      h_OldPointersLst, h_NewPointersLst;
1275     t_Error     err = E_OK;
1276     t_List      h_List;
1277     uint32_t    intFlags;
1278 
1279     INIT_LIST(&h_List);
1280 
1281     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1282 
1283     if ((err = FmPcdCcNodeTreeTryLock(p_FmHc->h_FmPcd, h_CcNode, &h_List)) != E_OK)
1284     {
1285         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1286         return err;
1287     }
1288 
1289     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1290 
1291     INIT_LIST(&h_OldPointersLst);
1292     INIT_LIST(&h_NewPointersLst);
1293 
1294     err = FmPcdCcModifyMissNextEngineParamNode(p_FmHc->h_FmPcd, h_CcNode, p_FmPcdCcNextEngineParams, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1295     if(err)
1296     {
1297         FmPcdCcNodeTreeReleaseLock(&h_List);
1298         RETURN_ERROR(MAJOR, err, NO_MSG);
1299     }
1300 
1301     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1302 
1303     FmPcdCcNodeTreeReleaseLock(&h_List);
1304 
1305 
1306     return E_OK;
1307 }
1308 
1309 t_Error FmHcPcdCcRemoveKey(t_Handle h_FmHc, t_Handle h_CcNode, uint8_t keyIndex)
1310 {
1311     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1312     t_Handle    h_Params;
1313     t_List      h_OldPointersLst, h_NewPointersLst;
1314     t_Error     err = E_OK;
1315     t_List      h_List;
1316     uint32_t    intFlags;
1317 
1318     INIT_LIST(&h_List);
1319 
1320     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1321 
1322     if ((err = FmPcdCcNodeTreeTryLock(p_FmHc->h_FmPcd, h_CcNode, &h_List)) != E_OK)
1323     {
1324         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1325         return err;
1326     }
1327 
1328     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1329 
1330     INIT_LIST(&h_OldPointersLst);
1331     INIT_LIST(&h_NewPointersLst);
1332 
1333 
1334     err = FmPcdCcRemoveKey(p_FmHc->h_FmPcd,h_CcNode,keyIndex, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1335     if(err)
1336     {
1337         FmPcdCcNodeTreeReleaseLock(&h_List);
1338         RETURN_ERROR(MAJOR, err, NO_MSG);
1339     }
1340 
1341     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1342 
1343     FmPcdCcNodeTreeReleaseLock(&h_List);
1344 
1345     return err;
1346 
1347 }
1348 
1349 t_Error FmHcPcdCcAddKey(t_Handle h_FmHc, t_Handle h_CcNode, uint8_t keyIndex, uint8_t keySize, t_FmPcdCcKeyParams  *p_KeyParams)
1350 {
1351     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1352     t_Handle    h_Params;
1353     t_List      h_OldPointersLst, h_NewPointersLst;
1354     t_Error     err = E_OK;
1355     t_List      h_List;
1356     uint32_t    intFlags;
1357 
1358     INIT_LIST(&h_List);
1359 
1360     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1361 
1362     if ((err = FmPcdCcNodeTreeTryLock(p_FmHc->h_FmPcd, h_CcNode, &h_List)) != E_OK)
1363     {
1364         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1365         return err;
1366     }
1367 
1368     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1369 
1370     INIT_LIST(&h_OldPointersLst);
1371     INIT_LIST(&h_NewPointersLst);
1372 
1373 
1374     err = FmPcdCcAddKey(p_FmHc->h_FmPcd,h_CcNode,keyIndex,keySize, p_KeyParams, &h_OldPointersLst,&h_NewPointersLst, &h_Params);
1375     if(err)
1376     {
1377         FmPcdCcNodeTreeReleaseLock(&h_List);
1378         RETURN_ERROR(MAJOR, err, NO_MSG);
1379     }
1380 
1381     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1382 
1383     FmPcdCcNodeTreeReleaseLock(&h_List);
1384 
1385     return err;
1386 }
1387 
1388 
1389 t_Error FmHcPcdCcModifyKey(t_Handle h_FmHc, t_Handle h_CcNode, uint8_t keyIndex, uint8_t keySize, uint8_t  *p_Key, uint8_t *p_Mask)
1390 {
1391     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1392     t_List      h_OldPointersLst, h_NewPointersLst;
1393     t_Error     err = E_OK;
1394     t_List      h_List;
1395     uint32_t    intFlags;
1396     t_Handle    h_Params;
1397 
1398     UNUSED(keySize);
1399 
1400     INIT_LIST(&h_List);
1401 
1402     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1403 
1404     if ((err = FmPcdCcNodeTreeTryLock(p_FmHc->h_FmPcd, h_CcNode, &h_List)) != E_OK)
1405     {
1406         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1407         return err;
1408     }
1409 
1410     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1411 
1412     INIT_LIST(&h_OldPointersLst);
1413     INIT_LIST(&h_NewPointersLst);
1414 
1415     err = FmPcdCcModifyKey(p_FmHc->h_FmPcd, h_CcNode, keyIndex, keySize, p_Key, p_Mask, &h_OldPointersLst,&h_NewPointersLst,  &h_Params);
1416     if(err)
1417     {
1418         FmPcdCcNodeTreeReleaseLock(&h_List);
1419         RETURN_ERROR(MAJOR, err, NO_MSG);
1420     }
1421 
1422     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1423 
1424     FmPcdCcNodeTreeReleaseLock(&h_List);
1425 
1426     return err;
1427 }
1428 
1429 t_Error FmHcPcdCcModifyNodeNextEngine(t_Handle h_FmHc, t_Handle h_CcNode, uint8_t keyIndex, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
1430 {
1431     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1432     t_Error     err = E_OK;
1433     t_List      h_OldPointersLst, h_NewPointersLst;
1434     t_List      h_List;
1435     uint32_t    intFlags;
1436     t_Handle    h_Params;
1437 
1438     INIT_LIST(&h_List);
1439 
1440     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1441 
1442     if ((err = FmPcdCcNodeTreeTryLock(p_FmHc->h_FmPcd, h_CcNode, &h_List)) != E_OK)
1443     {
1444         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1445         return err;
1446     }
1447 
1448     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1449 
1450     INIT_LIST(&h_OldPointersLst);
1451     INIT_LIST(&h_NewPointersLst);
1452 
1453     err = FmPcdCcModiyNextEngineParamNode(p_FmHc->h_FmPcd, h_CcNode, keyIndex, p_FmPcdCcNextEngineParams, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1454     if(err)
1455     {
1456         FmPcdCcNodeTreeReleaseLock(&h_List);
1457         RETURN_ERROR(MAJOR, err, NO_MSG);
1458     }
1459 
1460     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1461     FmPcdCcNodeTreeReleaseLock(&h_List);
1462     return err;
1463 }
1464 
1465 
1466 t_Error FmHcPcdCcModifyKeyAndNextEngine(t_Handle h_FmHc, t_Handle h_CcNode, uint8_t keyIndex, uint8_t keySize, t_FmPcdCcKeyParams  *p_KeyParams)
1467 {
1468     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1469     t_List      h_OldPointersLst, h_NewPointersLst;
1470     t_Error     err = E_OK;
1471     t_List      h_List;
1472     uint32_t    intFlags;
1473     t_Handle    h_Params;
1474 
1475     INIT_LIST(&h_OldPointersLst);
1476     INIT_LIST(&h_NewPointersLst);
1477     INIT_LIST(&h_List);
1478 
1479     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
1480 
1481     if ((err = FmPcdCcNodeTreeTryLock(p_FmHc->h_FmPcd, h_CcNode, &h_List)) != E_OK)
1482     {
1483         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1484         return err;
1485     }
1486 
1487     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
1488 
1489 
1490     err = FmPcdCcModifyKeyAndNextEngine(p_FmHc->h_FmPcd,h_CcNode,keyIndex,keySize, p_KeyParams, &h_OldPointersLst,&h_NewPointersLst, &h_Params);
1491     if(err)
1492     {
1493         FmPcdCcNodeTreeReleaseLock(&h_List);
1494         RETURN_ERROR(MAJOR, err, NO_MSG);
1495     }
1496 
1497     err =  HcDynamicChange(p_FmHc, &h_OldPointersLst, &h_NewPointersLst, &h_Params);
1498 
1499     FmPcdCcNodeTreeReleaseLock(&h_List);
1500 
1501 
1502     return err;
1503 }
1504 
1505 
1506 t_Error FmHcKgWriteSp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t spReg, bool add)
1507 {
1508     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1509     t_HcFrame               *p_HcFrame;
1510     t_DpaaFD                fmFd;
1511     t_Error                 err = E_OK;
1512 
1513     ASSERT_COND(p_FmHc);
1514 
1515     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
1516     if (!p_HcFrame)
1517         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
1518     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1519     /* first read SP register */
1520     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
1521     p_HcFrame->actionReg  = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);
1522     p_HcFrame->extraReg = 0xFFFFF800;
1523 
1524     BUILD_FD(SIZE_OF_HC_FRAME_PORT_REGS);
1525 
1526     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1527     {
1528         XX_FreeSmart(p_HcFrame);
1529         RETURN_ERROR(MINOR, err, NO_MSG);
1530     }
1531 
1532     /* spReg is the first reg, so we can use it both for read and for write */
1533     if(add)
1534         p_HcFrame->hcSpecificData.portRegsForRead.spReg |= spReg;
1535     else
1536         p_HcFrame->hcSpecificData.portRegsForRead.spReg &= ~spReg;
1537 
1538     p_HcFrame->actionReg  = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);
1539 
1540     BUILD_FD(sizeof(t_HcFrame));
1541 
1542     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1543     {
1544         XX_FreeSmart(p_HcFrame);
1545         RETURN_ERROR(MINOR, err, NO_MSG);
1546     }
1547 
1548     XX_FreeSmart(p_HcFrame);
1549 
1550     return E_OK;
1551 }
1552 
1553 t_Error FmHcKgWriteCpp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t cppReg)
1554 {
1555     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1556     t_HcFrame               *p_HcFrame;
1557     t_DpaaFD                fmFd;
1558     t_Error                 err = E_OK;
1559 
1560     ASSERT_COND(p_FmHc);
1561 
1562     p_HcFrame = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + p_FmHc->padTill16), 0, 16);
1563     if (!p_HcFrame)
1564         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame obj"));
1565     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1566     /* first read SP register */
1567     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
1568     p_HcFrame->actionReg  = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);
1569     p_HcFrame->extraReg = 0xFFFFF800;
1570     p_HcFrame->hcSpecificData.singleRegForWrite = cppReg;
1571 
1572     BUILD_FD(sizeof(t_HcFrame));
1573 
1574     if ((err = EnQFrm(p_FmHc, &fmFd, &p_HcFrame->commandSequence)) != E_OK)
1575     {
1576         XX_FreeSmart(p_HcFrame);
1577         RETURN_ERROR(MINOR, err, NO_MSG);
1578     }
1579 
1580     XX_FreeSmart(p_HcFrame);
1581 
1582     return E_OK;
1583 }
1584 
1585