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

Add new code to implement below functions for connection manager
roam part:
WLAN_ROAMING_IN_PROG/WLAN_ROAM_SYNCH_IN_PROG related handler.
Filling below WMI cmd parameters related process:
WMI_VDEV_PARAM_BMISS_FIRST_BCNT
WMI_VDEV_PARAM_BMISS_FINAL_BCNT
WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE
WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID
WMI_ROAM_SCAN_PERIOD

Change-Id: I28439393a57c72012f9de51f24050f95366294bc
CRs-Fixed: 2738353
This commit is contained in:
hqu
2020-07-17 23:01:04 +08:00
committed by snandini
parent ede5f59a27
commit f36840cce8
13 changed files with 902 additions and 211 deletions

View File

@@ -2653,4 +2653,26 @@ QDF_STATUS mlme_get_fw_scan_channels(struct wlan_objmgr_psoc *psoc,
QDF_STATUS
wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
bool *val);
/**
* wlan_mlme_get_roam_bmiss_final_bcnt() - Get roam bmiss final count
* @psoc: pointer to psoc object
* @val: Pointer to the value which will be filled for the caller
*
* Return: QDF Status
*/
QDF_STATUS
wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
uint8_t *val);
/**
* wlan_mlme_get_roam_bmiss_first_bcnt() - Get roam bmiss first count
* @psoc: pointer to psoc object
* @val: Pointer to the value which will be filled for the caller
*
* Return: QDF Status
*/
QDF_STATUS
wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
uint8_t *val);
#endif /* _WLAN_MLME_API_H_ */

View File

@@ -4047,3 +4047,37 @@ wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
uint8_t *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
uint8_t *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
return QDF_STATUS_SUCCESS;
}

View File

@@ -984,34 +984,14 @@ QDF_STATUS
ucfg_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
uint8_t *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
return QDF_STATUS_SUCCESS;
return wlan_mlme_get_roam_bmiss_final_bcnt(psoc, val);
}
QDF_STATUS
ucfg_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
uint8_t *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
return QDF_STATUS_SUCCESS;
return wlan_mlme_get_roam_bmiss_first_bcnt(psoc, val);
}
QDF_STATUS

View File

