qcacld-3.0: Add support for WLAN thermal mitigation

As part of new requirement WLAN subsystem needs to perform thermal
mitigation action as per the thermal state of the device. The
wifi hal sends vendor command QCA_NL80211_VENDOR_SUBCMD_THERMAL_CMD
with the thermal level parameter and wlan host performs the required
appropriate action. wlan host driver maps the thermal level to
corresponding duty cycle off percent value and duty cycle value,
send WMI_THERM_THROT_SET_CONF_CMDID cmd to FW.

Make changes to perform vendor command handling, mapping thermal level
to duty cycle value and communicating the thermal information to FW.

change-ID: I77175048c817ab755cdb838018e414ef3ee0b112
CRs-Fixed: 2610395
diff --git a/Kbuild b/Kbuild
index 9b49cf0..fff9d74 100644
--- a/Kbuild
+++ b/Kbuild
@@ -269,6 +269,10 @@
 HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_hw_capability.o
 endif
 
+ifeq ($(CONFIG_FW_THERMAL_THROTTLE), y)
+HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_thermal.o
+endif
+
 ###### OSIF_SYNC ########
 SYNC_DIR := os_if/sync
 SYNC_INC_DIR := $(SYNC_DIR)/inc
@@ -2823,6 +2827,9 @@
 #Flag to enable/disable WIPS feature
 cppflags-$(CONFIG_WLAN_BCN_RECV_FEATURE) += -DWLAN_BCN_RECV_FEATURE
 
+#Flag to enable/disable thermal mitigation
+cppflags-$(CONFIG_FW_THERMAL_THROTTLE) += -DFW_THERMAL_THROTTLE
+
 #Flag to enable/disable LTE COEX support
 cppflags-$(CONFIG_LTE_COEX) += -DLTE_COEX
 
diff --git a/components/fw_offload/core/inc/wlan_fw_offload_main.h b/components/fw_offload/core/inc/wlan_fw_offload_main.h
index 2464e9b..4609b7d 100644
--- a/components/fw_offload/core/inc/wlan_fw_offload_main.h
+++ b/components/fw_offload/core/inc/wlan_fw_offload_main.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012 - 2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012 - 2020 The Linux Foundation. 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
@@ -100,7 +100,7 @@
 };
 
 #define FWOL_THERMAL_LEVEL_MAX 4
