Ver Fonte

qcacld-3.0: Add ini/ioctl support for WOW data inactivity timeout

Add ini/ioctl support for data inactivity timeout for wow mode.

Change-Id: I47bbdeeecf2689ef68e76bc1810229da9da40016
CRs-Fixed: 2034525
Mukul Sharma há 8 anos atrás
pai
commit
ed92f2f5fa

+ 37 - 0
core/hdd/inc/wlan_hdd_cfg.h

@@ -2971,11 +2971,47 @@ enum hdd_dot11_mode {
 #define CFG_FW_MCC_BCAST_PROB_RESP_MAX         (1)
 #define CFG_FW_MCC_BCAST_PROB_RESP_DEFAULT     (0)
 
+/*
+ * <ini>
+ * gDataInactivityTimeout - Data activity timeout for non wow mode.
+ * @Min: 1
+ * @Max: 255
+ * @Default: 200
+ *
+ * This ini is used to set data inactivity timeout in non wow mode.
+ *
+ * Supported Feature: inactivity timeout in non wow mode
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
 #define CFG_DATA_INACTIVITY_TIMEOUT_NAME       "gDataInactivityTimeout"
 #define CFG_DATA_INACTIVITY_TIMEOUT_MIN        (1)
 #define CFG_DATA_INACTIVITY_TIMEOUT_MAX        (255)
 #define CFG_DATA_INACTIVITY_TIMEOUT_DEFAULT    (200)
 
+/*
+ * <ini>
+ * g_wow_data_inactivity_timeout - Data activity timeout in wow mode.
+ * @Min: 1
+ * @Max: 255
+ * @Default: 50
+ *
+ * This ini is used to set data inactivity timeout in wow mode.
+ *
+ * Supported Feature: inactivity timeout in wow mode
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_WOW_DATA_INACTIVITY_TIMEOUT_NAME     "g_wow_data_inactivity_timeout"
+#define CFG_WOW_DATA_INACTIVITY_TIMEOUT_MIN      (1)
+#define CFG_WOW_DATA_INACTIVITY_TIMEOUT_MAX      (255)
+#define CFG_WOW_DATA_INACTIVITY_TIMEOUT_DEFAULT  (50)
+
 /*
  * <ini>
  * rfSettlingTimeUs - Settle the TimeUs
@@ -9995,6 +10031,7 @@ struct hdd_config {
 	bool mcc_rts_cts_prot_enable;
 	bool mcc_bcast_prob_resp_enable;
 	uint8_t nDataInactivityTimeout;
+	uint8_t wow_data_inactivity_timeout;
 
 	/* WMM QoS Configuration */
 	enum hdd_wmm_user_mode WmmMode;

+ 14 - 0
core/hdd/src/wlan_hdd_cfg.c

@@ -863,6 +863,13 @@ struct reg_table_entry g_registry_table[] = {
 		     CFG_DATA_INACTIVITY_TIMEOUT_MIN,
 		     CFG_DATA_INACTIVITY_TIMEOUT_MAX),
 
+	REG_VARIABLE(CFG_WOW_DATA_INACTIVITY_TIMEOUT_NAME, WLAN_PARAM_Integer,
+		     struct hdd_config, wow_data_inactivity_timeout,
+		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_WOW_DATA_INACTIVITY_TIMEOUT_DEFAULT,
+		     CFG_WOW_DATA_INACTIVITY_TIMEOUT_MIN,
+		     CFG_WOW_DATA_INACTIVITY_TIMEOUT_MAX),
+
 	REG_VARIABLE(CFG_QOS_WMM_MODE_NAME, WLAN_PARAM_Integer,
 		     struct hdd_config, WmmMode,
 		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -6612,6 +6619,13 @@ bool hdd_update_config_cfg(hdd_context_t *hdd_ctx)
 		hdd_err("Couldn't pass on WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT to CFG");
 	}
 
+	if (sme_cfg_set_int(hdd_ctx->hHal,
+		WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
+		config->wow_data_inactivity_timeout) == QDF_STATUS_E_FAILURE) {
+		status = false;
+		hdd_err("Fail to pass WNI_CFG_PS_WOW_DATA_INACTIVITY_TO CFG");
+	}
+
 	if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_ENABLE_LTE_COEX,
 		     config->enableLTECoex) == QDF_STATUS_E_FAILURE) {
 		status = false;

+ 41 - 0
core/hdd/src/wlan_hdd_wext.c

@@ -984,6 +984,7 @@ static const struct ccp_freq_chan_map freq_chan_map[] = {
 #define WE_CLEAR_STATS                        86
 /* Private sub ioctl for starting/stopping the profiling */
 #define WE_START_FW_PROFILE                      87
+
 /*
  * <ioctl>
  * setChanChange - Initiate channel change
@@ -1072,6 +1073,28 @@ static const struct ccp_freq_chan_map freq_chan_map[] = {
  */
 #define WE_SET_RANGE_EXT                      93
 
+/*
+ * <ioctl>
+ * wow_ito - sets the timeout value for inactivity data while
+ * in power save mode during wow
+ *
+ * @INPUT: int
+ *
+ * @OUTPUT: None
+ *
+ * This IOCTL set the timeout value for inactivity data in power save mode
+ *
+ * @E.g: iwpriv wlan0 wow_ito 20
+ *
+ * Supported Feature: STA
+ *
+ * Usage: External
+ *
+ * </ioctl>
+*/
+#define WE_SET_WOW_DATA_INACTIVITY_TO    94
+
+
 /* Private ioctls and their sub-ioctls */
 #define WLAN_PRIV_SET_NONE_GET_INT    (SIOCIWFIRSTPRIV + 1)
 #define WE_GET_11D_STATE     1
@@ -7769,6 +7792,19 @@ static int __iw_setint_getnone(struct net_device *dev,
 			ret = -EINVAL;
 		}
 		break;
+	case WE_SET_WOW_DATA_INACTIVITY_TO:
+		if (!hHal)
+			return -EINVAL;
+
+		if ((set_value < CFG_WOW_DATA_INACTIVITY_TIMEOUT_MIN) ||
+		    (set_value > CFG_WOW_DATA_INACTIVITY_TIMEOUT_MAX) ||
+		    (sme_cfg_set_int((WLAN_HDD_GET_CTX(pAdapter))->hHal,
+				     WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
+				     set_value) == QDF_STATUS_E_FAILURE)) {
+			hdd_err("WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT fail");
+			ret = -EINVAL;
+		}
+		break;
 	case WE_SET_MC_RATE:
 	{
 		ret = wlan_hdd_set_mc_rate(pAdapter, set_value);
@@ -12841,6 +12877,11 @@ static const struct iw_priv_args we_private_args[] = {
 	 0,
 	 "inactivityTO"},
 
+	{WE_SET_WOW_DATA_INACTIVITY_TO,
+	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+	 0,
+	 "wow_ito"},
+
 	{WE_SET_MAX_TX_POWER,
 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
 	 0,

+ 5 - 0
core/mac/inc/wni_cfg.h

@@ -315,6 +315,7 @@ enum {
 	WNI_CFG_HE_NSS,
 	WNI_CFG_HE_MCS,
 	WNI_CFG_HE_PPET,
+	WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
 	/* Any new items to be added should be above this strictly */
 	CFG_PARAM_MAX_NUM
 };
@@ -1579,6 +1580,10 @@ enum {
 #define WNI_CFG_HE_MCS_STAMAX 0x7
 #define WNI_CFG_HE_MCS_STADEF 0
 
+#define WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT_STAMIN    1
+#define WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT_STAMAX    255
+#define WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT_STADEF    50
+
 #define CFG_STA_MAGIC_DWORD    0xbeefbeef
 
 #endif

+ 7 - 1
core/mac/src/cfg/cfg_proc_msg.c

@@ -1438,7 +1438,13 @@ cgstatic cfg_static[CFG_PARAM_MAX_NUM] = {
 	WNI_CFG_HE_MCS_STADEF},
 	{WNI_CFG_HE_PPET,
 	CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE,
-	0, 0, 0}
+	0, 0, 0},
+	{WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
+	CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT |
+	CFG_CTL_NTF_HAL,
+	WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT_STAMIN,
+	WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT_STAMAX,
+	WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT_STADEF}
 };
 
 

+ 3 - 0
core/wma/inc/wma.h

@@ -289,6 +289,9 @@ enum ds_mode {
 /* Default InActivity Time is 200 ms */
 #define POWERSAVE_DEFAULT_INACTIVITY_TIME 200
 
+/* Default WOW InActivity Time is 50 ms */
+#define WOW_POWERSAVE_DEFAULT_INACTIVITY_TIME 50
+
 /* Default Listen Interval */
 #define POWERSAVE_DEFAULT_LISTEN_INTERVAL 1
 

+ 62 - 4
core/wma/src/wma_power.c

@@ -1756,6 +1756,7 @@ QDF_STATUS wma_set_smps_params(tp_wma_handle wma, uint8_t vdev_id,
 static void wma_set_vdev_suspend_dtim(tp_wma_handle wma, uint8_t vdev_id)
 {
 	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
+	uint32_t cfg_data_val = 0;
 
 	if ((iface->type == WMI_VDEV_TYPE_STA) &&
 	    (iface->dtimPeriod != 0)) {
@@ -1764,6 +1765,13 @@ static void wma_set_vdev_suspend_dtim(tp_wma_handle wma, uint8_t vdev_id)
 		uint32_t max_mod_dtim;
 		uint32_t beacon_interval_mod;
 
+		/* get mac to acess CFG data base */
+		struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
+		if (!mac) {
+			WMA_LOGE(FL("Failed to get mac context"));
+			return;
+		}
+
 		if (wma->staDynamicDtim) {
 			listen_interval = wma->staDynamicDtim;
 		} else if ((wma->staModDtim) &&
@@ -1798,12 +1806,20 @@ static void wma_set_vdev_suspend_dtim(tp_wma_handle wma, uint8_t vdev_id)
 					(max_mod_dtim * iface->dtimPeriod);
 			}
 		} else {
-			return;
+			/* Set Listen Interval */
+			if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
+				&cfg_data_val) != eSIR_SUCCESS)) {
+				QDF_TRACE(QDF_MODULE_ID_WMA,
+					  QDF_TRACE_LEVEL_ERROR,
+					"Failed to listen interval");
+				cfg_data_val =
+					POWERSAVE_DEFAULT_LISTEN_INTERVAL;
+			}
+			listen_interval = cfg_data_val;
 		}
-
 		ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-						      WMI_VDEV_PARAM_LISTEN_INTERVAL,
-						      listen_interval);
+					      WMI_VDEV_PARAM_LISTEN_INTERVAL,
+					      listen_interval);
 		if (QDF_IS_STATUS_ERROR(ret)) {
 			/* Even it fails continue Fw will take default LI */
 			WMA_LOGE("Failed to Set Listen Interval vdevId %d",
@@ -1813,6 +1829,22 @@ static void wma_set_vdev_suspend_dtim(tp_wma_handle wma, uint8_t vdev_id)
 		WMA_LOGD("Set Listen Interval vdevId %d Listen Intv %d",
 			 vdev_id, listen_interval);
 
+		if (wlan_cfg_get_int(mac,
+				     WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
+				     &cfg_data_val) != eSIR_SUCCESS) {
+			QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
+				"Can't get WNI_CFG_PS_WOW_DATA_INACTIVITY_TO");
+			cfg_data_val = WOW_POWERSAVE_DEFAULT_INACTIVITY_TIME;
+		}
+
+		WMA_LOGD("%s: Set inactivity_time for wow: %d", __func__,
+				cfg_data_val);
+		ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
+				WMI_STA_PS_PARAM_INACTIVITY_TIME, cfg_data_val);
+		if (ret)
+			WMA_LOGE("%s: Setting InActivity time Failed.",
+				__func__);
+
 		iface->restore_dtim_setting = true;
 	}
 }
