linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Wolfgang Denk <wd@denx.de>
To: linuxppc-dev@ozlabs.org
Cc: Piotr Ziecik <kosmo@semihalf.com>,
	John Rigby <jrigby@freescale.com>,
	netdev@vger.kernel.org, Wolfgang Denk <wd@denx.de>
Subject: [PATCH 03/12] fs_enet: Add FEC TX Alignment workaround for MPC5121.
Date: Wed,  6 May 2009 22:15:10 +0200	[thread overview]
Message-ID: <1241640919-4650-4-git-send-email-wd@denx.de> (raw)
In-Reply-To: <1241640919-4650-1-git-send-email-wd@denx.de>

From: John Rigby <jrigby@freescale.com>

The FEC on 5121 has problems with misaligned tx buffers.
The RM says any alignment is ok but empirical results
show that packet buffers ending in 0x1E will sometimes
hang the FEC.  Other bad alignment does not hang but will
cause silent TX failures resulting in about a 1% packet
loss as tested by ping -f from a remote host.

This patch is a work around that copies every tx packet
to an aligned skb before sending.

Signed-off-by: John Rigby <jrigby@freescale.com>
Signed-off-by: Piotr Ziecik <kosmo@semihalf.com>
Signed-off-by: Wolfgang Denk <wd@denx.de>
Cc: <netdev@vger.kernel.org>
Cc: Grant Likely <grant.likely@secretlab.ca>
Cc: John Rigby <jcrigby@gmail.com>
---
 drivers/net/fs_enet/Kconfig        |    3 ++
 drivers/net/fs_enet/fs_enet-main.c |   41 ++++++++++++++++++++++++++++++++++++
 drivers/net/fs_enet/mac-fec.c      |    2 +-
 3 files changed, 45 insertions(+), 1 deletions(-)

diff --git a/drivers/net/fs_enet/Kconfig b/drivers/net/fs_enet/Kconfig
index fc073b5..79afd07 100644
--- a/drivers/net/fs_enet/Kconfig
+++ b/drivers/net/fs_enet/Kconfig
@@ -8,6 +8,9 @@ config FS_ENET_MPC5121_FEC
 	def_bool y if (FS_ENET && PPC_MPC512x)
 	select FS_ENET_HAS_FEC
 
+config FS_ENET_FEC_TX_ALIGN_WORKAROUND
+	def_bool y if FS_ENET_MPC5121_FEC
+
 config FS_ENET_HAS_SCC
 	bool "Chip has an SCC usable for ethernet"
 	depends on FS_ENET && (CPM1 || CPM2)
diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c
index 4170d33..c83ffc3 100644
--- a/drivers/net/fs_enet/fs_enet-main.c
+++ b/drivers/net/fs_enet/fs_enet-main.c
@@ -594,6 +594,37 @@ void fs_cleanup_bds(struct net_device *dev)
 
 /**********************************************************************************/
 
+#ifdef CONFIG_FS_ENET_FEC_TX_ALIGN_WORKAROUND
+static struct sk_buff *tx_skb_align_workaround(struct net_device *dev,
+							struct sk_buff *skb)
+{
+	struct sk_buff *new_skb;
+
+	/* Alloc new skb */
+	new_skb = dev_alloc_skb(ENET_RX_FRSIZE + 32);
+	if (!new_skb) {
+		printk(KERN_WARNING DRV_MODULE_NAME
+				": %s Memory squeeze, dropping tx packet.\n",
+								dev->name);
+		return NULL;
+	}
+
+	/* Make sure new skb is properly aligned */
+	skb_align(new_skb, 32);
+
+	/* Copy data to new skb ... */
+	skb_copy_from_linear_data(skb, new_skb->data, skb->len);
+	skb_put(new_skb, skb->len);
+
+	/* ... and free an old one */
+	dev_kfree_skb_any(skb);
+
+	return new_skb;
+}
+#else
+#define tx_skb_align_workaround(dev, skb) (skb)
+#endif
+
 static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct fs_enet_private *fep = netdev_priv(dev);
@@ -602,6 +633,16 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	u16 sc;
 	unsigned long flags;
 
+	skb = tx_skb_align_workaround(dev, skb);
+	if (!skb) {
+		/*
+		 * We have lost packet due to memory allocation error in
+		 * tx_skb_align_workaround(). Hopefully original skb is still
+		 * valid, so try transmit it later.
+		 */
+		return NETDEV_TX_BUSY;
+	}
+
 	spin_lock_irqsave(&fep->tx_lock, flags);
 
 	/*
diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c
index b069088..3e86498 100644
--- a/drivers/net/fs_enet/mac-fec.c
+++ b/drivers/net/fs_enet/mac-fec.c
@@ -311,7 +311,7 @@ static void restart(struct net_device *dev)
 	 * Enable big endian.
 	 */
 #ifndef CONFIG_FS_ENET_MPC5121_FEC
-	/* Don't care about SDMA FC. */
+	/* Don't care about SDMA Function Code. */
 	FW(fecp, fun_code, 0x78000000);
 #else
 	FS(fecp, dma_control, 0xC0000000);