-#define FWOL_THERMAL_THROTTLE_LEVEL_MAX 4
+#define FWOL_THERMAL_THROTTLE_LEVEL_MAX 6
 /*
  * struct wlan_fwol_thermal_temp - Thermal temperature config items
  * @thermal_temp_min_level: Array of temperature minimum levels
@@ -108,6 +108,7 @@
  * @thermal_mitigation_enable: Control for Thermal mitigation feature
  * @throttle_period: Thermal throttle period value
  * @throttle_dutycycle_level: Array of throttle duty cycle levels
+ * @thermal_sampling_time: sampling time for thermal mitigation in ms
  */
 struct wlan_fwol_thermal_temp {
 	bool     thermal_mitigation_enable;
@@ -115,6 +116,7 @@
 	uint16_t thermal_temp_min_level[FWOL_THERMAL_LEVEL_MAX];
 	uint16_t thermal_temp_max_level[FWOL_THERMAL_LEVEL_MAX];
 	uint32_t throttle_dutycycle_level[FWOL_THERMAL_THROTTLE_LEVEL_MAX];
+	uint16_t thermal_sampling_time;
 };
 
 /**
diff --git a/components/fw_offload/core/src/wlan_fw_offload_main.c b/components/fw_offload/core/src/wlan_fw_offload_main.c
index 4010ede..771781a 100644
--- a/components/fw_offload/core/src/wlan_fw_offload_main.c
+++ b/components/fw_offload/core/src/wlan_fw_offload_main.c
@@ -132,14 +132,20 @@
 	thermal_temp->thermal_mitigation_enable =
 				cfg_get(psoc, CFG_THERMAL_MITIGATION_ENABLE);
 	thermal_temp->throttle_period = cfg_get(psoc, CFG_THROTTLE_PERIOD);
+	thermal_temp->thermal_sampling_time =
+				cfg_get(psoc, CFG_THERMAL_SAMPLING_TIME);
 	thermal_temp->throttle_dutycycle_level[0] =
 				cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL0);
-	thermal_temp->throttle_dutycycle_level[1]=
+	thermal_temp->throttle_dutycycle_level[1] =
 				cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL1);
-	thermal_temp->throttle_dutycycle_level[2]=
+	thermal_temp->throttle_dutycycle_level[2] =
 				cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL2);
-	thermal_temp->throttle_dutycycle_level[3]=
+	thermal_temp->throttle_dutycycle_level[3] =
 				cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL3);
+	thermal_temp->throttle_dutycycle_level[4] =
+				cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL4);
+	thermal_temp->throttle_dutycycle_level[5] =
+				cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL5);
 }
 
 QDF_STATUS fwol_init_neighbor_report_cfg(struct wlan_objmgr_psoc *psoc,
diff --git a/components/fw_offload/dispatcher/inc/cfg_thermal_temp.h b/components/fw_offload/dispatcher/inc/cfg_thermal_temp.h
index 54d84a0..e500a10 100644
--- a/components/fw_offload/dispatcher/inc/cfg_thermal_temp.h
+++ b/components/fw_offload/dispatcher/inc/cfg_thermal_temp.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018,2020 The Linux Foundation. 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
@@ -234,7 +234,7 @@
  * gThrottleDutyCycleLevel1 - Set Thermal mitigation throttle duty cycle level1
  * @Min: 0
  * @Max: 100
- * @Default: 50
+ * @Default: 10
  *
  * Usage: External
  *
@@ -244,7 +244,7 @@
 			"gThrottleDutyCycleLevel1", \
 			0, \
 			100, \
-			50, \
+			10, \
 			CFG_VALUE_OR_DEFAULT, \
 			"Thermal mitigation throttle duty cycle level1")
 
@@ -253,7 +253,7 @@
  * gThrottleDutyCycleLevel2 - Set Thermal mitigation throttle duty cycle level2
  * @Min: 0
  * @Max: 100
- * @Default: 75
+ * @Default: 30
  *
  * Usage: External
  *
@@ -263,7 +263,7 @@
 			"gThrottleDutyCycleLevel2", \
 			0, \
 			100, \
-			75, \
+			30, \
 			CFG_VALUE_OR_DEFAULT, \
 			"Thermal mitigation throttle duty cycle level2")
 
@@ -272,7 +272,7 @@
  * gThrottleDutyCycleLevel3 - Set Thermal mitigation throttle duty cycle level3
  * @Min: 0
  * @Max: 100
- * @Default: 94
+ * @Default: 50
  *
  * Usage: External
  *
@@ -282,10 +282,74 @@
 			"gThrottleDutyCycleLevel3", \
 			0, \
 			100, \
-			94, \
+			50, \
 			CFG_VALUE_OR_DEFAULT, \
 			"Thermal mitigation throttle duty cycle level3")
 
+/*
+ * <ini>
+ * gThrottleDutyCycleLevel4 - Set Thermal mitigation throttle duty cycle level4
+ * @Min: 0
+ * @Max: 100
+ * @Default: 70
+ *
+ * This ini will apply the thermal throttle duty cycle value in FW
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL4 CFG_INI_UINT( \
+			"gThrottleDutyCycleLevel4", \
+			0, \
+			100, \
+			70, \
+			CFG_VALUE_OR_DEFAULT, \
+			"Thermal mitigation throttle duty cycle level4")
+
+/*
+ * <ini>
+ * gThrottleDutyCycleLevel5 - Set Thermal mitigation throttle duty cycle level5
+ * @Min: 0
+ * @Max: 100
+ * @Default: 90
+ *
+ * This ini will apply the thermal throttle duty cycle value in FW
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL5 CFG_INI_UINT( \
+			"gThrottleDutyCycleLevel5", \
+			0, \
+			100, \
+			90, \
+			CFG_VALUE_OR_DEFAULT, \
+			"Thermal mitigation throttle duty cycle level5")
+
+/* <ini>
+ *gThermalSamplingTime - Configure the thermal mitigation sampling time in ms.
+ *
+ * @Min: 10
+ * @Max: 100
+ * @Default: 100
+ *
+ * This ini will control the sampling time that the thermal mitigation in FW
+ * will consider while applying the duty cycle.
+ *
+ * Usage: External
+ *
+ * Supported features: Thermal Mitigation
+ *
+ *</ini>
+ */
+#define CFG_THERMAL_SAMPLING_TIME CFG_INI_UINT( \
+				"gThermalSamplingTime", \
+				10, \
+				100, \
+				100, \
+				CFG_VALUE_OR_DEFAULT, \
+				"Thermal mitigation sampling time")
+
 #define CFG_THERMAL_TEMP_ALL \
 	CFG(CFG_THERMAL_TEMP_MIN_LEVEL0) \
 	CFG(CFG_THERMAL_TEMP_MAX_LEVEL0) \
