ath10k: DMA related fixes for high latency devices
authorErik Stromdahl <erik.stromdahl@gmail.com>
Tue, 4 Sep 2018 12:05:23 +0000 (15:05 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 6 Sep 2018 16:14:37 +0000 (19:14 +0300)
Several DMA related functions (such as the dma_map_xxx functions)
are not used with high latency devices and don't need to be invoked
in this case.

Signed-off-by: Erik Stromdahl <erik.stromdahl@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/htc.c
drivers/net/wireless/ath/ath10k/htt_tx.c
drivers/net/wireless/ath/ath10k/txrx.c

index 4e70ff2..28daed5 100644 (file)
@@ -53,7 +53,8 @@ static inline void ath10k_htc_restore_tx_skb(struct ath10k_htc *htc,
 {
        struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
 
-       dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
+       if (htc->ar->dev_type != ATH10K_DEV_TYPE_HL)
+               dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
        skb_pull(skb, sizeof(struct ath10k_htc_hdr));
 }
 
@@ -137,11 +138,14 @@ int ath10k_htc_send(struct ath10k_htc *htc,
        ath10k_htc_prepare_tx_skb(ep, skb);
 
        skb_cb->eid = eid;
-       skb_cb->paddr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE);
-       ret = dma_mapping_error(dev, skb_cb->paddr);
-       if (ret) {
-               ret = -EIO;
-               goto err_credits;
+       if (ar->dev_type != ATH10K_DEV_TYPE_HL) {
+               skb_cb->paddr = dma_map_single(dev, skb->data, skb->len,
+                                              DMA_TO_DEVICE);
+               ret = dma_mapping_error(dev, skb_cb->paddr);
+               if (ret) {
+                       ret = -EIO;
+                       goto err_credits;
+               }
        }
 
        sg_item.transfer_id = ep->eid;
@@ -157,7 +161,8 @@ int ath10k_htc_send(struct ath10k_htc *htc,
        return 0;
 
 err_unmap:
-       dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
+       if (ar->dev_type != ATH10K_DEV_TYPE_HL)
+               dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
 err_credits:
        if (ep->tx_credit_flow_enabled) {
                spin_lock_bh(&htc->tx_lock);
index 7cff0d5..965acd5 100644 (file)
@@ -1123,7 +1123,8 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
        return 0;
 
 err_unmap_msdu:
-       dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
+       if (ar->dev_type != ATH10K_DEV_TYPE_HL)
+               dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
 err_free_txdesc:
        dev_kfree_skb_any(txdesc);
 err_free_msdu_id:
index cda164f..23606b6 100644 (file)
@@ -95,7 +95,8 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
                wake_up(&htt->empty_tx_wq);
        spin_unlock_bh(&htt->tx_lock);
 
-       dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
+       if (ar->dev_type != ATH10K_DEV_TYPE_HL)
+               dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
 
        ath10k_report_offchan_tx(htt->ar, msdu);