qcacld-3.0: Vendor command changes to enable the roam events stats

Add new vendor command to enable the roam events stats from the
driver/FW in both resume and suspend mode.
New roam param is introduced to indicate the FW to enable/disable
the roam stats using the new roam set command.

Change-Id: I6d04f0946e6735613a4cf3d4361bf31052314fa0
CRs-Fixed: 3036518
This commit is contained in:
Srikanth Marepalli 2021-10-06 18:57:21 +05:30 • committed by Madan Koyyalamudi
commit 9ad1472142
13 changed files with 510 additions and 0 deletions

View file

@ -1606,6 +1606,7 @@ static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc,
lfr->idle_roam_band = cfg_get(psoc, CFG_LFR_IDLE_ROAM_BAND);
lfr->sta_roam_disable = cfg_get(psoc, CFG_STA_DISABLE_ROAM);
mlme_init_sae_single_pmk_cfg(psoc, lfr);
qdf_mem_zero(&lfr->roam_rt_stats, sizeof(lfr->roam_rt_stats));
}
#else

View file

@ -1586,6 +1586,7 @@ struct fw_scan_channels {
* @mawc_roam_enabled: Enable/Disable MAWC during roaming
* @enable_fast_roam_in_concurrency:Enable LFR roaming on STA during concurrency
* @vendor_btm_param: Vendor WTC roam trigger parameters
* @roam_rt_stats: Roam event stats vendor command parameters
* @lfr3_roaming_offload: Enable/disable roam offload feature
* @lfr3_dual_sta_roaming_enabled: Enable/Disable dual sta roaming offload
* feature
@ -1704,6 +1705,7 @@ struct wlan_mlme_lfr_cfg {
bool enable_fast_roam_in_concurrency;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
struct wlan_cm_roam_rt_stats roam_rt_stats;
bool lfr3_roaming_offload;
bool lfr3_dual_sta_roaming_enabled;
bool enable_self_bss_roam;

View file

@ -26,6 +26,7 @@
#include "wlan_mlme_api.h"
#include "wlan_crypto_global_api.h"
#include "wlan_mlme_main.h"
#include "wlan_cm_roam_api.h"
static struct wmi_unified
*target_if_cm_roam_get_wmi_handle_from_vdev(struct wlan_objmgr_vdev *vdev)
@ -74,15 +75,78 @@ target_if_cm_roam_send_vdev_set_pcl_cmd(struct wlan_objmgr_vdev *vdev,
return wmi_unified_vdev_set_pcl_cmd(wmi_handle, &params);
}
/**
* target_if_roam_set_param() - set roam params in fw
* @wmi_handle: wmi handle
* @vdev_id: vdev id
* @param_id: parameter id
* @param_value: parameter value
*
* Return: QDF_STATUS_SUCCESS for success or error code
*/
static QDF_STATUS
target_if_roam_set_param(wmi_unified_t wmi_handle, uint8_t vdev_id,
uint32_t param_id, uint32_t param_value)
{
struct vdev_set_params roam_param = {0};
roam_param.vdev_id = vdev_id;
roam_param.param_id = param_id;
roam_param.param_value = param_value;
return wmi_unified_roam_set_param_send(wmi_handle, &roam_param);
}
/**
* target_if_cm_roam_rt_stats_config() - Send enable/disable roam event stats
* commands to wmi
* @vdev: vdev object
* @vdev_id: vdev id
* @rstats_config: roam event stats config parameters
*
* Return: QDF_STATUS
*/
static QDF_STATUS
target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, uint8_t rstats_config)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
wmi_unified_t wmi_handle;
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
if (!wmi_handle)
return status;
status = target_if_roam_set_param(
wmi_handle,
vdev_id,
WMI_ROAM_PARAM_ROAM_EVENTS_CONFIG,
rstats_config);
if (QDF_IS_STATUS_ERROR(status))
target_if_err("Failed to set "
"WMI_ROAM_PARAM_ROAM_EVENTS_CONFIG");
return status;
}
static void
target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
{
tx_ops->send_vdev_set_pcl_cmd = target_if_cm_roam_send_vdev_set_pcl_cmd;
tx_ops->send_roam_rt_stats_config = target_if_cm_roam_rt_stats_config;
}
#else
static inline void
target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
{}
static QDF_STATUS
target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, uint8_t rstats_config)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
@ -842,6 +906,7 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
QDF_STATUS status = QDF_STATUS_SUCCESS;
wmi_unified_t wmi_handle;
struct wlan_objmgr_psoc *psoc;
uint8_t vdev_id;
bool bss_load_enabled;
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
@ -962,6 +1027,11 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
target_if_cm_roam_idle_params(wmi_handle, ROAM_SCAN_OFFLOAD_START,
&req->idle_params);
vdev_id = wlan_vdev_get_id(vdev);
if (req->wlan_roam_rt_stats_config)
target_if_cm_roam_rt_stats_config(vdev, vdev_id,
req->wlan_roam_rt_stats_config);
/* add other wmi commands */
end:
return status;
@ -1179,6 +1249,11 @@ target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
wmi_handle, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
&req->idle_params);
target_if_cm_roam_triggers(vdev, &req->roam_triggers);
if (req->wlan_roam_rt_stats_config)
target_if_cm_roam_rt_stats_config(
vdev, vdev_id,
req->wlan_roam_rt_stats_config);
}
end:
return status;

