瀏覽代碼

iwlagn: fix DMA sync

For the RX DMA fix for iwlwifi ("iwlagn: fix RX skb alignment") Luis
pointed out:

> aligned_dma_addr can obviously be > real_dma_addr at this point, what
> guarantees we can use it on our own whim?

I asked around, and he's right, there may be platforms that do not allow
passing such such an address to the DMA API functions. This patch
changes it by using the proper dma_sync_single_range_for_cpu API
invented for this purpose.

Cc: Luis R. Rodriguez <mcgrof@gmail.com>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Johannes Berg 16 年之前
父節點
當前提交
e91af0af86
共有 1 個文件被更改,包括 5 次插入3 次删除
  1. 5 3
      drivers/net/wireless/iwlwifi/iwl-agn.c

+ 5 - 3
drivers/net/wireless/iwlwifi/iwl-agn.c

@@ -1384,9 +1384,11 @@ void iwl_rx_handle(struct iwl_priv *priv)
 
 
 		rxq->queue[i] = NULL;
 		rxq->queue[i] = NULL;
 
 
-		pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr,
-					    priv->hw_params.rx_buf_size,
-					    PCI_DMA_FROMDEVICE);
+		dma_sync_single_range_for_cpu(
+				&priv->pci_dev->dev, rxb->real_dma_addr,
+				rxb->aligned_dma_addr - rxb->real_dma_addr,
+				priv->hw_params.rx_buf_size,
+				PCI_DMA_FROMDEVICE);
 		pkt = (struct iwl_rx_packet *)rxb->skb->data;
 		pkt = (struct iwl_rx_packet *)rxb->skb->data;
 
 
 		/* Reclaim a command buffer only if this packet is a response
 		/* Reclaim a command buffer only if this packet is a response