|
@@ -2678,6 +2678,155 @@ QDF_STATUS wma_vdev_self_peer_create(struct vdev_mlme_obj *vdev_mlme)
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+#ifdef MULTI_CLIENT_LL_SUPPORT
|
|
|
+/**
|
|
|
+ * wma_set_vdev_latency_level_param() - Set per vdev latency level params in FW
|
|
|
+ * @wma_handle: wma handle
|
|
|
+ * @mac: mac context
|
|
|
+ * @vdev_id: vdev id
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS
|
|
|
+ */
|
|
|
+static QDF_STATUS wma_set_vdev_latency_level_param(tp_wma_handle wma_handle,
|
|
|
+ struct mac_context *mac,
|
|
|
+ uint8_t vdev_id)
|
|
|
+{
|
|
|
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
+ bool multi_client_ll_ini_support, multi_client_ll_caps;
|
|
|
+ uint32_t latency_flags;
|
|
|
+ static uint32_t ll[4] = {100, 60, 40, 20};
|
|
|
+ uint32_t ul_latency, dl_latency, ul_dl_latency;
|
|
|
+ uint8_t default_latency_level;
|
|
|
+
|
|
|
+ multi_client_ll_ini_support =
|
|
|
+ mac->mlme_cfg->wlm_config.multi_client_ll_support;
|
|
|
+ multi_client_ll_caps =
|
|
|
+ wlan_mlme_get_wlm_multi_client_ll_caps(mac->psoc);
|
|
|
+ wma_debug("[MULTI_CLIENT] INI support: %d, fw capability:%d",
|
|
|
+ multi_client_ll_ini_support, multi_client_ll_caps);
|
|
|
+ /*
|
|
|
+ * Multi-Client arbiter functionality is enabled only if both INI is
|
|
|
+ * set, and Service bit is configured.
|
|
|
+ */
|
|
|
+ if (!(multi_client_ll_ini_support && multi_client_ll_caps))
|
|
|
+ return status;
|
|
|
+
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_MULTI_CLIENT_LL_FEATURE_CONFIGURATION,
|
|
|
+ multi_client_ll_ini_support);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure low latency feature");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* wlm latency level index:0 - normal, 1 - xr, 2 - low, 3 - ultralow */
|
|
|
+ wma_debug("Setting vdev params for latency level flags");
|
|
|
+
|
|
|
+ latency_flags = mac->mlme_cfg->wlm_config.latency_flags[0];
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_NORMAL_LATENCY_FLAGS_CONFIGURATION,
|
|
|
+ latency_flags);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure normal latency flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ latency_flags = mac->mlme_cfg->wlm_config.latency_flags[1];
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_XR_LATENCY_FLAGS_CONFIGURATION,
|
|
|
+ latency_flags);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure xr latency flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ latency_flags = mac->mlme_cfg->wlm_config.latency_flags[2];
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_LOW_LATENCY_FLAGS_CONFIGURATION,
|
|
|
+ latency_flags);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure low latency flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ latency_flags = mac->mlme_cfg->wlm_config.latency_flags[3];
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ULTRA_LOW_LATENCY_FLAGS_CONFIGURATION,
|
|
|
+ latency_flags);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure ultra low latency flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ wma_debug("Setting vdev params for Latency level UL/DL flags");
|
|
|
+ /*
|
|
|
+ * Latency level UL/DL
|
|
|
+ * 0-15 bits: UL and 16-31 bits: DL
|
|
|
+ */
|
|
|
+ dl_latency = ll[0];
|
|
|
+ ul_latency = ll[0];
|
|
|
+ ul_dl_latency = dl_latency << 16 | ul_latency;
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_NORMAL_LATENCY_UL_DL_CONFIGURATION,
|
|
|
+ ul_dl_latency);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure normal latency ul dl flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ dl_latency = ll[1];
|
|
|
+ ul_latency = ll[1];
|
|
|
+ ul_dl_latency = dl_latency << 16 | ul_latency;
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_XR_LATENCY_UL_DL_CONFIGURATION,
|
|
|
+ ul_dl_latency);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure normal latency ul dl flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ dl_latency = ll[2];
|
|
|
+ ul_latency = ll[2];
|
|
|
+ ul_dl_latency = dl_latency << 16 | ul_latency;
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_LOW_LATENCY_UL_DL_CONFIGURATION,
|
|
|
+ ul_dl_latency);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure normal latency ul dl flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ dl_latency = ll[3];
|
|
|
+ ul_latency = ll[3];
|
|
|
+ ul_dl_latency = dl_latency << 16 | ul_latency;
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ULTRA_LOW_LATENCY_UL_DL_CONFIGURATION,
|
|
|
+ ul_dl_latency);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure normal latency ul dl flag");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ default_latency_level = mac->mlme_cfg->wlm_config.latency_level;
|
|
|
+ status = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
|
|
|
+ WMI_VDEV_PARAM_DEFAULT_LATENCY_LEVEL_CONFIGURATION,
|
|
|
+ default_latency_level);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ wma_err("failed to configure low latency feature");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+#else
|
|
|
+static QDF_STATUS wma_set_vdev_latency_level_param(tp_wma_handle wma_handle,
|
|
|
+ struct mac_context *mac,
|
|
|
+ uint8_t vdev_id)
|
|
|
+{
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
|
|
|
{
|
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
@@ -2914,6 +3063,10 @@ QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
|
|
|
wma_err("Failed to configure active APF mode");
|
|
|
}
|
|
|
|
|
|
+ if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
|
|
|
+ vdev_mlme->mgmt.generic.subtype == 0)
|
|
|
+ wma_set_vdev_latency_level_param(wma_handle, mac, vdev_id);
|
|
|
+
|
|
|
wma_vdev_set_data_tx_callback(vdev);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|