diff options
author | Mandy Lavi <mandy.lavi@freescale.com> | 2015-11-24 05:12:43 (GMT) |
---|---|---|
committer | Mandy Lavi <mandy.lavi@freescale.com> | 2015-11-24 08:21:27 (GMT) |
commit | 976b0aa3b91c922a80efa6bd1c6d670828b05164 (patch) | |
tree | 63b2c8743b97161c07a4a9e37321d8fd2669934b | |
parent | b242e9c35ae998f1f732deff174c4513a5f34ad1 (diff) | |
download | linux-fsl-qoriq-976b0aa3b91c922a80efa6bd1c6d670828b05164.tar.xz |
fmd: PCD: fix offline port blocked by fragmented IPV6
Signed-off-by: Mandy Lavi <mandy.lavi@freescale.com>
20 files changed, 458 insertions, 294 deletions
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/HC/hc.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/HC/hc.c index 633eb3a..774cd3a 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/HC/hc.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/HC/hc.c @@ -51,8 +51,8 @@ #define HC_HCOR_OPCODE_CC 0x3 #define HC_HCOR_OPCODE_CC_AGE_MASK 0x4 #define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT 0x5 -#define HC_HCOR_OPCODE_CC_REASSM_TIMEOUT 0x10 -#define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION 0x11 +#define HC_HCOR_OPCODE_CC_REASSM_TIMEOUT 0x10 +#define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION 0x11 #define HC_HCOR_OPCODE_CC_UPDATE_WITH_AGING 0x13 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT 24 #define HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT 24 @@ -283,7 +283,8 @@ t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams) return NULL; } - err = FM_PORT_ConfigMaxFrameLength(p_FmHc->h_HcPortDev, (uint16_t)sizeof(t_HcFrame)); + err = FM_PORT_ConfigMaxFrameLength(p_FmHc->h_HcPortDev, + (uint16_t)sizeof(t_HcFrame)); if (err != E_OK) { diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/MACSEC/fm_macsec_secy.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/MACSEC/fm_macsec_secy.c index 4d8c6e3..7c72dc9 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/MACSEC/fm_macsec_secy.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/MACSEC/fm_macsec_secy.c @@ -678,31 +678,6 @@ t_Error FM_MACSEC_SECY_RxSaModifyKey(t_Handle h_FmMacsecSecY, t_Handle h_Sc, mac return err; } -#if 0 -t_Handle FM_MACSEC_SECY_CreateTxSc(t_Handle h_FmMacsecSecY, macsecSCI_t sci) -{ - t_FmMacsecSecY *p_FmMacsecSecY = (t_FmMacsecSecY *)h_FmMacsecSecY; - - SANITY_CHECK_RETURN_VALUE(p_FmMacsecSecY, E_INVALID_HANDLE, NULL); - SANITY_CHECK_RETURN_VALUE(p_FmMacsecSecY->h_FmMacsec, E_INVALID_HANDLE, NULL); - SANITY_CHECK_RETURN_VALUE(!p_FmMacsecSecY->p_FmMacsecSecYDriverParam, E_INVALID_STATE, NULL); - - return FmMacsecSecYCreateSc(p_FmMacsecSecY, sci, e_SC_TX); -} - -t_Error FM_MACSEC_SECY_DeleteTxSc(t_Handle h_FmMacsecSecY, t_Handle h_Sc) -{ - t_FmMacsecSecY *p_FmMacsecSecY = (t_FmMacsecSecY *)h_FmMacsecSecY; - t_SecYSc *p_FmSecYSc = (t_SecYSc *)h_Sc; - - SANITY_CHECK_RETURN_ERROR(p_FmMacsecSecY, E_INVALID_HANDLE); - SANITY_CHECK_RETURN_ERROR(p_FmMacsecSecY->h_FmMacsec, E_INVALID_HANDLE); - SANITY_CHECK_RETURN_ERROR(!p_FmMacsecSecY->p_FmMacsecSecYDriverParam, E_INVALID_STATE); - SANITY_CHECK_RETURN_ERROR(p_FmSecYSc, E_INVALID_HANDLE); - - return FmMacsecSecYDeleteSc(p_FmMacsecSecY, p_FmSecYSc, e_SC_TX); -} -#endif /* 0 */ t_Error FM_MACSEC_SECY_CreateTxSa(t_Handle h_FmMacsecSecY, macsecAN_t an, macsecSAKey_t key) { diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c index f7be4d9..e980320 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c @@ -289,6 +289,9 @@ static t_Error CalculateTableSize(t_FmPcdManipParams *p_FmPcdManipParams, dataSize += 2; } break; + case (e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE): + tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE; + break; default: RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown customParams.type")); @@ -627,6 +630,8 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip, ((p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size << HMCD_IP_SIZE_SHIFT) & HMCD_IP_SIZE_MASK); + if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.dontFragOverwrite) + tmpReg |= HMCD_IP_DF_MODE; WRITE_UINT32(*p_TmpHmct, tmpReg); @@ -645,6 +650,8 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip, (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase))); p_TmpData += 2; p_TmpHmct += HMCD_PTR_SIZE / 4; + + WRITE_UINT8(*p_TmpHmct, p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.lastDstOffset); p_TmpHmct += HMCD_PARAM_SIZE / 4; Mem2IOCpy32( @@ -1007,18 +1014,42 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip, } p_TmpHmct += HMCD_PTR_SIZE / 4; break; + case (e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE): + /* set opcode */ + tmpReg = (uint32_t)(HMCD_OPCODE_GEN_FIELD_REPLACE) << HMCD_OC_SHIFT; + tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.size << HMCD_GEN_FIELD_SIZE_SHIFT; + tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset << HMCD_GEN_FIELD_SRC_OFF_SHIFT; + tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.dstOffset << HMCD_GEN_FIELD_DST_OFF_SHIFT; + if (p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask) + tmpReg |= HMCD_GEN_FIELD_MASK_EN; + + /* write the first 4 bytes of the descriptor */ + WRITE_UINT32(*p_TmpHmct, tmpReg); + /* save a pointer to the "last" indication word */ + p_Last = p_TmpHmct; + + p_TmpHmct += HMCD_BASIC_SIZE/4; + + if (p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask) + { + tmpReg = p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask << HMCD_GEN_FIELD_MASK_SHIFT; + tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.maskOffset << HMCD_GEN_FIELD_MASK_OFF_SHIFT; + /* write the next 4 bytes of the descriptor */ + WRITE_UINT32(*p_TmpHmct, tmpReg); + } + p_TmpHmct += HMCD_PARAM_SIZE/4; + break; default: RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown customParams.type")); } } - /* If this node has a nextManip, and no parsing is required, the old table must be copied to the new table - the old table and should be freed */ - if (p_FmPcdManipParams->h_NextManip && - (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && - (MANIP_DONT_REPARSE(p_Manip))) + the old table and should be freed */ + if (p_FmPcdManipParams->h_NextManip + && (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) + && (MANIP_DONT_REPARSE(p_Manip))) { if (new) { @@ -1028,7 +1059,6 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip, MANIP_UPDATE_UNIFIED_POSITION(p_FmPcdManipParams->h_NextManip); p_Manip->unifiedPosition = e_MANIP_UNIFIED_FIRST; - } } else @@ -1060,7 +1090,8 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, p_Manip->nextManipType = MANIP_GET_TYPE(p_FmPcdManipParams->h_NextManip); if ((p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && p_Manip->dontParseAfterManip) - nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip) + GetDataSize(p_FmPcdManipParams->h_NextManip)); + nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip) + + GetDataSize(p_FmPcdManipParams->h_NextManip)); else /* either parsing is required or next manip is Frag; no table merging. */ p_Manip->cascaded = TRUE; /* pass up the "cascaded" attribute. The whole chain is cascaded @@ -1157,11 +1188,12 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, } /* Build HMTD (table descriptor) */ - tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */ + tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */ + + /* add parseAfterManip */ + if (!p_Manip->dontParseAfterManip) + tmpReg |= HMTD_CFG_PRS_AFTER_HM; - /* add parseAfterManip */ - if (!p_Manip->dontParseAfterManip) - tmpReg |= HMTD_CFG_PRS_AFTER_HM; /* create cascade */ /*if (p_FmPcdManipParams->h_NextManip && (!MANIP_DONT_REPARSE(p_Manip) || (p_Manip->nextManipType != e_FM_PCD_MANIP_HDR)))*/ @@ -1201,7 +1233,6 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL; } - return E_OK; } @@ -2634,7 +2665,10 @@ static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, != e_FM_PCD_MANIP_HDR) && (MANIP_GET_TYPE(p_ManipParams->h_NextManip) != e_FM_PCD_MANIP_FRAG)) - RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation or Fragmentation.")); + RETURN_ERROR( + MAJOR, + E_NOT_SUPPORTED, + ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation or Fragmentation.")); } if (p_ManipParams->u.hdr.rmv) @@ -2782,6 +2816,34 @@ static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, else if (p_ManipParams->u.hdr.custom) { + if (p_ManipParams->u.hdr.customParams.type == e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE) + { + + if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.size == 0) || + (p_ManipParams->u.hdr.customParams.u.genFieldReplace.size > 8)) + RETURN_ERROR( + MAJOR, E_INVALID_VALUE, + ("size should get values of 1-8 ")); + + if (p_ManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset > 7) + RETURN_ERROR( + MAJOR, E_INVALID_VALUE, + ("srcOffset should be <= 7")); + + if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset + + p_ManipParams->u.hdr.customParams.u.genFieldReplace.size) > 8) + RETURN_ERROR( + MAJOR, E_INVALID_VALUE, + ("(srcOffset + size) should be <= 8")); + + if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.dstOffset + + p_ManipParams->u.hdr.customParams.u.genFieldReplace.size) > 256) + RETURN_ERROR( + MAJOR, E_INVALID_VALUE, + ("(dstOffset + size) should be <= 256")); + + } + p_Manip->opcode = HMAN_OC; p_Manip->muramAllocate = TRUE; p_Manip->custom = TRUE; @@ -3964,6 +4026,7 @@ static t_Error IPSecManip(t_FmPcdManipParams *p_ManipParams, t_FmPcdManipSpecialOffloadIPSecParams *p_IPSecParams; t_Error err = E_OK; uint32_t tmpReg32 = 0; + uint32_t power; SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE); SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE); @@ -3979,6 +4042,13 @@ static t_Error IPSecManip(t_FmPcdManipParams *p_ManipParams, SANITY_CHECK_RETURN_ERROR( !p_IPSecParams->variableIpVersion || p_IPSecParams->outerIPHdrLen, E_INVALID_VALUE); + SANITY_CHECK_RETURN_ERROR( + !p_IPSecParams->arwSize || p_IPSecParams->arwAddr, + E_INVALID_VALUE); + SANITY_CHECK_RETURN_ERROR( + !p_IPSecParams->arwSize || p_IPSecParams->decryption, + E_INVALID_VALUE); + SANITY_CHECK_RETURN_ERROR((p_IPSecParams->arwSize % 16) == 0, E_INVALID_VALUE); p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad; @@ -3990,19 +4060,30 @@ static t_Error IPSecManip(t_FmPcdManipParams *p_ManipParams, (p_IPSecParams->variableIpHdrLen) ? FM_PCD_MANIP_IPSEC_VIPL_EN : 0; tmpReg32 |= (p_IPSecParams->variableIpVersion) ? FM_PCD_MANIP_IPSEC_VIPV_EN : 0; + if (p_IPSecParams->arwSize) + tmpReg32 |= (uint32_t)((XX_VirtToPhys(UINT_TO_PTR(p_IPSecParams->arwAddr))-FM_MM_MURAM) + & (FM_MURAM_SIZE-1)); WRITE_UINT32(p_Ad->ccAdBase, tmpReg32); + tmpReg32 = 0; + if (p_IPSecParams->arwSize) { + NEXT_POWER_OF_2((p_IPSecParams->arwSize + 32), power); + LOG2(power, power); + tmpReg32 = (p_IPSecParams->arwSize | (power - 5)) << FM_PCD_MANIP_IPSEC_ARW_SIZE_SHIFT; + } + + if (p_ManipParams->h_NextManip) + tmpReg32 |= + (uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)- + (((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4; + WRITE_UINT32(p_Ad->matchTblPtr, tmpReg32); + tmpReg32 = HMAN_OC_IPSEC_MANIP; tmpReg32 |= p_IPSecParams->outerIPHdrLen << FM_PCD_MANIP_IPSEC_IP_HDR_LEN_SHIFT; if (p_ManipParams->h_NextManip) - { - WRITE_UINT32( - p_Ad->matchTblPtr, - (uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)- (((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4); - tmpReg32 |= FM_PCD_MANIP_IPSEC_NADEN; - }WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32); + WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32); return err; } @@ -4696,7 +4777,7 @@ t_Error FmPcdManipCheckParamsForCcNextEngine( p_Manip->ownerTmp++; break; case (HMAN_OC): - if (( p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC) + if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC) && MANIP_IS_CASCADED(p_Manip)) RETURN_ERROR( MINOR, diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h index b85d861..ebafd63 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h @@ -160,6 +160,9 @@ #define FM_PCD_MANIP_IPSEC_IP_HDR_LEN_MASK 0x00FF0000 #define FM_PCD_MANIP_IPSEC_IP_HDR_LEN_SHIFT 16 +#define FM_PCD_MANIP_IPSEC_ARW_SIZE_MASK 0xFFFF0000 +#define FM_PCD_MANIP_IPSEC_ARW_SIZE_SHIFT 16 + #define e_FM_MANIP_IP_INDX 1 #define HMCD_OPCODE_GENERIC_RMV 0x01 @@ -178,6 +181,7 @@ #define HMCD_OPCODE_IP_INSRT 0x17 #define HMCD_OPCODE_CAPWAP_RMV 0x18 #define HMCD_OPCODE_CAPWAP_INSRT 0x18 +#define HMCD_OPCODE_GEN_FIELD_REPLACE 0x19 #define HMCD_LAST 0x00800000 @@ -198,6 +202,7 @@ #define HMCD_IP_LAST_PID_MASK 0x000000FF #define HMCD_IP_OR_QOS 0x00010000 #define HMCD_IP_L4_CS_CALC 0x00040000 +#define HMCD_IP_DF_MODE 0x00400000 #define HMCD_OC_SHIFT 24 @@ -252,6 +257,14 @@ #define HMCD_IP_REPLACE_L3HDRSIZE_SHIFT 24 +#define HMCD_GEN_FIELD_SIZE_SHIFT 16 +#define HMCD_GEN_FIELD_SRC_OFF_SHIFT 8 +#define HMCD_GEN_FIELD_DST_OFF_SHIFT 0 +#define HMCD_GEN_FIELD_MASK_EN 0x00400000 + +#define HMCD_GEN_FIELD_MASK_OFF_SHIFT 16 +#define HMCD_GEN_FIELD_MASK_SHIFT 24 + #define DSCP_TO_VLAN_TABLE_SIZE 32 #define MANIP_GET_HMCT_SIZE(h_Manip) (((t_FmPcdManip *)h_Manip)->tableSize) diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_prs.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_prs.h index 0185717..056f225 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_prs.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_prs.h @@ -134,120 +134,160 @@ } #else -/* version: 106.3.13 */ #define SW_PRS_OFFLOAD_PATCH \ { \ - 0x31,0x52,0x00,0xDA,0x0E,0x4F,0x00,0x00,0x00,0x00, \ - 0x00,0x00,0x51,0xE6,0x08,0x4B,0x31,0x53,0x00,0xFB, \ - 0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x2B, \ - 0x33,0xF1,0x00,0xFB,0x00,0xDF,0x00,0x00,0x00,0x00, \ - 0x00,0x00,0x28,0x7F,0x31,0x52,0x00,0xDA,0x0A,0x00, \ - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xF0,0x00,0x00, \ - 0x00,0x01,0x1B,0xFE,0x00,0x00,0x99,0x00,0x51,0xF9, \ - 0x00,0x00,0x00,0x00,0x9F,0x98,0x51,0xF9,0x00,0x00, \ - 0x1A,0x14,0x09,0x5F,0x00,0x20,0x00,0x00,0x09,0x4F, \ - 0x00,0x20,0x00,0x00,0x34,0xB7,0x00,0xF9,0x00,0x00, \ - 0x01,0x00,0x00,0x00,0x00,0x00,0x2B,0x97,0x31,0xB3, \ - 0x29,0x8F,0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00, \ - 0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02, \ - 0x00,0x00,0x00,0x01,0x1B,0xFE,0x00,0x01,0x1B,0xFE, \ - 0x31,0x52,0x00,0xDA,0xFC,0x00,0x00,0x00,0x00,0x00, \ - 0x00,0x00,0x52,0x22,0x40,0x00,0x31,0x92,0x52,0x22, \ - 0x00,0x88,0x1A,0x25,0x08,0x05,0x00,0x00,0x1A,0x69, \ - 0x02,0x1F,0x00,0x08,0x00,0x83,0x02,0x1F,0x00,0x20, \ - 0x28,0x1B,0x00,0x05,0x29,0x1F,0x30,0xD0,0x62,0x45, \ - 0x00,0x07,0x00,0x05,0x00,0x00,0xC3,0x8F,0x00,0x52, \ - 0x00,0x01,0x07,0x01,0x62,0x31,0x00,0x00,0x30,0xD0, \ - 0x00,0xDA,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, \ - 0x42,0x42,0x00,0x00,0x02,0x8F,0x00,0x00,0x30,0xF2, \ - 0x00,0x06,0x1A,0x53,0x00,0x00,0x9F,0xFF,0x30,0xF2, \ - 0x00,0x06,0x29,0x1E,0x07,0x08,0x30,0xD0,0x00,0x52, \ - 0x00,0x08,0x28,0x1A,0x62,0x2D,0x00,0x00,0x30,0xF2, \ - 0x1A,0x53,0x06,0x00,0x29,0x1E,0x30,0xF2,0x29,0x0E, \ - 0x30,0x72,0x00,0x00,0x9B,0x8F,0x00,0x06,0x29,0x0E, \ - 0x32,0xF1,0x32,0xB0,0x00,0x4F,0x00,0x57,0x00,0x28, \ - 0x00,0x00,0x97,0x9E,0x00,0x4E,0x30,0x72,0x00,0x06, \ - 0x29,0x0E,0x08,0x05,0x00,0x01,0x31,0x52,0x00,0xDA, \ - 0x0E,0x4F,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x7F, \ - 0x04,0x4B,0x31,0x53,0x00,0xFB,0xFF,0xF0,0x00,0x00, \ - 0x00,0x00,0x00,0x00,0x29,0x2B,0x33,0xF1,0x00,0xFB, \ - 0x00,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7F, \ - 0x31,0x52,0x00,0xDA,0x06,0x00,0x00,0x00,0x00,0x00, \ - 0x00,0x00,0x42,0x89,0x00,0x00,0x00,0x01,0x1B,0xFE, \ - 0x31,0x52,0x00,0xDA,0x00,0x40,0x00,0x00,0x00,0x00, \ - 0x00,0x00,0x52,0xED,0x00,0x00,0x00,0x00,0x9B,0x8F, \ - 0x28,0x01,0x32,0xC1,0x00,0x55,0x00,0x28,0x28,0x43, \ - 0x30,0x00,0x42,0x9F,0x00,0x00,0x30,0x00,0x42,0x9F, \ - 0x00,0x3C,0x1A,0xB7,0x32,0x11,0x32,0xC0,0x00,0x4F, \ - 0x00,0x81,0x00,0x00,0x83,0x8F,0x28,0x01,0x06,0x00, \ - 0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01, \ - 0x00,0x81,0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50, \ - 0x00,0x01,0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00, \ - 0x1A,0x98,0x30,0x00,0x42,0xD5,0x00,0x2B,0x00,0x00, \ - 0x9B,0x8E,0x42,0xC3,0x00,0x00,0x32,0xC1,0x00,0x55, \ - 0x00,0x28,0x28,0x43,0x1A,0xD4,0x06,0x29,0x00,0x00, \ - 0x83,0x8F,0x28,0x23,0x06,0x00,0x06,0x29,0x32,0xC1, \ - 0x00,0x55,0x00,0x28,0x00,0x00,0x83,0x8E,0x00,0x50, \ - 0x00,0x01,0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00, \ - 0x1A,0xEC,0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x81, \ - 0x00,0x00,0x87,0x8F,0x28,0x23,0x06,0x00,0x32,0x11, \ - 0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01,0x00,0x81, \ - 0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50,0x00,0x01, \ - 0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00,0x1B,0x32, \ - 0x00,0x00,0x9B,0x8F,0x28,0x01,0x32,0xC1,0x00,0x55, \ - 0x00,0x28,0x28,0x43,0x30,0x00,0x43,0x17,0x00,0x2C, \ - 0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00, \ - 0x87,0x8F,0x28,0x23,0x06,0x00,0x32,0x11,0x32,0xC0, \ - 0x00,0x4F,0x00,0x81,0x00,0x00,0x83,0x8F,0x28,0x01, \ - 0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x55, \ - 0x00,0x01,0x00,0x81,0x32,0x11,0x00,0x00,0x83,0x8E, \ - 0x00,0x50,0x00,0x01,0x01,0x04,0x00,0x4D,0x28,0x43, \ - 0x06,0x00,0x1A,0xF4,0x09,0x5F,0x00,0x20,0x00,0x00, \ - 0x09,0x4F,0x00,0x20,0x00,0x00,0x34,0xB7,0x00,0xF9, \ - 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x2B,0x97, \ - 0x31,0xB3,0x29,0x8F,0x33,0xF1,0x00,0xF9,0x00,0x01, \ - 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03, \ - 0x00,0x02,0x00,0x00,0x00,0x01,0x1B,0xFE,0x30,0x50, \ - 0x53,0x37,0x00,0x00,0x00,0x01,0x1B,0xFE,0x32,0xF1, \ - 0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x02,0x00,0x00, \ - 0x97,0x9E,0x43,0x44,0x00,0x08,0x08,0x16,0x00,0x54, \ - 0x00,0x01,0x1B,0xFE,0x00,0x00,0x9F,0x9E,0x43,0x79, \ - 0x00,0x00,0x02,0x1F,0x00,0x08,0x28,0x1B,0x30,0x73, \ - 0x29,0x1F,0x30,0xD0,0x63,0x65,0x00,0x07,0x00,0x05, \ - 0x00,0x00,0xC3,0x8F,0x00,0x52,0x00,0x01,0x07,0x01, \ - 0x63,0x51,0x00,0x00,0x30,0xD0,0x00,0xDA,0x00,0x01, \ - 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x62,0x00,0x00, \ - 0x02,0x8F,0x00,0x00,0x30,0xF2,0x00,0x06,0x1B,0x73, \ - 0x00,0x00,0x9F,0xFF,0x30,0xF2,0x00,0x06,0x29,0x1E, \ - 0x07,0x08,0x30,0xD0,0x00,0x52,0x00,0x08,0x28,0x1A, \ - 0x63,0x4D,0x00,0x00,0x30,0xF2,0x1B,0x73,0x06,0x00, \ - 0x29,0x1E,0x30,0xF2,0x53,0x79,0xFF,0xFF,0x1B,0x7E, \ - 0x08,0x16,0x00,0x54,0x00,0x01,0x1B,0xFE,0x1B,0x8B, \ - 0x32,0xF1,0x28,0x5D,0x32,0xF1,0x00,0x55,0x00,0x08, \ - 0x28,0x5F,0x00,0x00,0x8F,0x9F,0x29,0x33,0x08,0x16, \ - 0x00,0x49,0x00,0x01,0x1B,0xFF,0x00,0x01,0x1B,0xFF, \ - 0x08,0x07,0x00,0x02,0x00,0x00,0x8D,0x80,0x53,0x97, \ - 0x00,0x01,0x30,0x71,0x00,0x55,0x00,0x01,0x28,0x0F, \ - 0x00,0x00,0x8D,0x00,0x53,0x9F,0x00,0x01,0x30,0x71, \ - 0x00,0x55,0x00,0x01,0x28,0x0F,0x00,0x00,0x83,0x8E, \ - 0x53,0xB4,0x00,0x00,0x00,0x00,0x86,0x08,0x30,0x71, \ - 0x00,0x7B,0x03,0xB4,0x33,0xB4,0x00,0xDA,0xFF,0xFF, \ - 0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x09, \ - 0x01,0x03,0x00,0x7D,0x03,0xB4,0x1B,0xC3,0x33,0xD1, \ - 0x00,0xF9,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, \ - 0x28,0x7B,0x09,0x5F,0x00,0x1A,0x00,0x00,0x09,0x4F, \ - 0x00,0x1A,0x00,0x00,0x00,0x01,0x1B,0xFF,0x00,0x00, \ - 0x8C,0x00,0x53,0xEB,0x00,0x01,0x34,0xF5,0x00,0xFB, \ - 0xFF,0xFF,0x00,0x7F,0x00,0x00,0x00,0x00,0x2A,0x9F, \ - 0x00,0x00,0x93,0x8F,0x28,0x49,0x00,0x00,0x97,0x8F, \ - 0x28,0x4B,0x34,0x61,0x28,0x4D,0x34,0x71,0x28,0x4F, \ - 0x34,0xB7,0x00,0xF9,0x00,0x00,0x01,0x00,0x00,0x00, \ - 0x00,0x00,0x2B,0x97,0x33,0xF1,0x00,0xF9,0x00,0x01, \ - 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03, \ - 0x00,0x02,0x00,0x00,0x00,0x01,0x1B,0xFF,0x00,0x01, \ - 0x1B,0xFF, \ + 0x31,0x52,0x00,0xDA,0x0E,0x4F,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x51,0x16,0x08,0x4B,0x31,0x53,0x00,0xFB, \ + 0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x2B, \ + 0x33,0xF1,0x00,0xFB,0x00,0xDF,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x28,0x7F,0x31,0x52,0x00,0xDA,0x0A,0x00, \ + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x20,0x00,0x00, \ + 0x00,0x01,0x1B,0xFE,0x00,0x00,0x99,0x00,0x51,0x29, \ + 0x00,0x00,0x00,0x00,0x9F,0x98,0x51,0x29,0x00,0x00, \ + 0x19,0x44,0x09,0x5F,0x00,0x20,0x00,0x00,0x09,0x4F, \ + 0x00,0x20,0x00,0x00,0x34,0xB7,0x00,0xF9,0x00,0x00, \ + 0x01,0x00,0x00,0x00,0x00,0x00,0x2B,0x97,0x31,0xB3, \ + 0x29,0x8F,0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00, \ + 0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02, \ + 0x00,0x00,0x00,0x01,0x1B,0xFE,0x00,0x01,0x1B,0xFE, \ + 0x31,0x52,0x00,0xDA,0xFC,0x00,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x51,0x52,0x40,0x00,0x31,0x92,0x51,0x52, \ + 0x00,0x88,0x19,0x55,0x08,0x05,0x00,0x00,0x19,0x99, \ + 0x02,0x1F,0x00,0x08,0x00,0x83,0x02,0x1F,0x00,0x20, \ + 0x28,0x1B,0x00,0x05,0x29,0x1F,0x30,0xD0,0x61,0x75, \ + 0x00,0x07,0x00,0x05,0x00,0x00,0xC3,0x8F,0x00,0x52, \ + 0x00,0x01,0x07,0x01,0x61,0x61,0x00,0x00,0x30,0xD0, \ + 0x00,0xDA,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, \ + 0x41,0x72,0x00,0x00,0x02,0x8F,0x00,0x00,0x30,0xF2, \ + 0x00,0x06,0x19,0x83,0x00,0x00,0x9F,0xFF,0x30,0xF2, \ + 0x00,0x06,0x29,0x1E,0x07,0x08,0x30,0xD0,0x00,0x52, \ + 0x00,0x08,0x28,0x1A,0x61,0x5D,0x00,0x00,0x30,0xF2, \ + 0x19,0x83,0x06,0x00,0x29,0x1E,0x30,0xF2,0x29,0x0E, \ + 0x30,0x72,0x00,0x00,0x9B,0x8F,0x00,0x06,0x29,0x0E, \ + 0x32,0xF1,0x32,0xB0,0x00,0x4F,0x00,0x57,0x00,0x28, \ + 0x00,0x00,0x97,0x9E,0x00,0x4E,0x30,0x72,0x00,0x06, \ + 0x29,0x0E,0x08,0x05,0x00,0x01,0x31,0x52,0x00,0xDA, \ + 0x0E,0x4F,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0xAF, \ + 0x04,0x4B,0x31,0x53,0x00,0xFB,0xFF,0xF0,0x00,0x00, \ + 0x00,0x00,0x00,0x00,0x29,0x2B,0x33,0xF1,0x00,0xFB, \ + 0x00,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7F, \ + 0x31,0x52,0x00,0xDA,0x06,0x00,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x01,0x1B,0xFE, \ + 0x31,0x52,0x00,0xDA,0x00,0x40,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x9B,0x8F, \ + 0x28,0x01,0x32,0xC1,0x00,0x55,0x00,0x28,0x28,0x43, \ + 0x30,0x00,0x41,0xEB,0x00,0x2C,0x32,0x11,0x32,0xC0, \ + 0x00,0x4F,0x00,0x81,0x00,0x00,0x87,0x8F,0x28,0x23, \ + 0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x81, \ + 0x00,0x00,0x83,0x8F,0x28,0x01,0x06,0x00,0x32,0x11, \ + 0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01,0x00,0x81, \ + 0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50,0x00,0x01, \ + 0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00,0x19,0xC8, \ + 0x09,0x5F,0x00,0x20,0x00,0x00,0x09,0x4F,0x00,0x20, \ + 0x00,0x00,0x34,0xB7,0x00,0xF9,0x00,0x00,0x01,0x00, \ + 0x00,0x00,0x00,0x00,0x2B,0x97,0x31,0xB3,0x29,0x8F, \ + 0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02,0x00,0x00, \ + 0x00,0x01,0x1B,0xFE,0x30,0x50,0x52,0x0B,0x00,0x00, \ + 0x00,0x01,0x1B,0xFE,0x32,0xF1,0x32,0xC0,0x00,0x4F, \ + 0x00,0x81,0x00,0x02,0x00,0x00,0x97,0x9E,0x42,0x18, \ + 0x00,0x08,0x08,0x16,0x00,0x54,0x00,0x01,0x1B,0xFE, \ + 0x00,0x00,0x9F,0x9E,0x42,0x4D,0x00,0x00,0x02,0x1F, \ + 0x00,0x08,0x28,0x1B,0x30,0x73,0x29,0x1F,0x30,0xD0, \ + 0x62,0x39,0x00,0x07,0x00,0x05,0x00,0x00,0xC3,0x8F, \ + 0x00,0x52,0x00,0x01,0x07,0x01,0x62,0x25,0x00,0x00, \ + 0x30,0xD0,0x00,0xDA,0x00,0x01,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x42,0x36,0x00,0x00,0x02,0x8F,0x00,0x00, \ + 0x30,0xF2,0x00,0x06,0x1A,0x47,0x00,0x00,0x9F,0xFF, \ + 0x30,0xF2,0x00,0x06,0x29,0x1E,0x07,0x08,0x30,0xD0, \ + 0x00,0x52,0x00,0x08,0x28,0x1A,0x62,0x21,0x00,0x00, \ + 0x30,0xF2,0x1A,0x47,0x06,0x00,0x29,0x1E,0x30,0xF2, \ + 0x52,0x4D,0xFF,0xFF,0x1A,0x52,0x08,0x16,0x00,0x54, \ + 0x00,0x01,0x1B,0xFE,0x1A,0x5F,0x32,0xF1,0x28,0x5D, \ + 0x32,0xF1,0x00,0x55,0x00,0x08,0x28,0x5F,0x00,0x00, \ + 0x8F,0x9F,0x29,0x33,0x08,0x16,0x00,0x49,0x00,0x01, \ + 0x1B,0xFF,0x00,0x01,0x1B,0xFF,0x31,0x52,0x00,0xDA, \ + 0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x6D, \ + 0x40,0x00,0x31,0x92,0x52,0x6D,0x00,0x88,0x1A,0x70, \ + 0x08,0x05,0x00,0x00,0x1A,0xB4,0x02,0x1F,0x00,0x08, \ + 0x00,0x83,0x02,0x1F,0x00,0x20,0x28,0x1B,0x00,0x05, \ + 0x29,0x1F,0x30,0xD0,0x62,0x90,0x00,0x07,0x00,0x05, \ + 0x00,0x00,0xC3,0x8F,0x00,0x52,0x00,0x01,0x07,0x01, \ + 0x62,0x7C,0x00,0x00,0x30,0xD0,0x00,0xDA,0x00,0x01, \ + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x8D,0x00,0x00, \ + 0x02,0x8F,0x00,0x00,0x30,0xF2,0x00,0x06,0x1A,0x9E, \ + 0x00,0x00,0x9F,0xFF,0x30,0xF2,0x00,0x06,0x29,0x1E, \ + 0x07,0x08,0x30,0xD0,0x00,0x52,0x00,0x08,0x28,0x1A, \ + 0x62,0x78,0x00,0x00,0x30,0xF2,0x1A,0x9E,0x06,0x00, \ + 0x29,0x1E,0x30,0xF2,0x29,0x0E,0x30,0x72,0x00,0x00, \ + 0x9B,0x8F,0x00,0x06,0x29,0x0E,0x32,0xF1,0x32,0xB0, \ + 0x00,0x4F,0x00,0x57,0x00,0x28,0x00,0x00,0x97,0x9E, \ + 0x00,0x4E,0x30,0x72,0x00,0x06,0x29,0x0E,0x08,0x05, \ + 0x00,0x01,0x31,0x52,0x00,0xDA,0x0E,0x4F,0x00,0x00, \ + 0x00,0x00,0x00,0x00,0x52,0xCA,0x04,0x4B,0x31,0x53, \ + 0x00,0xFB,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, \ + 0x29,0x2B,0x33,0xF1,0x00,0xFB,0x00,0xDF,0x00,0x00, \ + 0x00,0x00,0x00,0x00,0x28,0x7F,0x31,0x52,0x00,0xDA, \ + 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xD4, \ + 0x00,0x00,0x00,0x01,0x1B,0xFE,0x31,0x52,0x00,0xDA, \ + 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x37, \ + 0x00,0x00,0x00,0x00,0x9B,0x8F,0x28,0x01,0x32,0xC1, \ + 0x00,0x55,0x00,0x28,0x28,0x43,0x30,0x00,0x42,0xEA, \ + 0x00,0x00,0x30,0x00,0x42,0xEA,0x00,0x3C,0x1B,0x02, \ + 0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00, \ + 0x83,0x8F,0x28,0x01,0x06,0x00,0x32,0x11,0x32,0xC0, \ + 0x00,0x4F,0x00,0x55,0x00,0x01,0x00,0x81,0x32,0x11, \ + 0x00,0x00,0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04, \ + 0x00,0x4D,0x28,0x43,0x06,0x00,0x1A,0xE3,0x30,0x00, \ + 0x43,0x20,0x00,0x2B,0x00,0x00,0x9B,0x8E,0x43,0x0E, \ + 0x00,0x00,0x32,0xC1,0x00,0x55,0x00,0x28,0x28,0x43, \ + 0x1B,0x1F,0x06,0x29,0x00,0x00,0x83,0x8F,0x28,0x23, \ + 0x06,0x00,0x06,0x29,0x32,0xC1,0x00,0x55,0x00,0x28, \ + 0x00,0x00,0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04, \ + 0x00,0x4D,0x28,0x43,0x06,0x00,0x1B,0x37,0x32,0x11, \ + 0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00,0x87,0x8F, \ + 0x28,0x23,0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F, \ + 0x00,0x55,0x00,0x01,0x00,0x81,0x32,0x11,0x00,0x00, \ + 0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04,0x00,0x4D, \ + 0x28,0x43,0x06,0x00,0x30,0x50,0x53,0x3C,0x00,0x00, \ + 0x00,0x01,0x1B,0xFE,0x32,0xF1,0x32,0xC0,0x00,0x4F, \ + 0x00,0x81,0x00,0x02,0x00,0x00,0x97,0x9E,0x43,0x49, \ + 0x00,0x08,0x08,0x16,0x00,0x54,0x00,0x01,0x1B,0xFE, \ + 0x00,0x00,0x9F,0x9E,0x43,0x7E,0x00,0x00,0x02,0x1F, \ + 0x00,0x08,0x28,0x1B,0x30,0x73,0x29,0x1F,0x30,0xD0, \ + 0x63,0x6A,0x00,0x07,0x00,0x05,0x00,0x00,0xC3,0x8F, \ + 0x00,0x52,0x00,0x01,0x07,0x01,0x63,0x56,0x00,0x00, \ + 0x30,0xD0,0x00,0xDA,0x00,0x01,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x43,0x67,0x00,0x00,0x02,0x8F,0x00,0x00, \ + 0x30,0xF2,0x00,0x06,0x1B,0x78,0x00,0x00,0x9F,0xFF, \ + 0x30,0xF2,0x00,0x06,0x29,0x1E,0x07,0x08,0x30,0xD0, \ + 0x00,0x52,0x00,0x08,0x28,0x1A,0x63,0x52,0x00,0x00, \ + 0x30,0xF2,0x1B,0x78,0x06,0x00,0x29,0x1E,0x30,0xF2, \ + 0x53,0x7E,0xFF,0xFF,0x1B,0x83,0x08,0x16,0x00,0x54, \ + 0x00,0x01,0x1B,0xFE,0x1B,0x90,0x32,0xF1,0x28,0x5D, \ + 0x32,0xF1,0x00,0x55,0x00,0x08,0x28,0x5F,0x00,0x00, \ + 0x8F,0x9F,0x29,0x33,0x08,0x16,0x00,0x49,0x00,0x01, \ + 0x1B,0xFF,0x00,0x01,0x1B,0xFF,0x08,0x07,0x00,0x02, \ + 0x00,0x00,0x8D,0x80,0x53,0x9C,0x00,0x01,0x30,0x71, \ + 0x00,0x55,0x00,0x01,0x28,0x0F,0x00,0x00,0x8D,0x00, \ + 0x53,0xA4,0x00,0x01,0x30,0x71,0x00,0x55,0x00,0x01, \ + 0x28,0x0F,0x00,0x00,0x83,0x8E,0x53,0xB9,0x00,0x00, \ + 0x00,0x00,0x86,0x08,0x30,0x71,0x00,0x7B,0x03,0xB9, \ + 0x33,0xB4,0x00,0xDA,0xFF,0xFF,0x00,0x0F,0x00,0x00, \ + 0x00,0x00,0x00,0x00,0x86,0x09,0x01,0x03,0x00,0x7D, \ + 0x03,0xB9,0x1B,0xC8,0x33,0xD1,0x00,0xF9,0x00,0x10, \ + 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7B,0x09,0x5F, \ + 0x00,0x1A,0x00,0x00,0x09,0x4F,0x00,0x1A,0x00,0x00, \ + 0x00,0x01,0x1B,0xFF,0x00,0x00,0x8C,0x00,0x53,0xF0, \ + 0x00,0x01,0x34,0xF5,0x00,0xFB,0xFF,0xFF,0x00,0x7F, \ + 0x00,0x00,0x00,0x00,0x2A,0x9F,0x00,0x00,0x93,0x8F, \ + 0x28,0x49,0x00,0x00,0x97,0x8F,0x28,0x4B,0x34,0x61, \ + 0x28,0x4D,0x34,0x71,0x28,0x4F,0x34,0xB7,0x00,0xF9, \ + 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x2B,0x97, \ + 0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00,0x00,0x00, \ + 0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02,0x00,0x00, \ + 0x00,0x01,0x1B,0xFF,0x00,0x01,0x1B,0xFF, \ } - #endif /* (DPAA_VERSION == 10) */ /****************************/ 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) diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.h index bd06b9b..85986f5 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.h @@ -214,20 +214,23 @@ typedef uint32_t fmPcdEngines_t; /**< options as defined below: */ /* SW parser OFFLOAD labels (offsets) */ /***********************************************************************/ #if (DPAA_VERSION == 10) -#define OFFLOAD_SW_PATCH_IPv4_SIZE 0x025 -#define OFFLOAD_SW_PATCH_IPv4_LABEL 0x300 +#define OFFLOAD_SW_PATCH_IPv4_IPR_LABEL 0x300 +#define OFFLOAD_SW_PATCH_IPv6_IPR_LABEL 0x325 +#define OFFLOAD_SW_PATCH_IPv6_IPF_LABEL 0x325 #else -#define OFFLOAD_SW_PATCH_IPv4_SIZE 0x046 -#define OFFLOAD_SW_PATCH_IPv4_LABEL 0x1D0 -#define OFFLOAD_CAPWAP_SW_PATCH_LABEL 0x38d -#endif /* (DPAA_VERSION == 10) */ +#define OFFLOAD_SW_PATCH_IPv4_IPR_LABEL 0x100 /* Will be used for: * 1. identify fragments - * 2. if no fragment, will identify the fragmentable are - * 3. udp-lite + * 2. udp-lite + */ +#define OFFLOAD_SW_PATCH_IPv6_IPR_LABEL 0x146 +/* Will be used for: + * 1. will identify the fragmentable area + * 2. udp-lite */ -#define OFFLOAD_SW_PATCH_IPv6_LABEL \ - (OFFLOAD_SW_PATCH_IPv4_LABEL + OFFLOAD_SW_PATCH_IPv4_SIZE) +#define OFFLOAD_SW_PATCH_IPv6_IPF_LABEL 0x261 +#define OFFLOAD_SW_PATCH_CAPWAP_LABEL 0x38d +#endif /* (DPAA_VERSION == 10) */ #if ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT)) #define UDP_LITE_SW_PATCH_LABEL 0x2E0 @@ -429,7 +432,7 @@ typedef struct volatile uint32_t reserved0[4]; /**< 0xn00C - 0xn01B */ volatile uint32_t fmqm_pnen; /**< PortID n Enqueue NIA Register */ volatile uint32_t fmqm_pnetfc; /**< PortID n Enqueue Total Frame Counter */ - t_FmPortNonRxQmiRegs nonRxQmiRegs; /**< Registers for Tx Hc & Op ports */ + t_FmPortNonRxQmiRegs nonRxQmiRegs; /**< Registers for Tx Hc & Op ports */ } t_FmPortQmiRegs; typedef struct @@ -439,7 +442,7 @@ typedef struct volatile uint32_t softSeqAttach; /**< Soft Sequence Attachment */ volatile uint32_t lcv; /**< Line-up Enable Confirmation Mask */ } hdrs[FM_PCD_PRS_NUM_OF_HDRS]; - volatile uint8_t reserved0[0x378]; + volatile uint32_t reserved0[0xde]; volatile uint32_t pcac; /**< Parse Internal Memory Configuration Access Control Register */ volatile uint32_t pctpid; /**< Parse Internal Memory Configured TPID Register */ } t_FmPortPrsRegs; diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c index a1083a0..7b9f084 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c @@ -1288,6 +1288,7 @@ t_Error FmSetCongestionGroupPFCpriority(t_Handle h_Fm, uint8_t priorityBitMap) { t_Fm *p_Fm = (t_Fm *)h_Fm; + uint32_t regNum; ASSERT_COND(h_Fm); @@ -1299,9 +1300,11 @@ t_Error FmSetCongestionGroupPFCpriority(t_Handle h_Fm, if (p_Fm->guestId == NCSW_MASTER_ID) { ASSERT_COND(p_Fm->baseAddr); + regNum = (FM_PORT_NUM_OF_CONGESTION_GRPS - 1 - congestionGroupId) / 4; fman_set_congestion_group_pfc_priority((uint32_t *)((p_Fm->baseAddr+FM_MM_CGP)), congestionGroupId, - priorityBitMap); + priorityBitMap, + regNum); } else if (p_Fm->h_IpcSessions[0]) { @@ -2498,10 +2501,15 @@ uint32_t FmGetTimeStampScale(t_Handle h_Fm) &replyLength, NULL, NULL)) != E_OK) - RETURN_ERROR(MAJOR, err, NO_MSG); - + { + REPORT_ERROR(MAJOR, err, NO_MSG); + return 0; + } if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) - RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); + { + REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); + return 0; + } memcpy((uint8_t*)&timeStamp, reply.replyBody, sizeof(uint32_t)); return timeStamp; @@ -2510,7 +2518,10 @@ uint32_t FmGetTimeStampScale(t_Handle h_Fm) p_Fm->baseAddr) { if (!(GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_tsc1) & FPM_TS_CTL_EN)) - RETURN_ERROR(MAJOR, E_INVALID_STATE, ("timestamp is not enabled!")); + { + REPORT_ERROR(MAJOR, E_INVALID_STATE, ("timestamp is not enabled!")); + return 0; + } } else if (p_Fm->guestId != NCSW_MASTER_ID) DBG(WARNING, ("No IPC - can't validate FM if timestamp enabled.")); @@ -2632,7 +2643,6 @@ t_Error FmSetSizeOfFifo(t_Handle h_Fm, p_Fm->p_FmStateStruct->extraFifoPoolSize = FM_MAX_NUM_OF_RX_PORTS*BMI_FIFO_UNITS; p_Fm->p_FmStateStruct->extraFifoPoolSize = MAX(p_Fm->p_FmStateStruct->extraFifoPoolSize, extraSizeOfFifo); - } /* check that there are enough uncommitted fifo size */ @@ -2706,7 +2716,6 @@ t_Error FmSetNumOfTasks(t_Handle h_Fm, p_Fm->baseAddr) { DBG(WARNING, ("No IPC - can't validate FM total-num-of-tasks.")); - fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks); } else if (p_Fm->guestId != NCSW_MASTER_ID) @@ -2792,7 +2801,6 @@ t_Error FmSetNumOfOpenDmas(t_Handle h_Fm, #ifdef FM_HAS_TOTAL_DMAS else if (p_Fm->guestId != NCSW_MASTER_ID) RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("running in guest-mode without IPC!")); - #else else if ((p_Fm->guestId != NCSW_MASTER_ID) && p_Fm->baseAddr && @@ -3484,7 +3492,6 @@ t_Error FM_Init(t_Handle h_Fm) p_Fm->p_FmStateStruct->totalFifoSize = DEFAULT_totalFifoSize(p_Fm->p_FmStateStruct->revInfo.majorRev, p_Fm->p_FmStateStruct->revInfo.minorRev); - CHECK_INIT_PARAMETERS(p_Fm, CheckFmParameters); p_FmDriverParam = p_Fm->p_FmDriverParam; @@ -3724,7 +3731,7 @@ t_Error FM_Free(t_Handle h_Fm) } #endif /* (DPAA_VERSION >= 11) */ - if (p_Fm->fmModuleName) + if (p_Fm->fmModuleName[0] != 0) XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName); if (!p_Fm->recoveryMode) @@ -4950,11 +4957,9 @@ t_Error FM_GetSpecialOperationCoding(t_Handle h_Fm, DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision.")); revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER; } - else if (revInfo.packageRev != IP_OFFLOAD_PACKAGE_NUMBER) + else if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev)) RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Fman ctrl code package")); - if (revInfo.packageRev == IP_OFFLOAD_PACKAGE_NUMBER) - { switch (spOper) { case (FM_SP_OP_CAPWAP_DTLS_DEC): @@ -4977,6 +4982,9 @@ t_Error FM_GetSpecialOperationCoding(t_Handle h_Fm, case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN): *p_SpOperCoding = 1; break; + case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_NO_ETH_HDR): + *p_SpOperCoding = 12; + break; case (FM_SP_OP_IPSEC|FM_SP_OP_RPD): *p_SpOperCoding = 4; break; @@ -4992,7 +5000,7 @@ t_Error FM_GetSpecialOperationCoding(t_Handle h_Fm, default: RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG); } - } + return E_OK; } @@ -5084,11 +5092,18 @@ t_Error FM_CtrlMonGetCounters(t_Handle h_Fm, uint8_t fmCtrlIndex, t_FmCtrlMon *p return E_OK; } +t_Handle FM_GetMuramHandle(t_Handle h_Fm) +{ + t_Fm *p_Fm = (t_Fm*)h_Fm; + + SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL); + + return (p_Fm->h_FmMuram); +} /****************************************************/ /* Hidden-DEBUG Only API */ /****************************************************/ - t_Error FM_ForceIntr (t_Handle h_Fm, e_FmExceptions exception) { t_Fm *p_Fm = (t_Fm*)h_Fm; diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.h index 72121f3..fc7662d 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.h @@ -413,24 +413,6 @@ switch (exception){ \ /* @} */ /**************************************************************************//** - @Description Modules registers offsets -*//***************************************************************************/ -#define FM_MM_MURAM 0x00000000 -#define FM_MM_BMI 0x00080000 -#define FM_MM_QMI 0x00080400 -#define FM_MM_PRS 0x000c7000 -#define FM_MM_KG 0x000C1000 -#define FM_MM_DMA 0x000C2000 -#define FM_MM_FPM 0x000C3000 -#define FM_MM_PLCR 0x000C0000 -#define FM_MM_IMEM 0x000C4000 -#define FM_MM_CGP 0x000DB000 -#define FM_MM_TRB(i) (0x000D0200 + 0x400 * (i)) -#if (DPAA_VERSION >= 11) -#define FM_MM_SP 0x000dc000 -#endif /* (DPAA_VERSION >= 11) */ - -/**************************************************************************//** @Description Memory Mapped Registers *//***************************************************************************/ @@ -603,7 +585,6 @@ typedef struct t_FmSp { } t_FmSp; #endif /* (DPAA_VERSION >= 11) */ - typedef struct t_Fm { /***************************/ diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fman.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fman.c index 9e59062..97adbbf 100755 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fman.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fman.c @@ -565,18 +565,18 @@ void fman_set_vsp_window(struct fman_bmi_regs *bmi_rg, } void fman_set_congestion_group_pfc_priority(uint32_t *cpg_rg, - uint32_t congestion_group_id, - uint8_t priority_bit_map) + uint32_t congestion_group_id, + uint8_t priority_bit_map, + uint32_t reg_num) { - uint32_t reg_num, offset, tmp = 0; - - reg_num = (FM_PORT_NUM_OF_CONGESTION_GRPS-1-congestion_group_id)/4; + uint32_t offset, tmp = 0; + offset = (congestion_group_id%4)*8; tmp = ioread32be(&cpg_rg[reg_num]); tmp &= ~(0xFF<<offset); tmp |= (uint32_t)priority_bit_map << offset; - + iowrite32be(tmp,&cpg_rg[reg_num]); } @@ -823,7 +823,6 @@ int fman_fpm_init(struct fman_fpm_regs *fpm_rg, struct fman_cfg *cfg) /* RAM ECC - enable and clear events*/ /* first we need to clear all parser memory, * as it is uninitialized and may cause ECC errors */ - /* event bits */ tmp_reg = (FPM_RAM_MURAM_ECC | FPM_RAM_IRAM_ECC); /* Rams enable not effected by RCR bit, but by a COP configuration */ diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/inc/fm_common.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/inc/fm_common.h index 654294d..696298a 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/inc/fm_common.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/inc/fm_common.h @@ -56,6 +56,24 @@ +/**************************************************************************//** + @Description Modules registers offsets +*//***************************************************************************/ +#define FM_MM_MURAM 0x00000000 +#define FM_MM_BMI 0x00080000 +#define FM_MM_QMI 0x00080400 +#define FM_MM_PRS 0x000c7000 +#define FM_MM_KG 0x000C1000 +#define FM_MM_DMA 0x000C2000 +#define FM_MM_FPM 0x000C3000 +#define FM_MM_PLCR 0x000C0000 +#define FM_MM_IMEM 0x000C4000 +#define FM_MM_CGP 0x000DB000 +#define FM_MM_TRB(i) (0x000D0200 + 0x400 * (i)) +#if (DPAA_VERSION >= 11) +#define FM_MM_SP 0x000dc000 +#endif /* (DPAA_VERSION >= 11) */ + /**************************************************************************//** @Description Enum for inter-module interrupts registration diff --git a/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_ext.h b/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_ext.h index 00951b1..efbe6d3 100644 --- a/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_ext.h +++ b/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_ext.h @@ -238,6 +238,7 @@ typedef uint32_t fmSpecialOperations_t; /**< typedef for definin #define FM_SP_OP_CLEAR_RPD 0x02000000 /**< Clear the RPD bit */ #define FM_SP_OP_CAPWAP_DTLS_ENC 0x01000000 /**< activate features that related to CAPWAP-DTLS post Encryption */ #define FM_SP_OP_CAPWAP_DTLS_DEC 0x00800000 /**< activate features that related to CAPWAP-DTLS post Decryption */ +#define FM_SP_OP_IPSEC_NO_ETH_HDR 0x00400000 /**< activate features that related to IPSec without Eth hdr */ /* @} */ /**************************************************************************//** @@ -1659,6 +1660,21 @@ t_Error FM_ForceIntr (t_Handle h_Fm, e_FmExceptions exception); *//***************************************************************************/ t_Error FM_SetPortsBandwidth(t_Handle h_Fm, t_FmPortsBandwidthParams *p_PortsBandwidth); +/**************************************************************************//* + @Function FM_GetMuramHandle + + @Description Gets the corresponding MURAM handle + + @Param[in] h_Fm A handle to an FM Module. + + @Return MURAM handle; NULL otherwise. + + @Cautions Allowed only following FM_Init(). + This routine should NOT be called from guest-partition + (i.e. guestId != NCSW_MASTER_ID) +*//***************************************************************************/ +t_Handle FM_GetMuramHandle(t_Handle h_Fm); + /** @} */ /* end of FM_runtime_control_grp group */ /** @} */ /* end of FM_lib_grp group */ /** @} */ /* end of FM_grp group */ diff --git a/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h b/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h index e67fbb6..c489124 100644 --- a/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h +++ b/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h @@ -95,9 +95,8 @@ #define FM_PCD_KG_NUM_OF_DEFAULT_GROUPS 16 /**< Number of default value logical groups */ #define FM_PCD_PRS_NUM_OF_LABELS 32 /**< Maximum number of SW parser labels */ -#define FM_PCD_SW_PRS_SIZE 0x00000800 /**< Total size of SW parser area */ -#define FM_PCD_PRS_SW_OFFSET 0x00000040 /**< Size of illegal addresses at the beginning - of the SW parser area */ +#define FM_SW_PRS_MAX_IMAGE_SIZE (FM_PCD_SW_PRS_SIZE /*- FM_PCD_PRS_SW_OFFSET -FM_PCD_PRS_SW_TAIL_SIZE*/-FM_PCD_PRS_SW_PATCHES_SIZE) + /**< Maximum size of SW parser code */ #define FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE 128 /**< Maximum size of insertion template for insert manipulation */ @@ -1144,7 +1143,7 @@ typedef enum e_FmPcdManipHdrFieldUpdateVlan { } e_FmPcdManipHdrFieldUpdateVlan; /**************************************************************************//** - @Description Enumeration type for selecting specific L2 fields removal + @Description Enumeration type for selecting specific L2 header insertion *//***************************************************************************/ typedef enum e_FmPcdManipHdrInsrtSpecificL2 { e_FM_PCD_MANIP_HDR_INSRT_MPLS /**< Insert MPLS header (Unlimited MPLS labels) */ @@ -2243,7 +2242,7 @@ typedef struct t_FmPcdManipHdrRmvByHdrParams { If TRUE, remove also the specified header. */ t_FmManipHdrInfo hdrInfo; } fromStartByHdr; /**< Relevant when type = e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START */ -#endif /* FM_CAPWAP_SUPPORT */ +#endif /* (DPAA_VERSION >= 11) || ... */ #if (DPAA_VERSION >= 11) t_FmManipHdrInfo hdrInfo; /**< Relevant when type = e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START */ #endif /* (DPAA_VERSION >= 11) */ @@ -2356,9 +2355,14 @@ typedef struct t_FmPcdManipSpecialOffloadIPSecParams { (direction depends on the 'decryption' field). */ bool variableIpHdrLen; /**< TRUE for supporting variable IP header length in decryption. */ bool variableIpVersion; /**< TRUE for supporting both IP version on the same SA in encryption */ - uint8_t outerIPHdrLen; /**< if 'variableIpVersion == TRUE' than this field must be set to non-zero value; + uint8_t outerIPHdrLen; /**< if 'variableIpVersion == TRUE' then this field must be set to non-zero value; It is specifies the length of the outer IP header that was configured in the corresponding SA. */ + uint16_t arwSize; /**< if <> '0' then will perform ARW check for this SA; + The value must be a multiplication of 16 */ + uintptr_t arwAddr; /**< if arwSize <> '0' then this field must be set to non-zero value; + MUST be allocated from FMAN's MURAM that the post-sec op-port belongs to; + Must be 4B aligned. Required MURAM size is 'NEXT_POWER_OF_2(arwSize+32))/8+4' Bytes */ } t_FmPcdManipSpecialOffloadIPSecParams; #if (DPAA_VERSION >= 11) @@ -3832,8 +3836,6 @@ t_Error FM_PCD_HashTableGetBucketAging(t_Handle h_HashTbl, uint32_t *p_BucketAgingMask, uint8_t *agedKeysArray[31]); - - /**************************************************************************//** @Function FM_PCD_ManipNodeSet diff --git a/drivers/net/ethernet/freescale/fman/inc/flib/fsl_fman.h b/drivers/net/ethernet/freescale/fman/inc/flib/fsl_fman.h index cec4e10..96a63fa 100755 --- a/drivers/net/ethernet/freescale/fman/inc/flib/fsl_fman.h +++ b/drivers/net/ethernet/freescale/fman/inc/flib/fsl_fman.h @@ -672,7 +672,6 @@ enum fman_counters { #define QMI_GS_HALT_NOT_BUSY 0x00000002 - /**************************************************************************//** @Description IRAM defines *//***************************************************************************/ @@ -753,8 +752,9 @@ void fman_set_dma_emergency(struct fman_dma_regs *dma_rg, bool is_write, bool enable); void fman_set_dma_ext_bus_pri(struct fman_dma_regs *dma_rg, uint32_t pri); void fman_set_congestion_group_pfc_priority(uint32_t *cpg_rg, - uint32_t congestion_group_id, - uint8_t priority_bit_map); + uint32_t congestion_group_id, + uint8_t piority_bit_map, + uint32_t reg_num); void fman_defconfig(struct fman_cfg *cfg, bool is_master); diff --git a/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3H/dpaa_integration_ext.h b/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3H/dpaa_integration_ext.h index ce9c3e7..38ed441 100644 --- a/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3H/dpaa_integration_ext.h +++ b/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3H/dpaa_integration_ext.h @@ -220,7 +220,7 @@ typedef enum #define FM_PCD_PLCR_NUM_ENTRIES 256 /**< Total number of policer profiles */ #define FM_PCD_KG_NUM_OF_SCHEMES 32 /**< Total number of KG schemes */ #define FM_PCD_MAX_NUM_OF_CLS_PLANS 256 /**< Number of classification plan entries. */ -#define FM_PCD_PRS_SW_PATCHES_SIZE 0x00000460 /**< Number of bytes saved for patches */ +#define FM_PCD_PRS_SW_PATCHES_SIZE 0x00000600 /**< Number of bytes saved for patches */ #define FM_PCD_SW_PRS_SIZE 0x00000800 /**< Total size of SW parser area */ /* RTC defines */ diff --git a/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3L/dpaa_integration_ext.h b/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3L/dpaa_integration_ext.h index be3fcb1..594527e 100644 --- a/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3L/dpaa_integration_ext.h +++ b/drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3L/dpaa_integration_ext.h @@ -203,6 +203,8 @@ typedef enum #define FM_MAX_NUM_OF_10G_TX_PORTS FM_MAX_NUM_OF_10G_MACS #define FM_MAX_NUM_OF_TX_PORTS (FM_MAX_NUM_OF_10G_TX_PORTS + FM_MAX_NUM_OF_1G_TX_PORTS) +#define FM_MAX_NUM_OF_MACSECS 1 /* Should be updated */ + #define FM_PORT_MAX_NUM_OF_EXT_POOLS 4 /**< Number of external BM pools per Rx port */ #define FM_PORT_NUM_OF_CONGESTION_GRPS 256 /**< Total number of congestion groups in QM */ #define FM_MAX_NUM_OF_SUB_PORTALS 16 @@ -221,7 +223,7 @@ typedef enum #define FM_PCD_PLCR_NUM_ENTRIES 256 /**< Total number of policer profiles */ #define FM_PCD_KG_NUM_OF_SCHEMES 32 /**< Total number of KG schemes */ #define FM_PCD_MAX_NUM_OF_CLS_PLANS 256 /**< Number of classification plan entries. */ -#define FM_PCD_PRS_SW_PATCHES_SIZE 0x00000460 /**< Number of bytes saved for patches */ +#define FM_PCD_PRS_SW_PATCHES_SIZE 0x00000600 /**< Number of bytes saved for patches */ #define FM_PCD_SW_PRS_SIZE 0x00000800 /**< Total size of SW parser area */ /* RTC defines */ diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c index b25ff3d..fcc0198 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c @@ -126,10 +126,6 @@ #error Error: please synchronize IOC_ defines! #endif -#if CMP_IOC_DEFINE(FM_PCD_PRS_SW_OFFSET) -#error Error: please synchronize IOC_ defines! -#endif - #if CMP_IOC_DEFINE(FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE) #error Error: please synchronize IOC_ defines! #endif diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c index 5d2d306..ee98d88 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c @@ -1076,8 +1076,10 @@ void compat_fm_pcd_manip_set_node( memcpy(¶m->u.frag, &compat_param->u.frag, sizeof(param->u.frag)); break; case e_IOC_FM_PCD_MANIP_SPECIAL_OFFLOAD: - param->u.special_offload = compat_param->u.special_offload; - break; + memcpy(¶m->u.special_offload, + &compat_param->u.special_offload, + sizeof(param->u.special_offload)); + break; } param->p_next_manip = compat_pcd_id2ptr(compat_param->p_next_manip); diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h index af158e9..2f0fdd4 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h @@ -475,13 +475,24 @@ typedef struct ioc_compat_fm_pcd_manip_hdr_params_t { bool dont_parse_after_manip; } ioc_compat_fm_pcd_manip_hdr_params_t; +typedef struct ioc_compat_fm_pcd_manip_special_offload_params_t { + bool decryption; + bool ecn_copy; + bool dscp_copy; + bool variable_ip_hdr_len; + bool variable_ip_version; + uint8_t outer_ip_hdr_len; + uint16_t arw_size; + compat_uptr_t arw_addr; +} ioc_compat_fm_pcd_manip_special_offload_params_t; + typedef struct ioc_compat_fm_pcd_manip_params_t { ioc_fm_pcd_manip_type type; union { ioc_compat_fm_pcd_manip_hdr_params_t hdr; ioc_fm_pcd_manip_reassem_params_t reassem; ioc_fm_pcd_manip_frag_params_t frag; - ioc_fm_pcd_manip_special_offload_params_t special_offload; + ioc_compat_fm_pcd_manip_special_offload_params_t special_offload; } u; compat_uptr_t p_next_manip; #if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) diff --git a/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h b/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h index 325f186..4481f5c 100644 --- a/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h +++ b/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h @@ -94,8 +94,6 @@ #define IOC_FM_PCD_PRS_NUM_OF_LABELS 32 /**< Maximum number of SW parser labels */ #define IOC_FM_PCD_SW_PRS_SIZE 0x00000800 /**< Total size of SW parser area */ -#define IOC_FM_PCD_PRS_SW_OFFSET 0x00000040 /**< Size of illegal addresses at the beginning - of the SW parser area */ #define IOC_FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE 128 /**< Maximum size of insertion template for insert manipulation */ @@ -1833,6 +1831,11 @@ typedef struct ioc_fm_pcd_manip_special_offload_ipsec_params_t { uint8_t outer_ip_hdr_len; /**< If 'variable_ip_version == TRUE' than this field must be set to non-zero value; It is specifies the length of the outer IP header that was configured in the corresponding SA. */ + uint16_t arw_size; /**< if <> '0' then will perform ARW check for this SA; + The value must be a multiplication of 16 */ + void *arw_addr; /**< if arwSize <> '0' then this field must be set to non-zero value; + MUST be allocated from FMAN's MURAM that the post-sec op-port belong + Must be 4B aligned. Required MURAM size is '(NEXT_POWER_OF_2(arwSize+32))/8+4' Bytes */ } ioc_fm_pcd_manip_special_offload_ipsec_params_t; #if (DPAA_VERSION >= 11) |