Просмотр исходного кода

qcacld-3.0: Change to set proper tx power for Auto case

Tx power not set in case when user sets tx power as auto.
When user set tx power as auto now, host will configure
the tx power as max regulatory power allowed for
that channel. It signifies that it is the upper
limit for tx power used while transmission.

Change-Id: I98e53e417fa72c58ef8b22017a9a622ba8ccb257
CRs-Fixed: 3478243
Shailendra Singh 2 лет назад
Родитель
Сommit
4bfe79ebff
1 измененных файлов с 27 добавлено и 17 удалено
  1. 27 17
      core/wma/src/wma_power.c

+ 27 - 17
core/wma/src/wma_power.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -334,9 +334,11 @@ void wma_set_max_tx_power(WMA_HANDLE handle,
 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
 	uint8_t vdev_id;
 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
-	int8_t prev_max_power;
 	int8_t max_reg_power;
 	struct wma_txrx_node *iface;
+	int8_t max_tx_power;
+	struct wlan_channel *channel;
+	uint16_t ch_freq;
 
 	if (tx_pwr_params->dev_mode == QDF_SAP_MODE ||
 	    tx_pwr_params->dev_mode == QDF_P2P_GO_MODE) {
@@ -362,25 +364,33 @@ void wma_set_max_tx_power(WMA_HANDLE handle,
 	}
 
 	iface = &wma_handle->interfaces[vdev_id];
-	prev_max_power = mlme_get_max_reg_power(iface->vdev);
-
-	mlme_set_max_reg_power(iface->vdev, tx_pwr_params->power);
-
-	max_reg_power = mlme_get_max_reg_power(iface->vdev);
-
-	if (max_reg_power == 0) {
-		ret = QDF_STATUS_SUCCESS;
-		goto end;
+	channel = wlan_vdev_get_active_channel(iface->vdev);
+	if (channel) {
+		ch_freq = channel->ch_freq;
+	} else {
+		wma_err("Failed to get active channel");
+		qdf_mem_free(tx_pwr_params);
+		return;
 	}
-	wma_nofl_debug("TXP[W][set_max_pwr_req]: %d", max_reg_power);
+	max_reg_power = wlan_reg_get_channel_reg_power_for_freq(
+			wma_handle->mac_context->pdev, ch_freq);
+	/*
+	 * When user tx power as auto, host will configure
+	 * the tx power as max regulatory power allowed for
+	 * that channel which signifies that it will be the
+	 * upper limit for tx power used while transmission
+	 */
+	if (tx_pwr_params->power == 0)
+		max_tx_power = max_reg_power;
+	else
+		max_tx_power = QDF_MIN(tx_pwr_params->power, max_reg_power);
+
+	wma_nofl_debug("TXP[W][set_max_pwr_req]: %d", max_tx_power);
 	ret = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
 				wmi_vdev_param_tx_pwrlimit,
-				max_reg_power);
+				max_tx_power);
 	if (ret == QDF_STATUS_SUCCESS)
-		mlme_set_tx_power(iface->vdev, max_reg_power);
-	else
-		mlme_set_max_reg_power(iface->vdev, prev_max_power);
-end:
+		mlme_set_tx_power(iface->vdev, max_tx_power);
 	qdf_mem_free(tx_pwr_params);
 	if (QDF_IS_STATUS_ERROR(ret))
 		wma_err("Failed to set vdev param wmi_vdev_param_tx_pwrlimit");