@@ -300,7 +364,10 @@
 	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL0) \
 	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL1) \
 	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL2) \
-	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL3)
+	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL3) \
+	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL4) \
+	CFG(CFG_THROTTLE_DUTY_CYCLE_LEVEL5) \
+	CFG(CFG_THERMAL_SAMPLING_TIME)
 
 #endif
 
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 527ab5a..4a82b47 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -143,6 +143,8 @@
 #include "wlan_hdd_oemdata.h"
 #include "os_if_fwol.h"
 #include "wlan_hdd_sta_info.h"
+#include "sme_api.h"
+#include "wlan_hdd_thermal.h"
 #include <ol_defines.h>
 
 #define g_mode_rates_size (12)
@@ -3886,6 +3888,11 @@
 	wlan_hdd_cfg80211_set_feature(feature_flags,
 			QCA_WLAN_VENDOR_FEATURE_SELF_MANAGED_REGULATORY);
 #endif
+
+	if (wlan_hdd_thermal_config_support())
+		wlan_hdd_cfg80211_set_feature(feature_flags,
+					QCA_WLAN_VENDOR_FEATURE_THERMAL_CONFIG);
+
 	skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(feature_flags) +
 			NLMSG_HDRLEN);
 
@@ -14183,7 +14190,6 @@
 			 WIPHY_VENDOR_CMD_NEED_RUNNING,
 		.doit = wlan_hdd_cfg80211_extscan_get_valid_channels
 	},
-
 #ifdef WLAN_FEATURE_STATS_EXT
 	{
 		.info.vendor_id = QCA_NL80211_VENDOR_ID,
@@ -14797,6 +14803,7 @@
 	FEATURE_COEX_CONFIG_COMMANDS
 	FEATURE_MPTA_HELPER_COMMANDS
 	FEATURE_HW_CAPABILITY_COMMANDS
+	FEATURE_THERMAL_VENDOR_COMMANDS
 };
 
 struct hdd_context *hdd_cfg80211_wiphy_alloc(void)
