diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index b24ef8c90f..6f7d77b73e 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -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_ */ diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 9dc710ba51..95a98ad2d2 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -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; +} diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index 70b48bd0d2..d7df18e19e 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -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 diff --git a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c index 19afccfeaa..63a2f5ec59 100644 --- a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c +++ b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c @@ -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, ¶m); +} + +/** + * 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; } /** diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c index 9fe6be0e6d..d48eba3c16 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c @@ -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, + ¶ms->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; diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h index ca4d643fa0..11cf8595bf 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h @@ -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 diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h index e2f24b949d..da2e0e53e2 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h @@ -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 diff --git a/components/wmi/inc/wmi_unified_roam_api.h b/components/wmi/inc/wmi_unified_roam_api.h index 1ebba1c6f0..2d26b1c086 100644 --- a/components/wmi/inc/wmi_unified_roam_api.h +++ b/components/wmi/inc/wmi_unified_roam_api.h @@ -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 diff --git a/components/wmi/inc/wmi_unified_roam_param.h b/components/wmi/inc/wmi_unified_roam_param.h index 09611d3719..cf4a66026b 100644 --- a/components/wmi/inc/wmi_unified_roam_param.h +++ b/components/wmi/inc/wmi_unified_roam_param.h @@ -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 diff --git a/components/wmi/src/wmi_unified_roam_api.c b/components/wmi/src/wmi_unified_roam_api.c index 3d5129a8c1..77c7455a8e 100644 --- a/components/wmi/src/wmi_unified_roam_api.c +++ b/components/wmi/src/wmi_unified_roam_api.c @@ -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, diff --git a/components/wmi/src/wmi_unified_roam_tlv.c b/components/wmi/src/wmi_unified_roam_tlv.c index 00bde111b7..878ce7e755 100644 --- a/components/wmi/src/wmi_unified_roam_tlv.c +++ b/components/wmi/src/wmi_unified_roam_tlv.c @@ -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 diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d2b1388cf6..06cc8501b3 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -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; diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index f532573dec..987aac3bb2 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -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) {