From a4128d588700052e0d7f79999c41e80594e6d790 Mon Sep 17 00:00:00 2001 From: Srikanth Marepalli Date: Mon, 18 Oct 2021 23:31:51 +0530 Subject: [PATCH] qcacmn: Add roam set param command for roam params This change introduces the new roam set param WMI command to set the roam params from host to FW. Also added a fail_bssid param in wmi_roam_result TLV to know the roam failed AP BSSID from the FW. Added a new vendor command event for sending roam events stats attributes to userspace. Change-Id: I7a08635a7912cbd940d90a2d62433296740ad913 CRs-Fixed: 3050799 --- os_if/linux/wlan_cfg80211.h | 3 +++ wmi/inc/wmi_unified_api.h | 20 +++++++++++++++++ wmi/inc/wmi_unified_param.h | 2 ++ wmi/inc/wmi_unified_priv.h | 3 +++ wmi/src/wmi_unified_api.c | 13 +++++++++++ wmi/src/wmi_unified_tlv.c | 45 +++++++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+) diff --git a/os_if/linux/wlan_cfg80211.h b/os_if/linux/wlan_cfg80211.h index 3b7ca280cf..82926a0f63 100644 --- a/os_if/linux/wlan_cfg80211.h +++ b/os_if/linux/wlan_cfg80211.h @@ -245,6 +245,9 @@ enum qca_nl80211_vendor_subcmds_index { #ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING QCA_NL80211_VENDOR_SUBCMD_DIAG_EVENT_INDEX, #endif +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX, +#endif }; #if !defined(SUPPORT_WDEV_CFG80211_VENDOR_EVENT_ALLOC) && \ diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 52425f3930..16d93e6b4a 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -863,6 +863,26 @@ QDF_STATUS wmi_unified_vdev_set_param_send(wmi_unified_t wmi_handle, struct vdev_set_params *param); +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/** + * wmi_unified_roam_set_param_send() - WMI roam set parameter function + * @wmi_handle: handle to WMI. + * @roam_param: pointer to hold roam set parameter + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_roam_set_param_send(wmi_unified_t wmi_handle, + struct vdev_set_params *roam_param); +#else +static inline QDF_STATUS +wmi_unified_roam_set_param_send(wmi_unified_t wmi_handle, + struct vdev_set_params *roam_param) +{ + return QDF_STATUS_SUCCESS; +} +#endif + /** * wmi_unified_sifs_trigger_send() - WMI vdev sifs trigger parameter function * @wmi_handle: handle to WMI. diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 7e398f1961..9ea45bc722 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -7665,12 +7665,14 @@ struct wmi_roam_scan_data { * @status: 0 - Roaming is success ; 1 - Roaming failed ; * 2 - No roam * @fail_reason: One of WMI_ROAM_FAIL_REASON_ID + * @fail_bssid: BSSID of the last attempted roam failed AP */ struct wmi_roam_result { bool present; uint32_t timestamp; uint32_t status; uint32_t fail_reason; + struct qdf_mac_addr fail_bssid; }; #define WLAN_11KV_TYPE_BTM_REQ 1 diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 4db47ddf17..4029c0ae9e 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1092,6 +1092,9 @@ QDF_STATUS (*send_pdev_set_pcl_cmd)(wmi_unified_t wmi_handle, #ifdef WLAN_FEATURE_ROAM_OFFLOAD QDF_STATUS (*send_vdev_set_pcl_cmd)(wmi_unified_t wmi_handle, struct set_pcl_cmd_params *params); + +QDF_STATUS (*send_roam_set_param_cmd)(wmi_unified_t wmi_handle, + struct vdev_set_params *roam_param); #endif #ifdef WLAN_POLICY_MGR_ENABLE diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 929952b32c..7806d21677 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -408,6 +408,19 @@ wmi_unified_vdev_set_param_send(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +QDF_STATUS +wmi_unified_roam_set_param_send(wmi_unified_t wmi_handle, + struct vdev_set_params *roam_param) +{ + if (wmi_handle->ops->send_roam_set_param_cmd) + return wmi_handle->ops->send_roam_set_param_cmd(wmi_handle, + roam_param); + + return QDF_STATUS_E_FAILURE; +} +#endif + QDF_STATUS wmi_unified_sifs_trigger_send(wmi_unified_t wmi_handle, struct sifs_trigger_param *param) { diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index fa39714efa..3e376d98f4 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -15490,6 +15490,7 @@ extract_roam_result_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf, dst->status = src_data->roam_status; dst->timestamp = src_data->timestamp; dst->fail_reason = src_data->roam_fail_reason; + WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_data->bssid, dst->fail_bssid.bytes); return QDF_STATUS_SUCCESS; } @@ -15557,6 +15558,47 @@ extract_roam_11kv_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf, return QDF_STATUS_SUCCESS; } + +/** + * send_roam_set_param_cmd_tlv() - WMI roam set parameter function + * @wmi_handle : handle to WMI. + * @roam_param : pointer to hold roam set parameter + * + * Return: 0 on success and -ve on failure. + */ +static QDF_STATUS +send_roam_set_param_cmd_tlv(wmi_unified_t wmi_handle, + struct vdev_set_params *roam_param) +{ + QDF_STATUS ret; + wmi_roam_set_param_cmd_fixed_param *cmd; + wmi_buf_t buf; + uint16_t len = sizeof(*cmd); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + cmd = (wmi_roam_set_param_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_roam_set_param_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_roam_set_param_cmd_fixed_param)); + cmd->vdev_id = roam_param->vdev_id; + cmd->param_id = roam_param->param_id; + cmd->param_value = roam_param->param_value; + wmi_debug("Setting vdev %d roam_param = %x, value = %u", + cmd->vdev_id, cmd->param_id, cmd->param_value); + wmi_mtrace(WMI_ROAM_SET_PARAM_CMDID, cmd->vdev_id, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_ROAM_SET_PARAM_CMDID); + if (QDF_IS_STATUS_ERROR(ret)) { + wmi_err("Failed to send roam set param command, ret = %d", ret); + wmi_buf_free(buf); + } + + return ret; +} #else static inline QDF_STATUS extract_roam_trigger_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf, @@ -16634,6 +16676,9 @@ struct wmi_ops tlv_ops = { .send_mgmt_rx_reo_filter_config_cmd = send_mgmt_rx_reo_filter_config_cmd_tlv, #endif +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + .send_roam_set_param_cmd = send_roam_set_param_cmd_tlv, +#endif /* WLAN_FEATURE_ROAM_OFFLOAD */ }; /**