View file

@ -237,6 +237,39 @@ cm_roam_idle_params(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
wlan_mlme_get_idle_roam_min_rssi(psoc, &params->conn_ap_min_rssi);
wlan_mlme_get_idle_roam_band(psoc, &params->band);
}
/**
* cm_roam_send_rt_stats_config() - set roam stats parameters
* @psoc: psoc pointer
* @vdev_id: vdev id
* @param_value: roam stats param value
*
* This function is used to set roam event stats parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS
cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t param_value)
{
struct roam_disable_cfg *req;
QDF_STATUS status;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return QDF_STATUS_E_NOMEM;
req->vdev_id = vdev_id;
req->cfg = param_value;
status = wlan_cm_tgt_send_roam_rt_stats_config(psoc, req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send roam rt stats config");
qdf_mem_free(req);
return status;
}
#else
static inline void
cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
@ -488,6 +521,9 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
/* fill from legacy through this API */
wlan_cm_roam_fill_start_req(psoc, vdev_id, start_req, reason);
start_req->wlan_roam_rt_stats_config =
wlan_cm_get_roam_rt_stats(psoc, ROAM_RT_STATS_ENABLE);
status = wlan_cm_tgt_send_roam_start_req(psoc, vdev_id, start_req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send roam start");
@ -534,6 +570,9 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
/* fill from legacy through this API */
wlan_cm_roam_fill_update_config_req(psoc, vdev_id, update_req, reason);
update_req->wlan_roam_rt_stats_config =
wlan_cm_get_roam_rt_stats(psoc, ROAM_RT_STATS_ENABLE);
status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send update config");

View file

@ -102,6 +102,27 @@ cm_roam_fill_rssi_change_params(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_rssi_change_params *params);
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* cm_roam_send_rt_stats_config() - Send roam event stats cfg value to FW
* @psoc: PSOC pointer
* @vdev_id: vdev id
* @param_value: roam stats enable/disable cfg
*
* Return: QDF_STATUS
*/
QDF_STATUS
cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t param_value);
#else
static inline QDF_STATUS
cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t param_value)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* cm_roam_send_disable_config() - Send roam module enable/disable cfg to fw
* @psoc: PSOC pointer

View file

@ -599,6 +599,28 @@ uint32_t
wlan_cm_get_roam_states(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
enum roam_fail_params states);
/**
* wlan_cm_update_roam_rt_stats() - Store roam event stats command params
* @psoc: PSOC pointer
* @value: Value to update
* @stats: type of value to update
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_update_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
uint8_t value, enum roam_rt_stats_params stats);
/**
* wlan_cm_get_roam_rt_stats() - Get roam event stats value
* @psoc: PSOC pointer
* @stats: Get roam event command param for specific attribute
*
* Return: Roam events stats param value
*/
uint8_t
wlan_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
enum roam_rt_stats_params stats);
#else
static inline
void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
@ -702,5 +724,18 @@ wlan_cm_get_roam_states(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
return 0;
}
static inline QDF_STATUS
wlan_cm_update_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
uint8_t value, enum roam_rt_stats_params stats)
{
return QDF_STATUS_SUCCESS;
}
static inline uint8_t
wlan_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
enum roam_rt_stats_params stats)
{
return 0;
}
#endif /* FEATURE_ROAM_OFFLOAD */
#endif /* WLAN_CM_ROAM_API_H__ */

