lkml.org 
[lkml]   [2022]   [Oct]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.19 03/73] wifi: ath10k: Set tx credit to one for WCN3990 snoc based devices
    Date
    From: Youghandhar Chintala <quic_youghand@quicinc.com>

    [ Upstream commit d81bbb684c250a637186d9286d75b1cb04d2986c ]

    Currently host can send two WMI commands at once. There is possibility to
    cause SMMU issues or corruption, 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 (Source ring read index) for
    both DMA transfers and is in the middle of 2nd DMA. Host uses SRRI
    (Source ring read index) to interpret how many DMA’s have been completed
    and tries to unmap/free both the DMA entries. Hence now it is limiting to
    one.Because CE is still in the middle of 2nd DMA which can cause these
    issues when handling two DMA transfers.

    This change will not impact other targets, as it is only for WCN3990.

    Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.2.0-01387-QCAHLSWMTPLZ-1

    Signed-off-by: Youghandhar Chintala <quic_youghand@quicinc.com>
    Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
    Link: https://lore.kernel.org/r/20220801134941.15216-1-quic_youghand@quicinc.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/ath10k/core.c | 16 ++++++++++++++++
    drivers/net/wireless/ath/ath10k/htc.c | 11 ++++++++---
    drivers/net/wireless/ath/ath10k/hw.h | 2 ++
    3 files changed, 26 insertions(+), 3 deletions(-)

    diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
    index 688177453b07..07c4a4f0ed33 100644
    --- a/drivers/net/wireless/ath/ath10k/core.c
    +++ b/drivers/net/wireless/ath/ath10k/core.c
    @@ -95,6 +95,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = true,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA988X_HW_2_0_VERSION,
    @@ -133,6 +134,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = true,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA9887_HW_1_0_VERSION,
    @@ -172,6 +174,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA6174_HW_3_2_VERSION,
    @@ -206,6 +209,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .supports_peer_stats_info = true,
    .dynamic_sar_support = true,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA6174_HW_2_1_VERSION,
    @@ -244,6 +248,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA6174_HW_2_1_VERSION,
    @@ -282,6 +287,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA6174_HW_3_0_VERSION,
    @@ -320,6 +326,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA6174_HW_3_2_VERSION,
    @@ -362,6 +369,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .supports_peer_stats_info = true,
    .dynamic_sar_support = true,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA99X0_HW_2_0_DEV_VERSION,
    @@ -406,6 +414,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA9984_HW_1_0_DEV_VERSION,
    @@ -457,6 +466,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA9888_HW_2_0_DEV_VERSION,
    @@ -505,6 +515,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA9377_HW_1_0_DEV_VERSION,
    @@ -543,6 +554,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA9377_HW_1_1_DEV_VERSION,
    @@ -583,6 +595,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA9377_HW_1_1_DEV_VERSION,
    @@ -614,6 +627,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .credit_size_workaround = true,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = QCA4019_HW_1_0_DEV_VERSION,
    @@ -659,6 +673,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = false,
    .hw_restart_disconnect = false,
    + .use_fw_tx_credits = true,
    },
    {
    .id = WCN3990_HW_1_0_DEV_VERSION,
    @@ -690,6 +705,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
    .tx_stats_over_pktlog = false,
    .dynamic_sar_support = true,
    .hw_restart_disconnect = true,
    + .use_fw_tx_credits = false,
    },
    };

    diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c
    index fab398046a3f..6d1784f74bea 100644
    --- a/drivers/net/wireless/ath/ath10k/htc.c
    +++ b/drivers/net/wireless/ath/ath10k/htc.c
    @@ -947,13 +947,18 @@ 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.use_fw_tx_credits)
    + htc->total_transmit_credits = __le16_to_cpu(msg->ready.credit_count);
    + else
    + htc->total_transmit_credits = 1;
    +
    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/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
    index 93acf0dd580a..1b99f3a39a11 100644
    --- a/drivers/net/wireless/ath/ath10k/hw.h
    +++ b/drivers/net/wireless/ath/ath10k/hw.h
    @@ -635,6 +635,8 @@ struct ath10k_hw_params {
    bool dynamic_sar_support;

    bool hw_restart_disconnect;
    +
    + bool use_fw_tx_credits;
    };

    struct htt_resp;
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-10-10 00:27    [W:4.207 / U:0.484 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site