ar71xx: ag71xx: use dma_unmap_single to unmap frames
authorGabor Juhos <juhosg@openwrt.org>
Fri, 5 Mar 2010 20:29:10 +0000 (20:29 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Fri, 5 Mar 2010 20:29:10 +0000 (20:29 +0000)
SVN-Revision: 20001

target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h
target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

index 74593ddcc4086a6cef4c9cd072dfbf4241202251..5e3573b335a651fdeaea1b7d4506022a28722d84 100644 (file)
@@ -38,7 +38,7 @@
 #define ETH_FCS_LEN    4
 
 #define AG71XX_DRV_NAME                "ag71xx"
-#define AG71XX_DRV_VERSION     "0.5.29"
+#define AG71XX_DRV_VERSION     "0.5.30"
 
 #define AG71XX_NAPI_WEIGHT     64
 #define AG71XX_OOM_REFILL      (1 + HZ/10)
@@ -88,8 +88,10 @@ struct ag71xx_desc {
 } __attribute__((aligned(4)));
 
 struct ag71xx_buf {
-       struct sk_buff  *skb;
-       struct ag71xx_desc *desc;
+       struct sk_buff          *skb;
+       struct ag71xx_desc      *desc;
+       dma_addr_t              dma_addr;
+       u32                     pad;
 };
 
 struct ag71xx_ring {
index a3edd43aaf30e3a22de44630ad751f4139d249da..cb4ccf06b6d7bd04c4a060833655800aa3487266 100644 (file)
@@ -185,9 +185,11 @@ static void ag71xx_ring_rx_clean(struct ag71xx *ag)
                return;
 
        for (i = 0; i < AG71XX_RX_RING_SIZE; i++)
-               if (ring->buf[i].skb)
+               if (ring->buf[i].skb) {
+                       dma_unmap_single(&ag->dev->dev, ring->buf[i].dma_addr,
+                                        AG71XX_RX_PKT_SIZE, DMA_FROM_DEVICE);
                        kfree_skb(ring->buf[i].skb);
-
+               }
 }
 
 static int ag71xx_ring_rx_init(struct ag71xx *ag)
@@ -223,6 +225,7 @@ static int ag71xx_ring_rx_init(struct ag71xx *ag)
                                          AG71XX_RX_PKT_SIZE,
                                          DMA_FROM_DEVICE);
                ring->buf[i].skb = skb;
+               ring->buf[i].dma_addr = dma_addr;
                ring->buf[i].desc->data = (u32) dma_addr;
                ring->buf[i].desc->ctrl = DESC_EMPTY;
        }
@@ -264,6 +267,7 @@ static int ag71xx_ring_rx_refill(struct ag71xx *ag)
                                                  DMA_FROM_DEVICE);
 
                        ring->buf[i].skb = skb;
+                       ring->buf[i].dma_addr = dma_addr;
                        ring->buf[i].desc->data = (u32) dma_addr;
                }
 
@@ -684,6 +688,9 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit)
                pktlen = ag71xx_desc_pktlen(desc);
                pktlen -= ETH_FCS_LEN;
 
+               dma_unmap_single(&dev->dev, ring->buf[i].dma_addr,
+                                AG71XX_RX_PKT_SIZE, DMA_FROM_DEVICE);
+
                skb_put(skb, pktlen);
 
                skb->dev = dev;