@@ -85,6 +85,146 @@ target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
#endif
#ifdef ROAM_OFFLOAD_V1
/**
* target_if_is_vdev_valid - vdev id is valid or not
* @vdev_id: vdev id
*
* Return: true or false
*/
static bool target_if_is_vdev_valid(uint8_t vdev_id)
{
return (vdev_id < WLAN_MAX_VDEVS ? true : false);
}
/**
* target_if_vdev_set_param() - set per vdev 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_vdev_set_param(wmi_unified_t wmi_handle, uint32_t vdev_id,
uint32_t param_id, uint32_t param_value)
{
struct vdev_set_params param = {0};
if (!target_if_is_vdev_valid(vdev_id)) {
target_if_err("vdev_id: %d is invalid, reject the req: param id %d val %d",
vdev_id, param_id, param_value);
return QDF_STATUS_E_INVAL;
}
param.vdev_id = vdev_id;
param.param_id = param_id;
param.param_value = param_value;
return wmi_unified_vdev_set_param_send(wmi_handle, &param);
}
/**
* target_if_cm_roam_scan_bmiss_cnt() - set bmiss count to fw
* @wmi_handle: wmi handle
* @req: bmiss count parameters
*
* Set first & final bmiss count to fw.
*
* Return: QDF status
*/
static QDF_STATUS
target_if_cm_roam_scan_bmiss_cnt(wmi_unified_t wmi_handle,
struct wlan_roam_beacon_miss_cnt *req)
{
QDF_STATUS status;
uint32_t vdev_id;
uint8_t first_bcnt;
uint8_t final_bcnt;
vdev_id = req->vdev_id;
first_bcnt = req->roam_bmiss_first_bcnt;
final_bcnt = req->roam_bmiss_final_bcnt;
target_if_debug("first_bcnt: %d, final_bcnt: %d",
first_bcnt, final_bcnt);
status = target_if_vdev_set_param(wmi_handle, vdev_id,
WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
first_bcnt);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("vdev set WMI_VDEV_PARAM_BMISS_FIRST_BCNT params returned error %d",
status);
return status;
}
status = target_if_vdev_set_param(wmi_handle, vdev_id,
WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
final_bcnt);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("vdev set WMI_VDEV_PARAM_BMISS_FINAL_BCNT params returned error %d",
status);
return status;
}
return status;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/* target_if_cm_roam_reason_vsie(): set vdev param
* WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE
* @wmi_handle: handle to WMI
* @req: roam reason vsie enable parameters
*
* Return: void
*/
static void
target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
struct wlan_roam_reason_vsie_enable *req)
{
QDF_STATUS status;
status = target_if_vdev_set_param(
wmi_handle,
req->vdev_id,
WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE,
req->enable_roam_reason_vsie);
if (QDF_IS_STATUS_ERROR(status))
target_if_err("Failed to set vdev param %d",
WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE);
}
/* target_if_cm_roam_triggers(): send roam triggers to WMI
* @wmi_handle: handle to WMI
* @req: roam triggers parameters
*
* Return: QDF status
*/
static QDF_STATUS
target_if_cm_roam_triggers(wmi_unified_t wmi_handle,
struct wlan_roam_triggers *req)
{
if (!target_if_is_vdev_valid(req->vdev_id))
return QDF_STATUS_E_INVAL;
return wmi_unified_set_roam_triggers(wmi_handle, req);
}
#else
static void
target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
struct wlan_roam_reason_vsie_enable *req)
{
}
static QDF_STATUS
target_if_cm_roam_triggers(wmi_unified_t wmi_handle,
struct wlan_roam_triggers *req)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* target_if_cm_roam_scan_offload_rssi_thresh() - Send roam scan rssi threshold
* commands to wmi
@@ -200,6 +340,28 @@ target_if_cm_roam_scan_offload_rssi_thresh(
return status;
}
/**
* target_if_roam_scan_offload_scan_period() - set roam offload scan period
* @wmi_handle: wmi handle
* @req: roam scan period parameters
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF status
*/
static QDF_STATUS
target_if_cm_roam_scan_offload_scan_period(
wmi_unified_t wmi_handle,
struct wlan_roam_scan_period_params *req)
{
if (!target_if_is_vdev_valid(req->vdev_id)) {
target_if_err("Invalid vdev id:%d", req->vdev_id);
return QDF_STATUS_E_FAILURE;
}
return wmi_unified_roam_scan_offload_scan_period(wmi_handle, req);
}
/**
* target_if_cm_roam_send_roam_start() - Send roam start related commands
* to wmi
@@ -214,17 +376,47 @@ static QDF_STATUS
target_if_cm_roam_send_roam_start(struct wlan_objmgr_vdev *vdev,
struct wlan_roam_start_config *req)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
wmi_unified_t wmi_handle;
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
if (!wmi_handle)
return QDF_STATUS_E_FAILURE;
target_if_cm_roam_scan_offload_rssi_thresh(wmi_handle,
&req->rssi_params);
/* add other wmi commands */
status = target_if_cm_roam_scan_offload_rssi_thresh(
wmi_handle,
&req->rssi_params);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("Sending roam scan offload rssi thresh failed");
goto end;
}
return QDF_STATUS_SUCCESS;
status = target_if_cm_roam_scan_bmiss_cnt(wmi_handle,
&req->beacon_miss_cnt);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("vdev set bmiss bcnt param failed");
goto end;
}
target_if_cm_roam_reason_vsie(wmi_handle, &req->reason_vsie_enable);
target_if_cm_roam_triggers(wmi_handle, &req->roam_triggers);
/* Opportunistic scan runs on a timer, value set by
* empty_scan_refresh_period. Age out the entries after 3 such
* cycles.
*/
if (req->scan_period_params.empty_scan_refresh_period > 0) {
status = target_if_cm_roam_scan_offload_scan_period(
wmi_handle,
&req->scan_period_params);
if (QDF_IS_STATUS_ERROR(status))
goto end;
}
/* add other wmi commands */
end:
return status;
}
/**

View File

@@ -26,6 +26,93 @@
#include "wlan_cm_tgt_if_tx_api.h"
#include "wlan_cm_roam_api.h"
/**
* wlan_cm_roam_scan_bmiss_cnt() - set roam beacon miss count
* @psoc: psoc pointer
* @vdev_id: vdev id
* @params: roam beacon miss count parameters
*
* This function is used to set roam beacon miss count parameters
*
* 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)
{
uint8_t beacon_miss_count;
params->vdev_id = vdev_id;
wlan_mlme_get_roam_bmiss_first_bcnt(psoc, &beacon_miss_count);
params->roam_bmiss_first_bcnt = beacon_miss_count;
wlan_mlme_get_roam_bmiss_final_bcnt(psoc, &beacon_miss_count);
params->roam_bmiss_final_bcnt = beacon_miss_count;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* wlan_cm_roam_reason_vsie() - set roam reason vsie
* @psoc: psoc pointer
* @vdev_id: vdev id
* @params: roam reason vsie parameters
*
* This function is used to set roam reason vsie parameters
*
* 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)
{
uint8_t enable_roam_reason_vsie;
params->vdev_id = vdev_id;
wlan_mlme_get_roam_reason_vsie_status(psoc, &enable_roam_reason_vsie);
params->enable_roam_reason_vsie = enable_roam_reason_vsie;
}
/**
* wlan_cm_roam_triggers() - set roam triggers
* @psoc: psoc pointer
* @vdev_id: vdev id
* @params: roam triggers parameters
*
* This function is used to set roam triggers parameters
*
* Return: None
*/
static void
wlan_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 =
mlme_get_roam_trigger_bitmap(psoc, vdev_id);
wlan_cm_roam_get_vendor_btm_params(psoc, vdev_id,
&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 void
wlan_cm_roam_triggers(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_triggers *params)
{
}
#endif
/**
* cm_roam_init_req() - roam init request handling
* @psoc: psoc pointer
@@ -34,9 +121,10 @@
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_init_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
bool enable)
static QDF_STATUS
cm_roam_init_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
bool enable)
{
return QDF_STATUS_SUCCESS;
}
@@ -49,9 +137,10 @@ static QDF_STATUS cm_roam_init_req(struct wlan_objmgr_psoc *psoc,
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t reason)
static QDF_STATUS
cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t reason)
{
struct wlan_roam_start_config *start_req;
QDF_STATUS status;
@@ -60,6 +149,12 @@ static QDF_STATUS cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
if (!start_req)
return QDF_STATUS_E_NOMEM;
/* 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);
/* fill from legacy through this API */
wlan_cm_roam_fill_start_req(psoc, vdev_id, start_req, reason);
@@ -80,9 +175,10 @@ static QDF_STATUS 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,
uint8_t reason)
static QDF_STATUS
cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t reason)
{
return QDF_STATUS_SUCCESS;
}
@@ -92,10 +188,11 @@ static QDF_STATUS cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
* process directly, generate a new function wlan_cm_roam_send_rso_cmd
* for external usage.
*/
QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t rso_command,
uint8_t reason)
QDF_STATUS
cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t rso_command,
uint8_t reason)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
@@ -127,9 +224,10 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_stop_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t reason)
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;
@@ -145,9 +243,10 @@ static QDF_STATUS cm_roam_stop_req(struct wlan_objmgr_psoc *psoc,
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
static QDF_STATUS
cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
{
enum roam_offload_state cur_state;
QDF_STATUS status;
@@ -156,6 +255,8 @@ static QDF_STATUS cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
cur_state = mlme_get_roam_state(psoc, vdev_id);
switch (cur_state) {
case WLAN_ROAM_RSO_ENABLED:
case WLAN_ROAMING_IN_PROG:
case WLAN_ROAM_SYNCH_IN_PROG:
status = cm_roam_stop_req(psoc, vdev_id, reason);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("ROAM: Unable to switch to RSO STOP State");
@@ -188,16 +289,23 @@ static QDF_STATUS cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
static QDF_STATUS
cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
{
QDF_STATUS status;
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
switch (cur_state) {
/*
* If RSO stop is not done already, send RSO stop first and
* then post deinit.
*/
case WLAN_ROAM_RSO_ENABLED:
case WLAN_ROAMING_IN_PROG:
case WLAN_ROAM_SYNCH_IN_PROG:
cm_roam_switch_to_rso_stop(pdev, vdev_id, reason);
break;
case WLAN_ROAM_RSO_STOPPED:
@@ -236,9 +344,10 @@ static QDF_STATUS cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
static QDF_STATUS
cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
{
enum roam_offload_state cur_state;
uint8_t temp_vdev_id, roam_enabled_vdev_id;
@@ -287,9 +396,14 @@ static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
}
break;
case WLAN_ROAM_SYNCH_IN_PROG:
mlme_set_roam_state(psoc, vdev_id, WLAN_ROAM_INIT);
return QDF_STATUS_SUCCESS;
case WLAN_ROAM_INIT:
case WLAN_ROAM_RSO_STOPPED:
case WLAN_ROAM_RSO_ENABLED:
case WLAN_ROAMING_IN_PROG:
/*
* Already the roaming module is initialized at fw,
* just return from here
@@ -323,7 +437,7 @@ static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
}
/**
* cm_roam_switch_to_rso_start() - roam state handling for rso started
* cm_roam_switch_to_rso_enable() - roam state handling for rso started
* @pdev: pdev pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
@@ -332,11 +446,12 @@ static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
*
* Return: QDF_STATUS
*/
static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
static QDF_STATUS
cm_roam_switch_to_rso_enable(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
{
enum roam_offload_state cur_state;
enum roam_offload_state cur_state, new_roam_state;
QDF_STATUS status;
uint8_t control_bitmap;
bool sup_disabled_roaming;
@@ -345,6 +460,9 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
wlan_mlme_get_roam_scan_offload_enabled(psoc, &rso_allowed);
sup_disabled_roaming = mlme_get_supplicant_disabled_roaming(psoc,
vdev_id);
control_bitmap = mlme_get_operations_bitmap(psoc, vdev_id);
cur_state = mlme_get_roam_state(psoc, vdev_id);
switch (cur_state) {
@@ -363,6 +481,40 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
* Send RSO update config if roaming already enabled
*/
rso_command = ROAM_SCAN_OFFLOAD_UPDATE_CFG;
break;
case WLAN_ROAMING_IN_PROG:
/*
* When roam abort happens, the roam offload
* state machine moves to RSO_ENABLED state.
* But if Supplicant disabled roaming is set in case
* of roam invoke or if roaming was disabled due to
* other reasons like SAP start/connect on other vdev,
* the state should be transitioned to RSO STOPPED.
*/
if (sup_disabled_roaming || control_bitmap)
new_roam_state = WLAN_ROAM_RSO_STOPPED;
else
new_roam_state = WLAN_ROAM_RSO_ENABLED;
mlme_set_roam_state(psoc, vdev_id, new_roam_state);
return QDF_STATUS_SUCCESS;
case WLAN_ROAM_SYNCH_IN_PROG:
/*
* After roam sych propagation is complete, send
* RSO start command to firmware to update AP profile,
* new PCL.
* If this is roam invoke case and supplicant has already
* disabled firmware roaming, then move to RSO stopped state
* instead of RSO enabled.
*/
if (sup_disabled_roaming || control_bitmap) {
new_roam_state = WLAN_ROAM_RSO_STOPPED;
mlme_set_roam_state(psoc, vdev_id, new_roam_state);
return QDF_STATUS_SUCCESS;
}
break;
default:
return QDF_STATUS_SUCCESS;
@@ -373,7 +525,6 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
return QDF_STATUS_E_FAILURE;
}
control_bitmap = mlme_get_operations_bitmap(psoc, vdev_id);
if (control_bitmap) {
mlme_debug("ROAM: RSO Disabled internaly: vdev[%d] bitmap[0x%x]",
vdev_id, control_bitmap);
@@ -391,10 +542,9 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
* If supplicant disabled roaming, driver does not send
* RSO cmd to fw. This causes roam invoke to fail in FW
* since RSO start never happened at least once to
* configure roaming engine in FW.
* configure roaming engine in FW. So send RSO start followed
* by RSO stop if supplicant disabled roaming is true.
*/
sup_disabled_roaming = mlme_get_supplicant_disabled_roaming(psoc,
vdev_id);
if (!sup_disabled_roaming)
return QDF_STATUS_SUCCESS;
@@ -403,10 +553,118 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
REASON_SUPPLICANT_DISABLED_ROAMING);
}
QDF_STATUS cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
enum roam_offload_state requested_state,
uint8_t reason)
/**
* cm_roam_switch_to_roam_start() - roam state handling for ROAMING_IN_PROG
* @pdev: pdev pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* This function is used for WLAN_ROAMING_IN_PROG roam state handling
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_switch_to_roam_start(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
{
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
enum roam_offload_state cur_state =
mlme_get_roam_state(psoc, vdev_id);
switch (cur_state) {
case WLAN_ROAM_RSO_ENABLED:
mlme_set_roam_state(psoc, vdev_id, WLAN_ROAMING_IN_PROG);
break;
case WLAN_ROAM_RSO_STOPPED:
/*
* When supplicant has disabled roaming, roam invoke triggered
* from supplicant can cause firmware to send roam start
* notification. Allow roam start in this condition.
*/
if (mlme_get_supplicant_disabled_roaming(psoc, vdev_id) &&
mlme_is_roam_invoke_in_progress(psoc, vdev_id)) {
mlme_set_roam_state(psoc, vdev_id,
WLAN_ROAMING_IN_PROG);
break;
}
case WLAN_ROAM_INIT:
case WLAN_ROAM_DEINIT:
case WLAN_ROAM_SYNCH_IN_PROG:
default:
mlme_err("ROAM: Roaming start received in invalid state: %d",
cur_state);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
/**
* cm_roam_switch_to_roam_sync() - roam state handling for roam sync
* @pdev: pdev pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* This function is used for WLAN_ROAM_SYNCH_IN_PROG roam state handling
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_roam_switch_to_roam_sync(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
uint8_t reason)
{
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
struct wlan_objmgr_vdev *vdev;
enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
switch (cur_state) {
case WLAN_ROAM_RSO_ENABLED:
/*
* Roam synch can come directly without roam start
* after waking up from power save mode or in case of
* deauth roam trigger to stop data path queues
*/
case WLAN_ROAMING_IN_PROG:
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
WLAN_MLME_NB_ID);
if (!wlan_vdev_is_up(vdev)) {
mlme_err("ROAM: STA not in connected state");
return QDF_STATUS_E_FAILURE;
}
mlme_set_roam_state(psoc, vdev_id, WLAN_ROAM_SYNCH_IN_PROG);
break;
case WLAN_ROAM_RSO_STOPPED:
/*
* If roaming is disabled by Supplicant and if this transition
* is due to roaming invoked by the supplicant, then allow
* this state transition
*/
if (mlme_get_supplicant_disabled_roaming(psoc, vdev_id) &&
mlme_is_roam_invoke_in_progress(psoc, vdev_id)) {
mlme_set_roam_state(psoc, vdev_id,
WLAN_ROAM_SYNCH_IN_PROG);
break;
}
case WLAN_ROAM_INIT:
case WLAN_ROAM_DEINIT:
case WLAN_ROAM_SYNCH_IN_PROG:
default:
mlme_err("ROAM: Roam synch not allowed in [%d] state",
cur_state);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
enum roam_offload_state requested_state,
uint8_t reason)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_objmgr_vdev *vdev;
@@ -433,11 +691,17 @@ QDF_STATUS cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
status = cm_roam_switch_to_init(pdev, vdev_id, reason);
break;
case WLAN_ROAM_RSO_ENABLED:
status = cm_roam_switch_to_rso_start(pdev, vdev_id, reason);
status = cm_roam_switch_to_rso_enable(pdev, vdev_id, reason);
break;
case WLAN_ROAM_RSO_STOPPED:
status = cm_roam_switch_to_rso_stop(pdev, vdev_id, reason);
break;
case WLAN_ROAMING_IN_PROG:
status = cm_roam_switch_to_roam_start(pdev, vdev_id, reason);
break;
case WLAN_ROAM_SYNCH_IN_PROG:
status = cm_roam_switch_to_roam_sync(pdev, vdev_id, reason);
break;
default:
mlme_debug("ROAM: Invalid roam state %d", requested_state);
break;

View File

@@ -39,10 +39,11 @@
*
* Return: QDF_STATUS
*/
QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t rso_command,
uint8_t reason);
QDF_STATUS
cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t rso_command,
uint8_t reason);
/**
* cm_roam_state_change() - Post roam state change to roam state machine
@@ -55,9 +56,10 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
*
* Return: QDF_STATUS
*/
QDF_STATUS cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
enum roam_offload_state requested_state,
uint8_t reason);
QDF_STATUS
cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
enum roam_offload_state requested_state,
uint8_t reason);
#endif
#endif

