summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMandy Lavi <mandy.lavi@freescale.com>2015-11-24 05:12:43 (GMT)
committerMandy Lavi <mandy.lavi@freescale.com>2015-11-24 08:21:27 (GMT)
commit976b0aa3b91c922a80efa6bd1c6d670828b05164 (patch)
tree63b2c8743b97161c07a4a9e37321d8fd2669934b
parentb242e9c35ae998f1f732deff174c4513a5f34ad1 (diff)
downloadlinux-fsl-qoriq-976b0aa3b91c922a80efa6bd1c6d670828b05164.tar.xz
fmd: PCD: fix offline port blocked by fragmented IPV6
Signed-off-by: Mandy Lavi <mandy.lavi@freescale.com>
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/HC/hc.c7
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/MACSEC/fm_macsec_secy.c25
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c121
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h13
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_prs.h262
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c126
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.h27
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c45
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.h19
-rwxr-xr-xdrivers/net/ethernet/freescale/fman/Peripherals/FM/fman.c13
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/inc/fm_common.h18
-rw-r--r--drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_ext.h16
-rw-r--r--drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h18
-rwxr-xr-xdrivers/net/ethernet/freescale/fman/inc/flib/fsl_fman.h6
-rw-r--r--drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3H/dpaa_integration_ext.h2
-rw-r--r--drivers/net/ethernet/freescale/fman/inc/integrations/FMANV3L/dpaa_integration_ext.h4
-rw-r--r--drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c4
-rw-r--r--drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c6
-rw-r--r--drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h13
-rw-r--r--include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h7
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(&param->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(&param->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)