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 <quic_youghand@xxxxxxxxxxx> --- 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