diff --git a/core/hdd/src/wlan_hdd_thermal.c b/core/hdd/src/wlan_hdd_thermal.c
new file mode 100644
index 0000000..fb09212
--- /dev/null
+++ b/core/hdd/src/wlan_hdd_thermal.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2020 The Linux Foundation. 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: wlan_hdd_thermal.c
+ *
+ * WLAN Host Device Driver implementation for thermal mitigation handling
+ */
+
+#include <wlan_hdd_includes.h>
+#include <net/cfg80211.h>
+#include "wlan_osif_priv.h"
+#include "qdf_trace.h"
+#include "wlan_hdd_main.h"
+#include "osif_sync.h"
+#include <linux/limits.h>
+#include <wlan_hdd_object_manager.h>
+#include "sme_api.h"
+#include "wlan_hdd_thermal.h"
+#include "wlan_hdd_cfg80211.h"
+#include <qca_vendor.h>
+#include "wlan_fwol_ucfg_api.h"
+
+static const struct nla_policy
+	wlan_hdd_thermal_mitigation_policy
+	[QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_MAX + 1] = {
+		[QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_VALUE] = {.type = NLA_U32},
+		[QCA_WLAN_VENDOR_ATTR_THERMAL_LEVEL] = {
+						.type = NLA_U32},
+};
+
+/**
+ * __wlan_hdd_cfg80211_set_thermal_mitigation_policy() - Set the thermal policy
+ * @wiphy: Pointer to wireless phy
+ * @wdev: Pointer to wireless device
+ * @data: Pointer to data
+ * @data_len: Length of @data
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int
+__wlan_hdd_cfg80211_set_thermal_mitigation_policy(struct wiphy *wiphy,
+						  struct wireless_dev *wdev,
+						  const void *data,
+						  int data_len)
+{
+	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
+	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_MAX + 1];
+	bool enable = true;
+	uint32_t dc, dc_off_percent, level, cmd_type;
+	uint32_t prio = 0, target_temp = 0;
+	struct wlan_fwol_thermal_temp thermal_temp = {0};
+	QDF_STATUS status;
+
+	hdd_enter();
+
+	if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
+		hdd_err_rl("Command not allowed in FTM mode");
+		return -EPERM;
+	}
+
+	if (wlan_cfg80211_nla_parse(tb,
+				    QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_MAX,
+				    (struct nlattr *)data, data_len,
+				    wlan_hdd_thermal_mitigation_policy)) {
+		hdd_err_rl("Invalid attribute");
+		return -EINVAL;
+	}
+
+	if (!tb[QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_VALUE]) {
+		hdd_err_rl("attr thermal cmd value failed");
+		return -EINVAL;
+	}
+
+	cmd_type = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_VALUE]);
+	if (cmd_type != QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_TYPE_SET_LEVEL) {
+		hdd_err_rl("invalid thermal cmd value");
+		return -EINVAL;
+	}
+
+	if (!tb[QCA_WLAN_VENDOR_ATTR_THERMAL_LEVEL]) {
+		hdd_err_rl("attr thermal throttle set failed");
+		return -EINVAL;
+	}
+	level =
+	    nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_THERMAL_LEVEL]);
+
+	hdd_debug("thermal mitigation level %d", level);
+
+	status = ucfg_fwol_get_thermal_temp(hdd_ctx->psoc, &thermal_temp);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		hdd_err_rl("Failed to get fwol thermal obj");
+		return qdf_status_to_os_return(status);
+	}
+
+	switch (level) {
+	case QCA_WLAN_VENDOR_THERMAL_LEVEL_EMERGENCY:
+		dc_off_percent = thermal_temp.throttle_dutycycle_level[5];
+		break;
+	case QCA_WLAN_VENDOR_THERMAL_LEVEL_CRITICAL:
+		dc_off_percent = thermal_temp.throttle_dutycycle_level[4];
+		break;
+	case QCA_WLAN_VENDOR_THERMAL_LEVEL_SEVERE:
+		dc_off_percent = thermal_temp.throttle_dutycycle_level[3];
+		break;
+	case QCA_WLAN_VENDOR_THERMAL_LEVEL_MODERATE:
+		dc_off_percent = thermal_temp.throttle_dutycycle_level[2];
+		break;
+	case QCA_WLAN_VENDOR_THERMAL_LEVEL_LIGHT:
+		dc_off_percent = thermal_temp.throttle_dutycycle_level[1];
+		break;
+	case QCA_WLAN_VENDOR_THERMAL_LEVEL_NONE:
+		enable = false;
+		dc_off_percent = thermal_temp.throttle_dutycycle_level[0];
+		break;
+	default:
+		hdd_debug("Invalid thermal state");
+		return -EINVAL;
+	}
+
+	dc = thermal_temp.thermal_sampling_time;
+	hdd_debug("dc %d dc_off_per %d", dc, dc_off_percent);
+
+	status = sme_set_thermal_throttle_cfg(hdd_ctx->mac_handle,
+					      enable,
+					      dc,
+					      dc_off_percent,
+					      prio,
+					      target_temp);
+	if (QDF_IS_STATUS_ERROR(status))
+		hdd_err_rl("Failed to set throttle configuration %d", status);
+
+	return qdf_status_to_os_return(status);
+}
+
+/**
+ * wlan_hdd_cfg80211_set_thermal_mitigation_policy() - set thermal
+ * mitigation policy
+ * @wiphy: wiphy pointer
+ * @wdev: pointer to struct wireless_dev
+ * @data: pointer to incoming NL vendor data
+ * @data_len: length of @data
+ *
+ * Return: 0 on success; error number otherwise.
+ */
+int
+wlan_hdd_cfg80211_set_thermal_mitigation_policy(struct wiphy *wiphy,
+						struct wireless_dev *wdev,
+						const void *data, int data_len)
+{
+	struct osif_psoc_sync *psoc_sync;
+	int errno;
+
+	errno = osif_psoc_sync_op_start(wiphy_dev(wiphy), &psoc_sync);
+	if (errno)
+		return errno;
+
+	errno = __wlan_hdd_cfg80211_set_thermal_mitigation_policy(wiphy, wdev,
+								  data,
+								  data_len);
+
+	osif_psoc_sync_op_stop(psoc_sync);
+
+	return errno;
+}
+
+bool wlan_hdd_thermal_config_support(void)
+{
+	return true;
+}
+
diff --git a/core/hdd/src/wlan_hdd_thermal.h b/core/hdd/src/wlan_hdd_thermal.h
new file mode 100644
index 0000000..39b01df
--- /dev/null
+++ b/core/hdd/src/wlan_hdd_thermal.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2020 The Linux Foundation. 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __HDD_THERMAL_H
+#define __HDD_THERMAL_H
+/**
+ * DOC: wlan_hdd_thermal.h
+ * WLAN Host Device Driver thermal mitigation include file
+ */
+
+#include <linux/netdevice.h>
+#include <net/cfg80211.h>
+
+#ifdef FW_THERMAL_THROTTLE_SUPPORT
+
+int
+wlan_hdd_cfg80211_set_thermal_mitigation_policy(struct wiphy *wiphy,
+						struct wireless_dev *wdev,
+						const void *data, int data_len);
+
+/**
+ * wlan_hdd_thermal_config_support() - thermal mitigation support
+ *
+ * Return: true if thermal mitigation support enabled otherwise false
+ */
+bool wlan_hdd_thermal_config_support(void);
+
+#define FEATURE_THERMAL_VENDOR_COMMANDS				\
+{								\
+	.info.vendor_id = QCA_NL80211_VENDOR_ID,		\
+	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_THERMAL_CMD,	\
+	.flags = WIPHY_VENDOR_CMD_NEED_WDEV,			\
+	.doit = wlan_hdd_cfg80211_set_thermal_mitigation_policy	\
+},
+#else
+#define FEATURE_THERMAL_VENDOR_COMMANDS
+
+static inline bool wlan_hdd_thermal_config_support(void)
+{
+	return false;
+}
+
+#endif /* FEATURE_THERMAL_VENDOR_COMMANDS */
+#endif /* __HDD_THERMAL_H */
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index 77e2066..72b5a85 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -15541,7 +15541,9 @@
 	return qdf_status;
 }
 #endif /* WLAN_FEATURE_MOTION_DETECTION */
+
 #ifdef FW_THERMAL_THROTTLE_SUPPORT
+
 /**
  * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
  * configuration parameters
@@ -15577,6 +15579,7 @@
 		therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
 		therm_cfg_params->levelconf[0].priority = prio;
 		therm_cfg_params->levelconf[0].tmplwm = target_temp;
+		therm_cfg_params->num_thermal_conf = 1;
 
 		qdf_mem_set(&msg, sizeof(msg), 0);
 		msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
@@ -15587,6 +15590,8 @@
 						     QDF_MODULE_ID_WMA,
 						     QDF_MODULE_ID_WMA, &msg);
 		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+			sme_err("failed to schedule throttle config req %d",
+				qdf_status);
 			qdf_mem_free(therm_cfg_params);
 			qdf_status = QDF_STATUS_E_FAILURE;
 		}