qcacld-3.0: Add support to send roam scan scheme for the triggers

Add support to handle the nl80211 attribute -
QCA_ATTR_ROAM_CONTROL_TRIGGERS_SCAN_SCHEME. Send RSO update to
firmware if roam scan scheme value is received via the nl80211
attribute QCA_ATTR_ROAM_CONTROL_TRIGGERS_SCAN_SCHEME over the
QCA_WLAN_VENDOR_ATTR_ROAMING_SUBCMD subcommand.

Change-Id: If21281245097648380990b9218a722691279f598
CRs-Fixed: 2785256
This commit is contained in:
Pragaspathi Thilagaraj
2020-09-25 00:53:15 +05:30
committed by snandini
parent adbc4f7d5b
commit cd22d076ab
8 changed files with 223 additions and 2 deletions

View File

@@ -1558,6 +1558,7 @@ static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc,
lfr->idle_roam_min_rssi = cfg_get(psoc, CFG_LFR_IDLE_ROAM_MIN_RSSI);
lfr->roam_trigger_bitmap =
cfg_get(psoc, CFG_ROAM_TRIGGER_BITMAP);
lfr->idle_roam_band = cfg_get(psoc, CFG_LFR_IDLE_ROAM_BAND);
lfr->sta_roam_disable = cfg_get(psoc, CFG_STA_DISABLE_ROAM);
mlme_init_sae_single_pmk_cfg(psoc, lfr);

View File

@@ -3010,4 +3010,5 @@ QDF_STATUS mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
*/
QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
qdf_size_t len);
#endif /* _WLAN_MLME_API_H_ */

View File

@@ -513,6 +513,31 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_cm_roam_vendor_btm_params
*param);
/**
* wlan_cm_update_roam_scan_scheme_bitmap() - Set roam scan scheme bitmap for
* each vdev
* @psoc: PSOC pointer
* @vdev_id: VDEV id
* @roam_scan_scheme_bitmap: bitmap of roam triggers for which partial roam
* scan needs to be enabled
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t roam_scan_scheme_bitmap);
/**
* wlan_cm_get_roam_scan_scheme_bitmap() - Get roam scan scheme bitmap value
* @psoc: PSOC pointer
* @vdev_id: VDEV id
*
* Return: Roam scan scheme bitmap value
*/
uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
#else
static inline
void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
@@ -570,5 +595,20 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_cm_roam_vendor_btm_params *param)
{}
static inline QDF_STATUS
wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t roam_scan_scheme_bitmap)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline
uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
return 0;
}
#endif /* FEATURE_ROAM_OFFLOAD */
#endif /* WLAN_CM_ROAM_API_H__ */

View File