View file

@ -1095,6 +1095,27 @@ struct wlan_roam_rssi_change_params {
int32_t rssi_change_thresh;
};
/**
* struct wlan_cm_roam_rt_stats - Roam events stats update
* @roam_stats_enabled: set 1 if roam stats feature is enabled from userspace
* @roam_stats_wow_sent: set 1 if roam stats wow event is sent to FW
*/
struct wlan_cm_roam_rt_stats {
uint8_t roam_stats_enabled;
uint8_t roam_stats_wow_sent;
};
/**
* enum roam_rt_stats_params: different types of params to set or get roam
* events stats for the vdev
* @ROAM_RT_STATS_ENABLE: Roam stats feature if enable/not
* @ROAM_RT_STATS_SUSPEND_MODE_ENABLE: Roam stats wow event if sent to FW/not
*/
enum roam_rt_stats_params {
ROAM_RT_STATS_ENABLE,
ROAM_RT_STATS_SUSPEND_MODE_ENABLE,
};
/**
* struct wlan_roam_start_config - structure containing parameters for
* roam start config
@ -1113,6 +1134,7 @@ struct wlan_roam_rssi_change_params {
* @bss_load_config: bss load config
* @disconnect_params: disconnect params
* @idle_params: idle params
* @wlan_roam_rt_stats_config: roam events stats config
*/
struct wlan_roam_start_config {
struct wlan_roam_offload_scan_rssi_params rssi_params;
@ -1131,6 +1153,7 @@ struct wlan_roam_start_config {
struct wlan_roam_bss_load_config bss_load_config;
struct wlan_roam_disconnect_params disconnect_params;
struct wlan_roam_idle_params idle_params;
uint8_t wlan_roam_rt_stats_config;
/* other wmi cmd structures */
};
@ -1175,6 +1198,7 @@ struct wlan_roam_stop_config {
* @disconnect_params: disconnect params
* @idle_params: idle params
* @roam_triggers: roam triggers parameters
* @wlan_roam_rt_stats_config: roam events stats config
*/
struct wlan_roam_update_config {
struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
@ -1188,6 +1212,7 @@ struct wlan_roam_update_config {
struct wlan_roam_disconnect_params disconnect_params;
struct wlan_roam_idle_params idle_params;
struct wlan_roam_triggers roam_triggers;
uint8_t wlan_roam_rt_stats_config;
};
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
@ -1312,6 +1337,7 @@ struct set_pcl_req {
* commands
* @send_roam_abort: send roam abort
* @send_roam_disable_config: send roam disable config
* @send_roam_rt_stats_config: Send roam events vendor command param value to FW
*/
struct wlan_cm_roam_tx_ops {
QDF_STATUS (*send_vdev_set_pcl_cmd)(struct wlan_objmgr_vdev *vdev,
@ -1336,6 +1362,10 @@ struct wlan_cm_roam_tx_ops {
struct wlan_roam_triggers *req);
QDF_STATUS (*send_roam_disable_config)(struct wlan_objmgr_vdev *vdev,
struct roam_disable_cfg *req);
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS (*send_roam_rt_stats_config)(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, uint8_t value);
#endif
};
/**

View file

@ -155,6 +155,35 @@ ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
return wlan_cm_update_roam_scan_scheme_bitmap(psoc, vdev_id,
roam_scan_scheme_bitmap);
}
static inline QDF_STATUS
ucfg_cm_update_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
uint8_t value, enum roam_rt_stats_params stats)
{
return wlan_cm_update_roam_rt_stats(psoc, value, stats);
}
static inline uint8_t
ucfg_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
enum roam_rt_stats_params stats)
{
return wlan_cm_get_roam_rt_stats(psoc, stats);
}
/**
* ucfg_cm_roam_send_rt_stats_config() - Enable/Disable Roam event stats from FW
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @param_value: Value set based on the userspace attributes.
* param_value - 0: if configure attribute is 0
* 1: if configure is 1 and suspend_state is not set
* 3: if configure is 1 and suspend_state is set
*
* Return: QDF_STATUS
*/
QDF_STATUS
ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint8_t param_value);
#else
static inline QDF_STATUS
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
@ -163,4 +192,25 @@ ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
ucfg_cm_update_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
uint8_t value, enum roam_rt_stats_params stats)
{
return QDF_STATUS_SUCCESS;
}
static inline uint8_t
ucfg_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
enum roam_rt_stats_params stats)
{
return 0;
}
static inline QDF_STATUS
ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint8_t param_value)
{
return QDF_STATUS_SUCCESS;
}
#endif

View file

@ -36,6 +36,17 @@
QDF_STATUS
wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
struct set_pcl_req *pcl_req);
/**
* wlan_cm_tgt_send_roam_rt_stats_config() - Send roam event stats config
* command to FW
* @psoc: psoc pointer
* @req: roam stats config parameter
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
struct roam_disable_cfg *req);
#else
static inline QDF_STATUS
wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
@ -43,6 +54,13 @@ wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
{
return QDF_STATUS_E_FAILURE;
}
static inline QDF_STATUS
wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
struct roam_disable_cfg *req)
{
return QDF_STATUS_E_FAILURE;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)

View file

@ -818,4 +818,55 @@ uint32_t wlan_cm_get_roam_states(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
return roam_states;
}
QDF_STATUS
wlan_cm_update_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
uint8_t value, enum roam_rt_stats_params stats)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
struct wlan_cm_roam_rt_stats *roam_rt_stats;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
mlme_legacy_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
roam_rt_stats = &mlme_obj->cfg.lfr.roam_rt_stats;
switch (stats) {
case ROAM_RT_STATS_ENABLE:
roam_rt_stats->roam_stats_enabled = value;
break;
default:
break;
}
return QDF_STATUS_SUCCESS;
}
uint8_t wlan_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
enum roam_rt_stats_params stats)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
struct wlan_cm_roam_rt_stats *roam_rt_stats;
uint8_t rstats_value = 0;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
mlme_legacy_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
roam_rt_stats = &mlme_obj->cfg.lfr.roam_rt_stats;
switch (stats) {
case ROAM_RT_STATS_ENABLE:
rstats_value = roam_rt_stats->roam_stats_enabled;
break;
default:
break;
}
return rstats_value;
}
#endif

View file

@ -127,3 +127,14 @@ QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
return status;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS
ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint8_t param_value)
{
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
return cm_roam_send_rt_stats_config(psoc, vdev_id, param_value);
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */

