qcacld-3.0: Add vendor command attribute for roam hand-off delay

User can configure roam hand-off delay value using the new vendor
attribute introduced as part roam vendor command.
This change gets the configured value and sends it to firmware.
And firmware delays the roam Hand-off (in msec) by the specified
duration to receive pending RX frames from the current BSS.

Change-Id: Ic328c077cba06532ee8ffed12cde072c816b92e0
CRs-Fixed: 3329964
Dieser Commit ist enthalten in:
Srikanth Marepalli
2022-11-02 16:13:48 +05:30
committet von Madan Koyyalamudi
Ursprung 59e76c45a5
Commit 8ef0316626
12 geänderte Dateien mit 254 neuen und 0 gelöschten Zeilen

Datei anzeigen

@@ -1903,6 +1903,7 @@ struct fw_scan_channels {
* during wakeup.
* @beaconloss_timeout_onsleep: time in sec to configure FW BMISS event
* during sleep.
* @roam_ho_delay_config: Roam HO delay value
*/
struct wlan_mlme_lfr_cfg {
bool mawc_roam_enabled;
@@ -2025,6 +2026,7 @@ struct wlan_mlme_lfr_cfg {
bool enable_ft_over_ds;
uint8_t beaconloss_timeout_onwakeup;
uint8_t beaconloss_timeout_onsleep;
uint16_t roam_ho_delay_config;
};
/**

Datei anzeigen

@@ -290,6 +290,38 @@ target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops *tx_ops)
}
#endif
/**
* target_if_cm_roam_ho_delay_config() - Send roam HO delay value to wmi
* @vdev: vdev object
* @vdev_id: vdev id
* @roam_ho_delay: roam hand-off delay value
*
* Return: QDF_STATUS
*/
static QDF_STATUS
target_if_cm_roam_ho_delay_config(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, uint16_t roam_ho_delay)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
wmi_unified_t wmi_handle;
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
if (!wmi_handle)
return status;
status = target_if_roam_set_param(
wmi_handle,
vdev_id,
WMI_ROAM_PARAM_ROAM_HO_DELAY_RUNTIME_CONFIG,
roam_ho_delay);
if (QDF_IS_STATUS_ERROR(status))
target_if_err("Failed to set "
"WMI_ROAM_PARAM_ROAM_HO_DELAY_RUNTIME_CONFIG");
return status;
}
static void
target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
{
@@ -297,6 +329,7 @@ target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
tx_ops->send_roam_invoke_cmd = target_if_cm_roam_send_roam_invoke_cmd;
tx_ops->send_roam_sync_complete_cmd = target_if_cm_roam_send_roam_sync_complete;
tx_ops->send_roam_rt_stats_config = target_if_cm_roam_rt_stats_config;
tx_ops->send_roam_ho_delay_config = target_if_cm_roam_ho_delay_config;
target_if_cm_roam_register_vendor_handoff_ops(tx_ops);
target_if_cm_roam_register_linkspeed_state(tx_ops);
}
@@ -311,6 +344,13 @@ target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
{
return QDF_STATUS_E_NOSUPPORT;
}
static QDF_STATUS
target_if_cm_roam_ho_delay_config(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, uint16_t roam_ho_delay)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
@@ -1309,6 +1349,10 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
if (req->wlan_roam_rt_stats_config)
target_if_cm_roam_rt_stats_config(vdev, vdev_id,
req->wlan_roam_rt_stats_config);
if (req->wlan_roam_ho_delay_config)
target_if_cm_roam_ho_delay_config(
vdev, vdev_id, req->wlan_roam_ho_delay_config);
/* add other wmi commands */
end:
return status;
@@ -1687,6 +1731,11 @@ target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
target_if_cm_roam_rt_stats_config(
vdev, vdev_id,
req->wlan_roam_rt_stats_config);
if (req->wlan_roam_ho_delay_config)
target_if_cm_roam_ho_delay_config(
vdev, vdev_id,
req->wlan_roam_ho_delay_config);
}
end:
return status;

Datei anzeigen