@@ -94,6 +94,7 @@
#define WLAN_FILS_FT_MAX_LEN 48
#define WLAN_MAX_PMK_DUMP_BYTES 6
#define DEFAULT_ROAM_SCAN_SCHEME_BITMAP 0
/**
* enum roam_cfg_param - Type values for roaming parameters used as index
@@ -1312,12 +1313,18 @@ enum roam_scan_freq_scheme {
* @beacon_rssi_weight: Number of beacons to be used to calculate the average
* rssi of the AP.
* @hi_rssi_scan_delay: Roam scan delay in ms for High RSSI roam trigger.
* @roam_scan_scheme_bitmap: Bitmap of roam triggers for which partial channel
* map scan scheme needs to be enabled. Each bit in the bitmap corresponds to
* the bit position in the order provided by the enum roam_trigger_reason
* Ex: roam_scan_scheme_bitmap - 0x00110 will enable partial scan for below
* triggers:
* ROAM_TRIGGER_REASON_PER, ROAM_TRIGGER_REASON_BMISS
*/
struct wlan_cm_rso_configs {
uint8_t rescan_rssi_delta;
uint8_t beacon_rssi_weight;
uint32_t hi_rssi_scan_delay;
uint32_t roam_scan_scheme_bitmap;
};
/**

View File

@@ -135,5 +135,24 @@ ucfg_cm_roaming_in_progress(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
return wlan_cm_roaming_in_progress(pdev, vdev_id);
}
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
static inline QDF_STATUS
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t roam_scan_scheme_bitmap)
{
return wlan_cm_update_roam_scan_scheme_bitmap(psoc, vdev_id,
roam_scan_scheme_bitmap);
}
#else
static inline QDF_STATUS
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t roam_scan_scheme_bitmap)
{
return QDF_STATUS_SUCCESS;
}
#endif
#endif

View File

@@ -674,3 +674,65 @@ QDF_STATUS wlan_cm_update_fils_ft(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS
wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t roam_scan_scheme_bitmap)
{
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev) {
mlme_err("vdev%d: vdev object is NULL", vdev_id);
return QDF_STATUS_E_FAILURE;
}
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_FAILURE;
}
mlme_priv->cm_roam.vdev_rso_config.roam_scan_scheme_bitmap =
roam_scan_scheme_bitmap;
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_SUCCESS;
}
uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
uint32_t roam_scan_scheme_bitmap;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev) {
mlme_err("vdev%d: vdev object is NULL", vdev_id);
return 0;
}
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return 0;
}
roam_scan_scheme_bitmap =
mlme_priv->cm_roam.vdev_rso_config.roam_scan_scheme_bitmap;
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return roam_scan_scheme_bitmap;
}
#endif

View File

@@ -4543,6 +4543,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
[QCA_ATTR_ROAM_CONTROL_CONNECTED_RSSI_THRESHOLD] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_CANDIDATE_RSSI_THRESHOLD] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_USER_REASON] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS] = {.type = NLA_U32},
};
/**
@@ -4612,7 +4613,7 @@ wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_bitmap)
/* Enable the complete trigger bitmap when all bits are set in
* the control config bitmap
*/
all_bitmap = (QCA_ROAM_TRIGGER_REASON_BSS_LOAD << 1) - 1;
all_bitmap = (QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN << 1) - 1;
if (trigger_reason_bitmap == all_bitmap)
return BIT(ROAM_TRIGGER_REASON_MAX) - 1;
@@ -4640,9 +4641,74 @@ wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_bitmap)
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_USER_TRIGGER)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_FORCED);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DEAUTH)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_DEAUTH);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_IDLE)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_IDLE);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_TX_FAILURES)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_STA_KICKOUT);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BACKGROUND);
return drv_trigger_bitmap;
}
/**
* wlan_hdd_convert_control_roam_scan_scheme_bitmap() - Convert the
* vendor specific roam scan scheme for roam triggers to internal roam trigger
* bitmap for partial scan.
* @trigger_reason_bitmap: Vendor specific roam trigger bitmap
*
* Return: Internal roam scan scheme bitmap
*/
static uint32_t
wlan_hdd_convert_control_roam_scan_scheme_bitmap(uint32_t trigger_reason_bitmap)
{
uint32_t drv_scan_scheme_bitmap = 0;
/*
* Partial scan scheme override over default scan scheme only for
* the PER, BMISS, Low RSSI, BTM, BSS_LOAD Triggers
*/
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_PER)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_PER);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BEACON_MISS)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BMISS);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_POOR_RSSI)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_LOW_RSSI);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BTM)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BTM);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_USER_TRIGGER)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_FORCED);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DEAUTH)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_DEAUTH);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_IDLE)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_IDLE);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_TX_FAILURES)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_STA_KICKOUT);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN)
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BACKGROUND);
return drv_scan_scheme_bitmap;
}
/**
* hdd_send_roam_triggers_to_sme() - Send roam trigger bitmap to SME
* @hdd_ctx: HDD context
@@ -4694,6 +4760,16 @@ hdd_send_roam_triggers_to_sme(struct hdd_context *hdd_ctx,
triggers.trigger_bitmap =
wlan_hdd_convert_control_roam_trigger_bitmap(roam_trigger_bitmap);
/*
* roam trigger bitmap is > 0 - Roam triggers are set.
* roam trigger bitmap is 0 - Disable roaming
*
* For both the above modes, reset the roam scan scheme bitmap to
* 0.
*/
status = ucfg_cm_update_roam_scan_scheme_bitmap(hdd_ctx->psoc,
vdev_id, 0);
#ifdef ROAM_OFFLOAD_V1
status = ucfg_cm_rso_set_roam_trigger(hdd_ctx->pdev, vdev_id,
&triggers);
@@ -4978,6 +5054,15 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
}
}
attr = tb2[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS];
if (attr) {
value = wlan_hdd_convert_control_roam_scan_scheme_bitmap(
nla_get_u32(attr));
status = ucfg_cm_update_roam_scan_scheme_bitmap(hdd_ctx->psoc,
vdev_id,
value);
}
/* Scoring and roam candidate selection criteria */
attr = tb2[QCA_ATTR_ROAM_CONTROL_SELECTION_CRITERIA];
if (attr) {
@@ -5004,7 +5089,9 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
param.user_roam_reason = nla_get_u32(attr);
else
param.user_roam_reason = DISABLE_VENDOR_BTM_CONFIG;
wlan_cm_roam_set_vendor_btm_params(hdd_ctx->psoc, vdev_id, &param);
/* Sends RSO update */
sme_send_vendor_btm_params(hdd_ctx->mac_handle, vdev_id);
return qdf_status_to_os_return(status);

View File

@@ -824,6 +824,10 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac,
src_cfg.uint_value = mac->mlme_cfg->lfr.roam_scan_hi_rssi_delay;
wlan_cm_roam_cfg_set_value(mac->psoc, session_id,
HI_RSSI_DELAY_BTW_SCANS, &src_cfg);
wlan_cm_update_roam_scan_scheme_bitmap(mac->psoc, session_id,
DEFAULT_ROAM_SCAN_SCHEME_BITMAP);
/*
* Now we can clear the preauthDone that
* was saved as we are connected afresh