diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c')
-rw-r--r-- | drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c | 126 |
1 files changed, 66 insertions, 60 deletions
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c index d706ed3..ec6e0ed 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c @@ -1076,6 +1076,38 @@ static uint32_t GetPortSchemeBindParams( return tmp; } +static void FmPortCheckNApplyMacsec(t_Handle h_FmPort) +{ + t_FmPort *p_FmPort = (t_FmPort*)h_FmPort; + volatile uint32_t *p_BmiCfgReg = NULL; + uint32_t macsecEn = BMI_PORT_CFG_EN_MACSEC; + uint32_t lcv, walking1Mask = 0x80000000; + uint8_t cnt = 0; + + ASSERT_COND(p_FmPort); + ASSERT_COND(p_FmPort->h_FmPcd); + ASSERT_COND(!p_FmPort->p_FmPortDriverParam); + + if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) + && (p_FmPort->portType != e_FM_PORT_TYPE_RX)) + return; + + p_BmiCfgReg = &p_FmPort->port.bmi_regs->rx.fmbm_rcfg; + /* get LCV for MACSEC */ + if ((lcv = FmPcdGetMacsecLcv(p_FmPort->h_FmPcd, p_FmPort->netEnvId)) + != 0) + { + while (!(lcv & walking1Mask)) + { + cnt++; + walking1Mask >>= 1; + } + + macsecEn |= (uint32_t)cnt << BMI_PORT_CFG_MS_SEL_SHIFT; + WRITE_UINT32(*p_BmiCfgReg, GET_UINT32(*p_BmiCfgReg) | macsecEn); + } +} + static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams) { t_Error err = E_OK; @@ -1338,7 +1370,7 @@ static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams) ASSERT_COND(p_PcdParams->p_PrsParams); #if (DPAA_VERSION >= 11) if (p_PcdParams->p_PrsParams->firstPrsHdr == HEADER_TYPE_CAPWAP) - hdrNum = OFFLOAD_CAPWAP_SW_PATCH_LABEL; + hdrNum = OFFLOAD_SW_PATCH_CAPWAP_LABEL; else { #endif /* (DPAA_VERSION >= 11) */ @@ -1528,28 +1560,30 @@ static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams) RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG); } - /* Check if ip-reassembly port - need to update NIAs */ + /* Check if ip-reassembly port - need to link sw-parser code */ if (p_FmPort->h_IpReassemblyManip) { - /* link to sw parser code for IP Frag - only if no other code is applied. */ + /* link to sw parser code for IP Frag - only if no other code is applied. */ hdrNum = GetPrsHdrNum(HEADER_TYPE_IPv4); if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN)) - tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN - | OFFLOAD_SW_PATCH_IPv4_LABEL); - } - - if ((p_FmPort->h_IpReassemblyManip) - || (FmPcdNetEnvIsHdrExist(p_FmPort->h_FmPcd, p_FmPort->netEnvId, - HEADER_TYPE_UDP_LITE)) - || (FmPcdIsAdvancedOffloadSupported(p_FmPort->h_FmPcd) - && (p_FmPort->portType - == e_FM_PORT_TYPE_OH_OFFLINE_PARSING))) - { + tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | OFFLOAD_SW_PATCH_IPv4_IPR_LABEL); hdrNum = GetPrsHdrNum(HEADER_TYPE_IPv6); if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN)) - tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN - | OFFLOAD_SW_PATCH_IPv6_LABEL); - } + tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | OFFLOAD_SW_PATCH_IPv6_IPR_LABEL); + } else { + if (FmPcdNetEnvIsHdrExist(p_FmPort->h_FmPcd, p_FmPort->netEnvId, HEADER_TYPE_UDP_LITE)) + { + hdrNum = GetPrsHdrNum(HEADER_TYPE_IPv6); + if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN)) + tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | OFFLOAD_SW_PATCH_IPv6_IPF_LABEL); + } else if ((FmPcdIsAdvancedOffloadSupported(p_FmPort->h_FmPcd) + && (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING))) + { + hdrNum = GetPrsHdrNum(HEADER_TYPE_IPv6); + if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN)) + tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | OFFLOAD_SW_PATCH_IPv6_IPF_LABEL); + } + } #if ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT)) if (FmPcdNetEnvIsHdrExist(p_FmPort->h_FmPcd, p_FmPort->netEnvId, @@ -1600,7 +1634,7 @@ static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams) { hdrNum = GetPrsHdrNum(HEADER_TYPE_IPv6); WRITE_UINT32(p_FmPort->p_FmPortPrsRegs->hdrs[hdrNum].softSeqAttach, - (PRS_HDR_SW_PRS_EN | OFFLOAD_SW_PATCH_IPv6_LABEL)); + (PRS_HDR_SW_PRS_EN | OFFLOAD_SW_PATCH_IPv6_IPF_LABEL)); } WRITE_UINT32(*p_BmiPrsStartOffset, 0); @@ -1608,6 +1642,8 @@ static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams) p_FmPort->privateInfo = 0; } + FmPortCheckNApplyMacsec(p_FmPort); + WRITE_UINT32( *p_BmiPrsStartOffset, GET_UINT32(*p_BmiPrsStartOffset) + p_FmPort->internalBufferOffset); @@ -1849,43 +1885,6 @@ static t_Error DetachPCD(t_FmPort *p_FmPort) /*****************************************************************************/ /* Inter-module API routines */ /*****************************************************************************/ - -void FmPortSetMacsecLcv(t_Handle h_FmPort) -{ - t_FmPort *p_FmPort = (t_FmPort*)h_FmPort; - volatile uint32_t *p_BmiCfgReg = NULL; - uint32_t macsecEn = BMI_PORT_CFG_EN_MACSEC; - uint32_t lcv, walking1Mask = 0x80000000; - uint8_t cnt = 0; - - SANITY_CHECK_RETURN(p_FmPort, E_INVALID_HANDLE); - SANITY_CHECK_RETURN(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE); - - if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) - && (p_FmPort->portType != e_FM_PORT_TYPE_RX)) - { - REPORT_ERROR(MAJOR, E_INVALID_OPERATION, ("The routine is relevant for Rx ports only")); - return; - } - - p_BmiCfgReg = &p_FmPort->port.bmi_regs->rx.fmbm_rcfg; - /* get LCV for MACSEC */ - if ((p_FmPort->h_FmPcd) - && ((lcv = FmPcdGetMacsecLcv(p_FmPort->h_FmPcd, p_FmPort->netEnvId)) - != 0)) - { - while (!(lcv & walking1Mask)) - { - cnt++; - walking1Mask >>= 1; - } - - macsecEn |= (uint32_t)cnt << BMI_PORT_CFG_MS_SEL_SHIFT; - } - - WRITE_UINT32(*p_BmiCfgReg, GET_UINT32(*p_BmiCfgReg) | macsecEn); -} - void FmPortSetMacsecCmd(t_Handle h_FmPort, uint8_t dfltSci) { t_FmPort *p_FmPort = (t_FmPort*)h_FmPort; @@ -3546,9 +3545,9 @@ t_Error FM_PORT_Disable(t_Handle h_FmPort) { DBG(WARNING, ("%s: BMI or QMI is Busy. Port forced down", p_FmPort->name)); - err = E_OK; } - else if (err != 0) + else + if (err != 0) { RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fman_port_disable")); } @@ -4235,7 +4234,8 @@ uint32_t FM_PORT_GetCounter(t_Handle h_FmPort, e_FmPortCounters counter) queueType = E_FMAN_PORT_DEQ_CONFIRM; break; default: - RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Requested counter is not available")); + REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available")); + return 0; } return fman_port_get_qmi_counter(&p_FmPort->port, queueType); @@ -4316,7 +4316,7 @@ t_Error FM_PORT_ModifyCounter(t_Handle h_FmPort, e_FmPortCounters counter, queueType = E_FMAN_PORT_DEQ_CONFIRM; break; default: - RETURN_ERROR(MINOR, E_INVALID_STATE, + RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Requested counter is not available")); } @@ -4720,7 +4720,8 @@ t_Error FM_PORT_PcdCcModifyTree(t_Handle h_FmPort, t_Handle h_CcTree) volatile uint32_t *p_BmiNia = NULL; uint32_t ccTreePhysOffset; - SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_VALUE); + SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE); + SANITY_CHECK_RETURN_ERROR(h_CcTree, E_INVALID_HANDLE); if (p_FmPort->imEn) RETURN_ERROR(MAJOR, E_INVALID_OPERATION, @@ -4886,6 +4887,7 @@ t_Error FM_PORT_SetPCD(t_Handle h_FmPort, t_FmPortPcdParams *p_PcdParam) t_FmPortGetSetCcParams fmPortGetSetCcParams; SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE); + SANITY_CHECK_RETURN_ERROR(p_PcdParam, E_NULL_POINTER); SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE); if (p_FmPort->imEn) @@ -4907,6 +4909,10 @@ t_Error FM_PORT_SetPCD(t_Handle h_FmPort, t_FmPortPcdParams *p_PcdParam) p_FmPort->h_FmPcd = FmGetPcdHandle(p_FmPort->h_Fm); ASSERT_COND(p_FmPort->h_FmPcd); + if (p_PcdParam->p_CcParams && !p_PcdParam->p_CcParams->h_CcTree) + RETURN_ERROR(MAJOR, E_INVALID_HANDLE, + ("Tree handle must be given if CC is required")); + memcpy(&modifiedPcdParams, p_PcdParam, sizeof(t_FmPortPcdParams)); p_PcdParams = &modifiedPcdParams; if ((p_PcdParams->h_IpReassemblyManip) |