From: Vasanthakumar Thiagarajan Date: Mon, 15 Dec 2008 15:10:46 +0000 (+0530) Subject: ath9k: Synchronize DMA transfer with CPU at right place X-Git-Tag: v2.6.29-rc1~581^2~105^2~26 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=9bf9fca8dea70116016d32c2bf3f83170c8fba76;p=linux-2.6-omap-h63xx.git ath9k: Synchronize DMA transfer with CPU at right place This patch does pci_dma_sync_single_for_cpu() before accessing the header of the frame and queueing the same buffer into h/w. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville --- diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c index cc160fe9f81..462e08c3d09 100644 --- a/drivers/net/wireless/ath9k/recv.c +++ b/drivers/net/wireless/ath9k/recv.c @@ -519,6 +519,15 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) if (!skb) continue; + /* + * Synchronize the DMA transfer with CPU before + * 1. accessing the frame + * 2. requeueing the same buffer to h/w + */ + pci_dma_sync_single_for_cpu(sc->pdev, bf->bf_buf_addr, + sc->rx.bufsize, + PCI_DMA_FROMDEVICE); + /* * If we're asked to flush receive queue, directly * chain it back at the queue without processing it. @@ -547,10 +556,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) if (!requeue_skb) goto requeue; - /* Sync and unmap the frame */ - pci_dma_sync_single_for_cpu(sc->pdev, bf->bf_buf_addr, - sc->rx.bufsize, - PCI_DMA_FROMDEVICE); + /* Unmap the frame */ pci_unmap_single(sc->pdev, bf->bf_buf_addr, sc->rx.bufsize, PCI_DMA_FROMDEVICE);