-- 
1.6.0.6

  parent reply	other threads:[~2009-05-06 20:15 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-06 20:15 [PATCH 00/16] Add support for MPC512x Wolfgang Denk
2009-05-06 20:15 ` [PATCH 01/12] fs_enet: Use defines to set driver tunables Wolfgang Denk
2009-05-06 20:35   ` Grant Likely
2009-05-06 22:02     ` Wolfgang Denk
2009-05-06 22:41       ` Grant Likely
2009-05-06 20:15 ` [PATCH 02/12] fs_enet: Add MPC5121 FEC support Wolfgang Denk
2009-05-06 20:33   ` Grant Likely
2009-05-06 21:08     ` Scott Wood
2009-05-06 22:01     ` Wolfgang Denk
2009-05-06 22:29       ` Grant Likely
2009-05-06 22:41         ` Wolfgang Denk
2009-05-07 14:09           ` Grant Likely
2009-05-08  2:02             ` John Rigby
2009-05-08  7:52               ` David Miller
2009-05-11  6:56                 ` David Jander
2009-05-07  8:14         ` David Jander
2009-05-07 13:05       ` Kumar Gala
2009-05-06 20:40   ` David Miller
2009-05-06 22:06     ` Wolfgang Denk
2009-05-06 20:41   ` Scott Wood
2009-05-06 22:09     ` Wolfgang Denk
2009-05-06 22:39       ` Grant Likely
2009-05-14 12:38         ` Piotr Zięcik
2009-05-14 14:00           ` Grant Likely
2009-05-18 22:17             ` Benjamin Herrenschmidt
2009-05-19 11:26               ` Piotr Zięcik
2009-05-19 21:56                 ` Benjamin Herrenschmidt
2009-05-21  8:34             ` Piotr Zięcik
2009-05-21 15:36               ` Grant Likely
2009-05-06 20:15 ` Wolfgang Denk [this message]
2009-05-06 20:37   ` [PATCH 03/12] fs_enet: Add FEC TX Alignment workaround for MPC5121 Grant Likely
2009-05-06 22:12     ` Wolfgang Denk
2009-05-06 22:42       ` Grant Likely
2009-05-08  2:36         ` John Rigby
2009-05-06 20:15 ` [PATCH 04/12] mpc5121: Added reset module registers representation Wolfgang Denk
2009-05-06 20:29   ` Scott Wood
2009-05-06 21:57     ` Wolfgang Denk
2009-05-06 20:39   ` Grant Likely
2009-05-06 22:14     ` Wolfgang Denk
2009-05-06 20:15 ` [PATCH 05/12] mpc5121ads: Added Reset Module node to DTS Wolfgang Denk
2009-05-06 20:40   ` Grant Likely
2009-05-06 22:16     ` Wolfgang Denk
2009-05-06 22:46       ` Grant Likely
2009-05-06 20:15 ` [PATCH 06/12] mpc5121: Added NAND Flash Controller driver Wolfgang Denk
2009-05-06 20:59   ` Grant Likely
2009-05-08  2:22     ` John Rigby
2009-05-08  3:07       ` Grant Likely
2009-05-07  8:08   ` David Jander
2009-05-08  3:30   ` John Rigby
2009-05-13  8:41     ` Piotr Zięcik
2009-05-06 20:15 ` [PATCH 07/12] mpc5121ads: Clean up and fix NAND description in mpc5121ads DTS Wolfgang Denk
2009-05-06 21:00   ` Grant Likely
2009-05-06 20:15 ` [PATCH 08/12] mpc5121: Added I2C support Wolfgang Denk
2009-05-06 21:01   ` Grant Likely
2009-05-06 22:19     ` Wolfgang Denk
2009-05-06 22:51       ` Grant Likely
2009-05-07  2:41         ` Grant Likely
2009-05-07  6:36           ` Wolfgang Grandegger
2009-05-18 13:57             ` Piotr Zięcik
2009-05-18 14:11               ` Grant Likely
2009-05-18 14:29               ` Wolfgang Grandegger
2009-05-19  7:47                 ` Piotr Zięcik
2009-05-19  8:10                   ` Wolfgang Grandegger
2009-05-08  2:12           ` John Rigby
2009-05-08  3:01             ` Grant Likely
2009-05-06 20:15 ` [PATCH 09/12] mpc5121ads: Added I2C RTC node to mpc5121ads DTS Wolfgang Denk
2009-05-06 21:02   ` Grant Likely
2009-05-07  6:45   ` Wolfgang Grandegger
2009-05-06 20:15 ` [PATCH 10/12] mpc5121: Add MPC5121 Real time clock driver Wolfgang Denk
2009-05-06 21:03   ` Grant Likely
2009-05-06 21:06   ` Wolfram Sang
2009-05-06 22:40     ` Grant Likely
2009-05-08  2:41       ` [rtc-linux] " John Rigby
2009-05-08 15:53         ` Grant Likely
2009-05-08 16:09           ` Alessandro Zummo
2009-05-08 19:18             ` Wolfgang Denk
2009-05-08 16:10           ` Alessandro Zummo
2009-05-06 20:15 ` [PATCH 11/12] mpc5121: Added MPC512x DMA driver Wolfgang Denk
2009-05-06 21:07   ` Grant Likely
2009-05-08  2:49     ` John Rigby
2009-05-19  1:37   ` Hongjun Chen
2009-05-19  8:03     ` Piotr Zięcik
2009-05-20  0:39       ` Hongjun Chen
2009-05-06 20:15 ` [PATCH 12/12] mpc5121: Added default config for MPC5121 Wolfgang Denk
2009-05-06 21:08   ` Grant Likely
2009-05-06 22:23     ` Wolfgang Denk
2009-05-06 22:48       ` Grant Likely

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=1241640919-4650-4-git-send-email-wd@denx.de \
    --to=wd@denx.de \
    --cc=jrigby@freescale.com \
    --cc=kosmo@semihalf.com \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=netdev@vger.kernel.org \
    /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).