rt2x00: Map extra_tx_headroom to DMA
authorIvo van Doorn <ivdoorn@gmail.com>
Fri, 29 Aug 2008 19:04:50 +0000 (21:04 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 29 Aug 2008 20:24:11 +0000 (16:24 -0400)
If a driver requests additional headroom it should
be mapped to DMA as well because it will be send to
the hardware as well (as form of extra descriptor).

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00queue.c

index d10a8012f387df5ab9d742843d0def80241962ab..2822684c505e9f2f6715a766e32235960e030173 100644 (file)
@@ -100,8 +100,21 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
 {
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
 
-       skbdesc->skb_dma = dma_map_single(rt2x00dev->dev, skb->data, skb->len,
-                                         DMA_TO_DEVICE);
+       /*
+        * If device has requested headroom, we should make sure that
+        * is also mapped to the DMA so it can be used for transfering
+        * additional descriptor information to the hardware.
+        */
+       skb_push(skb, rt2x00dev->hw->extra_tx_headroom);
+
+       skbdesc->skb_dma =
+           dma_map_single(rt2x00dev->dev, skb->data, skb->len, DMA_TO_DEVICE);
+
+       /*
+        * Restore data pointer to original location again.
+        */
+       skb_pull(skb, rt2x00dev->hw->extra_tx_headroom);
+
        skbdesc->flags |= SKBDESC_DMA_MAPPED_TX;
 }
 EXPORT_SYMBOL_GPL(rt2x00queue_map_txskb);
@@ -117,7 +130,12 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
        }
 
        if (skbdesc->flags & SKBDESC_DMA_MAPPED_TX) {
-               dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, skb->len,
+               /*
+                * Add headroom to the skb length, it has been removed
+                * by the driver, but it was actually mapped to DMA.
+                */
+               dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma,
+                                skb->len + rt2x00dev->hw->extra_tx_headroom,
                                 DMA_TO_DEVICE);
                skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX;
        }