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: 55+ 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:43 ` Eric Nelson
2016-09-23 16:54 ` Eric Dumazet
2016-09-23 16:54 ` Eric Dumazet
2016-09-23 17:19 ` Eric Nelson
2016-09-23 17:19 ` Eric Nelson
2016-09-23 17:33 ` Eric Nelson
2016-09-23 17:33 ` Eric Nelson
2016-09-23 18:13 ` Andrew Lunn
2016-09-23 18:13 ` Andrew Lunn
2016-09-23 18:30 ` Russell King - ARM Linux
2016-09-23 18:30 ` Russell King - ARM Linux
2016-09-23 18:39 ` Eric Nelson
2016-09-23 18:39 ` Eric Nelson
2016-09-23 18:35 ` Eric Nelson
2016-09-23 18:35 ` Eric Nelson
2016-09-24 2:45 ` David Miller
2016-09-24 2:45 ` David Miller
2016-09-24 5:13 ` Andy Duan
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 2:43 ` David Miller
2016-09-24 12:27 ` Eric Nelson
2016-09-24 12:27 ` Eric Nelson
2016-09-23 17:37 ` Russell King - ARM Linux
2016-09-23 17:37 ` Russell King - ARM Linux
2016-09-23 18:26 ` Eric Nelson
2016-09-23 18:26 ` Eric Nelson
2016-09-23 18:37 ` Russell King - ARM Linux
2016-09-23 18:37 ` Russell King - ARM Linux
2016-09-23 18:49 ` Eric Nelson
2016-09-23 18:49 ` Eric Nelson
2016-09-23 20:22 ` Uwe Kleine-König
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.