@@ -1850,6 +1882,7 @@ void wma_set_suspend_dtim(tp_wma_handle wma)
 static void wma_set_vdev_resume_dtim(tp_wma_handle wma, uint8_t vdev_id)
 {
 	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
+	uint32_t inactivity_time;
 
 	if ((iface->type == WMI_VDEV_TYPE_STA) &&
 	    (iface->restore_dtim_setting)) {
@@ -1881,6 +1914,31 @@ static void wma_set_vdev_resume_dtim(tp_wma_handle wma, uint8_t vdev_id)
 		WMA_LOGD("Set Listen Interval vdevId %d Listen Intv %d",
 			 vdev_id, cfg_data_val);
 
+		if (wlan_cfg_get_int(mac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
+					&cfg_data_val) != eSIR_SUCCESS) {
+			QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
+				"Failed to get WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
+			cfg_data_val = POWERSAVE_DEFAULT_INACTIVITY_TIME;
+		}
+
+		inactivity_time = (u_int32_t)cfg_data_val;
+		WMA_LOGD("%s: Setting InActivity time %d.", __func__,
+							inactivity_time);
+		ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
+					WMI_STA_PS_PARAM_INACTIVITY_TIME,
+					inactivity_time);
+		if (ret)
+			WMA_LOGE("%s: Setting InActivity time Failed.",
+				__func__);
+
+		if (wlan_cfg_get_int(mac, WNI_CFG_MAX_PS_POLL,
+				&cfg_data_val) != eSIR_SUCCESS) {
+				QDF_TRACE(QDF_MODULE_ID_WMA,
+				QDF_TRACE_LEVEL_ERROR,
+				"Failed to get value for WNI_CFG_MAX_PS_POLL");
+			cfg_data_val = 0;
+		}
+
 		iface->restore_dtim_setting = false;
 
 	}