View file

@ -154,6 +154,37 @@ end:
return status;
}
QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
struct roam_disable_cfg *req)
{
QDF_STATUS status;
struct wlan_cm_roam_tx_ops *roam_tx_ops;
struct wlan_objmgr_vdev *vdev;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, req->vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
roam_tx_ops = wlan_cm_roam_get_tx_ops_from_vdev(vdev);
if (!roam_tx_ops || !roam_tx_ops->send_roam_rt_stats_config) {
mlme_err("vdev %d send_roam_rt_stats_config is NULL",
req->vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops->send_roam_rt_stats_config(vdev,
req->vdev_id, req->cfg);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("vdev %d fail to send roam rt stats config",
req->vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
#endif
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)

View file

@ -1703,6 +1703,12 @@ static const struct nl80211_vendor_cmd_info wlan_hdd_cfg80211_vendor_events[] =
FEATURE_TWT_VENDOR_EVENTS
#endif
FEATURE_CFR_DATA_VENDOR_EVENTS
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
[QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX] = {
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS,
},
#endif
};
/**
@ -15306,6 +15312,133 @@ err:
}
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* enum roam_stats_set_params - Different types of params to set the roam stats
* @ROAM_RT_STATS_DISABLED: Roam stats feature disabled
* @ROAM_RT_STATS_ENABLED: Roam stats feature enabled
* @ROAM_RT_STATS_ENABLED_IN_SUSPEND_MODE: Roam stats enabled in suspend mode
*/
enum roam_stats_set_params {
ROAM_RT_STATS_DISABLED = 0,
ROAM_RT_STATS_ENABLED = 1,
ROAM_RT_STATS_ENABLED_IN_SUSPEND_MODE = 2,
};
#define EVENTS_CONFIGURE QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_CONFIGURE
#define SUSPEND_STATE QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_SUSPEND_STATE
static const struct nla_policy
set_roam_events_policy[QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX + 1] = {
[QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_CONFIGURE] = {.type = NLA_U8},
[QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_SUSPEND_STATE] = {.type = NLA_FLAG},
};
/**
* __wlan_hdd_cfg80211_set_roam_events() - set roam stats
* @wiphy: wiphy pointer
* @wdev: pointer to struct wireless_dev
* @data: pointer to incoming NL vendor data
* @data_len: length of @data
*
* Return: 0 on success; error number otherwise.
*/
static int __wlan_hdd_cfg80211_set_roam_events(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len)
{
struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(wdev->netdev);
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX + 1];
QDF_STATUS status;
int ret;
uint8_t config, state, param = 0;
ret = wlan_hdd_validate_context(hdd_ctx);
if (ret != 0) {
hdd_err("Invalid hdd_ctx");
return ret;
}
ret = hdd_validate_adapter(adapter);
if (ret != 0) {
hdd_err("Invalid adapter");
return ret;
}
if (adapter->device_mode != QDF_STA_MODE) {
hdd_err("STATS supported in only STA mode!");
return -EINVAL;
}
if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX,
data, data_len, set_roam_events_policy)) {
hdd_err("Invalid ATTR");
return -EINVAL;
}
if (!tb[EVENTS_CONFIGURE]) {
hdd_err("roam events configure not present");
return -EINVAL;
}
config = nla_get_u8(tb[EVENTS_CONFIGURE]);
hdd_debug("roam stats configured: %d", config);
if (!tb[SUSPEND_STATE]) {
hdd_debug("suspend state not present");
param = config ? ROAM_RT_STATS_ENABLED : ROAM_RT_STATS_DISABLED;
} else if (config == ROAM_RT_STATS_ENABLED) {
state = nla_get_flag(tb[SUSPEND_STATE]);
hdd_debug("Suspend state configured: %d", state);
param = ROAM_RT_STATS_ENABLED |
ROAM_RT_STATS_ENABLED_IN_SUSPEND_MODE;
}
hdd_debug("roam events param: %d", param);
ucfg_cm_update_roam_rt_stats(hdd_ctx->psoc,
param, ROAM_RT_STATS_ENABLE);
status = ucfg_cm_roam_send_rt_stats_config(hdd_ctx->pdev,
adapter->vdev_id, param);
return qdf_status_to_os_return(status);
}
#undef EVENTS_CONFIGURE
#undef SUSPEND_STATE
/**
* wlan_hdd_cfg80211_set_roam_events() - set roam stats
* @wiphy: wiphy pointer
* @wdev: pointer to struct wireless_dev
* @data: pointer to incoming NL vendor data
* @data_len: length of @data
*
* Return: 0 on success; error number otherwise.
*/
static int wlan_hdd_cfg80211_set_roam_events(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len)
{
int errno;
struct osif_vdev_sync *vdev_sync;
errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync);
if (errno)
return errno;
errno = __wlan_hdd_cfg80211_set_roam_events(wiphy, wdev,
data, data_len);
osif_vdev_sync_op_stop(vdev_sync);
return errno;
}
#endif
/**
* __wlan_hdd_cfg80211_get_chain_rssi() - get chain rssi
* @wiphy: wiphy pointer
@ -16398,6 +16531,19 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
#ifdef WLAN_FEATURE_PKT_CAPTURE
FEATURE_MONITOR_MODE_VENDOR_COMMANDS
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
{
.info.vendor_id = QCA_NL80211_VENDOR_ID,
.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS,
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
WIPHY_VENDOR_CMD_NEED_NETDEV |
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_set_roam_events,
vendor_command_policy(set_roam_events_policy,
QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX)
},
#endif
};
struct hdd_context *hdd_cfg80211_wiphy_alloc(void)