Path: blob/main/sys/contrib/ncsw/Peripherals/FM/MACSEC/fm_macsec_master.c
48417 views
/*1* Copyright 2008-2015 Freescale Semiconductor Inc.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions are met:5* * Redistributions of source code must retain the above copyright6* notice, this list of conditions and the following disclaimer.7* * Redistributions in binary form must reproduce the above copyright8* notice, this list of conditions and the following disclaimer in the9* documentation and/or other materials provided with the distribution.10* * Neither the name of Freescale Semiconductor nor the11* names of its contributors may be used to endorse or promote products12* derived from this software without specific prior written permission.13*14*15* ALTERNATIVELY, this software may be distributed under the terms of the16* GNU General Public License ("GPL") as published by the Free Software17* Foundation, either version 2 of that License or (at your option) any18* later version.19*20* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED22* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE23* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY24* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES25* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;26* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND27* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT28* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/3132/******************************************************************************33@File fm_macsec.c3435@Description FM MACSEC driver routines implementation.36*//***************************************************************************/3738#include "std_ext.h"39#include "error_ext.h"40#include "xx_ext.h"41#include "string_ext.h"42#include "sprint_ext.h"43#include "fm_mac_ext.h"4445#include "fm_macsec_master.h"464748extern uint16_t FM_MAC_GetMaxFrameLength(t_Handle FmMac);495051/****************************************/52/* static functions */53/****************************************/54static t_Error CheckFmMacsecParameters(t_FmMacsec *p_FmMacsec)55{56if (!p_FmMacsec->f_Exception)57RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));5859return E_OK;60}6162static void UnimplementedIsr(t_Handle h_Arg, uint32_t id)63{64UNUSED(h_Arg); UNUSED(id);6566REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented Isr!"));67}6869static void MacsecEventIsr(t_Handle h_FmMacsec)70{71t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;72uint32_t events,event,i;7374SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);7576events = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->evr);77events |= GET_UINT32(p_FmMacsec->p_FmMacsecRegs->ever);78WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->evr,events);7980for (i=0; i<NUM_OF_TX_SC; i++)81if (events & FM_MACSEC_EV_TX_SC_NEXT_PN(i))82{83GET_MACSEC_MODULE_EVENT(e_FM_MACSEC_MOD_SC_TX, i, e_FM_INTR_TYPE_NORMAL, event);84p_FmMacsec->intrMng[event].f_Isr(p_FmMacsec->intrMng[event].h_SrcHandle, i);85}86}8788static void MacsecErrorIsr(t_Handle h_FmMacsec)89{90t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;91uint32_t errors,error,i;9293SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);9495errors = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->err);96errors |= GET_UINT32(p_FmMacsec->p_FmMacsecRegs->erer);97WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->err,errors);9899for (i=0; i<NUM_OF_TX_SC; i++)100if (errors & FM_MACSEC_EX_TX_SC(i))101{102GET_MACSEC_MODULE_EVENT(e_FM_MACSEC_MOD_SC_TX, i, e_FM_INTR_TYPE_ERR, error);103p_FmMacsec->intrMng[error].f_Isr(p_FmMacsec->intrMng[error].h_SrcHandle, i);104}105106if (errors & FM_MACSEC_EX_ECC)107{108uint8_t eccType;109uint32_t tmpReg;110111tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->meec);112ASSERT_COND(tmpReg & MECC_CAP);113eccType = (uint8_t)((tmpReg & MECC_CET) >> MECC_CET_SHIFT);114115if (!eccType && (p_FmMacsec->userExceptions & FM_MACSEC_USER_EX_SINGLE_BIT_ECC))116p_FmMacsec->f_Exception(p_FmMacsec->h_App,e_FM_MACSEC_EX_SINGLE_BIT_ECC);117else if (eccType && (p_FmMacsec->userExceptions & FM_MACSEC_USER_EX_MULTI_BIT_ECC))118p_FmMacsec->f_Exception(p_FmMacsec->h_App,e_FM_MACSEC_EX_MULTI_BIT_ECC);119else120WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->meec,tmpReg);121}122}123124static t_Error MacsecInit(t_Handle h_FmMacsec)125{126t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;127t_FmMacsecDriverParam *p_FmMacsecDriverParam = NULL;128uint32_t tmpReg,i,macId;129130SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);131SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);132133CHECK_INIT_PARAMETERS(p_FmMacsec, CheckFmMacsecParameters);134135p_FmMacsecDriverParam = p_FmMacsec->p_FmMacsecDriverParam;136137for (i=0;i<e_FM_MACSEC_EV_DUMMY_LAST;i++)138p_FmMacsec->intrMng[i].f_Isr = UnimplementedIsr;139140tmpReg = 0;141tmpReg |= (p_FmMacsecDriverParam->changedTextWithNoEncryptDeliverUncontrolled << CFG_UECT_SHIFT)|142(p_FmMacsecDriverParam->onlyScbIsSetDeliverUncontrolled << CFG_ESCBT_SHIFT) |143(p_FmMacsecDriverParam->unknownSciTreatMode << CFG_USFT_SHIFT) |144(p_FmMacsecDriverParam->invalidTagsDeliverUncontrolled << CFG_ITT_SHIFT) |145(p_FmMacsecDriverParam->encryptWithNoChangedTextDiscardUncontrolled << CFG_KFT_SHIFT) |146(p_FmMacsecDriverParam->untagTreatMode << CFG_UFT_SHIFT) |147(p_FmMacsecDriverParam->keysUnreadable << CFG_KSS_SHIFT) |148(p_FmMacsecDriverParam->reservedSc0 << CFG_S0I_SHIFT) |149(p_FmMacsecDriverParam->byPassMode << CFG_BYPN_SHIFT);150WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg, tmpReg);151152tmpReg = FM_MAC_GetMaxFrameLength(p_FmMacsec->h_FmMac);153/* At least Ethernet FCS (4 bytes) overhead must be subtracted from MFL.154* In addition, the SCI (8 bytes) overhead might be subtracted as well. */155tmpReg -= p_FmMacsecDriverParam->mflSubtract;156WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->mfl, tmpReg);157158WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->tpnet, p_FmMacsecDriverParam->pnExhThr);159160if (!p_FmMacsec->userExceptions)161p_FmMacsec->exceptions &= ~FM_MACSEC_EX_ECC;162WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->erer, p_FmMacsec->exceptions);163164p_FmMacsec->numRxScAvailable = NUM_OF_RX_SC;165if (p_FmMacsecDriverParam->reservedSc0)166p_FmMacsec->numRxScAvailable --;167p_FmMacsec->numTxScAvailable = NUM_OF_TX_SC;168169XX_Free(p_FmMacsecDriverParam);170p_FmMacsec->p_FmMacsecDriverParam = NULL;171172FM_MAC_GetId(p_FmMacsec->h_FmMac, &macId);173FmRegisterIntr(p_FmMacsec->h_Fm,174e_FM_MOD_MACSEC,175(uint8_t)macId,176e_FM_INTR_TYPE_NORMAL,177MacsecEventIsr,178p_FmMacsec);179180FmRegisterIntr(p_FmMacsec->h_Fm,181e_FM_MOD_MACSEC,1820,183e_FM_INTR_TYPE_ERR,184MacsecErrorIsr,185p_FmMacsec);186187return E_OK;188}189190static t_Error MacsecFree(t_Handle h_FmMacsec)191{192t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;193uint32_t macId;194195SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);196SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);197198FM_MAC_GetId(p_FmMacsec->h_FmMac, &macId);199FmUnregisterIntr(p_FmMacsec->h_Fm,200e_FM_MOD_MACSEC,201(uint8_t)macId,202e_FM_INTR_TYPE_NORMAL);203204FmUnregisterIntr(p_FmMacsec->h_Fm,205e_FM_MOD_MACSEC,2060,207e_FM_INTR_TYPE_ERR);208209if (p_FmMacsec->rxScSpinLock)210XX_FreeSpinlock(p_FmMacsec->rxScSpinLock);211if (p_FmMacsec->txScSpinLock)212XX_FreeSpinlock(p_FmMacsec->txScSpinLock);213214XX_Free(p_FmMacsec);215216return E_OK;217}218219static t_Error MacsecConfigUnknownSciFrameTreatment(t_Handle h_FmMacsec, e_FmMacsecUnknownSciFrameTreatment treatMode)220{221t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;222223SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);224SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);225226p_FmMacsec->p_FmMacsecDriverParam->unknownSciTreatMode = treatMode;227228return E_OK;229}230231static t_Error MacsecConfigInvalidTagsFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)232{233t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;234235SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);236SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);237238p_FmMacsec->p_FmMacsecDriverParam->invalidTagsDeliverUncontrolled = deliverUncontrolled;239240return E_OK;241}242243static t_Error MacsecConfigChangedTextWithNoEncryptFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)244{245t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;246247SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);248SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);249250p_FmMacsec->p_FmMacsecDriverParam->changedTextWithNoEncryptDeliverUncontrolled = deliverUncontrolled;251252return E_OK;253}254255static t_Error MacsecConfigOnlyScbIsSetFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)256{257t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;258259SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);260SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);261262p_FmMacsec->p_FmMacsecDriverParam->onlyScbIsSetDeliverUncontrolled = deliverUncontrolled;263264return E_OK;265}266267static t_Error MacsecConfigEncryptWithNoChangedTextFrameTreatment(t_Handle h_FmMacsec, bool discardUncontrolled)268{269t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;270271SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);272SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);273274p_FmMacsec->p_FmMacsecDriverParam->encryptWithNoChangedTextDiscardUncontrolled = discardUncontrolled;275276return E_OK;277}278279static t_Error MacsecConfigUntagFrameTreatment(t_Handle h_FmMacsec, e_FmMacsecUntagFrameTreatment treatMode)280{281t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;282283SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);284SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);285286p_FmMacsec->p_FmMacsecDriverParam->untagTreatMode = treatMode;287288return E_OK;289}290291static t_Error MacsecConfigPnExhaustionThreshold(t_Handle h_FmMacsec, uint32_t pnExhThr)292{293t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;294295SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);296SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);297298p_FmMacsec->p_FmMacsecDriverParam->pnExhThr = pnExhThr;299300return E_OK;301}302303static t_Error MacsecConfigKeysUnreadable(t_Handle h_FmMacsec)304{305t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;306307SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);308SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);309310p_FmMacsec->p_FmMacsecDriverParam->keysUnreadable = TRUE;311312return E_OK;313}314315static t_Error MacsecConfigSectagWithoutSCI(t_Handle h_FmMacsec)316{317t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;318319SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);320SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);321322p_FmMacsec->p_FmMacsecDriverParam->sectagOverhead -= MACSEC_SCI_SIZE;323p_FmMacsec->p_FmMacsecDriverParam->mflSubtract += MACSEC_SCI_SIZE;324325return E_OK;326}327328static t_Error MacsecConfigException(t_Handle h_FmMacsec, e_FmMacsecExceptions exception, bool enable)329{330t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;331uint32_t bitMask = 0;332333SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);334SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);335336GET_USER_EXCEPTION_FLAG(bitMask, exception);337if (bitMask)338{339if (enable)340p_FmMacsec->userExceptions |= bitMask;341else342p_FmMacsec->userExceptions &= ~bitMask;343}344else345RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));346347return E_OK;348}349350static t_Error MacsecGetRevision(t_Handle h_FmMacsec, uint32_t *p_MacsecRevision)351{352t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;353354SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);355SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);356357*p_MacsecRevision = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->ip_rev1);358359return E_OK;360}361362static t_Error MacsecEnable(t_Handle h_FmMacsec)363{364t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;365uint32_t tmpReg;366367SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);368SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);369370tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg);371tmpReg |= CFG_BYPN;372WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg,tmpReg);373374return E_OK;375}376377static t_Error MacsecDisable(t_Handle h_FmMacsec)378{379t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;380uint32_t tmpReg;381382SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);383SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);384385tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg);386tmpReg &= ~CFG_BYPN;387WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg,tmpReg);388389return E_OK;390}391392static t_Error MacsecSetException(t_Handle h_FmMacsec, e_FmMacsecExceptions exception, bool enable)393{394t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;395uint32_t bitMask;396397SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);398SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);399400GET_USER_EXCEPTION_FLAG(bitMask, exception);401if (bitMask)402{403if (enable)404p_FmMacsec->userExceptions |= bitMask;405else406p_FmMacsec->userExceptions &= ~bitMask;407}408else409RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));410411if (!p_FmMacsec->userExceptions)412p_FmMacsec->exceptions &= ~FM_MACSEC_EX_ECC;413else414p_FmMacsec->exceptions |= FM_MACSEC_EX_ECC;415WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->erer, p_FmMacsec->exceptions);416417return E_OK;418}419420static void InitFmMacsecControllerDriver(t_FmMacsecControllerDriver *p_FmMacsecControllerDriver)421{422p_FmMacsecControllerDriver->f_FM_MACSEC_Init = MacsecInit;423p_FmMacsecControllerDriver->f_FM_MACSEC_Free = MacsecFree;424p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUnknownSciFrameTreatment = MacsecConfigUnknownSciFrameTreatment;425p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigInvalidTagsFrameTreatment = MacsecConfigInvalidTagsFrameTreatment;426p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigEncryptWithNoChangedTextFrameTreatment = MacsecConfigEncryptWithNoChangedTextFrameTreatment;427p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUntagFrameTreatment = MacsecConfigUntagFrameTreatment;428p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigChangedTextWithNoEncryptFrameTreatment = MacsecConfigChangedTextWithNoEncryptFrameTreatment;429p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigOnlyScbIsSetFrameTreatment = MacsecConfigOnlyScbIsSetFrameTreatment;430p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigPnExhaustionThreshold = MacsecConfigPnExhaustionThreshold;431p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigKeysUnreadable = MacsecConfigKeysUnreadable;432p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigSectagWithoutSCI = MacsecConfigSectagWithoutSCI;433p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigException = MacsecConfigException;434p_FmMacsecControllerDriver->f_FM_MACSEC_GetRevision = MacsecGetRevision;435p_FmMacsecControllerDriver->f_FM_MACSEC_Enable = MacsecEnable;436p_FmMacsecControllerDriver->f_FM_MACSEC_Disable = MacsecDisable;437p_FmMacsecControllerDriver->f_FM_MACSEC_SetException = MacsecSetException;438}439440/****************************************/441/* Inter-Module functions */442/****************************************/443444void FmMacsecRegisterIntr(t_Handle h_FmMacsec,445e_FmMacsecEventModules module,446uint8_t modId,447e_FmIntrType intrType,448void (*f_Isr) (t_Handle h_Arg, uint32_t id),449t_Handle h_Arg)450{451t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;452uint8_t event= 0;453454SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);455456GET_MACSEC_MODULE_EVENT(module, modId, intrType, event);457458ASSERT_COND(event != e_FM_MACSEC_EV_DUMMY_LAST);459p_FmMacsec->intrMng[event].f_Isr = f_Isr;460p_FmMacsec->intrMng[event].h_SrcHandle = h_Arg;461}462463void FmMacsecUnregisterIntr(t_Handle h_FmMacsec,464e_FmMacsecEventModules module,465uint8_t modId,466e_FmIntrType intrType)467{468t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;469uint8_t event= 0;470471SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);472473GET_MACSEC_MODULE_EVENT(module, modId,intrType, event);474475ASSERT_COND(event != e_FM_MACSEC_EV_DUMMY_LAST);476p_FmMacsec->intrMng[event].f_Isr = NULL;477p_FmMacsec->intrMng[event].h_SrcHandle = NULL;478}479480t_Error FmMacsecAllocScs(t_Handle h_FmMacsec, e_ScType type, bool isPtp, uint32_t numOfScs, uint32_t *p_ScIds)481{482t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;483t_Error err = E_OK;484bool *p_ScTable;485uint32_t *p_ScAvailable,i;486487SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);488SANITY_CHECK_RETURN_ERROR(p_ScIds, E_INVALID_HANDLE);489SANITY_CHECK_RETURN_ERROR(numOfScs, E_INVALID_HANDLE);490491if (type == e_SC_RX)492{493p_ScTable = (bool *)p_FmMacsec->rxScTable;494p_ScAvailable = &p_FmMacsec->numRxScAvailable;495i = (NUM_OF_RX_SC - 1);496}497else498{499p_ScTable = (bool *)p_FmMacsec->txScTable;500p_ScAvailable = &p_FmMacsec->numTxScAvailable;501i = (NUM_OF_TX_SC - 1);502503}504if (*p_ScAvailable < numOfScs)505RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Not enough SCs available"));506507if (isPtp)508{509i = 0;510if (p_ScTable[i])511RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Sc 0 Not available"));512}513514for (;numOfScs;i--)515{516if (p_ScTable[i])517continue;518numOfScs --;519(*p_ScAvailable)--;520p_ScIds[numOfScs] = i;521p_ScTable[i] = TRUE;522}523524return err;525}526527t_Error FmMacsecFreeScs(t_Handle h_FmMacsec, e_ScType type, uint32_t numOfScs, uint32_t *p_ScIds)528{529t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;530t_Error err = E_OK;531bool *p_ScTable;532uint32_t *p_ScAvailable,maxNumOfSc,i;533534SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);535SANITY_CHECK_RETURN_ERROR(p_ScIds, E_INVALID_HANDLE);536SANITY_CHECK_RETURN_ERROR(numOfScs, E_INVALID_HANDLE);537538if (type == e_SC_RX)539{540p_ScTable = (bool *)p_FmMacsec->rxScTable;541p_ScAvailable = &p_FmMacsec->numRxScAvailable;542maxNumOfSc = NUM_OF_RX_SC;543}544else545{546p_ScTable = (bool *)p_FmMacsec->txScTable;547p_ScAvailable = &p_FmMacsec->numTxScAvailable;548maxNumOfSc = NUM_OF_TX_SC;549}550551if ((*p_ScAvailable + numOfScs) > maxNumOfSc)552RETURN_ERROR(MINOR, E_FULL, ("Too much SCs"));553554for (i=0;i<numOfScs;i++)555{556p_ScTable[p_ScIds[i]] = FALSE;557(*p_ScAvailable)++;558}559560return err;561562}563564t_Error FmMacsecSetPTP(t_Handle h_FmMacsec, bool enable)565{566t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;567uint32_t tmpReg = 0;568569SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);570571tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg);572if (enable && (tmpReg & CFG_S0I))573RETURN_ERROR(MINOR, E_INVALID_STATE, ("MACSEC already in point-to-point mode"));574575if (enable)576tmpReg |= CFG_S0I;577else578tmpReg &= ~CFG_S0I;579WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg, tmpReg);580581return E_OK;582}583584t_Error FmMacsecCreateRxSc(t_Handle h_FmMacsec, t_RxScParams *p_RxScParams)585{586t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;587t_Error err = E_OK;588uint32_t tmpReg = 0, intFlags;589590SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);591SANITY_CHECK_RETURN_ERROR(p_RxScParams, E_INVALID_HANDLE);592SANITY_CHECK_RETURN_ERROR(p_RxScParams->scId < NUM_OF_RX_SC, E_INVALID_HANDLE);593594intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);595596WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, p_RxScParams->scId);597tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsccfg);598if (tmpReg & RX_SCCFG_SCI_EN_MASK)599{600XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);601RETURN_ERROR(MINOR, E_INVALID_STATE, ("Rx Sc %d must be disable",p_RxScParams->scId));602}603604WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsci1h, GET_SCI_FIRST_HALF(p_RxScParams->sci));605WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsci2h, GET_SCI_SECOND_HALF(p_RxScParams->sci));606tmpReg |= ((p_RxScParams->replayProtect << RX_SCCFG_RP_SHIFT) & RX_SCCFG_RP_MASK);607tmpReg |= ((p_RxScParams->validateFrames << RX_SCCFG_VF_SHIFT) & RX_SCCFG_VF_MASK);608tmpReg |= ((p_RxScParams->confidentialityOffset << RX_SCCFG_CO_SHIFT) & RX_SCCFG_CO_MASK);609tmpReg |= RX_SCCFG_SCI_EN_MASK;610tmpReg |= (p_RxScParams->cipherSuite << RX_SCCFG_CS_SHIFT);611WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsccfg, tmpReg);612613WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rpw, p_RxScParams->replayWindow);614615XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);616617return err;618}619620t_Error FmMacsecDeleteRxSc(t_Handle h_FmMacsec, uint32_t scId)621{622t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;623t_Error err = E_OK;624uint32_t tmpReg = 0, intFlags;625626SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);627SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);628629intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);630631tmpReg &= ~RX_SCCFG_SCI_EN_MASK;632WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);633WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsccfg, tmpReg);634635XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);636637return err;638}639640t_Error FmMacsecCreateTxSc(t_Handle h_FmMacsec, t_TxScParams *p_TxScParams)641{642t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;643t_Error err = E_OK;644uint32_t tmpReg = 0, intFlags;645bool alwaysIncludeSCI = FALSE, useES = FALSE, useSCB = FALSE;646647SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);648SANITY_CHECK_RETURN_ERROR(p_TxScParams, E_INVALID_HANDLE);649SANITY_CHECK_RETURN_ERROR(p_TxScParams->scId < NUM_OF_TX_SC, E_INVALID_HANDLE);650651intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);652653WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, p_TxScParams->scId);654655tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg);656if (tmpReg & TX_SCCFG_SCE_MASK)657{658XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);659RETURN_ERROR(MINOR, E_INVALID_STATE, ("Tx Sc %d must be disable",p_TxScParams->scId));660}661662WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsci1h, GET_SCI_FIRST_HALF(p_TxScParams->sci));663WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsci2h, GET_SCI_SECOND_HALF(p_TxScParams->sci));664alwaysIncludeSCI = (p_TxScParams->sciInsertionMode == e_FM_MACSEC_SCI_INSERTION_MODE_EXPLICIT_SECTAG);665useES = (p_TxScParams->sciInsertionMode == e_FM_MACSEC_SCI_INSERTION_MODE_EXPLICIT_MAC_SA);666667tmpReg |= ((p_TxScParams->protectFrames << TX_SCCFG_PF_SHIFT) & TX_SCCFG_PF_MASK);668tmpReg |= ((alwaysIncludeSCI << TX_SCCFG_AIS_SHIFT) & TX_SCCFG_AIS_MASK);669tmpReg |= ((useES << TX_SCCFG_UES_SHIFT) & TX_SCCFG_UES_MASK);670tmpReg |= ((useSCB << TX_SCCFG_USCB_SHIFT) & TX_SCCFG_USCB_MASK);671tmpReg |= ((p_TxScParams->confidentialityEnable << TX_SCCFG_CE_SHIFT) & TX_SCCFG_CE_MASK);672tmpReg |= ((p_TxScParams->confidentialityOffset << TX_SCCFG_CO_SHIFT) & TX_SCCFG_CO_MASK);673tmpReg |= TX_SCCFG_SCE_MASK;674tmpReg |= (p_TxScParams->cipherSuite << TX_SCCFG_CS_SHIFT);675WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg, tmpReg);676677XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);678679return err;680}681682t_Error FmMacsecDeleteTxSc(t_Handle h_FmMacsec, uint32_t scId)683{684t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;685t_Error err = E_OK;686uint32_t tmpReg = 0, intFlags;687688SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);689SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_TX_SC, E_INVALID_HANDLE);690691intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);692693tmpReg &= ~TX_SCCFG_SCE_MASK;694WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);695WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg, tmpReg);696697XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);698699return err;700}701702t_Error FmMacsecCreateRxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, macsecAN_t an, uint32_t lowestPn, macsecSAKey_t key)703{704t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;705t_Error err = E_OK;706uint32_t tmpReg = 0, intFlags;707708SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);709SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);710SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);711712intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);713714WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);715WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsanpn, DEFAULT_initNextPn);716WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsalpn, lowestPn);717MemCpy8((void*)p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsak, key, sizeof(macsecSAKey_t));718719tmpReg |= RX_SACFG_ACTIVE;720tmpReg |= ((an << RX_SACFG_AN_SHIFT) & RX_SACFG_AN_MASK);721WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs, tmpReg);722723XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);724725return err;726}727728t_Error FmMacsecCreateTxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, macsecSAKey_t key)729{730t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;731t_Error err = E_OK;732uint32_t tmpReg = 0, intFlags;733734SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);735SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);736SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_TX_SC, E_INVALID_HANDLE);737738intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);739740WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);741WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsanpn, DEFAULT_initNextPn);742MemCpy8((void*)p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsak, key, sizeof(macsecSAKey_t));743744tmpReg |= TX_SACFG_ACTIVE;745WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsacs, tmpReg);746747XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);748749return err;750}751752t_Error FmMacsecDeleteRxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId)753{754t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;755t_Error err = E_OK;756uint32_t tmpReg = 0, i, intFlags;757758SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);759SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);760SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);761762intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);763764WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);765WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsanpn, 0x0);766WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsalpn, 0x0);767for (i=0; i<4; i++)768WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsak[i], 0x0);769770tmpReg |= RX_SACFG_ACTIVE;771tmpReg &= ~RX_SACFG_EN_MASK;772WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs, tmpReg);773774XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);775776return err;777}778779t_Error FmMacsecDeleteTxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId)780{781t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;782t_Error err = E_OK;783uint32_t tmpReg = 0, i, intFlags;784785SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);786SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);787SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_TX_SC, E_INVALID_HANDLE);788789intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);790791WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);792WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsanpn, 0x0);793for (i=0; i<4; i++)794WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsak[i], 0x0);795796tmpReg |= TX_SACFG_ACTIVE;797WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsacs, tmpReg);798799XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);800801return err;802}803804t_Error FmMacsecRxSaSetReceive(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, bool enableReceive)805{806t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;807t_Error err = E_OK;808uint32_t tmpReg = 0, intFlags;809810SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);811SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);812SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);813814intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);815816WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);817tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs);818if (enableReceive)819tmpReg |= RX_SACFG_EN_MASK;820else821tmpReg &= ~RX_SACFG_EN_MASK;822823WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs, tmpReg);824825XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);826827return err;828}829830t_Error FmMacsecRxSaUpdateNextPn(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, uint32_t updtNextPN)831{832t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;833t_Error err = E_OK;834uint32_t intFlags;835836SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);837SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);838SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);839840intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);841842WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);843WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsanpn, updtNextPN);844845XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);846847return err;848}849850t_Error FmMacsecRxSaUpdateLowestPn(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, uint32_t updtLowestPN)851{852t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;853t_Error err = E_OK;854uint32_t intFlags;855856SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);857SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);858SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);859860intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);861862WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);863WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsalpn, updtLowestPN);864865XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);866867return err;868}869870t_Error FmMacsecTxSaSetActive(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, macsecAN_t an)871{872t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;873t_Error err = E_OK;874uint32_t tmpReg = 0, intFlags;875876SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);877SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);878SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_TX_SC, E_INVALID_HANDLE);879880intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);881882WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);883884tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg);885886tmpReg |= ((an << TX_SCCFG_AN_SHIFT) & TX_SCCFG_AN_MASK);887tmpReg |= ((saId << TX_SCCFG_ASA_SHIFT) & TX_SCCFG_ASA_MASK);888889WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg, tmpReg);890891XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);892893return err;894}895896t_Error FmMacsecTxSaGetActive(t_Handle h_FmMacsec, uint32_t scId, macsecAN_t *p_An)897{898t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;899t_Error err = E_OK;900uint32_t tmpReg = 0, intFlags;901902SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);903SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);904SANITY_CHECK_RETURN_ERROR(p_An, E_INVALID_HANDLE);905906intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);907908WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);909910tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg);911912XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);913914*p_An = (macsecAN_t)((tmpReg & TX_SCCFG_AN_MASK) >> TX_SCCFG_AN_SHIFT);915916return err;917}918919t_Error FmMacsecSetException(t_Handle h_FmMacsec, e_FmMacsecGlobalExceptions exception, uint32_t scId, bool enable)920{921t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;922uint32_t bitMask;923924SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);925SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);926927GET_EXCEPTION_FLAG(bitMask, exception, scId);928if (bitMask)929{930if (enable)931p_FmMacsec->exceptions |= bitMask;932else933p_FmMacsec->exceptions &= ~bitMask;934}935else936RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));937938WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->erer, p_FmMacsec->exceptions);939940return E_OK;941}942943t_Error FmMacsecSetEvent(t_Handle h_FmMacsec, e_FmMacsecGlobalEvents event, uint32_t scId, bool enable)944{945t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;946uint32_t bitMask;947948SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);949SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);950951GET_EVENT_FLAG(bitMask, event, scId);952if (bitMask)953{954if (enable)955p_FmMacsec->events |= bitMask;956else957p_FmMacsec->events &= ~bitMask;958}959else960RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined event"));961962WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->ever, p_FmMacsec->events);963964return E_OK;965}966967/****************************************/968/* API Init unit functions */969/****************************************/970t_Handle FM_MACSEC_MASTER_Config(t_FmMacsecParams *p_FmMacsecParam)971{972t_FmMacsec *p_FmMacsec;973uint32_t macId;974975/* Allocate FM MACSEC structure */976p_FmMacsec = (t_FmMacsec *) XX_Malloc(sizeof(t_FmMacsec));977if (!p_FmMacsec)978{979REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM MACSEC driver structure"));980return NULL;981}982memset(p_FmMacsec, 0, sizeof(t_FmMacsec));983InitFmMacsecControllerDriver(&p_FmMacsec->fmMacsecControllerDriver);984985/* Allocate the FM MACSEC driver's parameters structure */986p_FmMacsec->p_FmMacsecDriverParam = (t_FmMacsecDriverParam *)XX_Malloc(sizeof(t_FmMacsecDriverParam));987if (!p_FmMacsec->p_FmMacsecDriverParam)988{989XX_Free(p_FmMacsec);990REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM MACSEC driver parameters"));991return NULL;992}993memset(p_FmMacsec->p_FmMacsecDriverParam, 0, sizeof(t_FmMacsecDriverParam));994995/* Initialize FM MACSEC parameters which will be kept by the driver */996p_FmMacsec->h_Fm = p_FmMacsecParam->h_Fm;997p_FmMacsec->h_FmMac = p_FmMacsecParam->nonGuestParams.h_FmMac;998p_FmMacsec->p_FmMacsecRegs = (t_FmMacsecRegs *)UINT_TO_PTR(p_FmMacsecParam->nonGuestParams.baseAddr);999p_FmMacsec->f_Exception = p_FmMacsecParam->nonGuestParams.f_Exception;1000p_FmMacsec->h_App = p_FmMacsecParam->nonGuestParams.h_App;1001p_FmMacsec->userExceptions = DEFAULT_userExceptions;1002p_FmMacsec->exceptions = DEFAULT_exceptions;1003p_FmMacsec->events = DEFAULT_events;1004p_FmMacsec->rxScSpinLock = XX_InitSpinlock();1005p_FmMacsec->txScSpinLock = XX_InitSpinlock();10061007/* Initialize FM MACSEC driver parameters parameters (for initialization phase only) */1008p_FmMacsec->p_FmMacsecDriverParam->unknownSciTreatMode = DEFAULT_unknownSciFrameTreatment;1009p_FmMacsec->p_FmMacsecDriverParam->invalidTagsDeliverUncontrolled = DEFAULT_invalidTagsFrameTreatment;1010p_FmMacsec->p_FmMacsecDriverParam->encryptWithNoChangedTextDiscardUncontrolled = DEFAULT_encryptWithNoChangedTextFrameTreatment;1011p_FmMacsec->p_FmMacsecDriverParam->untagTreatMode = DEFAULT_untagFrameTreatment;1012p_FmMacsec->p_FmMacsecDriverParam->keysUnreadable = DEFAULT_keysUnreadable;1013p_FmMacsec->p_FmMacsecDriverParam->reservedSc0 = DEFAULT_sc0ReservedForPTP;1014p_FmMacsec->p_FmMacsecDriverParam->byPassMode = !DEFAULT_normalMode;1015p_FmMacsec->p_FmMacsecDriverParam->pnExhThr = DEFAULT_pnExhThr;1016p_FmMacsec->p_FmMacsecDriverParam->sectagOverhead = DEFAULT_sectagOverhead;1017p_FmMacsec->p_FmMacsecDriverParam->mflSubtract = DEFAULT_mflSubtract;1018/* build the FM MACSEC master IPC address */1019memset(p_FmMacsec->fmMacsecModuleName, 0, (sizeof(char))*MODULE_NAME_SIZE);1020FM_MAC_GetId(p_FmMacsec->h_FmMac,&macId);1021if (Sprint (p_FmMacsec->fmMacsecModuleName, "FM-%d-MAC-%d-MACSEC-Master",1022FmGetId(p_FmMacsec->h_Fm),macId) != 24)1023{1024XX_Free(p_FmMacsec->p_FmMacsecDriverParam);1025XX_Free(p_FmMacsec);1026REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));1027return NULL;1028}1029return p_FmMacsec;1030}103110321033