+@@ -700,12 +700,16 @@ static bool ath_edma_get_buffers(struct
+ bf = SKB_CB_ATHBUF(skb);
+ BUG_ON(!bf);
+
+- dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
++ dma_sync_single_for_cpu(sc->dev, bf->bf_buf_addr,
+ common->rx_bufsize, DMA_FROM_DEVICE);
+
+ ret = ath9k_hw_process_rxdesc_edma(ah, NULL, skb->data);
+- if (ret == -EINPROGRESS)
++ if (ret == -EINPROGRESS) {
++ /*let device gain the buffer again*/
++ dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
++ common->rx_bufsize, DMA_FROM_DEVICE);
+ return false;
++ }
+
+ __skb_unlink(skb, &rx_edma->rx_fifo);
+ if (ret == -EINVAL) {
+@@ -814,13 +818,266 @@ static struct ath_buf *ath_get_next_rx_b
+ * 1. accessing the frame
+ * 2. requeueing the same buffer to h/w
+ */
+- dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
++ dma_sync_single_for_cpu(sc->dev, bf->bf_buf_addr,
+ common->rx_bufsize,
+ DMA_FROM_DEVICE);
+