From: Eric Nelson <eric@nelint.com>
To: netdev@vger.kernel.org
Cc: linux@arm.linux.org.uk, andrew@lunn.ch, fugang.duan@nxp.com,
otavio@ossystems.com.br, edumazet@google.com,
troy.kisky@boundarydevices.com, davem@davemloft.net,
u.kleine-koenig@pengutronix.de, Eric Nelson <eric@nelint.com>
Subject: [PATCH 3/3] net: fec: align IP header in hardware
Date: Sat, 24 Sep 2016 07:42:19 -0700 [thread overview]
Message-ID: <1474728139-9335-4-git-send-email-eric@nelint.com> (raw)
In-Reply-To: <1474728139-9335-1-git-send-email-eric@nelint.com>
The FEC receive accelerator (RACC) supports shifting the data payload of
received packets by 16-bits, which aligns the payload (IP header) on a
4-byte boundary, which is, if not required, at least strongly suggested
by the Linux networking layer.
Without this patch, a huge number of alignment faults will be taken by the
IP stack, as seen in /proc/cpu/alignment:
~/$ cat /proc/cpu/alignment
User: 0
System: 72645 (inet_gro_receive+0x104/0x27c)
Skipped: 0
Half: 0
Word: 0
DWord: 0
Multi: 72645
User faults: 3 (fixup+warn)
This patch was suggested by Andrew Lunn in this message to linux-netdev:
http://marc.info/?l=linux-arm-kernel&m=147465452108384&w=2
and adapted from a patch by Russell King from 2014:
http://git.arm.linux.org.uk/cgit/linux-arm.git/commit/?id=70d8a8a
Signed-off-by: Eric Nelson <eric@nelint.com>
---
drivers/net/ethernet/freescale/fec_main.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 0219e79..1fa2d87 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -180,6 +180,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
/* FEC receive acceleration */
#define FEC_RACC_IPDIS (1 << 1)
#define FEC_RACC_PRODIS (1 << 2)
+#define FEC_RACC_SHIFT16 BIT(7)
#define FEC_RACC_OPTIONS (FEC_RACC_IPDIS | FEC_RACC_PRODIS)
/*
@@ -945,9 +946,11 @@ fec_restart(struct net_device *ndev)
#if !defined(CONFIG_M5272)
if (fep->quirks & FEC_QUIRK_HAS_RACC) {
- /* set RX checksum */
val = readl(fep->hwp + FEC_RACC);
+ /* align IP header */
+ val |= FEC_RACC_SHIFT16;
if (fep->csum_flags & FLAG_RX_CSUM_ENABLED)
+ /* set RX checksum */
val |= FEC_RACC_OPTIONS;
else
val &= ~FEC_RACC_OPTIONS;
@@ -1428,6 +1431,12 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
prefetch(skb->data - NET_IP_ALIGN);
skb_put(skb, pkt_len - 4);
data = skb->data;
+
+#if !defined(CONFIG_M5272)
+ if (fep->quirks & FEC_QUIRK_HAS_RACC)
+ data = skb_pull_inline(skb, 2);
+#endif
+
if (!is_copybreak && need_swap)
swap_buffer(data, pkt_len);
--
2.7.4
next prev parent reply other threads:[~2016-09-24 14:58 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-23 16:43 Alignment issues with freescale FEC driver Eric Nelson
2016-09-23 16:54 ` Eric Dumazet
2016-09-23 17:19 ` Eric Nelson
2016-09-23 17:33 ` Eric Nelson
2016-09-23 18:13 ` Andrew Lunn
2016-09-23 18:30 ` Russell King - ARM Linux
2016-09-23 18:39 ` Eric Nelson
2016-09-23 18:35 ` Eric Nelson
2016-09-24 2:45 ` David Miller
2016-09-24 5:13 ` Andy Duan
2016-09-24 14:42 ` [PATCH 0/3] net: fec: updates to align IP header Eric Nelson
2016-09-24 14:42 ` [PATCH 1/3] net: fec: remove QUIRK_HAS_RACC from i.mx25 Eric Nelson
2016-09-24 14:42 ` [PATCH 2/3] net: fec: remove QUIRK_HAS_RACC from i.mx27 Eric Nelson
2016-09-24 14:42 ` Eric Nelson [this message]
2016-09-26 9:26 ` [PATCH 3/3] net: fec: align IP header in hardware David Laight
2016-09-26 18:39 ` Eric Nelson
2016-09-28 16:42 ` David Laight
2016-09-28 17:14 ` Eric Nelson
2016-09-28 17:25 ` Russell King - ARM Linux
2016-09-28 18:01 ` Eric Nelson
2016-09-29 11:07 ` David Laight
2016-09-30 13:27 ` Eric Nelson
2016-09-30 13:49 ` David Laight
2016-09-30 14:16 ` Eric Nelson
2016-10-01 19:52 ` Russell King - ARM Linux
2016-10-03 16:42 ` David Laight
2016-10-03 18:48 ` Eric Nelson
2016-10-08 2:44 ` Andy Duan
2016-09-24 15:09 ` [PATCH 0/3] net: fec: updates to align IP header Andy Duan
2016-09-24 15:29 ` Eric Nelson
2016-09-27 11:40 ` David Miller
2016-09-24 2:43 ` Alignment issues with freescale FEC driver David Miller
2016-09-24 12:27 ` Eric Nelson
2016-09-23 17:37 ` Russell King - ARM Linux
2016-09-23 18:26 ` Eric Nelson
2016-09-23 18:37 ` Russell King - ARM Linux
2016-09-23 18:49 ` Eric Nelson
2016-09-23 20:22 ` Uwe Kleine-König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1474728139-9335-4-git-send-email-eric@nelint.com \
--to=eric@nelint.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=fugang.duan@nxp.com \
--cc=linux@arm.linux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=otavio@ossystems.com.br \
--cc=troy.kisky@boundarydevices.com \
--cc=u.kleine-koenig@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).