summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale/fman/Peripherals
diff options
context:
space:
mode:
authorMandy Lavi <mandy.lavi@freescale.com>2015-04-19 16:14:44 (GMT)
committerHonghua Yin <Hong-Hua.Yin@freescale.com>2015-04-30 11:37:02 (GMT)
commit62f235b427813b031176be5db848cad3ef7df019 (patch)
treef2b00a4949b256edc00b1a76b6562c134eeadd89 /drivers/net/ethernet/freescale/fman/Peripherals
parentfcecfbd74af9a1ecd77865f2df85143837c64e24 (diff)
downloadlinux-fsl-qoriq-62f235b427813b031176be5db848cad3ef7df019.tar.xz
fmd: Add support for SW parser being run before HW parser
Change-Id: Ia1830aa7a73fcc081dc6e54ee0599b10747bcd2b Signed-off-by: Mandy Lavi <mandy.lavi@freescale.com> Reviewed-on: http://git.am.freescale.net:8181/35266 Reviewed-by: Liron Himi <Liron.Himi@freescale.com> Reviewed-by: Honghua Yin <Hong-Hua.Yin@freescale.com> Tested-by: Honghua Yin <Hong-Hua.Yin@freescale.com>
Diffstat (limited to 'drivers/net/ethernet/freescale/fman/Peripherals')
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c19
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.h1
2 files changed, 20 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c
index 50d8d4c..bbcc59a 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
@@ -1093,6 +1093,7 @@ static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams)
uint8_t physicalSchemeId;
uint32_t ccTreePhysOffset;
t_FmPcdKgInterModuleBindPortToSchemes schemeBind;
+ uint32_t initialSwPrs = 0;
ASSERT_COND(p_FmPort);
SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
@@ -1493,6 +1494,24 @@ static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams)
for (i = 0; i < p_PcdParams->p_PrsParams->numOfHdrsWithAdditionalParams;
i++)
{
+ /* case for using sw parser as the initial NIA address, before
+ * HW parsing
+ */
+ if ((p_PcdParams->p_PrsParams->additionalParams[i].hdr == HEADER_TYPE_NONE) &&
+ p_PcdParams->p_PrsParams->additionalParams[i].swPrsEnable)
+ {
+ initialSwPrs = FmPcdGetSwPrsOffset(p_FmPort->h_FmPcd, HEADER_TYPE_NONE,
+ p_PcdParams->p_PrsParams->additionalParams[i].indexPerHdr);
+ if (initialSwPrs == ILLEGAL_BASE)
+ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
+
+ /* clear parser first HXS */
+ p_FmPort->savedBmiNia &= ~BMI_RFNE_HXS_MASK; /* 0x000000FF */
+ /* rewrite with soft parser start */
+ p_FmPort->savedBmiNia |= initialSwPrs;
+ continue;
+ }
+
hdrNum =
GetPrsHdrNum(p_PcdParams->p_PrsParams->additionalParams[i].hdr);
if (hdrNum == ILLEGAL_HDR_NUM)
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 b9fe9b3..eabf892 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
@@ -509,6 +509,7 @@ typedef _Packed struct
#define BMI_PORT_RFNE_FRWD_DCL4C 0x10000000
#define BMI_PORT_RFNE_FRWD_RPD 0x40000000
#define BMI_RFNE_FDCS_MASK 0xFF000000
+#define BMI_RFNE_HXS_MASK 0x000000FF
#define BMI_CMD_MR_LEAC 0x00200000
#define BMI_CMD_MR_SLEAC 0x00100000