mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 15:11:48 -04:00
qcacld-3.0: Configure full scan period from vendor cmd to firmware
Userspace can update the full scan period through the roam subcmd QCA_WLAN_VENDOR_ROAMING_SUBCMD_CONTROL_SET and the attribute QCA_ATTR_ROAM_CONTROL_FULL_SCAN_PERIOD. Send the same to firmware as part of roam scan offload command Change-Id: I7c1046763d693faa3340b655848d3306ef92e06c CRs-Fixed: 2508775
This commit is contained in:
parent
0acd0c4df4
commit
0628e84a29
11 changed files with 132 additions and 0 deletions
|
|
@ -1422,6 +1422,8 @@ struct bss_load_trigger {
|
|||
* @roam_scan_period_after_inactivity: Roam scan period after device was in
|
||||
* inactive state
|
||||
* @fw_akm_bitmap: Supported Akm suites of firmware
|
||||
* @roam_full_scan_period: Idle period in seconds between two successive
|
||||
* full channel roam scans
|
||||
*/
|
||||
struct wlan_mlme_lfr_cfg {
|
||||
bool mawc_roam_enabled;
|
||||
|
|
@ -1524,6 +1526,7 @@ struct wlan_mlme_lfr_cfg {
|
|||
uint32_t roam_inactive_data_packet_count;
|
||||
uint32_t roam_scan_period_after_inactivity;
|
||||
uint32_t fw_akm_bitmap;
|
||||
uint32_t roam_full_scan_period;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3869,4 +3869,13 @@ ucfg_mlme_get_peer_phymode(struct wlan_objmgr_psoc *psoc, uint8_t *mac,
|
|||
{
|
||||
return mlme_get_peer_phymode(psoc, mac, peer_phymode);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucfg_mlme_validate_full_roam_scan_period() - Validate full roam scan period
|
||||
* @full_roam_scan_period: Idle period in seconds between two successive
|
||||
* full channel roam scans
|
||||
*
|
||||
* Return: True if full_roam_scan_period is in expected range, false otherwise.
|
||||
*/
|
||||
bool ucfg_mlme_validate_full_roam_scan_period(uint32_t full_roam_scan_period);
|
||||
#endif /* _WLAN_MLME_UCFG_API_H_ */
|
||||
|
|
|
|||
|
|
@ -1666,3 +1666,19 @@ ucfg_mlme_set_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
|
|||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
bool ucfg_mlme_validate_full_roam_scan_period(uint32_t full_roam_scan_period)
|
||||
{
|
||||
bool is_valid = true;
|
||||
uint32_t min, max;
|
||||
|
||||
if (!cfg_in_range(CFG_LFR_FULL_ROAM_SCAN_REFRESH_PERIOD,
|
||||
full_roam_scan_period)) {
|
||||
min = (cfg_min(CFG_LFR_FULL_ROAM_SCAN_REFRESH_PERIOD));
|
||||
max = (cfg_max(CFG_LFR_FULL_ROAM_SCAN_REFRESH_PERIOD));
|
||||
mlme_legacy_err("Full roam scan period value %d is out of range (Min: %d Max: %d)",
|
||||
full_roam_scan_period, min, max);
|
||||
is_valid = false;
|
||||
}
|
||||
|
||||
return is_valid;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4111,8 +4111,41 @@ hdd_send_roam_scan_channel_freq_list_to_sme(struct hdd_context *hdd_ctx,
|
|||
static const struct nla_policy
|
||||
roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
|
||||
[PARAM_FREQ_LIST_SCHEME] = {.type = NLA_NESTED},
|
||||
[QCA_ATTR_ROAM_CONTROL_FULL_SCAN_PERIOD] = {.type = NLA_U32},
|
||||
};
|
||||
|
||||
/**
|
||||
* hdd_send_roam_full_scan_period_to_sme() - Send full roam scan period to SME
|
||||
* @hdd_ctx: HDD context
|
||||
* @vdev_id: vdev id
|
||||
* @full_roam_scan_period: Idle period in seconds between two successive
|
||||
* full channel roam scans
|
||||
*
|
||||
* Validate the full roam scan period and send it to firmware
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static QDF_STATUS
|
||||
hdd_send_roam_full_scan_period_to_sme(struct hdd_context *hdd_ctx,
|
||||
uint8_t vdev_id,
|
||||
uint32_t full_roam_scan_period)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
|
||||
if (!ucfg_mlme_validate_full_roam_scan_period(full_roam_scan_period))
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
hdd_debug("Received Command to Set full roam scan period = %u",
|
||||
full_roam_scan_period);
|
||||
|
||||
status = sme_update_full_roam_scan_period(hdd_ctx->mac_handle, vdev_id,
|
||||
full_roam_scan_period);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
hdd_err("Failed to set full scan period");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* hdd_set_roam_with_control_config() - Set roam control configuration
|
||||
* @hdd_ctx: HDD context
|
||||
|
|
@ -4131,6 +4164,7 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
|
|||
{
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
struct nlattr *tb2[QCA_ATTR_ROAM_CONTROL_MAX + 1], *attr;
|
||||
uint32_t value;
|
||||
|
||||
/* The command must carry PARAM_ROAM_CONTROL_CONFIG */
|
||||
if (!tb[PARAM_ROAM_CONTROL_CONFIG]) {
|
||||
|
|
@ -4154,6 +4188,17 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
|
|||
hdd_err("failed to config roam control");
|
||||
}
|
||||
|
||||
attr = tb2[QCA_ATTR_ROAM_CONTROL_FULL_SCAN_PERIOD];
|
||||
if (attr) {
|
||||
hdd_debug("Parse and send full scan period to firmware");
|
||||
value = nla_get_u32(attr);
|
||||
status = hdd_send_roam_full_scan_period_to_sme(hdd_ctx,
|
||||
vdev_id,
|
||||
value);
|
||||
if (status)
|
||||
hdd_err("failed to config full scan period");
|
||||
}
|
||||
|
||||
return qdf_status_to_os_return(status);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2251,6 +2251,7 @@ struct roam_offload_scan_req {
|
|||
uint32_t btm_query_bitmask;
|
||||
struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS];
|
||||
struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS];
|
||||
uint32_t full_roam_scan_period;
|
||||
};
|
||||
|
||||
struct roam_offload_scan_rsp {
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ typedef struct sCsrNeighborRoamCfgParams {
|
|||
uint32_t hi_rssi_scan_delay;
|
||||
int32_t hi_rssi_scan_rssi_ub;
|
||||
tCsrChannelInfo pref_chan_info;
|
||||
uint32_t full_roam_scan_period;
|
||||
} tCsrNeighborRoamCfgParams, *tpCsrNeighborRoamCfgParams;
|
||||
|
||||
#define CSR_NEIGHBOR_ROAM_INVALID_CHANNEL_INDEX 255
|
||||
|
|
@ -250,6 +251,7 @@ void csr_roam_reset_roam_params(struct mac_context *mac_ptr);
|
|||
#define REASON_FILS_PARAMS_CHANGED 41
|
||||
#define REASON_SME_ISSUED 42
|
||||
#define REASON_DRIVER_ENABLED 43
|
||||
#define REASON_ROAM_FULL_SCAN_PERIOD_CHANGED 44
|
||||
|
||||
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
QDF_STATUS csr_roam_offload_scan(struct mac_context *mac, uint8_t sessionId,
|
||||
|
|
|
|||
|
|
@ -817,6 +817,20 @@ uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle);
|
|||
uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle);
|
||||
QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
|
||||
uint8_t sessionId, uint16_t empty_scan_refresh_period);
|
||||
/**
|
||||
* sme_update_full_roam_scan_period() - Send full roam scan period to SME
|
||||
* @mac_handle: Opaque handle to the MAC context
|
||||
* @vdev_id: vdev id
|
||||
* @full_roam_scan_period: Idle period in seconds between two successive
|
||||
* full channel roam scans
|
||||
*
|
||||
* Updated full scan period in roam info and a roam_offload_scan request.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS sme_update_full_roam_scan_period(mac_handle_t mac_handle,
|
||||
uint8_t vdev_id,
|
||||
uint32_t full_roam_scan_period);
|
||||
QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
|
||||
const uint16_t nNeighborScanMinChanTime,
|
||||
uint8_t sessionId);
|
||||
|
|
|
|||
|
|
@ -6799,6 +6799,41 @@ QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
|
|||
return status;
|
||||
}
|
||||
|
||||
QDF_STATUS sme_update_full_roam_scan_period(mac_handle_t mac_handle,
|
||||
uint8_t vdev_id,
|
||||
uint32_t full_roam_scan_period)
|
||||
{
|
||||
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
||||
QDF_STATUS status;
|
||||
tpCsrNeighborRoamControlInfo neighbor_roam_info;
|
||||
|
||||
if (vdev_id >= WLAN_MAX_VDEVS) {
|
||||
sme_err("Invalid vdev_id: %d", vdev_id);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
status = sme_acquire_global_lock(&mac->sme);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
return status;
|
||||
|
||||
neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
|
||||
sme_debug("LFR runtime successfully set full roam scan period to %d -old value is %d - roam state is %s",
|
||||
full_roam_scan_period,
|
||||
neighbor_roam_info->cfgParams.full_roam_scan_period,
|
||||
mac_trace_get_neighbour_roam_state(
|
||||
neighbor_roam_info->neighborRoamState));
|
||||
neighbor_roam_info->cfgParams.full_roam_scan_period =
|
||||
full_roam_scan_period;
|
||||
if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
|
||||
csr_roam_offload_scan(mac, vdev_id,
|
||||
ROAM_SCAN_OFFLOAD_UPDATE_CFG,
|
||||
REASON_ROAM_FULL_SCAN_PERIOD_CHANGED);
|
||||
}
|
||||
sme_release_global_lock(&mac->sme);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* sme_set_neighbor_scan_min_chan_time() -
|
||||
* Update nNeighborScanMinChanTime
|
||||
|
|
|
|||
|
|
@ -2471,6 +2471,8 @@ QDF_STATUS csr_change_default_config_param(struct mac_context *mac,
|
|||
mac->mlme_cfg->lfr.roam_bmiss_final_bcnt);
|
||||
sme_debug("roam_beacon_rssi_weight: %d",
|
||||
mac->mlme_cfg->lfr.roam_beacon_rssi_weight);
|
||||
sme_debug("full_scan_period: %u",
|
||||
mac->mlme_cfg->lfr.roam_full_scan_period);
|
||||
mac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
|
||||
mac->roam.configParam.fScanTwice = pParam->fScanTwice;
|
||||
/* This parameter is not available in cfg and not passed from
|
||||
|
|
@ -18142,6 +18144,8 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx,
|
|||
roam_info->cfgParams.maxChannelScanTime;
|
||||
req_buf->EmptyRefreshScanPeriod =
|
||||
roam_info->cfgParams.emptyScanRefreshPeriod;
|
||||
req_buf->full_roam_scan_period =
|
||||
roam_info->cfgParams.full_roam_scan_period;
|
||||
req_buf->roam_scan_inactivity_time =
|
||||
mac_ctx->mlme_cfg->lfr.roam_scan_inactivity_time;
|
||||
req_buf->roam_inactive_data_packet_count =
|
||||
|
|
|
|||
|
|
@ -1246,6 +1246,8 @@ QDF_STATUS csr_neighbor_roam_init(struct mac_context *mac, uint8_t sessionId)
|
|||
mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
|
||||
pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
|
||||
mac->mlme_cfg->lfr.empty_scan_refresh_period;
|
||||
pNeighborRoamInfo->cfgParams.full_roam_scan_period =
|
||||
mac->mlme_cfg->lfr.roam_full_scan_period;
|
||||
|
||||
specific_chan_info = &pNeighborRoamInfo->cfgParams.specific_chan_info;
|
||||
specific_chan_info->numOfChannels =
|
||||
|
|
|
|||
|
|
@ -624,6 +624,7 @@ wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
|
|||
roam_req->roam_inactive_data_packet_count;
|
||||
scan_period_params.roam_scan_period_after_inactivity =
|
||||
roam_req->roam_scan_period_after_inactivity;
|
||||
scan_period_params.full_scan_period = roam_req->full_roam_scan_period;
|
||||
|
||||
return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle,
|
||||
&scan_period_params);
|
||||
|
|
|
|||
Loading…
Reference in a new issue