Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dce2e3a8 authored by Srikanth Marepalli's avatar Srikanth Marepalli
Browse files

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
parent ae69ee96
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1722,6 +1722,7 @@ struct fw_scan_channels {
 * @sae_single_pmk_feature_enabled: Contains value of ini
 * sae_single_pmk_feature_enabled
 * @enable_ft_over_ds: Flag to enable/disable FT-over-DS
 * @roam_ho_delay_config: Roam HO delay value
 */
struct wlan_mlme_lfr_cfg {
	bool mawc_roam_enabled;
@@ -1840,6 +1841,7 @@ struct wlan_mlme_lfr_cfg {
	bool sae_single_pmk_feature_enabled;
#endif
	bool enable_ft_over_ds;
	uint16_t roam_ho_delay_config;
};

/**
+50 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
@@ -130,11 +131,44 @@ target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
	return status;
}

/**
 * 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)
{
	tx_ops->send_vdev_set_pcl_cmd = target_if_cm_roam_send_vdev_set_pcl_cmd;
	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;
}
#else
static inline void
@@ -147,6 +181,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

/**
@@ -1032,6 +1073,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;
@@ -1254,6 +1299,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;
+21 −0
Original line number Diff line number Diff line
@@ -272,6 +272,21 @@ cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc,

	return status;
}

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;
}
#else
static inline void
cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
@@ -526,6 +541,9 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
	start_req->wlan_roam_rt_stats_config =
			wlan_cm_get_roam_rt_stats(psoc, ROAM_RT_STATS_ENABLE);

	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");
@@ -575,6 +593,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");
+22 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -114,6 +115,20 @@ cm_roam_fill_rssi_change_params(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
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,
@@ -121,6 +136,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

/**
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
@@ -621,6 +622,26 @@ wlan_cm_update_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
uint8_t
wlan_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
			  enum roam_rt_stats_params stats);

/**
 * 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,
@@ -737,5 +758,11 @@ wlan_cm_get_roam_rt_stats(struct wlan_objmgr_psoc *psoc,
{
	return 0;
}

static inline uint16_t
wlan_cm_roam_get_ho_delay_config(struct wlan_objmgr_psoc *psoc)
{
	return 0;
}
#endif  /* FEATURE_ROAM_OFFLOAD */
#endif  /* WLAN_CM_ROAM_API_H__ */
Loading