View File

@@ -86,6 +86,37 @@
#define REASON_ROAM_HANDOFF_DONE 52
#define REASON_ROAM_ABORT 53
/**
* struct wlan_cm_roam_vendor_btm_params - vendor config roam control param
* @scan_freq_scheme: scan frequency scheme from enum
* qca_roam_scan_freq_scheme
* @connected_rssi_threshold: RSSI threshold of the current
* connected AP
* @candidate_rssi_threshold: RSSI threshold of the
* candidate AP
* @user_roam_reason: Roam triggered reason code, value zero is for enable
* and non zero value is disable
*/
struct wlan_cm_roam_vendor_btm_params {
uint32_t scan_freq_scheme;
uint32_t connected_rssi_threshold;
uint32_t candidate_rssi_threshold;
uint32_t user_roam_reason;
};
/**
* struct wlan_roam_triggers - vendor configured roam triggers
* @vdev_id: vdev id
* @trigger_bitmap: vendor configured roam trigger bitmap as
* defined @enum roam_control_trigger_reason
* @control_param: roam trigger param
*/
struct wlan_roam_triggers {
uint32_t vdev_id;
uint32_t trigger_bitmap;
struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
};
#ifdef ROAM_OFFLOAD_V1
#define NOISE_FLOOR_DBM_DEFAULT (-96)
#define RSSI_MIN_VALUE (-128)
@@ -152,13 +183,70 @@ struct wlan_roam_offload_scan_rssi_params {
uint32_t bg_scan_client_bitmap;
};
/**
* struct wlan_roam_beacon_miss_cnt - roam beacon miss count
* @vdev_id: vdev id
* @roam_bmiss_first_bcnt: First beacon miss count
* @roam_bmiss_final_bcnt: Final beacon miss count
*/
struct wlan_roam_beacon_miss_cnt {
uint32_t vdev_id;
uint8_t roam_bmiss_first_bcnt;
uint8_t roam_bmiss_final_bcnt;
};
/**
* struct wlan_roam_reason_vsie_enable - roam reason vsie enable parameters
* @vdev_id: vdev id
* @enable_roam_reason_vsie: enable/disable inclusion of roam Reason
* in Re(association) frame
*/
struct wlan_roam_reason_vsie_enable {
uint32_t vdev_id;
uint8_t enable_roam_reason_vsie;
};
/**
* struct wlan_roam_scan_period_params - Roam scan period parameters
* @vdev_id: Vdev for which the scan period parameters are sent
* @empty_scan_refresh_period: empty scan refresh period
* @scan_period: Opportunistic scan runs on a timer for scan_period
* @scan_age: Duration after which the scan entries are to be aged out
* @roam_scan_inactivity_time: inactivity monitoring time in ms for which the
* device is considered to be inactive
* @roam_inactive_data_packet_count: Maximum allowed data packets count during
* roam_scan_inactivity_time.
* @roam_scan_period_after_inactivity: Roam scan period in ms after device is
* in inactive state.
* @full_scan_period: Full scan period is the idle period in seconds
* between two successive full channel roam scans.
*/
struct wlan_roam_scan_period_params {
uint32_t vdev_id;
uint32_t empty_scan_refresh_period;
uint32_t scan_period;
uint32_t scan_age;
uint32_t roam_scan_inactivity_time;
uint32_t roam_inactive_data_packet_count;
uint32_t roam_scan_period_after_inactivity;
uint32_t full_scan_period;
};
/**
* struct wlan_roam_start_config - structure containing parameters for
* roam start config
* @rssi_params: roam scan rssi threshold parameters
* @beacon_miss_cnt: roam beacon miss count parameters
* @reason_vsie_enable: roam reason vsie enable parameters
* @roam_triggers: roam triggers parameters
* @scan_period_params: roam scan period parameters
*/
struct wlan_roam_start_config {
struct wlan_roam_offload_scan_rssi_params rssi_params;
struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
struct wlan_roam_reason_vsie_enable reason_vsie_enable;
struct wlan_roam_triggers roam_triggers;
struct wlan_roam_scan_period_params scan_period_params;
/* other wmi cmd structures */
};
@@ -285,37 +373,6 @@ enum roam_scan_freq_scheme {
ROAM_SCAN_FREQ_SCHEME_FULL_SCAN = 2,
};
/**
* struct wlan_cm_roam_vendor_btm_params - vendor config roam control param
* @scan_freq_scheme: scan frequency scheme from enum
* qca_roam_scan_freq_scheme
* @connected_rssi_threshold: RSSI threshold of the current
* connected AP
* @candidate_rssi_threshold: RSSI threshold of the
* candidate AP
* @user_roam_reason: Roam triggered reason code, value zero is for enable
* and non zero value is disable
*/
struct wlan_cm_roam_vendor_btm_params {
uint32_t scan_freq_scheme;
uint32_t connected_rssi_threshold;
uint32_t candidate_rssi_threshold;
uint32_t user_roam_reason;
};
/**
* struct wlan_roam_triggers - vendor configured roam triggers
* @vdev_id: vdev id
* @trigger_bitmap: vendor configured roam trigger bitmap as
* defined @enum roam_control_trigger_reason
* @control_param: roam trigger param
*/
struct wlan_roam_triggers {
uint32_t vdev_id;
uint32_t trigger_bitmap;
struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
};
/**
* struct wlan_cm_roam - Connection manager roam configs, state and roam
* data related structure

View File

@@ -73,6 +73,18 @@ wmi_unified_set_rssi_monitoring_cmd(wmi_unified_t wmi_handle,
QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
wmi_unified_t wmi_handle,
struct wlan_roam_offload_scan_rssi_params *roam_req);
/**
* wmi_unified_roam_scan_offload_scan_period() - set roam offload scan period
* @wmi_handle: wmi handle
* @param: pointer to roam scan period params to be sent to fw
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS wmi_unified_roam_scan_offload_scan_period(
wmi_unified_t wmi_handle, struct wlan_roam_scan_period_params *param);
#else
/**
* wmi_unified_roam_scan_offload_rssi_thresh_cmd() - set roam scan rssi
@@ -88,6 +100,18 @@ QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
wmi_unified_t wmi_handle,
struct roam_offload_scan_rssi_params *roam_req);
/**
* wmi_unified_roam_scan_offload_scan_period() - set roam offload scan period
* @wmi_handle: wmi handle
* @param: pointer to roam scan period params to be sent to fw
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS wmi_unified_roam_scan_offload_scan_period(
wmi_unified_t wmi_handle, struct roam_scan_period_params *param);
#endif
/**
@@ -289,18 +313,6 @@ QDF_STATUS wmi_unified_roam_scan_offload_cmd(wmi_unified_t wmi_handle,
uint32_t command,
uint32_t vdev_id);
/**
* wmi_unified_roam_scan_offload_scan_period() - set roam offload scan period
* @wmi_handle: wmi handle
* @param: pointer to roam scan period params to be sent to fw
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS wmi_unified_roam_scan_offload_scan_period(
wmi_unified_t wmi_handle, struct roam_scan_period_params *param);
/**
* wmi_unified_roam_scan_offload_chan_list_cmd() - set roam offload channel list
* @wmi_handle: wmi handle

View File

@@ -127,7 +127,6 @@ struct roam_offload_scan_rssi_params {
uint32_t bg_scan_client_bitmap;
uint32_t flags;
};
#endif
/**
* struct roam_scan_period_params - Roam scan period parameters
@@ -152,6 +151,7 @@ struct roam_scan_period_params {
uint32_t roam_scan_period_after_inactivity;
uint32_t full_scan_period;
};
#endif
/**
* struct wmi_mawc_roam_params - Motion Aided wireless connectivity params

View File

@@ -57,6 +57,18 @@ QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_roam_scan_offload_scan_period(
wmi_unified_t wmi_handle,
struct wlan_roam_scan_period_params *param)
{
if (wmi_handle->ops->send_roam_scan_offload_scan_period_cmd)
return wmi_handle->ops->send_roam_scan_offload_scan_period_cmd(
wmi_handle, param);
return QDF_STATUS_E_FAILURE;
}
#else
QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
wmi_unified_t wmi_handle,
@@ -68,6 +80,17 @@ QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_roam_scan_offload_scan_period(wmi_unified_t wmi_handle,
struct roam_scan_period_params *param)
{
if (wmi_handle->ops->send_roam_scan_offload_scan_period_cmd)
return wmi_handle->ops->send_roam_scan_offload_scan_period_cmd(
wmi_handle, param);
return QDF_STATUS_E_FAILURE;
}
#endif
QDF_STATUS wmi_unified_roam_mawc_params_cmd(
@@ -221,17 +244,6 @@ QDF_STATUS wmi_unified_roam_scan_offload_cmd(wmi_unified_t wmi_handle,
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_roam_scan_offload_scan_period(wmi_unified_t wmi_handle,
struct roam_scan_period_params *param)
{
if (wmi_handle->ops->send_roam_scan_offload_scan_period_cmd)
return wmi_handle->ops->send_roam_scan_offload_scan_period_cmd(
wmi_handle, param);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_roam_scan_offload_chan_list_cmd(wmi_unified_t wmi_handle,
uint8_t chan_count,

View File

@@ -300,6 +300,75 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
return status;
}
/**
* send_roam_scan_offload_scan_period_cmd_tlv() - set roam offload scan period
* @wmi_handle: wmi handle
* @param: roam scan parameters to be sent to firmware
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF status
*/
static QDF_STATUS
send_roam_scan_offload_scan_period_cmd_tlv(
wmi_unified_t wmi_handle,
struct wlan_roam_scan_period_params *param)
{
QDF_STATUS status;
wmi_buf_t buf = NULL;
int len;
uint8_t *buf_ptr;
wmi_roam_scan_period_fixed_param *scan_period_fp;
/* Send scan period values */
len = sizeof(wmi_roam_scan_period_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf)
return QDF_STATUS_E_NOMEM;
buf_ptr = (uint8_t *)wmi_buf_data(buf);
scan_period_fp = (wmi_roam_scan_period_fixed_param *)buf_ptr;
WMITLV_SET_HDR(&scan_period_fp->tlv_header,
WMITLV_TAG_STRUC_wmi_roam_scan_period_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_roam_scan_period_fixed_param));
/* fill in scan period values */
scan_period_fp->vdev_id = param->vdev_id;
scan_period_fp->roam_scan_period = param->scan_period;
scan_period_fp->roam_scan_age = param->scan_age;
scan_period_fp->inactivity_time_period =
param->roam_scan_inactivity_time;
scan_period_fp->roam_inactive_count =
param->roam_inactive_data_packet_count;
scan_period_fp->roam_scan_period_after_inactivity =
param->roam_scan_period_after_inactivity;
/* Firmware expects the full scan preriod in msec whereas host
* provides the same in seconds.
* Convert it to msec and send to firmware
*/
scan_period_fp->roam_full_scan_period = param->full_scan_period * 1000;
wmi_debug("roam_scan_period=%d, roam_scan_age=%d, full_scan_period= %u",
scan_period_fp->roam_scan_period,
scan_period_fp->roam_scan_age,
scan_period_fp->roam_full_scan_period);
wmi_debug("inactiviy time:%d inactive cnt:%d time after inactivity:%d",
scan_period_fp->inactivity_time_period,
scan_period_fp->roam_inactive_count,
scan_period_fp->roam_scan_period_after_inactivity);
wmi_mtrace(WMI_ROAM_SCAN_PERIOD, NO_SESSION, 0);
status = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_ROAM_SCAN_PERIOD);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_buf_free(buf);
return status;
}
return QDF_STATUS_SUCCESS;
}
#else
static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
wmi_unified_t wmi_handle,
@@ -431,6 +500,75 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
return status;
}
/**
* send_roam_scan_offload_scan_period_cmd_tlv() - set roam offload scan period
* @wmi_handle: wmi handle
* @param: roam scan parameters to be sent to firmware
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF status
*/
static QDF_STATUS
send_roam_scan_offload_scan_period_cmd_tlv(
wmi_unified_t wmi_handle,
struct roam_scan_period_params *param)
{
QDF_STATUS status;
wmi_buf_t buf = NULL;
int len;
uint8_t *buf_ptr;
wmi_roam_scan_period_fixed_param *scan_period_fp;
/* Send scan period values */
len = sizeof(wmi_roam_scan_period_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf)
return QDF_STATUS_E_NOMEM;
buf_ptr = (uint8_t *)wmi_buf_data(buf);
scan_period_fp = (wmi_roam_scan_period_fixed_param *)buf_ptr;
WMITLV_SET_HDR(&scan_period_fp->tlv_header,
WMITLV_TAG_STRUC_wmi_roam_scan_period_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_roam_scan_period_fixed_param));
/* fill in scan period values */
scan_period_fp->vdev_id = param->vdev_id;
scan_period_fp->roam_scan_period = param->scan_period;
scan_period_fp->roam_scan_age = param->scan_age;
scan_period_fp->inactivity_time_period =
param->roam_scan_inactivity_time;
scan_period_fp->roam_inactive_count =
param->roam_inactive_data_packet_count;
scan_period_fp->roam_scan_period_after_inactivity =
param->roam_scan_period_after_inactivity;
/* Firmware expects the full scan preriod in msec whereas host
* provides the same in seconds.
* Convert it to msec and send to firmware
*/
scan_period_fp->roam_full_scan_period = param->full_scan_period * 1000;
wmi_debug("roam_scan_period=%d, roam_scan_age=%d, full_scan_period= %u",
scan_period_fp->roam_scan_period,
scan_period_fp->roam_scan_age,
scan_period_fp->roam_full_scan_period);
wmi_debug("inactiviy time:%d inactive cnt:%d time after inactivity:%d",
scan_period_fp->inactivity_time_period,
scan_period_fp->roam_inactive_count,
scan_period_fp->roam_scan_period_after_inactivity);
wmi_mtrace(WMI_ROAM_SCAN_PERIOD, NO_SESSION, 0);
status = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_ROAM_SCAN_PERIOD);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_buf_free(buf);
return status;
}
return QDF_STATUS_SUCCESS;
}
#endif
static QDF_STATUS send_roam_mawc_params_cmd_tlv(wmi_unified_t wmi_handle,
@@ -2327,75 +2465,6 @@ error:
return status;
}
/**
* send_roam_scan_offload_scan_period_cmd_tlv() - set roam offload scan period
* @wmi_handle: wmi handle
* @param: roam scan parameters to be sent to firmware
*
* Send WMI_ROAM_SCAN_PERIOD parameters to fw.
*
* Return: QDF status
*/
static QDF_STATUS
send_roam_scan_offload_scan_period_cmd_tlv(
wmi_unified_t wmi_handle,
struct roam_scan_period_params *param)
{
QDF_STATUS status;
wmi_buf_t buf = NULL;
int len;
uint8_t *buf_ptr;
wmi_roam_scan_period_fixed_param *scan_period_fp;
/* Send scan period values */
len = sizeof(wmi_roam_scan_period_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf)
return QDF_STATUS_E_NOMEM;
buf_ptr = (uint8_t *)wmi_buf_data(buf);
scan_period_fp = (wmi_roam_scan_period_fixed_param *)buf_ptr;
WMITLV_SET_HDR(&scan_period_fp->tlv_header,
WMITLV_TAG_STRUC_wmi_roam_scan_period_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_roam_scan_period_fixed_param));
/* fill in scan period values */
scan_period_fp->vdev_id = param->vdev_id;
scan_period_fp->roam_scan_period = param->scan_period;
scan_period_fp->roam_scan_age = param->scan_age;
scan_period_fp->inactivity_time_period =
param->roam_scan_inactivity_time;
scan_period_fp->roam_inactive_count =
param->roam_inactive_data_packet_count;
scan_period_fp->roam_scan_period_after_inactivity =
param->roam_scan_period_after_inactivity;
/* Firmware expects the full scan preriod in msec whereas host
* provides the same in seconds.
* Convert it to msec and send to firmware
*/
scan_period_fp->roam_full_scan_period = param->full_scan_period * 1000;
wmi_debug("roam_scan_period=%d, roam_scan_age=%d, full_scan_period= %u",
scan_period_fp->roam_scan_period,
scan_period_fp->roam_scan_age,
scan_period_fp->roam_full_scan_period);
wmi_debug("inactiviy time:%d inactive cnt:%d time after inactivity:%d",
scan_period_fp->inactivity_time_period,
scan_period_fp->roam_inactive_count,
scan_period_fp->roam_scan_period_after_inactivity);
wmi_mtrace(WMI_ROAM_SCAN_PERIOD, NO_SESSION, 0);
status = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_ROAM_SCAN_PERIOD);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_buf_free(buf);
return status;
}
return QDF_STATUS_SUCCESS;
}
/**
* send_roam_scan_offload_chan_list_cmd_tlv() - set roam offload channel list
* @wmi_handle: wmi handle

View File

@@ -19184,10 +19184,11 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
#ifdef ROAM_OFFLOAD_V1
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
QDF_STATUS wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t command,
uint8_t reason)
QDF_STATUS
wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t command,
uint8_t reason)
{
uint8_t *state = NULL;
struct csr_roam_session *session;
@@ -19343,7 +19344,8 @@ QDF_STATUS wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
*
* Return: None
*/
static void wlan_cm_roam_scan_offload_rssi_thresh(
static void
wlan_cm_roam_scan_offload_rssi_thresh(
struct mac_context *mac_ctx,
struct csr_roam_session *session,
struct wlan_roam_offload_scan_rssi_params *params)
@@ -19426,6 +19428,41 @@ static void wlan_cm_roam_scan_offload_rssi_thresh(
roam_info->cfgParams.rssi_thresh_offset_5g;
}
/**
* wlan_cm_roam_scan_offload_scan_period() - set roam offload scan period
* parameters
* @mac_ctx: global mac ctx
* @session: csr roam session
* @params: roam offload scan period related parameters
*
* This function is used to set roam offload scan period related parameters
*
* Return: None
*/
static void
wlan_cm_roam_scan_offload_scan_period(
struct mac_context *mac_ctx,
struct csr_roam_session *session,
struct wlan_roam_scan_period_params *params)
{
tpCsrNeighborRoamControlInfo roam_info =
&mac_ctx->roam.neighborRoamInfo[session->vdev_id];
params->vdev_id = session->vdev_id;
params->empty_scan_refresh_period =
roam_info->cfgParams.emptyScanRefreshPeriod;
params->scan_period = params->empty_scan_refresh_period;
params->scan_age = (3 * params->empty_scan_refresh_period);
params->roam_scan_inactivity_time =
roam_info->cfgParams.roam_scan_inactivity_time;
params->roam_inactive_data_packet_count =
roam_info->cfgParams.roam_inactive_data_packet_count;
params->roam_scan_period_after_inactivity =
roam_info->cfgParams.roam_scan_period_after_inactivity;
params->full_scan_period =
roam_info->cfgParams.full_roam_scan_period;
}
QDF_STATUS
wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
@@ -19453,6 +19490,10 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
session,
&req->rssi_params);
wlan_cm_roam_scan_offload_scan_period(mac_ctx,
session,
&req->scan_period_params);
/* fill other struct similar to wlan_roam_offload_scan_rssi_params */
return status;

View File

@@ -698,14 +698,6 @@ wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
roam_params->roam_bad_rssi_thresh_offset_2g);
return status;
}
#else
QDF_STATUS
wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
struct roam_offload_scan_req *roam_req)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* wma_roam_scan_offload_scan_period() - set roam offload scan period
@@ -743,7 +735,21 @@ wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle,
&scan_period_params);
}
#else
QDF_STATUS
wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
struct roam_offload_scan_req *roam_req)
{
return QDF_STATUS_E_NOSUPPORT;
}
QDF_STATUS
wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
struct roam_offload_scan_req *roam_req)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* wma_roam_scan_offload_rssi_change() - set roam offload RSSI change threshold
* @wma_handle: wma handle
@@ -1863,7 +1869,7 @@ wma_send_idle_roam_params(tp_wma_handle wma_handle,
*
* Return: Void
*/
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && !defined(ROAM_OFFLOAD_V1)
static void wma_set_vdev_roam_reason_vsie(tp_wma_handle wma, uint8_t vdev_id,
bool is_roam_reason_vsie_enabled)
{