We are seeing a corner case smmu fault issue where copy engine is still
accessing the memory though host unmaps it hence as work around
we are delaying the unmapping the memory.

Tested-on: WLAN.HL.3.2.2.c10-00757-QCAHLSWMTPL-1

Signed-off-by: Youghandhar Chintala <[email protected]>
---
 drivers/net/wireless/ath/ath10k/core.c | 15 +++++++++++++++
 drivers/net/wireless/ath/ath10k/htc.c  |  5 +++++
 drivers/net/wireless/ath/ath10k/hw.h   |  3 +++
 3 files changed, 23 insertions(+)

diff --git a/drivers/net/wireless/ath/ath10k/core.c 
b/drivers/net/wireless/ath/ath10k/core.c
index fcaed7d176568..65f775fb5ccab 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -93,6 +93,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] 
= {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA988X_HW_2_0_VERSION,
@@ -130,6 +131,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA9887_HW_1_0_VERSION,
@@ -168,6 +170,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA6174_HW_3_2_VERSION,
@@ -200,6 +203,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .bmi_large_size_download = true,
                .dynamic_sar_support = true,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA6174_HW_2_1_VERSION,
@@ -237,6 +241,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA6174_HW_2_1_VERSION,
@@ -274,6 +279,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA6174_HW_3_0_VERSION,
@@ -311,6 +317,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA6174_HW_3_2_VERSION,
@@ -351,6 +358,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = true,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA99X0_HW_2_0_DEV_VERSION,
@@ -394,6 +402,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA9984_HW_1_0_DEV_VERSION,
@@ -444,6 +453,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA9888_HW_2_0_DEV_VERSION,
@@ -491,6 +501,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA9377_HW_1_0_DEV_VERSION,
@@ -528,6 +539,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA9377_HW_1_1_DEV_VERSION,
@@ -567,6 +579,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = QCA9377_HW_1_1_DEV_VERSION,
@@ -639,6 +652,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = false,
                .dynamic_sar_support = false,
                .tx_credit_limit = false,
+               .delay_unmap_buffer = false,
        },
        {
                .id = WCN3990_HW_1_0_DEV_VERSION,
@@ -669,6 +683,7 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .tx_mac_seq_by_fw = true,
                .dynamic_sar_support = true,
                .tx_credit_limit = true,
+               .delay_unmap_buffer = true,
        },
 };
 
diff --git a/drivers/net/wireless/ath/ath10k/htc.c 
b/drivers/net/wireless/ath/ath10k/htc.c
index 108980476d654..e2640f244918e 100644
--- a/drivers/net/wireless/ath/ath10k/htc.c
+++ b/drivers/net/wireless/ath/ath10k/htc.c
@@ -55,6 +55,11 @@ void ath10k_htc_notify_tx_completion(struct ath10k_htc_ep 
*ep,
        ath10k_dbg(ar, ATH10K_DBG_HTC, "%s: ep %d skb %pK\n", __func__,
                   ep->eid, skb);
 
+       /* WAR - Delay the unmapping of the buffer */
+       if (ar->hw_params.delay_unmap_buffer &&
+           ep->ul_pipe_id == 3)
+               mdelay(2);
+
        ath10k_htc_restore_tx_skb(ep->htc, skb);
 
        if (!ep->ep_ops.ep_tx_complete) {
diff --git a/drivers/net/wireless/ath/ath10k/hw.h 
b/drivers/net/wireless/ath/ath10k/hw.h
index 0d96df311b026..3f7539e8da0fc 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -628,6 +628,9 @@ struct ath10k_hw_params {
 
        /* limit tx credit */
        bool tx_credit_limit;
+
+       /* WAR - Delay the unmapping of the buffer */
+       bool delay_unmap_buffer;
 };
 
 struct htt_rx_desc;
-- 
2.29.0


_______________________________________________
ath10k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath10k

Reply via email to