qcacld-2.0: Define configuration parameters for thermal shutdown
Add new items in ini file and send these thermal shutdown configuration
parameters to fw.
Change-Id: I5cc3cf9c6f224c192bd4b0cdd529dfaa9b13ae16
CRs-Fixed: 2080395
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 3991428..a4dc09d 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2260,6 +2260,139 @@
#define CFG_THERMAL_TEMP_MAX_LEVEL3_MAX ( 1000 )
#define CFG_THERMAL_TEMP_MAX_LEVEL3_DEFAULT ( 0 )
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+/*
+ * <ini>
+ * gThermalShutdownEnable - Enable/Disable Thermal Shutdown feature to protect
+ IC too hot and die
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini is used to enable/disable Thermal Shutdown feature
+ *
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_ENABLE_NAME "gThermalShutdownEnable"
+#define CFG_THERMAL_SHUTDOWN_ENABLE_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_ENABLE_MAX ( 1 )
+#define CFG_THERMAL_SHUTDOWN_ENABLE_DEFAULT ( 1 )
+
+/*
+ * <ini>
+ * gThermalShutdownAutoEnable - Enable/Disable Automatic Thermal Shutdown
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * In Automatic mode, host driver send the suspend command if the condition is
+ * meet, or else the command is send by host app.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_NAME "gThermalShutdownAutoEnable"
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MAX ( 1 )
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_DEFAULT ( 1 )
+
+/*
+ * <ini>
+ * gThermalShutdownTempSuspend - Temperature threshold of suspend
+ * @Min: 0
+ * @Max: 1000
+ * @Default: 117
+ *
+ * If the reported temperature from firmware is higher than this threshold,
+ * the suspend command will be sent to shutdown the target.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_NAME "gThermalShutdownTempSuspend"
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MAX ( 1000 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_DEFAULT ( 117 )
+
+/*
+ * <ini>
+ * gThermalShutdownTempWarning - Temperature threshold of warning.
+ * @Min: 0
+ * @Max: 1000
+ * @Default: 115
+ *
+ * Firmware report temperature to host as indication if the temperature is
+ * higher than this threshold.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_NAME "gThermalShutdownTempWarning"
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MAX ( 1000 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_DEFAULT ( 115 )
+
+/*
+ * <ini>
+ * gThermalShutdownTempResume - Temperature threshold of resume
+ * @Min: 0
+ * @Max: 1000
+ * @Default: 113
+ *
+ * If the reported temperature from firmware is lower than this threshold,
+ * the resume command will be sent to shutdown the target.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_NAME "gThermalShutdownTempResume"
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MAX ( 1000 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_DEFAULT ( 113 )
+
+/*
+ * <ini>
+ * gThermalSampleRate - The sample rate of temperature for firmware
+ * @Min: 1000
+ * @Max: 10000
+ * @Default: 5000
+ *
+ * Thermal Sample Rate (in milliseconds) used by FW to sample temperature of IC
+ *
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_THERMAL_SAMPLE_RATE_NAME "gThermalSampleRate"
+#define CFG_THERMAL_SAMPLE_RATE_MIN ( 1000 )
+#define CFG_THERMAL_SAMPLE_RATE_MAX ( 10000 )
+#define CFG_THERMAL_SAMPLE_RATE_DEFAULT ( 5000 )
+#endif /* FEATURE_WLAN_THERMAL_SHUTDOWN */
/*
* Enable/Disable Modulated DTIM feature
@@ -5424,6 +5557,17 @@
v_U16_t thermalTempMaxLevel2;
v_U16_t thermalTempMinLevel3;
v_U16_t thermalTempMaxLevel3;
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ /* Thermal Shutdown feature is enabled or not. */
+ bool thermal_shutdown_enabled;
+ /* Thermal Shutdown is autonomous in driver or requested by user app. */
+ bool thermal_shutdown_auto_enabled;
+ uint16_t thermal_resume_threshold;
+ uint16_t thermal_warning_threshold;
+ uint16_t thermal_suspend_threshold;
+ uint16_t thermal_sample_rate;
+#endif
+
v_U32_t TxPower2g;
v_U32_t TxPower5g;
v_U32_t gEnableDebugLog;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 5518cfe..a1e8202 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3357,6 +3357,50 @@
CFG_THERMAL_TEMP_MAX_LEVEL3_MIN,
CFG_THERMAL_TEMP_MAX_LEVEL3_MAX ),
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_ENABLE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_shutdown_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_ENABLE_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_ENABLE_MIN,
+ CFG_THERMAL_SHUTDOWN_ENABLE_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_shutdown_auto_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MIN,
+ CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_TEMP_RESUME_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_resume_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_RESUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MIN,
+ CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_TEMP_WARNING_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_warning_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_WARNING_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MIN,
+ CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_suspend_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MIN,
+ CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SAMPLE_RATE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_sample_rate,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SAMPLE_RATE_DEFAULT,
+ CFG_THERMAL_SAMPLE_RATE_MIN,
+ CFG_THERMAL_SAMPLE_RATE_MAX),
+#endif /* FEATURE_WLAN_THERMAL_SHUTDOWN */
+
REG_VARIABLE( CFG_SET_TXPOWER_LIMIT2G_NAME , WLAN_PARAM_Integer,
hdd_config_t, TxPower2g,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d82c784..4ed51ed 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -15950,6 +15950,30 @@
return 0;
}
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+static void hdd_get_thermal_shutdown_ini_param(tSmeThermalParams *pthermalParam,
+ hdd_context_t *pHddCtx)
+{
+ pthermalParam->thermal_shutdown_enabled =
+ pHddCtx->cfg_ini->thermal_shutdown_enabled;
+ pthermalParam->thermal_shutdown_auto_enabled =
+ pHddCtx->cfg_ini->thermal_shutdown_auto_enabled;
+ pthermalParam->thermal_resume_threshold =
+ pHddCtx->cfg_ini->thermal_resume_threshold;
+ pthermalParam->thermal_warning_threshold =
+ pHddCtx->cfg_ini->thermal_warning_threshold;
+ pthermalParam->thermal_suspend_threshold =
+ pHddCtx->cfg_ini->thermal_suspend_threshold;
+ pthermalParam->thermal_sample_rate = pHddCtx->cfg_ini->thermal_sample_rate;
+}
+#else
+static inline void hdd_get_thermal_shutdown_ini_param(tSmeThermalParams *pthermalParam,
+ hdd_context_t *pHddCtx)
+{
+ return;
+}
+
+#endif
/**---------------------------------------------------------------------------
\brief hdd_wlan_startup() - HDD init function
@@ -16922,6 +16946,8 @@
thermalParam.smeThermalLevels[3].smeMaxTempThreshold =
pHddCtx->cfg_ini->thermalTempMaxLevel3;
+ hdd_get_thermal_shutdown_ini_param(&thermalParam, pHddCtx);
+
if (eHAL_STATUS_SUCCESS != sme_InitThermalInfo(pHddCtx->hHal,thermalParam))
{
hddLog(VOS_TRACE_LEVEL_ERROR,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index fd48a3f..0b50aee 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -5302,6 +5302,15 @@
u_int8_t thermalMgmtEnabled;
u_int32_t throttlePeriod;
u_int8_t throttle_duty_cycle_tbl[WLAN_THROTTLE_DUTY_CYCLE_LEVEL_MAX];
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ uint8_t thermal_shutdown_enabled;
+ uint8_t thermal_shutdown_auto_enabled;
+ uint16_t thermal_resume_threshold;
+ uint16_t thermal_warning_threshold;
+ uint16_t thermal_suspend_threshold;
+ uint16_t thermal_sample_rate;
+#endif
+
} t_thermal_mgmt, *tp_thermal_mgmt;
typedef struct sSirTxPowerLimit
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 525ad40..4880c07 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -28910,6 +28910,83 @@
return VOS_STATUS_SUCCESS;
}
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+static VOS_STATUS wma_set_thermal_suspend_params(tp_wma_handle wma)
+{
+
+ wmi_thermal_mgmt_cmd_fixed_param *cmd;
+ wmi_buf_t buf;
+ int status;
+ u_int32_t len;
+
+ len = sizeof(*cmd);
+ buf = wmi_buf_alloc(wma->wmi_handle, len);
+ if (!buf) {
+ WMA_LOGE("Failed to allocate buffer to send set key cmd");
+ return eHAL_STATUS_FAILURE;
+ }
+
+ cmd = (wmi_thermal_mgmt_cmd_fixed_param *) wmi_buf_data (buf);
+
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_thermal_mgmt_cmd_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(wmi_thermal_mgmt_cmd_fixed_param));
+
+ cmd->lower_thresh_degreeC =
+ wma->thermal_mgmt_info.thermal_resume_threshold;
+ cmd->threshold_warning_degreeC =
+ wma->thermal_mgmt_info.thermal_warning_threshold;
+ cmd->upper_thresh_degreeC =
+ wma->thermal_mgmt_info.thermal_suspend_threshold;
+ cmd->enable = wma->thermal_mgmt_info.thermal_shutdown_enabled;
+ cmd->action = WMI_THERMAL_MGMT_ACTION_NOTIFY_HOST;
+ cmd->sample_rate_ms = wma->thermal_mgmt_info.thermal_sample_rate;
+
+ WMA_LOGD("thermal shutdown params: resume:%d, warning:%d, suspend:%d, "
+ "enable:%d, action:%d, sample rate:%d ms\n",
+ cmd->lower_thresh_degreeC, cmd->threshold_warning_degreeC,
+ cmd->upper_thresh_degreeC, cmd->enable, cmd->action,
+ cmd->sample_rate_ms);
+
+ status = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
+ WMI_THERMAL_MGMT_CMDID);
+ if (status) {
+ wmi_buf_free(buf);
+ WMA_LOGE("%s:Failed to send thermal mgmt command", __func__);
+ return eHAL_STATUS_FAILURE;
+ }
+
+ return eHAL_STATUS_SUCCESS;
+}
+#endif /* FEATURE_WLAN_THERMAL_SHUTDOWN */
+
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+static void wma_fetch_set_thermal_params(tp_wma_handle wma,
+ t_thermal_mgmt *pThermalParams)
+{
+ wma->thermal_mgmt_info.thermal_shutdown_enabled =
+ pThermalParams->thermal_shutdown_enabled;
+ wma->thermal_mgmt_info.thermal_shutdown_auto_enabled =
+ pThermalParams->thermal_shutdown_auto_enabled;
+ wma->thermal_mgmt_info.thermal_resume_threshold =
+ pThermalParams->thermal_resume_threshold;
+ wma->thermal_mgmt_info.thermal_warning_threshold =
+ pThermalParams->thermal_warning_threshold;
+ wma->thermal_mgmt_info.thermal_suspend_threshold =
+ pThermalParams->thermal_suspend_threshold;
+ wma->thermal_mgmt_info.thermal_sample_rate =
+ pThermalParams->thermal_sample_rate;
+
+ if (wma->thermal_mgmt_info.thermal_shutdown_enabled)
+ wma_set_thermal_suspend_params(wma);
+}
+#else
+static inline void wma_fetch_set_thermal_params(tp_wma_handle wma,
+ t_thermal_mgmt *pThermalParams)
+{
+ return;
+}
+#endif
/* function : wma_process_init_thermal_info
* Description : This function initializes the thermal management table in WMA,
sends down the initial temperature thresholds to the firmware and
@@ -29006,7 +29083,10 @@
WMA_LOGE("Could not send thermal mgmt command to the firmware!");
}
}
- return VOS_STATUS_SUCCESS;
+
+ wma_fetch_set_thermal_params(wma, pThermalParams);
+
+ return VOS_STATUS_SUCCESS;
}
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 04bbe41..820323b 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -246,6 +246,15 @@
u_int8_t smeThermalMgmtEnabled;
u_int32_t smeThrottlePeriod;
u_int8_t sme_throttle_duty_cycle_tbl[SME_MAX_THROTTLE_LEVELS];
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ uint8_t thermal_shutdown_enabled;
+ uint8_t thermal_shutdown_auto_enabled;
+ uint16_t thermal_resume_threshold;
+ uint16_t thermal_warning_threshold;
+ uint16_t thermal_suspend_threshold;
+ uint16_t thermal_sample_rate;
+#endif
+
} tSmeThermalParams;
#ifdef WLAN_FEATURE_APFIND
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 02c1ae8..f6df3c2 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -15314,6 +15314,18 @@
pWdaParam->thermalLevels[3].maxTempThreshold =
thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ pWdaParam->thermal_shutdown_enabled = thermalParam.thermal_shutdown_enabled;
+ pWdaParam->thermal_shutdown_auto_enabled =
+ thermalParam.thermal_shutdown_auto_enabled;
+ pWdaParam->thermal_resume_threshold =thermalParam.thermal_resume_threshold;
+ pWdaParam->thermal_warning_threshold =
+ thermalParam.thermal_warning_threshold;
+ pWdaParam->thermal_suspend_threshold =
+ thermalParam.thermal_suspend_threshold;
+ pWdaParam->thermal_sample_rate = thermalParam.thermal_sample_rate;
+#endif
+
if (eHAL_STATUS_SUCCESS == sme_AcquireGlobalLock(&pMac->sme))
{
msg.type = WDA_INIT_THERMAL_INFO_CMD;
diff --git a/Kbuild b/Kbuild
index 6cb1b87..ac779fa 100644
--- a/Kbuild
+++ b/Kbuild
@@ -340,6 +340,9 @@
#for these channels has not yet been added to the kernel.
CONFIG_STATICALLY_ADD_11P_CHANNELS := n
+#Enable thermal shutdown
+CONFIG_WLAN_THERMAL_SHUTDOWN := 1
+
ifeq ($(CONFIG_CFG80211),y)
HAVE_CFG80211 := 1
else
@@ -1671,6 +1674,11 @@
CDEFINES += -DFORCE_LEGACY_PCI_INTERRUPTS
endif
+ifeq ($(CONFIG_WLAN_THERMAL_SHUTDOWN), 1)
+CDEFINES += -DFEATURE_WLAN_THERMAL_SHUTDOWN
+CDEFINES += -DFEATURE_WLAN_AUTO_SHUTDOWN
+endif
+
KBUILD_CPPFLAGS += $(CDEFINES)
# Currently, for versions of gcc which support it, the kernel Makefile