diff options
| author | Christian Lamparter <chunkeey@googlemail.com> | 2011-02-10 19:48:42 -0500 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2011-02-21 15:17:51 -0500 |
| commit | 0bf719dfdecc5552155cbec78e49fa06e531e35c (patch) | |
| tree | 03e24faaf508afcea36d4b277a4dae4d7811188c | |
| parent | 4f919a3bc54da01db829c520ce4b1fabfde1c3f7 (diff) | |
p54pci: update receive dma buffers before and after processing
Documentation/DMA-API-HOWTO.txt states:
"DMA transfers need to be synced properly in order for
the cpu and device to see the most uptodate and correct
copy of the DMA buffer."
Cc: <stable@kernel.org>
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/p54/p54pci.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index 1eacba4daa5b..0494d7b102d4 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
| @@ -199,6 +199,7 @@ static void p54p_check_rx_ring(struct ieee80211_hw *dev, u32 *index, | |||
| 199 | while (i != idx) { | 199 | while (i != idx) { |
| 200 | u16 len; | 200 | u16 len; |
| 201 | struct sk_buff *skb; | 201 | struct sk_buff *skb; |
| 202 | dma_addr_t dma_addr; | ||
| 202 | desc = &ring[i]; | 203 | desc = &ring[i]; |
| 203 | len = le16_to_cpu(desc->len); | 204 | len = le16_to_cpu(desc->len); |
| 204 | skb = rx_buf[i]; | 205 | skb = rx_buf[i]; |
| @@ -216,17 +217,20 @@ static void p54p_check_rx_ring(struct ieee80211_hw *dev, u32 *index, | |||
| 216 | 217 | ||
| 217 | len = priv->common.rx_mtu; | 218 | len = priv->common.rx_mtu; |
| 218 | } | 219 | } |
| 220 | dma_addr = le32_to_cpu(desc->host_addr); | ||
| 221 | pci_dma_sync_single_for_cpu(priv->pdev, dma_addr, | ||
| 222 | priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE); | ||
| 219 | skb_put(skb, len); | 223 | skb_put(skb, len); |
| 220 | 224 | ||
| 221 | if (p54_rx(dev, skb)) { | 225 | if (p54_rx(dev, skb)) { |
| 222 | pci_unmap_single(priv->pdev, | 226 | pci_unmap_single(priv->pdev, dma_addr, |
| 223 | le32_to_cpu(desc->host_addr), | 227 | priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE); |
| 224 | priv->common.rx_mtu + 32, | ||
| 225 | PCI_DMA_FROMDEVICE); | ||
| 226 | rx_buf[i] = NULL; | 228 | rx_buf[i] = NULL; |
| 227 | desc->host_addr = 0; | 229 | desc->host_addr = cpu_to_le32(0); |
| 228 | } else { | 230 | } else { |
| 229 | skb_trim(skb, 0); | 231 | skb_trim(skb, 0); |
| 232 | pci_dma_sync_single_for_device(priv->pdev, dma_addr, | ||
| 233 | priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE); | ||
| 230 | desc->len = cpu_to_le16(priv->common.rx_mtu + 32); | 234 | desc->len = cpu_to_le16(priv->common.rx_mtu + 32); |
| 231 | } | 235 | } |
| 232 | 236 | ||
