|
@@ -946,6 +946,70 @@ static void wma_set_modulated_dtim(tp_wma_handle wma,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * wma_override_listen_interval() - function to override static/ini based LI
|
|
|
+ * @wma: wma handle
|
|
|
+ * @privcmd: structure containing parameters
|
|
|
+ *
|
|
|
+ * This function override static/ini based LI in firmware
|
|
|
+ *
|
|
|
+ * Return: none
|
|
|
+ */
|
|
|
+static void wma_override_listen_interval(tp_wma_handle wma,
|
|
|
+ wma_cli_set_cmd_t *privcmd)
|
|
|
+{
|
|
|
+ uint8_t vdev_id = privcmd->param_vdev_id;
|
|
|
+ struct wma_txrx_node *iface =
|
|
|
+ &wma->interfaces[vdev_id];
|
|
|
+ u32 old_override_li, new_override_li, listen_interval;
|
|
|
+ struct sAniSirGlobal *mac;
|
|
|
+ QDF_STATUS ret;
|
|
|
+
|
|
|
+ mac = cds_get_context(QDF_MODULE_ID_PE);
|
|
|
+ if (!mac) {
|
|
|
+ WMA_LOGE(FL("Failed to get mac context"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ old_override_li = iface->override_li;
|
|
|
+ new_override_li = privcmd->param_value;
|
|
|
+ iface->override_li = new_override_li;
|
|
|
+
|
|
|
+ if (new_override_li &&
|
|
|
+ (new_override_li != old_override_li)) {
|
|
|
+ listen_interval = new_override_li;
|
|
|
+ } else if (!new_override_li &&
|
|
|
+ (new_override_li != old_override_li)) {
|
|
|
+ /* Configure default LI as we do on resume */
|
|
|
+ if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
|
|
|
+ &listen_interval) != eSIR_SUCCESS)) {
|
|
|
+ QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
|
|
|
+ "Failed to get value for listen interval");
|
|
|
+ listen_interval = POWERSAVE_DEFAULT_LISTEN_INTERVAL;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
|
|
|
+ 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",
|
|
|
+ vdev_id);
|
|
|
+ }
|
|
|
+ WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d",
|
|
|
+ __func__, vdev_id, listen_interval);
|
|
|
+ ret = wma_vdev_set_param(wma->wmi_handle,
|
|
|
+ privcmd->param_vdev_id,
|
|
|
+ WMI_VDEV_PARAM_DTIM_POLICY,
|
|
|
+ NORMAL_DTIM);
|
|
|
+ if (QDF_IS_STATUS_ERROR(ret))
|
|
|
+ WMA_LOGE("Failed to Set to Normal DTIM policy");
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* wma_process_cli_set_cmd() - set parameters to fw
|
|
@@ -1088,6 +1152,9 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
|
|
|
case GEN_PARAM_MODULATED_DTIM:
|
|
|
wma_set_modulated_dtim(wma, privcmd);
|
|
|
break;
|
|
|
+ case GEN_PARAM_LISTEN_INTERVAL:
|
|
|
+ wma_override_listen_interval(wma, privcmd);
|
|
|
+ break;
|
|
|
default:
|
|
|
WMA_LOGE("Invalid param id 0x%x",
|
|
|
privcmd->param_id);
|