@@ -3052,6 +3052,9 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
wlan_cm_get_roam_rt_stats(psoc, ROAM_RT_STATS_ENABLE);
cm_roam_mlo_config(psoc, vdev, start_req);
start_req->wlan_roam_ho_delay_config =
wlan_cm_roam_get_ho_delay_config(psoc);
status = wlan_cm_tgt_send_roam_start_req(psoc, vdev_id, start_req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send roam start");
@@ -3137,6 +3140,9 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
update_req->wlan_roam_rt_stats_config =
wlan_cm_get_roam_rt_stats(psoc, ROAM_RT_STATS_ENABLE);
update_req->wlan_roam_ho_delay_config =
wlan_cm_roam_get_ho_delay_config(psoc);
status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send update config");
@@ -7124,4 +7130,19 @@ cm_send_rso_stop(struct wlan_objmgr_vdev *vdev)
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
cm_roam_send_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint16_t param_value)
{
QDF_STATUS status;
wlan_cm_roam_set_ho_delay_config(psoc, param_value);
status = wlan_cm_tgt_send_roam_ho_delay_config(psoc,
vdev_id, param_value);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send roam HO delay config");
return status;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */

Datei anzeigen

@@ -421,6 +421,20 @@ QDF_STATUS cm_roam_update_vendor_handoff_config(struct wlan_objmgr_psoc *psoc,
QDF_STATUS
cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t param_value);
/**
* cm_roam_send_ho_delay_config() - Send HO delay value to FW to delay
* hand-off (in msec) by the specified duration to receive pending rx frames
* from current BSS.
* @psoc: PSOC pointer
* @vdev_id: vdev id
* @param_value: HO delay value
*
* Return: QDF_STATUS
*/
QDF_STATUS
cm_roam_send_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint16_t param_value);
#else
static inline QDF_STATUS
cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,
@@ -428,6 +442,13 @@ cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
cm_roam_send_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint16_t param_value)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
#if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)

Datei anzeigen

