Commit d81bbb68 authored by Youghandhar Chintala's avatar Youghandhar Chintala Committed by Kalle Valo
Browse files

wifi: ath10k: Set tx credit to one for WCN3990 snoc based devices



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: default avatarYoughandhar Chintala <quic_youghand@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20220801134941.15216-1-quic_youghand@quicinc.com
parent 63757225
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -98,6 +98,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,
@@ -136,6 +137,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,
@@ -175,6 +177,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,
@@ -209,6 +212,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,
@@ -247,6 +251,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,
@@ -285,6 +290,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,
@@ -323,6 +329,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,
@@ -365,6 +372,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,
@@ -409,6 +417,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,
@@ -460,6 +469,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,
@@ -508,6 +518,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,
@@ -546,6 +557,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,
@@ -586,6 +598,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,
@@ -617,6 +630,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,
@@ -662,6 +676,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,
@@ -693,6 +708,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,
	},
};

+8 −3
Original line number Diff line number Diff line
@@ -947,13 +947,18 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
		return -ECOMM;
	}

	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)) {
+2 −0
Original line number Diff line number Diff line
@@ -635,6 +635,8 @@ struct ath10k_hw_params {
	bool dynamic_sar_support;

	bool hw_restart_disconnect;

	bool use_fw_tx_credits;
};

struct htt_resp;