diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 042c7c0bdba7..3a1f58fea763 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -574,6 +574,9 @@ QDF_STATUS (*send_offload_11k_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_invoke_neighbor_report_cmd)(wmi_unified_t wmi_handle, struct wmi_invoke_neighbor_report_params *params); +QDF_STATUS (*send_roam_bss_load_config)(wmi_unified_t wmi_handle, + struct wmi_bss_load_config *params); + QDF_STATUS (*send_btm_config)(wmi_unified_t wmi_handle, struct wmi_btm_config *params); diff --git a/wmi/inc/wmi_unified_roam_api.h b/wmi/inc/wmi_unified_roam_api.h index 12ae77a27c0e..48cfdfc5a459 100644 --- a/wmi/inc/wmi_unified_roam_api.h +++ b/wmi/inc/wmi_unified_roam_api.h @@ -298,6 +298,16 @@ QDF_STATUS wmi_unified_roam_send_hlp_cmd(void *wmi_hdl, QDF_STATUS wmi_unified_send_btm_config(void *wmi_hdl, struct wmi_btm_config *params); +/** + * wmi_unified_send_bss_load_config() - Send bss load trigger params to fw + * @wmi_hdl: wmi handle + * @params: pointer to wmi_bss_load_config + * + * Return: QDF_STATUS + */ +QDF_STATUS wmi_unified_send_bss_load_config(void *wmi_hdl, + struct wmi_bss_load_config *params); + /** * wmi_unified_offload_11k_cmd() - send 11k offload command * @wmi_hdl: wmi handle diff --git a/wmi/inc/wmi_unified_roam_param.h b/wmi/inc/wmi_unified_roam_param.h index 3daac3bcf527..2b88f0ef8403 100644 --- a/wmi/inc/wmi_unified_roam_param.h +++ b/wmi/inc/wmi_unified_roam_param.h @@ -524,6 +524,16 @@ struct wmi_btm_config { uint32_t btm_sticky_time; }; +/** + * struct wmi_bss_load_config - BSS load trigger parameters + * @vdev_id: VDEV on which the parameters should be applied + * @bss_load_threshold: BSS load threshold after which roam scan should trigger + */ +struct wmi_bss_load_config { + uint32_t vdev_id; + uint32_t bss_load_threshold; +}; + /** * @time_offset: time offset after 11k offload command to trigger a neighbor * report request (in seconds) diff --git a/wmi/src/wmi_unified_roam_api.c b/wmi/src/wmi_unified_roam_api.c index 0cfb0027fdbf..420478575914 100644 --- a/wmi/src/wmi_unified_roam_api.c +++ b/wmi/src/wmi_unified_roam_api.c @@ -288,6 +288,18 @@ QDF_STATUS wmi_unified_send_btm_config(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_unified_send_bss_load_config(void *wmi_hdl, + struct wmi_bss_load_config *params) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->send_roam_bss_load_config) + return wmi_handle->ops->send_roam_bss_load_config(wmi_handle, + params); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_unified_offload_11k_cmd(void *wmi_hdl, struct wmi_11k_offload_params *params) { diff --git a/wmi/src/wmi_unified_roam_tlv.c b/wmi/src/wmi_unified_roam_tlv.c index b11ae647b9d1..f69ca47f1396 100644 --- a/wmi/src/wmi_unified_roam_tlv.c +++ b/wmi/src/wmi_unified_roam_tlv.c @@ -2046,6 +2046,50 @@ static QDF_STATUS send_btm_config_cmd_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * send_roam_bss_load_config_tlv() - send roam load bss trigger configuration + * @wmi_handle: wmi handle + * @parms: pointer to wmi_bss_load_config + * + * This function sends the roam load bss trigger configuration to fw. + * the bss_load_threshold parameter is used to configure the maximum + * bss load percentage, above which the firmware should trigger roaming + * + * Return: QDF status + */ +static QDF_STATUS +send_roam_bss_load_config_tlv(wmi_unified_t wmi_handle, + struct wmi_bss_load_config *params) +{ + wmi_roam_bss_load_config_cmd_fixed_param *cmd; + wmi_buf_t buf; + uint32_t len; + + len = sizeof(*cmd); + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + cmd = (wmi_roam_bss_load_config_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR( + &cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_roam_bss_load_config_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_roam_bss_load_config_cmd_fixed_param)); + cmd->vdev_id = params->vdev_id; + cmd->bss_load_threshold = params->bss_load_threshold; + + wmi_mtrace(WMI_ROAM_BSS_LOAD_CONFIG_CMDID, cmd->vdev_id, 0); + if (wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_ROAM_BSS_LOAD_CONFIG_CMDID)) { + WMI_LOGE("%s: failed to send WMI_ROAM_BSS_LOAD_CONFIG_CMDID ", + __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + /** * send_offload_11k_cmd_tlv() - send wmi cmd with 11k offload params * @wmi_handle: wmi handler @@ -2214,6 +2258,7 @@ void wmi_roam_attach_tlv(wmi_unified_t wmi_handle) ops->send_offload_11k_cmd = send_offload_11k_cmd_tlv; ops->send_invoke_neighbor_report_cmd = send_invoke_neighbor_report_cmd_tlv; + ops->send_roam_bss_load_config = send_roam_bss_load_config_tlv; wmi_lfr_subnet_detection_attach_tlv(wmi_handle); wmi_rssi_monitor_attach_tlv(wmi_handle);