qcacld-3.0: Move rso related process to connection manager [PART 4]

Add new code to implement below functions for connection manager
roam part:

Filling below WMI cmd parameters related process:
WMI_ROAM_BTM_CONFIG_CMDID
WMI_ROAM_SCAN_STOP_CMD
WMI_ROAM_PER_CONFIG_CMDID

And RSO command:
ROAM_SCAN_OFFLOAD_RESTART

Change-Id: I18480941980a55957abd48e0329fe4ef213a1243
CRs-Fixed: 2747578
Šī revīzija ir iekļauta:
hqu
2020-08-04 00:47:07 +08:00
revīziju iesūtīja snandini
vecāks c2c66700ac
revīzija ed6c27c858
30 mainīti faili ar 1092 papildinājumiem un 372 dzēšanām

Parādīt failu

@@ -22,12 +22,14 @@
* Implementation for the common roaming offload api interfaces.
*/
#include "wlan_mlme_main.h"
#include "wlan_cm_roam_offload.h"
#include "wlan_cm_tgt_if_tx_api.h"
#include "wlan_cm_roam_api.h"
#include "wlan_mlme_vdev_mgr_interface.h"
/**
* wlan_cm_roam_scan_bmiss_cnt() - set roam beacon miss count
* cm_roam_scan_bmiss_cnt() - set roam beacon miss count
* @psoc: psoc pointer
* @vdev_id: vdev id
* @params: roam beacon miss count parameters
@@ -37,9 +39,8 @@
* Return: None
*/
static void
wlan_cm_roam_scan_bmiss_cnt(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_beacon_miss_cnt *params)
cm_roam_scan_bmiss_cnt(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_beacon_miss_cnt *params)
{
uint8_t beacon_miss_count;
@@ -64,9 +65,8 @@ wlan_cm_roam_scan_bmiss_cnt(struct wlan_objmgr_psoc *psoc,
* Return: None
*/
static void
wlan_cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_reason_vsie_enable *params)
cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_reason_vsie_enable *params)
{
uint8_t enable_roam_reason_vsie;
@@ -87,9 +87,8 @@ wlan_cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc,
* Return: None
*/
static void
wlan_cm_roam_triggers(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_triggers *params)
cm_roam_triggers(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_triggers *params)
{
params->vdev_id = vdev_id;
params->trigger_bitmap =
@@ -98,17 +97,15 @@ wlan_cm_roam_triggers(struct wlan_objmgr_psoc *psoc,
&params->vendor_btm_param);
}
#else
static void
wlan_cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_reason_vsie_enable *params)
static inline void
cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_reason_vsie_enable *params)
{
}
static void
wlan_cm_roam_triggers(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_triggers *params)
static inline void
cm_roam_triggers(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_triggers *params)
{
}
#endif
@@ -127,6 +124,19 @@ cm_roam_init_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, bool enable)
return wlan_cm_tgt_send_roam_offload_init(psoc, vdev_id, enable);
}
static void cm_roam_set_roam_reason_better_ap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, bool set)
{
struct wlan_objmgr_vdev *vdev;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return;
mlme_set_roam_reason_better_ap(vdev, set);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
}
/**
* cm_roam_start_req() - roam start request handling
* @psoc: psoc pointer
@@ -136,8 +146,7 @@ cm_roam_init_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, bool enable)
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
struct wlan_roam_start_config *start_req;
@@ -147,11 +156,11 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
if (!start_req)
return QDF_STATUS_E_NOMEM;
cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
/* fill from mlme directly */
wlan_cm_roam_scan_bmiss_cnt(psoc, vdev_id,
&start_req->beacon_miss_cnt);
wlan_cm_roam_reason_vsie(psoc, vdev_id, &start_req->reason_vsie_enable);
wlan_cm_roam_triggers(psoc, vdev_id, &start_req->roam_triggers);
cm_roam_scan_bmiss_cnt(psoc, vdev_id, &start_req->beacon_miss_cnt);
cm_roam_reason_vsie(psoc, vdev_id, &start_req->reason_vsie_enable);
cm_roam_triggers(psoc, vdev_id, &start_req->roam_triggers);
/* fill from legacy through this API */
wlan_cm_roam_fill_start_req(psoc, vdev_id, start_req, reason);
@@ -174,13 +183,201 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
struct wlan_roam_update_config *update_req;
QDF_STATUS status;
cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
update_req = qdf_mem_malloc(sizeof(*update_req));
if (!update_req)
return QDF_STATUS_E_NOMEM;
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");
qdf_mem_free(update_req);
return status;
}
/**
* cm_roam_restart_req() - roam restart req for LFR2
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_restart_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
struct wlan_objmgr_vdev *vdev;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
/* Rome offload engine does not stop after any scan.
* If this command is sent because all preauth attempts failed
* and WMI_ROAM_REASON_SUITABLE_AP event was received earlier,
* now it is time to call it heartbeat failure.
*/
if (reason == REASON_PREAUTH_FAILED_FOR_ALL
&& mlme_get_roam_reason_better_ap(vdev)) {
mlme_err("Sending heartbeat failure after preauth failures");
wlan_cm_send_beacon_miss(vdev_id, mlme_get_hb_ap_rssi(vdev));
mlme_set_roam_reason_better_ap(vdev, false);
}
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_SUCCESS;
}
/**
* cm_roam_abort_req() - roam scan abort req
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_abort_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
QDF_STATUS status;
status = wlan_cm_tgt_send_roam_abort_req(psoc, vdev_id);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send abort start");
return status;
}
/**
* cm_roam_stop_req() - roam stop request handling
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
struct wlan_roam_stop_config *stop_req;
QDF_STATUS status;
cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
stop_req = qdf_mem_malloc(sizeof(*stop_req));
if (!stop_req)
return QDF_STATUS_E_NOMEM;
/* do the filling as csr_post_rso_stop */
status = wlan_cm_tgt_send_roam_stop_req(psoc, vdev_id, stop_req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send roam stop");
qdf_mem_free(stop_req);
return status;
}
/**
* cm_roam_fill_per_roam_request() - create PER roam offload config request
* @psoc: psoc context
* @vdev_id: vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_fill_per_roam_request(struct wlan_objmgr_psoc *psoc,
struct wlan_per_roam_config_req *req)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_FAILURE;
req->per_config.enable = mlme_obj->cfg.lfr.per_roam_enable;
req->per_config.tx_high_rate_thresh =
mlme_obj->cfg.lfr.per_roam_config_high_rate_th;
req->per_config.rx_high_rate_thresh =
mlme_obj->cfg.lfr.per_roam_config_high_rate_th;
req->per_config.tx_low_rate_thresh =
mlme_obj->cfg.lfr.per_roam_config_low_rate_th;
req->per_config.rx_low_rate_thresh =
mlme_obj->cfg.lfr.per_roam_config_low_rate_th;
req->per_config.per_rest_time = mlme_obj->cfg.lfr.per_roam_rest_time;
req->per_config.tx_per_mon_time =
mlme_obj->cfg.lfr.per_roam_monitor_time;
req->per_config.rx_per_mon_time =
mlme_obj->cfg.lfr.per_roam_monitor_time;
req->per_config.tx_rate_thresh_percnt =
mlme_obj->cfg.lfr.per_roam_config_rate_th_percent;
req->per_config.rx_rate_thresh_percnt =
mlme_obj->cfg.lfr.per_roam_config_rate_th_percent;
req->per_config.min_candidate_rssi =
mlme_obj->cfg.lfr.per_roam_min_candidate_rssi;
mlme_debug("PER based roaming configuaration enable: %d vdev: %d high_rate_thresh: %d low_rate_thresh: %d rate_thresh_percnt: %d per_rest_time: %d monitor_time: %d min cand rssi: %d",
req->per_config.enable, req->vdev_id,
req->per_config.tx_high_rate_thresh,
req->per_config.tx_low_rate_thresh,
req->per_config.tx_rate_thresh_percnt,
req->per_config.per_rest_time,
req->per_config.tx_per_mon_time,
req->per_config.min_candidate_rssi);
return QDF_STATUS_SUCCESS;
}
/**
* cm_roam_offload_per_scan() - populates roam offload scan request and sends
* to fw
* @psoc: psoc context
* @vdev_id: vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_offload_per_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
{
struct wlan_per_roam_config_req *req = NULL;
QDF_STATUS status;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return QDF_STATUS_E_NOMEM;
req->vdev_id = vdev_id;
status = cm_roam_fill_per_roam_request(psoc, req);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(req);
mlme_debug("fail to fill per config");
return status;
}
status = wlan_cm_tgt_send_roam_per_config(psoc, vdev_id, req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send roam stop");
qdf_mem_free(req);
return status;
}
/*
* similar to csr_roam_offload_scan, will be used from many legacy
* process directly, generate a new function wlan_cm_roam_send_rso_cmd
@@ -200,35 +397,28 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
mlme_debug("ROAM: not allowed");
return status;
}
/*
* Update PER config to FW. No need to update in case of stop command,
* FW takes care of stopping this internally
*/
if (rso_command != ROAM_SCAN_OFFLOAD_STOP)
cm_roam_offload_per_config(psoc, vdev_id);
if (rso_command == ROAM_SCAN_OFFLOAD_START)
status = cm_roam_start_req(psoc, vdev_id, reason);
else if (rso_command == ROAM_SCAN_OFFLOAD_UPDATE_CFG)
status = cm_roam_update_config_req(psoc, vdev_id, reason);
// else if (rso_command == ROAM_SCAN_OFFLOAD_RESTART)
/* RESTART API */
// else
/* ABORT SCAN API */
else if (rso_command == ROAM_SCAN_OFFLOAD_RESTART)
status = cm_roam_restart_req(psoc, vdev_id, reason);
else if (rso_command == ROAM_SCAN_OFFLOAD_ABORT_SCAN)
status = cm_roam_abort_req(psoc, vdev_id, reason);
else
mlme_debug("ROAM: invalid RSO command %d", rso_command);
return status;
}
/**
* cm_roam_stop_req() - roam stop request handling
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_stop_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t reason)
{
/* do the filling as csr_post_rso_stop */
return QDF_STATUS_SUCCESS;
}
/**
* cm_roam_switch_to_rso_stop() - roam state handling for rso stop
* @pdev: pdev pointer

Parādīt failu

@@ -78,6 +78,16 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_start_config *req,
uint8_t reason);
/**
* wlan_cm_send_beacon_miss() - initiate beacon miss
* @vdev_id: vdev id
* @rssi: AP rssi
*
* Return: void
*/
void wlan_cm_send_beacon_miss(uint8_t vdev_id, int32_t rssi);
#else
static inline QDF_STATUS
wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
@@ -88,21 +98,21 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
#endif
/**
* cm_roam_acquire_lock - Wrapper for sme_acquire_global_lock.
* cm_roam_acquire_lock() - Wrapper for sme_acquire_global_lock.
*
* Return: QDF_STATUS
*/
QDF_STATUS cm_roam_acquire_lock(void);
/**
* cm_roam_release_lock - Wrapper for sme_release_global_lock()
* cm_roam_release_lock() - Wrapper for sme_release_global_lock()
*
* Return: QDF_STATUS
*/
QDF_STATUS cm_roam_release_lock(void);
/**
* cm_roam_get_requestor_string - RSO control requestor to string api
* cm_roam_get_requestor_string() - RSO control requestor to string api
* @requestor: Requestor of type enum wlan_cm_rso_control_requestor
*
* Return: Pointer to converted string
@@ -111,7 +121,7 @@ char
*cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor);
/**
* ucfg_cm_rso_init_deinit - Init or Deinit roaming module at firmware
* ucfg_cm_rso_init_deinit() - Init or Deinit roaming module at firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @enable: true: Send RSO init and RSO enable
@@ -123,7 +133,7 @@ QDF_STATUS wlan_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, bool enable);
/**
* wlan_cm_disable_rso - Disable roam scan offload to firmware
* wlan_cm_disable_rso() - Disable roam scan offload to firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @requestor: RSO disable requestor
@@ -136,7 +146,7 @@ QDF_STATUS wlan_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
uint8_t reason);
/**
* ucfg_cm_enable_rso - Enable roam scan offload to firmware
* ucfg_cm_enable_rso() - Enable roam scan offload to firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @requestor: RSO disable requestor
@@ -212,7 +222,7 @@ wlan_cm_roam_extract_roam_initial_info(wmi_unified_t wmi, void *evt_buf,
uint8_t idx);
/**
* wlan_cm_roam_activate_pcl_per_vdev - Set the PCL command to be sent per
* wlan_cm_roam_activate_pcl_per_vdev() - Set the PCL command to be sent per
* vdev instead of pdev.
* @psoc: PSOC pointer
* @vdev_id: VDEV id
@@ -232,8 +242,8 @@ void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
bool pcl_per_vdev);
/**
* wlan_cm_roam_is_pcl_per_vdev_active - API to know if the pcl command needs to be
* sent per vdev or not
* wlan_cm_roam_is_pcl_per_vdev_active() - API to know if the pcl command needs
* to be sent per vdev or not
* @psoc: PSOC pointer
* @vdev_id: VDEV id
*
@@ -243,7 +253,7 @@ bool wlan_cm_roam_is_pcl_per_vdev_active(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
/**
* wlan_cm_dual_sta_is_freq_allowed - This API is used to check if the
* wlan_cm_dual_sta_is_freq_allowed() - This API is used to check if the
* provided frequency is allowed for the 2nd STA vdev for connection.
* @psoc: Pointer to PSOC object
* @freq: Frequency in the given frequency list for the STA that is about to
@@ -260,7 +270,7 @@ wlan_cm_dual_sta_is_freq_allowed(struct wlan_objmgr_psoc *psoc, uint32_t freq,
enum QDF_OPMODE opmode);
/**
* wlan_cm_dual_sta_roam_update_connect_channels - Fill the allowed channels
* wlan_cm_dual_sta_roam_update_connect_channels() - Fill the allowed channels
* for connection of the 2nd STA based on the 1st STA connected band if dual
* sta roaming is enabled.
* @psoc: Pointer to PSOC object
@@ -272,7 +282,7 @@ void
wlan_cm_dual_sta_roam_update_connect_channels(struct wlan_objmgr_psoc *psoc,
struct scan_filter *filter);
/**
* wlan_cm_roam_set_vendor_btm_params - API to set vendor btm params
* wlan_cm_roam_set_vendor_btm_params() - API to set vendor btm params
* @psoc: PSOC pointer
* @vdev_id: VDEV id
* @param: vendor configured roam trigger param
@@ -285,7 +295,7 @@ wlan_cm_roam_set_vendor_btm_params(struct wlan_objmgr_psoc *psoc,
struct wlan_cm_roam_vendor_btm_params
*param);
/**
* wlan_cm_roam_disable_vendor_btm - API to disable vendor btm by default
* wlan_cm_roam_disable_vendor_btm() - API to disable vendor btm by default
* reason
* @psoc: PSOC pointer
* @vdev_id: VDEV id
@@ -296,7 +306,7 @@ void
wlan_cm_roam_disable_vendor_btm(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id);
/**
* wlan_cm_roam_get_vendor_btm_params - API to get vendor btm param
* wlan_cm_roam_get_vendor_btm_params() - API to get vendor btm param
* @psoc: PSOC pointer
* @vdev_id: VDEV id
* @param: vendor configured roam trigger param

Parādīt failu

@@ -418,6 +418,149 @@ struct wlan_roam_scan_filter_params {
struct roam_scan_filter_params filter_params;
};
/**
* struct wlan_roam_btm_config - BSS Transition Management offload params
* @vdev_id: VDEV on which the parameters should be applied
* @btm_offload_config: BTM config
* @btm_solicited_timeout: Timeout value for waiting BTM request
* @btm_max_attempt_cnt: Maximum attempt for sending BTM query to ESS
* @btm_sticky_time: Stick time after roaming to new AP by BTM
* @disassoc_timer_threshold: threshold value till which the firmware can
* wait before triggering the roam scan after receiving the disassoc iminent
* @btm_query_bitmask: bitmask to btm query with candidate list
* @btm_candidate_min_score: Minimum score of the AP to consider it as a
* candidate if the roam trigger is BTM kickout.
*/
struct wlan_roam_btm_config {
uint8_t vdev_id;
uint32_t btm_offload_config;
uint32_t btm_solicited_timeout;
uint32_t btm_max_attempt_cnt;
uint32_t btm_sticky_time;
uint32_t disassoc_timer_threshold;
uint32_t btm_query_bitmask;
uint32_t btm_candidate_min_score;
};
/**
* struct wlan_roam_neighbor_report_params -neighbour report params
* @time_offset: time offset after 11k offload command to trigger a neighbor
* report request (in seconds)
* @low_rssi_offset: Offset from rssi threshold to trigger a neighbor
* report request (in dBm)
* @bmiss_count_trigger: Number of beacon miss events to trigger neighbor
* report request
* @per_threshold_offset: offset from PER threshold to trigger neighbor
* report request (in %)
* @neighbor_report_cache_timeout: timeout after which new trigger can enable
* sending of a neighbor report request (in seconds)
* @max_neighbor_report_req_cap: max number of neighbor report requests that
* can be sent to the peer in the current session
* @ssid: Current connect SSID info
*/
struct wlan_roam_neighbor_report_params {
uint32_t time_offset;
uint32_t low_rssi_offset;
uint32_t bmiss_count_trigger;
uint32_t per_threshold_offset;
uint32_t neighbor_report_cache_timeout;
uint32_t max_neighbor_report_req_cap;
struct wlan_ssid ssid;
};
/**
* struct wlan_roam_11k_offload_params - offload 11k features to FW
* @vdev_id: vdev id
* @offload_11k_bitmask: bitmask to specify offloaded features
* B0: Neighbor Report Request offload
* B1-B31: Reserved
* @neighbor_report_params: neighbor report offload params
*/
struct wlan_roam_11k_offload_params {
uint32_t vdev_id;
uint32_t offload_11k_bitmask;
struct wlan_roam_neighbor_report_params neighbor_report_params;
};
/**
* struct wlan_roam_disconnect_params - Emergency deauth/disconnect roam params
* @vdev_id: VDEV on which the parameters should be applied
* @enable: Enable or disable disconnect roaming.
*/
struct wlan_roam_disconnect_params {
uint32_t vdev_id;
bool enable;
};
/**
* struct wlan_roam_idle_params - Idle roam trigger parameters
* @vdev_id: VDEV on which the parameters should be applied
* @enable: Enable/Disable Idle roaming
* @band: Connected AP band
* @conn_ap_rssi_delta: Rssi change of connected AP in dBm
* @conn_ap_min_rssi: If connected AP rssi is less than min rssi trigger roam
* @inactive_time: Connected AP idle time
* @data_pkt_count: Data packet count allowed during idle time
*/
struct wlan_roam_idle_params {
uint32_t vdev_id;
bool enable;
uint32_t band;
uint32_t conn_ap_rssi_delta;
int32_t conn_ap_min_rssi;
uint32_t inactive_time;
uint32_t data_pkt_count;
};
/**
* struct wlan_per_roam_config - per based roaming parameters
* @enable: if PER based roaming is enabled/disabled
* @tx_high_rate_thresh: high rate threshold at which PER based
* roam will stop in tx path
* @rx_high_rate_thresh: high rate threshold at which PER based
* roam will stop in rx path
* @tx_low_rate_thresh: rate below which traffic will be considered
* for PER based roaming in Tx path
* @rx_low_rate_thresh: rate below which traffic will be considered
* for PER based roaming in Tx path
* @tx_rate_thresh_percnt: % above which when traffic is below low_rate_thresh
* will be considered for PER based scan in tx path
* @rx_rate_thresh_percnt: % above which when traffic is below low_rate_thresh
* will be considered for PER based scan in rx path
* @per_rest_time: time for which PER based roam will wait once it
* issues a roam scan.
* @tx_per_mon_time: Minimum time required to be considered as valid scenario
* for PER based roam in tx path
* @rx_per_mon_time: Minimum time required to be considered as valid scenario
* for PER based roam in rx path
* @min_candidate_rssi: Minimum RSSI threshold for candidate AP to be used for
* PER based roaming
*/
struct wlan_per_roam_config {
uint32_t enable;
uint32_t tx_high_rate_thresh;
uint32_t rx_high_rate_thresh;
uint32_t tx_low_rate_thresh;
uint32_t rx_low_rate_thresh;
uint32_t tx_rate_thresh_percnt;
uint32_t rx_rate_thresh_percnt;
uint32_t per_rest_time;
uint32_t tx_per_mon_time;
uint32_t rx_per_mon_time;
uint32_t min_candidate_rssi;
};
/**
* struct wlan_per_roam_config_req: PER based roaming config request
* @vdev_id: vdev id on which config needs to be set
* @per_config: PER config
*/
struct wlan_per_roam_config_req {
uint8_t vdev_id;
struct wlan_per_roam_config per_config;
};
#ifdef ROAM_OFFLOAD_V1
#define NOISE_FLOOR_DBM_DEFAULT (-96)
#define RSSI_MIN_VALUE (-128)
@@ -543,6 +686,10 @@ struct wlan_roam_scan_period_params {
* @scan_period_params: roam scan period parameters
* @profile_params: ap profile parameters
* @scan_filter_params: roam scan filter parameters
* @btm_config: btm configuration
* @roam_11k_params: 11k params
* @disconnect_params: disconnect params
* @idle_params: idle params
*/
struct wlan_roam_start_config {
struct wlan_roam_offload_scan_rssi_params rssi_params;
@@ -552,9 +699,53 @@ struct wlan_roam_start_config {
struct wlan_roam_scan_period_params scan_period_params;
struct ap_profile_params profile_params;
struct wlan_roam_scan_filter_params scan_filter_params;
struct wlan_roam_btm_config btm_config;
struct wlan_roam_11k_offload_params roam_11k_params;
struct wlan_roam_disconnect_params disconnect_params;
struct wlan_roam_idle_params idle_params;
/* other wmi cmd structures */
};
/**
* struct wlan_roam_stop_config - structure containing parameters for
* roam stop
* @roam_11k_params: 11k params
* @btm_config: btm configuration
* @scan_filter_params: roam scan filter parameters
* @disconnect_params: disconnect params
* @idle_params: idle params
* @roam_triggers: roam triggers parameters
* @rssi_params: roam scan rssi threshold parameters
*/
struct wlan_roam_stop_config {
struct wlan_roam_11k_offload_params roam_11k_params;
struct wlan_roam_btm_config btm_config;
struct wlan_roam_scan_filter_params scan_filter_params;
struct wlan_roam_disconnect_params disconnect_params;
struct wlan_roam_idle_params idle_params;
struct wlan_roam_triggers roam_triggers;
struct wlan_roam_offload_scan_rssi_params rssi_params;
};
/**
* struct wlan_roam_update_config - structure containing parameters for
* roam update config
* @beacon_miss_cnt: roam beacon miss count parameters
* @scan_filter_params: roam scan filter parameters
* @scan_period_params: roam scan period parameters
* @rssi_params: roam scan rssi threshold parameters
* @disconnect_params: disconnect params
* @idle_params: idle params
*/
struct wlan_roam_update_config {
struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
struct wlan_roam_scan_filter_params scan_filter_params;
struct wlan_roam_scan_period_params scan_period_params;
struct wlan_roam_offload_scan_rssi_params rssi_params;
struct wlan_roam_disconnect_params disconnect_params;
struct wlan_roam_idle_params idle_params;
};
#endif
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
@@ -658,6 +849,7 @@ struct set_pcl_req {
* module initialize request
* @send_roam_start_req: TX ops function pointer to send roam start related
* commands
* @send_roam_abort: send roam abort
*/
struct wlan_cm_roam_tx_ops {
QDF_STATUS (*send_vdev_set_pcl_cmd) (struct wlan_objmgr_vdev *vdev,
@@ -669,6 +861,14 @@ struct wlan_cm_roam_tx_ops {
QDF_STATUS (*send_roam_start_req)(struct wlan_objmgr_vdev *vdev,
struct wlan_roam_start_config *req);
QDF_STATUS (*send_roam_stop_offload)(struct wlan_objmgr_vdev *vdev,
struct wlan_roam_stop_config *req);
QDF_STATUS (*send_roam_update_config)(struct wlan_objmgr_vdev *vdev,
struct wlan_roam_update_config *req);
QDF_STATUS (*send_roam_abort)(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id);
QDF_STATUS (*send_roam_per_config)(struct wlan_objmgr_vdev *vdev,
struct wlan_per_roam_config_req *req);
#endif
};

Parādīt failu

@@ -28,7 +28,7 @@
#ifdef ROAM_OFFLOAD_V1
/**
* ucfg_user_space_enable_disable_rso - Enable/Disable Roam Scan offload
* ucfg_user_space_enable_disable_rso() - Enable/Disable Roam Scan offload
* to firmware.
* @pdev: Pointer to pdev
* @vdev_id: vdev id
@@ -55,7 +55,7 @@ QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id);
/**
* ucfg_cm_rso_init_deinit - Init or Deinit roaming module at firmware
* ucfg_cm_rso_init_deinit() - Init or Deinit roaming module at firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @enable: true: Send RSO init and RSO enable
@@ -71,7 +71,7 @@ ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
}
/**
* ucfg_cm_disable_rso - Disable roam scan offload to firmware
* ucfg_cm_disable_rso() - Disable roam scan offload to firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @requestor: RSO disable requestor
@@ -88,7 +88,7 @@ QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
}
/**
* ucfg_cm_enable_rso - Enable roam scan offload to firmware
* ucfg_cm_enable_rso() - Enable roam scan offload to firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @requestor: RSO disable requestor

Parādīt failu

@@ -30,7 +30,7 @@
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* wlan_cm_roam_send_set_vdev_pcl - Send vdev set pcl command to firmware
* wlan_cm_roam_send_set_vdev_pcl() - Send vdev set pcl command to firmware
* @psoc: PSOC pointer
* @pcl_req: Set pcl request structure pointer
*
@@ -51,8 +51,8 @@ wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
#ifdef ROAM_OFFLOAD_V1
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
/**
* wlan_cm_tgt_send_roam_offload_init - Send WMI_VDEV_PARAM_ROAM_FW_OFFLOAD to
* init/deinit roaming module at firmware
* wlan_cm_tgt_send_roam_offload_init() - Send WMI_VDEV_PARAM_ROAM_FW_OFFLOAD
* to init/deinit roaming module at firmware
* @psoc: PSOC pointer
* @vdev_id: vdev id
* @is_init: true if roam module is to be initialized else false for deinit
@@ -63,7 +63,7 @@ QDF_STATUS wlan_cm_tgt_send_roam_offload_init(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, bool is_init);
/**
* wlan_cm_tgt_send_roam_start_req - Send roam start command to firmware
* wlan_cm_tgt_send_roam_start_req() - Send roam start command to firmware
* @psoc: psoc pointer
* @vdev_id: vdev id
* @req: roam start config parameter
@@ -73,6 +73,52 @@ QDF_STATUS wlan_cm_tgt_send_roam_offload_init(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_cm_tgt_send_roam_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_start_config *req);
/**
* wlan_cm_tgt_send_roam_stop_req() - Send roam stop command to firmware
* @psoc: psoc pointer
* @vdev_id: vdev id
* @req: roam stop config parameter
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_tgt_send_roam_stop_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_stop_config *req);
/**
* wlan_cm_tgt_send_roam_start_req() - Send roam update command to firmware
* @psoc: psoc pointer
* @vdev_id: vdev id
* @req: roam update config parameter
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_tgt_send_roam_update_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_update_config *req);
/**
* wlan_cm_tgt_send_roam_abort_req() - Send roam abort command to firmware
* @psoc: psoc pointer
* @vdev_id: vdev id
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_tgt_send_roam_abort_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
/**
* wlan_cm_tgt_send_roam_per_config() - Send roam per config command to FW
* @psoc: psoc pointer
* @vdev_id: vdev id
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_tgt_send_roam_per_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_per_roam_config_req *req);
#endif
#endif
#endif /* CM_TGT_IF_TX_API_H__ */

Parādīt failu

@@ -92,7 +92,7 @@ QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
if (QDF_IS_STATUS_ERROR(status))
return status;
status = cm_roam_state_change(pdev, vdev_id,
status = cm_roam_send_rso_cmd(psoc, vdev_id,
ROAM_SCAN_OFFLOAD_ABORT_SCAN,
REASON_ROAM_ABORT_ROAM_SCAN);
cm_roam_release_lock();

Parādīt failu

@@ -169,6 +169,8 @@ QDF_STATUS wlan_cm_tgt_send_roam_offload_init(struct wlan_objmgr_psoc *psoc,
init_msg.roam_offload_flag |=
WLAN_ROAM_BMISS_FINAL_SCAN_TYPE;
}
mlme_debug("vdev_id:%d, is_init:%d, flag:%d", vdev_id, is_init,
init_msg.roam_offload_flag);
status = roam_tx_ops.send_roam_offload_init_req(vdev, &init_msg);
if (QDF_IS_STATUS_ERROR(status))
@@ -194,17 +196,138 @@ QDF_STATUS wlan_cm_tgt_send_roam_start_req(struct wlan_objmgr_psoc *psoc,
roam_tx_ops = GET_CM_ROAM_TX_OPS_FROM_VDEV(vdev);
if (!roam_tx_ops.send_roam_start_req) {
mlme_err("CM_RSO: vdev%d send_roam_start_req is NULL", vdev_id);
mlme_err("CM_RSO: vdev %d send_roam_start_req is NULL",
vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops.send_roam_start_req(vdev, req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("CM_RSO: vdev%d fail to send roam start", vdev_id);
mlme_debug("CM_RSO: vdev %d fail to send roam start", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
QDF_STATUS wlan_cm_tgt_send_roam_stop_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_stop_config *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, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
roam_tx_ops = GET_CM_ROAM_TX_OPS_FROM_VDEV(vdev);
if (!roam_tx_ops.send_roam_stop_offload) {
mlme_err("CM_RSO: vdev %d send_roam_stop_offload is NULL",
vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops.send_roam_stop_offload(vdev, req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("CM_RSO: vdev %d fail to send roam stop", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
QDF_STATUS wlan_cm_tgt_send_roam_update_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_update_config *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, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
roam_tx_ops = GET_CM_ROAM_TX_OPS_FROM_VDEV(vdev);
if (!roam_tx_ops.send_roam_update_config) {
mlme_err("CM_RSO: vdev %d send_roam_update_config is NULL",
vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops.send_roam_update_config(vdev, req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("CM_RSO: vdev %d fail to send roam update", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
QDF_STATUS wlan_cm_tgt_send_roam_abort_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
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, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
roam_tx_ops = GET_CM_ROAM_TX_OPS_FROM_VDEV(vdev);
if (!roam_tx_ops.send_roam_abort) {
mlme_err("CM_RSO: vdev %d send_roam_abort is NULL", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops.send_roam_abort(vdev, vdev_id);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("CM_RSO: vdev %d fail to send roam abort", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
QDF_STATUS wlan_cm_tgt_send_roam_per_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_per_roam_config_req *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, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
roam_tx_ops = GET_CM_ROAM_TX_OPS_FROM_VDEV(vdev);
if (!roam_tx_ops.send_roam_per_config) {
mlme_err("CM_RSO: vdev %d send_roam_per_config is NULL",
vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops.send_roam_per_config(vdev, req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("CM_RSO: vdev %d fail to send per config", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
#endif
#endif