diff mbox

fec: fix FEC driver packet transmission breakage

Message ID 200908070358.n773wIxB015388@localhost.localdomain
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Greg Ungerer Aug. 7, 2009, 3:58 a.m. UTC
fec: fix FEC driver packet transmission breakage

Commit f0b3fbeae11a526c3d308b691684589ee37c359b breaks transmission of
packets where the skb data buffer is not memory aligned according to
FEC_ALIGNMENT. It incorrectly passes to dma_sync_single() the buffer
address directly from the skb, instead of the address calculated for
use (which may be the skb address or one of the bounce buffers).

It seems there is no use converting the cpu address of the buffer to
a physical either, since dma_map_single() expects the cpu address and
will return the dma address to use in the descriptor. So remove the use
of __pa() on the buffer address as well.

This patch is against 2.6.30-rc5. This breakage is a regression over
2.6.30, which does not have this problem.

Signed-off-by: Greg Ungerer <gerg@uclinux.org>
---

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

David Miller Aug. 10, 2009, 4:51 a.m. UTC | #1
From: Greg Ungerer <gerg@snapgear.com>
Date: Fri, 7 Aug 2009 13:58:18 +1000

> fec: fix FEC driver packet transmission breakage
> 
> Commit f0b3fbeae11a526c3d308b691684589ee37c359b 

In the future, when referencing commits, please also provide the
commit message header line text, in parenthesis, and in quotes, like
this ("the commit message header line"), right after the SHA1 ID.

I've fixed up your commit message, in that way, this time.  But
next time I'm going to simply shoot this back to you.

> breaks transmission of
> packets where the skb data buffer is not memory aligned according to
> FEC_ALIGNMENT. It incorrectly passes to dma_sync_single() the buffer
> address directly from the skb, instead of the address calculated for
> use (which may be the skb address or one of the bounce buffers).
> 
> It seems there is no use converting the cpu address of the buffer to
> a physical either, since dma_map_single() expects the cpu address and
> will return the dma address to use in the descriptor. So remove the use
> of __pa() on the buffer address as well.
> 
> This patch is against 2.6.30-rc5. This breakage is a regression over
> 2.6.30, which does not have this problem.
> 
> Signed-off-by: Greg Ungerer <gerg@uclinux.org>

Applied.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index 0d2ab43..a32230b 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -285,6 +285,7 @@  fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct fec_enet_private *fep = netdev_priv(dev);
 	struct bufdesc *bdp;
+	void *bufaddr;
 	unsigned short	status;
 	unsigned long flags;
 
@@ -312,7 +313,7 @@  fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	status &= ~BD_ENET_TX_STATS;
 
 	/* Set buffer length and buffer pointer */
-	bdp->cbd_bufaddr = __pa(skb->data);
+	bufaddr = skb->data;
 	bdp->cbd_datlen = skb->len;
 
 	/*
@@ -320,11 +321,11 @@  fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	 * 4-byte boundaries. Use bounce buffers to copy data
 	 * and get it aligned. Ugh.
 	 */
-	if (bdp->cbd_bufaddr & FEC_ALIGNMENT) {
+	if (((unsigned long) bufaddr) & FEC_ALIGNMENT) {
 		unsigned int index;
 		index = bdp - fep->tx_bd_base;
 		memcpy(fep->tx_bounce[index], (void *)skb->data, skb->len);
-		bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]);
+		bufaddr = fep->tx_bounce[index];
 	}
 
 	/* Save skb pointer */
@@ -336,7 +337,7 @@  fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	/* Push the data cache so the CPM does not get stale memory
 	 * data.
 	 */
-	bdp->cbd_bufaddr = dma_map_single(&dev->dev, skb->data,
+	bdp->cbd_bufaddr = dma_map_single(&dev->dev, bufaddr,
 			FEC_ENET_TX_FRSIZE, DMA_TO_DEVICE);
 
 	/* Send it on its way.  Tell FEC it's ready, interrupt when done,