@@ -1149,6 +1149,26 @@ void
wlan_cm_get_roam_offload_ssid(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t *ssid, uint8_t *len);
/**
* wlan_cm_roam_set_ho_delay_config() - Set roam hand-off delay
* @psoc: PSOC pointer
* @roam_ho_delay: vendor configured roam HO delay value
*
* Return: none
*/
void
wlan_cm_roam_set_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint16_t roam_ho_delay);
/**
* wlan_cm_roam_get_ho_delay_config() - Get roam hand-off delay
* @psoc: PSOC pointer
*
* Return: Roam HO delay value
*/
uint16_t
wlan_cm_roam_get_ho_delay_config(struct wlan_objmgr_psoc *psoc);
#else
static inline
void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
@@ -1349,6 +1369,12 @@ wlan_cm_get_roam_offload_ssid(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
{
}
static inline uint16_t
wlan_cm_roam_get_ho_delay_config(struct wlan_objmgr_psoc *psoc)
{
return 0;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
#ifdef WLAN_FEATURE_FIPS

Datei anzeigen

@@ -1778,6 +1778,7 @@ struct wlan_roam_mlo_config {
* @idle_params: idle params
* @wlan_roam_rt_stats_config: roam events stats config
* @roam_mlo_params: roam mlo config params
* @wlan_roam_ho_delay_config: roam HO delay value
*/
struct wlan_roam_start_config {
struct wlan_roam_offload_scan_rssi_params rssi_params;
@@ -1799,6 +1800,7 @@ struct wlan_roam_start_config {
struct wlan_roam_idle_params idle_params;
uint8_t wlan_roam_rt_stats_config;
struct wlan_roam_mlo_config roam_mlo_params;
uint16_t wlan_roam_ho_delay_config;
/* other wmi cmd structures */
};
@@ -1849,6 +1851,7 @@ struct wlan_roam_stop_config {
* @idle_params: idle params
* @roam_triggers: roam triggers parameters
* @wlan_roam_rt_stats_config: roam events stats config
* @wlan_roam_ho_delay_config: roam HO delay value
*/
struct wlan_roam_update_config {
struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
@@ -1864,6 +1867,7 @@ struct wlan_roam_update_config {
struct wlan_roam_idle_params idle_params;
struct wlan_roam_triggers roam_triggers;
uint8_t wlan_roam_rt_stats_config;
uint16_t wlan_roam_ho_delay_config;
};
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
@@ -2334,6 +2338,7 @@ struct roam_pmkid_req_event {
* @send_roam_abort: send roam abort
* @send_roam_disable_config: send roam disable config
* @send_roam_rt_stats_config: Send roam events vendor command param value to FW
* @send_roam_ho_delay_config: Send roam Hand-off delay value to FW
* @send_roam_linkspeed_state: Send roam link speed good/poor state to FW
* @send_roam_vendor_handoff_config: send vendor handoff config command to FW
*/
@@ -2366,6 +2371,9 @@ struct wlan_cm_roam_tx_ops {
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS (*send_roam_rt_stats_config)(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, uint8_t value);
QDF_STATUS (*send_roam_ho_delay_config)(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id,
uint16_t value);
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
QDF_STATUS (*send_roam_linkspeed_state)(struct wlan_objmgr_vdev *vdev,
uint8_t vdev_id, bool value);

Datei anzeigen

@@ -354,6 +354,18 @@ void ucfg_cm_reset_key(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id);
QDF_STATUS
ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint8_t param_value);
/**
* ucfg_cm_roam_send_ho_delay_config() - Send the HO delay value to Firmware
* @pdev: Pointer to pdev
* @vdev_id: vdev id
* @param_value: Value will be from range 20 to 1000 in msec.
*
* Return: QDF_STATUS
*/
QDF_STATUS
ucfg_cm_roam_send_ho_delay_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint16_t param_value);
#else
static inline void
ucfg_cm_reset_key(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id) {}
@@ -364,6 +376,13 @@ ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
ucfg_cm_roam_send_ho_delay_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint16_t param_value)
{
return QDF_STATUS_SUCCESS;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
#ifdef WLAN_VENDOR_HANDOFF_CONTROL

Datei anzeigen

@@ -71,6 +71,19 @@ wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
struct roam_disable_cfg *req);
/**
* wlan_cm_tgt_send_roam_ho_delay_config() - Send roam HO delay config command
* to FW
* @psoc: psoc pointer
* @vdev_id: vdev id
* @roam_ho_delay: roam hand-off delay value
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_tgt_send_roam_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint16_t roam_ho_delay);
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
/**
* wlan_cm_tgt_send_roam_linkspeed_state() - Send roam link speed state
@@ -105,6 +118,13 @@ QDF_STATUS wlan_cm_tgt_send_roam_mlo_config(struct wlan_objmgr_psoc *psoc,
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
wlan_cm_tgt_send_roam_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint16_t roam_ho_delay)
{
return QDF_STATUS_E_FAILURE;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
#ifdef WLAN_VENDOR_HANDOFF_CONTROL

Datei anzeigen

@@ -3606,6 +3606,33 @@ ret:
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
}
void
wlan_cm_roam_set_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint16_t roam_ho_delay)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return;
mlme_obj->cfg.lfr.roam_ho_delay_config = roam_ho_delay;
}
uint16_t
wlan_cm_roam_get_ho_delay_config(struct wlan_objmgr_psoc *psoc)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
mlme_legacy_err("Failed to get MLME Obj");
return 0;
}
return mlme_obj->cfg.lfr.roam_ho_delay_config;
}
#else
QDF_STATUS
cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,

Datei anzeigen

@@ -487,6 +487,15 @@ ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
return cm_roam_send_rt_stats_config(psoc, vdev_id, param_value);
}
QDF_STATUS
ucfg_cm_roam_send_ho_delay_config(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id, uint16_t param_value)
{
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
return cm_roam_send_ho_delay_config(psoc, vdev_id, param_value);
}
#ifdef WLAN_VENDOR_HANDOFF_CONTROL
QDF_STATUS
ucfg_cm_roam_send_vendor_handoff_param_req(struct wlan_objmgr_psoc *psoc,

Datei anzeigen

@@ -207,6 +207,37 @@ QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
return status;
}
QDF_STATUS wlan_cm_tgt_send_roam_ho_delay_config(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint16_t roam_ho_delay)
{
QDF_STATUS status;
struct wlan_cm_roam_tx_ops *roam_tx_ops;
struct wlan_objmgr_vdev *vdev;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_NB_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
roam_tx_ops = wlan_cm_roam_get_tx_ops_from_vdev(vdev);
if (!roam_tx_ops || !roam_tx_ops->send_roam_ho_delay_config) {
mlme_err("vdev %d send_roam_ho_delay_config is NULL", vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return QDF_STATUS_E_INVAL;
}
status = roam_tx_ops->send_roam_ho_delay_config(vdev, vdev_id,
roam_ho_delay);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("vdev %d fail to send roam HO delay config",
vdev_id);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
return status;
}
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
QDF_STATUS wlan_cm_tgt_send_roam_linkspeed_state(struct wlan_objmgr_psoc *psoc,
struct roam_disable_cfg *req)

Datei anzeigen

@@ -5197,6 +5197,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_BAND_MASK] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_RX_LINKSPEED_THRESHOLD] = {.type = NLA_U16},
[QCA_ATTR_ROAM_CONTROL_HO_DELAY_FOR_RX] = {.type = NLA_U16},
};
/**
@@ -5627,6 +5628,10 @@ hdd_set_roam_rx_linkspeed_threshold(struct wlan_objmgr_psoc *psoc,
}
#endif
/* Roam Hand-off delay range is 20 to 1000 msec */
#define MIN_ROAM_HO_DELAY 20
#define MAX_ROAM_HO_DELAY 1000
/**
* hdd_set_roam_with_control_config() - Set roam control configuration
* @hdd_ctx: HDD context
@@ -5883,6 +5888,22 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
sme_send_vendor_btm_params(hdd_ctx->mac_handle, vdev_id);
}
attr = tb2[QCA_ATTR_ROAM_CONTROL_HO_DELAY_FOR_RX];
if (attr) {
value = nla_get_u16(attr);
if (value < MIN_ROAM_HO_DELAY || value > MAX_ROAM_HO_DELAY) {
hdd_err("Invalid roam HO delay value: %d", value);
return -EINVAL;
}
hdd_debug("Received roam HO delay value: %d", value);
status = ucfg_cm_roam_send_ho_delay_config(hdd_ctx->pdev,
vdev_id, value);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("failed to set hand-off delay");
}
return qdf_status_to_os_return(status);
}