]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mwifiex: use pci_dma_sync_single* APIs
authorAmitkumar Karwar <akarwar@marvell.com>
Tue, 24 Jan 2017 13:35:45 +0000 (19:05 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Sat, 28 Jan 2017 07:10:04 +0000 (09:10 +0200)
On some platforms, driver is unable read sleep cookie signature even
if firmware has written it through DMA. The problem is fixed by using
pci_dma_sync_single* APIs while reading DMA buffer shared with firmware.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/pcie.c

index 3f4ca28356acb683c06e44923325941a152dddee..a0d918094889df6cd9de14046b773d6112b2006b 100644 (file)
@@ -439,9 +439,14 @@ static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
        struct pcie_service_card *card = adapter->card;
        u8 *buffer;
        u32 sleep_cookie, count;
+       struct sk_buff *cmdrsp = card->cmdrsp_buf;
 
        for (count = 0; count < max_delay_loop_cnt; count++) {
-               buffer = card->cmdrsp_buf->data;
+               pci_dma_sync_single_for_cpu(card->dev,
+                                           MWIFIEX_SKB_DMA_ADDR(cmdrsp),
+                                           sizeof(sleep_cookie),
+                                           PCI_DMA_FROMDEVICE);
+               buffer = cmdrsp->data;
                sleep_cookie = READ_ONCE(*(u32 *)buffer);
 
                if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
@@ -449,6 +454,10 @@ static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
                                    "sleep cookie found at count %d\n", count);
                        break;
                }
+               pci_dma_sync_single_for_device(card->dev,
+                                              MWIFIEX_SKB_DMA_ADDR(cmdrsp),
+                                              sizeof(sleep_cookie),
+                                              PCI_DMA_FROMDEVICE);
                usleep_range(20, 30);
        }