aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale/fman
diff options
context:
space:
mode:
authorMadalin Bucur <madalin.bucur@nxp.com>2018-06-28 15:26:50 +0300
committerDavid S. Miller <davem@davemloft.net>2018-06-30 18:51:06 +0900
commitb95f6fbc8e15803a596ca5e5e21008fba29694c6 (patch)
tree411a18aa099ccde4156d9faa8304423ba30360a5 /drivers/net/ethernet/freescale/fman
parentbnx2x: Fix receiving tx-timeout in error or recovery state. (diff)
downloadlinux-dev-b95f6fbc8e15803a596ca5e5e21008fba29694c6.tar.xz
linux-dev-b95f6fbc8e15803a596ca5e5e21008fba29694c6.zip
fsl/fman: fix parser reporting bad checksum on short frames
The FMan hardware parser needs to be configured to remove the short frame padding from the checksum calculation, otherwise short UDP and TCP frames are likely to be marked as having a bad checksum. Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/freescale/fman')
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_port.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/fman/fman_port.c b/drivers/net/ethernet/freescale/fman/fman_port.c
index ce6e24c74978..ecbf6187e13a 100644
--- a/drivers/net/ethernet/freescale/fman/fman_port.c
+++ b/drivers/net/ethernet/freescale/fman/fman_port.c
@@ -324,6 +324,10 @@ struct fman_port_qmi_regs {
#define HWP_HXS_PHE_REPORT 0x00000800
#define HWP_HXS_PCAC_PSTAT 0x00000100
#define HWP_HXS_PCAC_PSTOP 0x00000001
+#define HWP_HXS_TCP_OFFSET 0xA
+#define HWP_HXS_UDP_OFFSET 0xB
+#define HWP_HXS_SH_PAD_REM 0x80000000
+
struct fman_port_hwp_regs {
struct {
u32 ssa; /* Soft Sequence Attachment */
@@ -728,6 +732,10 @@ static void init_hwp(struct fman_port *port)
iowrite32be(0xffffffff, &regs->pmda[i].lcv);
}
+ /* Short packet padding removal from checksum calculation */
+ iowrite32be(HWP_HXS_SH_PAD_REM, &regs->pmda[HWP_HXS_TCP_OFFSET].ssa);
+ iowrite32be(HWP_HXS_SH_PAD_REM, &regs->pmda[HWP_HXS_UDP_OFFSET].ssa);
+
start_port_hwp(port);
}