From patchwork Fri Jan 21 06:44:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Youghandhar Chintala X-Patchwork-Id: 534473 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83CF2C433EF for ; Fri, 21 Jan 2022 06:44:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378767AbiAUGor (ORCPT ); Fri, 21 Jan 2022 01:44:47 -0500 Received: from alexa-out.qualcomm.com ([129.46.98.28]:33381 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378763AbiAUGor (ORCPT ); Fri, 21 Jan 2022 01:44:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1642747487; x=1674283487; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=+zRG3gH0OAuV4AFliy9juiq8ATfYC/v57zrcVecvZMY=; b=fXwzptY0fg/XdNYQjGR0ozBp/X/+TtwpoNisCqQL9UaJy9br+GCCTGUR ef0OAjCbpal3yNRSuu9823HaCZ6o1HY3wRiQADlHdCfXcApRC2cn+XPz4 5mtG3x3Bk+Peg0COczun4cYFsRA6qgtVbofWft2IVpwgGw8xZfCMfcnhk Q=; Received: from ironmsg08-lv.qualcomm.com ([10.47.202.152]) by alexa-out.qualcomm.com with ESMTP; 20 Jan 2022 22:44:47 -0800 X-QCInternal: smtphost Received: from ironmsg01-blr.qualcomm.com ([10.86.208.130]) by ironmsg08-lv.qualcomm.com with ESMTP/TLS/AES256-SHA; 20 Jan 2022 22:44:45 -0800 X-QCInternal: smtphost Received: from unknown (HELO youghand-linux.qualcomm.com) ([10.206.66.115]) by ironmsg01-blr.qualcomm.com with ESMTP; 21 Jan 2022 12:14:33 +0530 Received: by youghand-linux.qualcomm.com (Postfix, from userid 2370257) id 3DA5B225AE; Fri, 21 Jan 2022 12:14:32 +0530 (IST) From: Youghandhar Chintala To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, quic_pillair@quicinc.com, dianders@chromium.org, kuabhs@chromium.org, briannorris@chromium.org, Youghandhar Chintala Subject: [RFC 1/2] ath10k: Set tx credit to one for wcn3990 snoc based devices Date: Fri, 21 Jan 2022 12:14:26 +0530 Message-Id: <20220121064427.32059-2-quic_youghand@quicinc.com> X-Mailer: git-send-email 2.29.0 In-Reply-To: <20220121064427.32059-1-quic_youghand@quicinc.com> References: <20220121064427.32059-1-quic_youghand@quicinc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Currently for WCN3990, the host driver can send two wmi commands at once, now it is limiting to one because if HOST wants to initiate 2 DMA transfers, it is possible when copy complete interrupt for first DMA reaches HOST, CE has already updated SRRI for both DMA transfers and is in the middle of 2nd DMA.HOST uses SRRI to interpret how many DMA’s have been completed and tries to unmap/free both the DMA entries, but CE is still in the middle of 2nd DMA which can cause SMMU issues or corruption. Tested-on: WLAN.HL.3.2.2.c10-00757-QCAHLSWMTPL-1 Signed-off-by: Youghandhar Chintala --- drivers/net/wireless/ath/ath10k/core.c | 15 +++++++++++++++ drivers/net/wireless/ath/ath10k/htc.c | 13 ++++++++++--- drivers/net/wireless/ath/ath10k/htc.h | 1 + drivers/net/wireless/ath/ath10k/hw.h | 3 +++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index f0e12556e7dce..fcaed7d176568 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c @@ -92,6 +92,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = true, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA988X_HW_2_0_VERSION, @@ -128,6 +129,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = true, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA9887_HW_1_0_VERSION, @@ -165,6 +167,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA6174_HW_3_2_VERSION, @@ -196,6 +199,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_mac_seq_by_fw = false, .bmi_large_size_download = true, .dynamic_sar_support = true, + .tx_credit_limit = false, }, { .id = QCA6174_HW_2_1_VERSION, @@ -232,6 +236,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA6174_HW_2_1_VERSION, @@ -268,6 +273,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA6174_HW_3_0_VERSION, @@ -304,6 +310,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA6174_HW_3_2_VERSION, @@ -343,6 +350,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = true, + .tx_credit_limit = false, }, { .id = QCA99X0_HW_2_0_DEV_VERSION, @@ -385,6 +393,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA9984_HW_1_0_DEV_VERSION, @@ -434,6 +443,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA9888_HW_2_0_DEV_VERSION, @@ -480,6 +490,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA9377_HW_1_0_DEV_VERSION, @@ -516,6 +527,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA9377_HW_1_1_DEV_VERSION, @@ -554,6 +566,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = QCA9377_HW_1_1_DEV_VERSION, @@ -625,6 +638,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = false, .dynamic_sar_support = false, + .tx_credit_limit = false, }, { .id = WCN3990_HW_1_0_DEV_VERSION, @@ -654,6 +668,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { .tx_stats_over_pktlog = false, .tx_mac_seq_by_fw = true, .dynamic_sar_support = true, + .tx_credit_limit = true, }, }; diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c index 61ee413d902a7..108980476d654 100644 --- a/drivers/net/wireless/ath/ath10k/htc.c +++ b/drivers/net/wireless/ath/ath10k/htc.c @@ -630,13 +630,20 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc) return -ECOMM; } - htc->total_transmit_credits = __le16_to_cpu(msg->ready.credit_count); + if (ar->hw_params.tx_credit_limit) + htc->total_transmit_credits = + __le16_to_cpu(HTC_HOST_MAX_CREDIT_COUNT); + else + htc->total_transmit_credits = + __le16_to_cpu(msg->ready.credit_count); + htc->target_credit_size = __le16_to_cpu(msg->ready.credit_size); ath10k_dbg(ar, ATH10K_DBG_HTC, - "Target ready! transmit resources: %d size:%d\n", + "Target ready! transmit resources: %d size:%d actual credits:%d\n", htc->total_transmit_credits, - htc->target_credit_size); + htc->target_credit_size, + msg->ready.credit_count); if ((htc->total_transmit_credits == 0) || (htc->target_credit_size == 0)) { diff --git a/drivers/net/wireless/ath/ath10k/htc.h b/drivers/net/wireless/ath/ath10k/htc.h index 14e5c3f712c11..a84d76f062d36 100644 --- a/drivers/net/wireless/ath/ath10k/htc.h +++ b/drivers/net/wireless/ath/ath10k/htc.h @@ -41,6 +41,7 @@ struct ath10k; */ #define HTC_HOST_MAX_MSG_PER_RX_BUNDLE 32 +#define HTC_HOST_MAX_CREDIT_COUNT 1 enum ath10k_htc_tx_flags { ATH10K_HTC_FLAG_NEED_CREDIT_UPDATE = 0x01, diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h index 0dec9f01cd4dd..0d96df311b026 100644 --- a/drivers/net/wireless/ath/ath10k/hw.h +++ b/drivers/net/wireless/ath/ath10k/hw.h @@ -625,6 +625,9 @@ struct ath10k_hw_params { bool tx_mac_seq_by_fw; bool dynamic_sar_support; + + /* limit tx credit */ + bool tx_credit_limit; }; struct htt_rx_desc; From patchwork Fri Jan 21 06:44:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Youghandhar Chintala X-Patchwork-Id: 534094 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5171C433EF for ; Fri, 21 Jan 2022 06:44:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378703AbiAUGop (ORCPT ); Fri, 21 Jan 2022 01:44:45 -0500 Received: from alexa-out.qualcomm.com ([129.46.98.28]:33381 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343722AbiAUGop (ORCPT ); Fri, 21 Jan 2022 01:44:45 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1642747485; x=1674283485; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gnN8J7Hmx0zp2CogqSWzfQlfG3AuVKS1SW9uZDHI86I=; b=CAJKEDuLa3z8/ABriOJF7ov1V3BVxjlfSsROLwzBhdJ0VtZE3zoLDKB7 psJwCEjhmfwTkmSBcQ6vzw78iLTNxAnsJiCwRw7k+rCiDSYrtDgVw8yFd OCp92KMr0+bSY9tDU+n8UkgyUsV4W9FnyJq+KvBfDqGfUhhokBgL/UbiP E=; Received: from ironmsg08-lv.qualcomm.com ([10.47.202.152]) by alexa-out.qualcomm.com with ESMTP; 20 Jan 2022 22:44:45 -0800 X-QCInternal: smtphost Received: from ironmsg01-blr.qualcomm.com ([10.86.208.130]) by ironmsg08-lv.qualcomm.com with ESMTP/TLS/AES256-SHA; 20 Jan 2022 22:44:43 -0800 X-QCInternal: smtphost Received: from unknown (HELO youghand-linux.qualcomm.com) ([10.206.66.115]) by ironmsg01-blr.qualcomm.com with ESMTP; 21 Jan 2022 12:14:35 +0530 Received: by youghand-linux.qualcomm.com (Postfix, from userid 2370257) id C04EA225AE; Fri, 21 Jan 2022 12:14:34 +0530 (IST) From: Youghandhar Chintala To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, quic_pillair@quicinc.com, dianders@chromium.org, kuabhs@chromium.org, briannorris@chromium.org, Youghandhar Chintala Subject: [RFC 2/2] ath10k: Delay the unmapping of the buffer Date: Fri, 21 Jan 2022 12:14:27 +0530 Message-Id: <20220121064427.32059-3-quic_youghand@quicinc.com> X-Mailer: git-send-email 2.29.0 In-Reply-To: <20220121064427.32059-1-quic_youghand@quicinc.com> References: <20220121064427.32059-1-quic_youghand@quicinc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org 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 --- 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;