[PATCH] fs_enet: Fix dma_unmap_single calls
Pantelis Antoniou [Sat, 29 Oct 2005 22:22:40 +0000 (01:22 +0300)]
The following patches fixes a bug with erroneous calling of
dma_unmap_single. It never triggered because on normal ppc32
the calls is a NOP. Out of tree drivers need this fix however.

Signed-off-by: Jeff Garzik <jgarzik@pobox.com>

drivers/net/fs_enet/fs_enet-main.c

index 44fac73..9342d5b 100644 (file)
@@ -130,7 +130,7 @@ static int fs_enet_rx_napi(struct net_device *dev, int *budget)
 
                        skb = fep->rx_skbuff[curidx];
 
-                       dma_unmap_single(fep->dev, skb->data,
+                       dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
                                L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
                                DMA_FROM_DEVICE);
 
@@ -144,7 +144,7 @@ static int fs_enet_rx_napi(struct net_device *dev, int *budget)
 
                        skb = fep->rx_skbuff[curidx];
 
-                       dma_unmap_single(fep->dev, skb->data,
+                       dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
                                L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
                                DMA_FROM_DEVICE);
 
@@ -268,7 +268,7 @@ static int fs_enet_rx_non_napi(struct net_device *dev)
 
                        skb = fep->rx_skbuff[curidx];
 
-                       dma_unmap_single(fep->dev, skb->data,
+                       dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
                                L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
                                DMA_FROM_DEVICE);
 
@@ -278,7 +278,7 @@ static int fs_enet_rx_non_napi(struct net_device *dev)
 
                        skb = fep->rx_skbuff[curidx];
 
-                       dma_unmap_single(fep->dev, skb->data,
+                       dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
                                L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
                                DMA_FROM_DEVICE);
 
@@ -399,7 +399,8 @@ static void fs_enet_tx(struct net_device *dev)
                        fep->stats.collisions++;
 
                /* unmap */
-               dma_unmap_single(fep->dev, skb->data, skb->len, DMA_TO_DEVICE);
+               dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
+                               skb->len, DMA_TO_DEVICE);
 
                /*
                 * Free the sk buffer associated with this last transmit. 
@@ -547,17 +548,19 @@ void fs_cleanup_bds(struct net_device *dev)
 {
        struct fs_enet_private *fep = netdev_priv(dev);
        struct sk_buff *skb;
+       cbd_t *bdp;
        int i;
 
        /*
         * Reset SKB transmit buffers.  
         */
-       for (i = 0; i < fep->tx_ring; i++) {
+       for (i = 0, bdp = fep->tx_bd_base; i < fep->tx_ring; i++, bdp++) {
                if ((skb = fep->tx_skbuff[i]) == NULL)
                        continue;
 
                /* unmap */
-               dma_unmap_single(fep->dev, skb->data, skb->len, DMA_TO_DEVICE);
+               dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
+                               skb->len, DMA_TO_DEVICE);
 
                fep->tx_skbuff[i] = NULL;
                dev_kfree_skb(skb);
@@ -566,12 +569,12 @@ void fs_cleanup_bds(struct net_device *dev)
        /*
         * Reset SKB receive buffers 
         */
-       for (i = 0; i < fep->rx_ring; i++) {
+       for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) {
                if ((skb = fep->rx_skbuff[i]) == NULL)
                        continue;
 
                /* unmap */
-               dma_unmap_single(fep->dev, skb->data,
+               dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
                        L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
                        DMA_FROM_DEVICE);