Forráskód Böngészése

qcacld-3.0: Update linkspeed state to F/W for roaming protocol part

To avoid unmeaningful roaming, when low RSSI trigger,
only roam when rx linkspeed is also bad.
Steps:
1. F/W indicates feature supported by:
	wmi_service_linkspeed_roam_trigger_support
2. App sets vdev rx link speed threshold by vendor cmd.
3. Bus_bw_work gets rx link speed from data path periodically.
4. If found rx link speed change from good to poor, or poor to good, send
	to F/W.
5. F/W low rssi roaming is triggered only when both RSSI and link speed are
	poor.

Change-Id: I56829e42b26e407dd8e989a870aee2b3ea406232
CRs-Fixed: 3261996
Jianmin Zhu 2 éve
szülő
commit
5a9556bf4b

+ 2 - 1
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1758,7 +1758,8 @@ struct fw_scan_channels {
 	uint32_t freq[NUM_CHANNELS];
 };
 
-/*
+/**
+ * struct wlan_mlme_lfr_cfg - MLME LMAC fast roaming config
  * @mawc_roam_enabled:              Enable/Disable MAWC during roaming
  * @enable_fast_roam_in_concurrency:Enable LFR roaming on STA during concurrency
  * @vendor_btm_param:               Vendor WTC roam trigger parameters

+ 62 - 0
components/target_if/connection_mgr/src/target_if_cm_roam_offload.c

@@ -184,6 +184,46 @@ target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
 	return status;
 }
 
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+/**
+ * target_if_cm_roam_linkspeed_state() - Send link speed state for roaming
+ * commands to wmi
+ * @vdev: vdev object
+ * @vdev_id: vdev id
+ * @is_linkspeed_good: true, don't need low rssi roaming
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+target_if_cm_roam_linkspeed_state(struct wlan_objmgr_vdev *vdev,
+				  uint8_t vdev_id, bool is_linkspeed_good)
+{
+	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_LINKSPEED_STATE,
+					  is_linkspeed_good);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		target_if_err("Failed to set WMI_ROAM_PARAM_LINKSPEED_STATE");
+
+	return status;
+}
+#else
+static inline QDF_STATUS
+target_if_cm_roam_linkspeed_state(struct wlan_objmgr_vdev *vdev,
+				  uint8_t vdev_id, bool is_linkspeed_good)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
 /**
  * target_if_cm_roam_vendor_handoff_config() - Send vendor handoff config
@@ -228,6 +268,27 @@ static inline void target_if_cm_roam_register_vendor_handoff_ops(
 }
 #endif
 
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+/**
+ * target_if_cm_roam_register_linkspeed_state() - Register tx ops to send
+ * roam link speed state command to fw
+ * @tx_ops: structure of tx function pointers for roaming related commands
+ *
+ * Return: none
+ */
+static inline void
+target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops *tx_ops)
+{
+	tx_ops->send_roam_linkspeed_state =
+				target_if_cm_roam_linkspeed_state;
+}
+#else
+static inline void
+target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops *tx_ops)
+{
+}
+#endif
+
 static void
 target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
 {
@@ -236,6 +297,7 @@ target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
 	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;
 	target_if_cm_roam_register_vendor_handoff_ops(tx_ops);
+	target_if_cm_roam_register_linkspeed_state(tx_ops);
 }
 #else
 static inline void

+ 43 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h

@@ -29,6 +29,7 @@
 #include "wlan_mlme_main.h"
 #include "wlan_mlme_api.h"
 #include "wlan_reg_ucfg_api.h"
+#include "wlan_cm_tgt_if_tx_api.h"
 
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
 /**
@@ -840,6 +841,48 @@ QDF_STATUS wlan_cm_set_roam_band_bitmask(struct wlan_objmgr_psoc *psoc,
 					 uint8_t vdev_id,
 					 uint32_t roam_band_bitmask);
 
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+/**
+ * struct link_speed_cfg - link speed state config
+ * @psoc: pointer to psoc
+ * @vdev_id: vdev id
+ * @is_link_speed_good: true means link speed good, false means bad
+ */
+struct roam_link_speed_cfg {
+	struct wlan_objmgr_psoc *psoc;
+	uint8_t vdev_id;
+	uint8_t is_link_speed_good;
+};
+
+/**
+ * wlan_cm_send_roam_linkspeed_state() - Send link speed state to target
+ * @msg: Pointer to schedule message
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_cm_send_roam_linkspeed_state(struct scheduler_msg *msg);
+
+/**
+ * wlan_cm_roam_link_speed_update() - Update link speed state for roaming
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @is_link_speed_good: true means link speed good, false means bad
+ *
+ * Return: None
+ */
+void wlan_cm_roam_link_speed_update(struct wlan_objmgr_psoc *psoc,
+				    uint8_t vdev_id,
+				    bool is_link_speed_good);
+
+/**
+ * wlan_mlme_is_linkspeed_roam_trigger_supported() - Get roam linkspeed check
+ * @psoc: pointer to psoc object
+ *
+ * Return: bool, true: Linkspeed check for low rssi roaming supported
+ */
+bool wlan_cm_is_linkspeed_roam_trigger_supported(struct wlan_objmgr_psoc *psoc);
+#endif
+
 /**
  * wlan_cm_set_roam_band_update() - send rso update on set band
  * @psoc: psoc pointer

+ 5 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h

@@ -2293,6 +2293,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_linkspeed_state: Send roam link speed good/poor state to FW
  * @send_roam_vendor_handoff_config: send vendor handoff config command to FW
  */
 struct wlan_cm_roam_tx_ops {
@@ -2324,6 +2325,10 @@ 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);
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+	QDF_STATUS (*send_roam_linkspeed_state)(struct wlan_objmgr_vdev *vdev,
+						uint8_t vdev_id, bool value);
+#endif
 #endif
 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
 	QDF_STATUS (*send_roam_vendor_handoff_config)(

+ 32 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h

@@ -126,6 +126,38 @@ ucfg_cm_update_session_assoc_ie(struct wlan_objmgr_psoc *psoc,
 }
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+/**
+ * ucfg_cm_roam_link_speed_update() - Update link speed state for roaming
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @is_link_speed_good: true means link speed good, false means bad
+ *
+ * Return: QDF_STATUS
+ */
+static inline
+void ucfg_cm_roam_link_speed_update(struct wlan_objmgr_psoc *psoc,
+				    uint8_t vdev_id,
+				    bool is_link_speed_good)
+{
+	wlan_cm_roam_link_speed_update(psoc,
+				       vdev_id,
+				       is_link_speed_good);
+}
+
+/**
+ * ucfg_mlme_is_linkspeed_roam_trigger_supported() - Get roam linkspeed check
+ * @psoc: pointer to psoc object
+ *
+ * Return: bool, true: Linkspeed check for low rssi roaming supported
+ */
+static inline bool
+ucfg_cm_is_linkspeed_roam_trigger_supported(struct wlan_objmgr_psoc *psoc)
+{
+	return wlan_cm_is_linkspeed_roam_trigger_supported(psoc);
+}
+#endif
+
 static inline QDF_STATUS
 ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
 				       uint8_t vdev_id,

+ 14 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h

@@ -48,6 +48,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);
+
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+/**
+ * wlan_cm_tgt_send_roam_linkspeed_state() - Send roam link speed state
+ * command to FW
+ * @psoc: psoc pointer
+ * @req: roam stats config parameter
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_cm_tgt_send_roam_linkspeed_state(struct wlan_objmgr_psoc *psoc,
+						 struct roam_disable_cfg *req);
+#endif
 #else
 static inline QDF_STATUS
 wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
@@ -62,6 +75,7 @@ wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
 {
 	return QDF_STATUS_E_FAILURE;
 }
+
 #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
 
 #ifdef WLAN_VENDOR_HANDOFF_CONTROL

+ 65 - 0
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -35,6 +35,7 @@
 #include <../../core/src/wlan_cm_roam_i.h>
 #include "wlan_reg_ucfg_api.h"
 #include "wlan_connectivity_logging.h"
+#include "target_if.h"
 
 /* Support for "Fast roaming" (i.e., ESE, LFR, or 802.11r.) */
 #define BG_SCAN_OCCUPIED_CHANNEL_LIST_LEN 15
@@ -316,6 +317,70 @@ bool wlan_cm_same_band_sta_allowed(struct wlan_objmgr_psoc *psoc)
 }
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
+#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
+QDF_STATUS wlan_cm_send_roam_linkspeed_state(struct scheduler_msg *msg)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct roam_link_speed_cfg *link_speed_cfg;
+	struct roam_disable_cfg  roam_link_speed_cfg;
+
+	if (!msg || !msg->bodyptr)
+		return QDF_STATUS_E_FAILURE;
+
+	link_speed_cfg = msg->bodyptr;
+	roam_link_speed_cfg.vdev_id = link_speed_cfg->vdev_id;
+	roam_link_speed_cfg.cfg = link_speed_cfg->is_link_speed_good;
+	status = wlan_cm_tgt_send_roam_linkspeed_state(link_speed_cfg->psoc,
+						       &roam_link_speed_cfg);
+	qdf_mem_free(link_speed_cfg);
+
+	return status;
+}
+
+void wlan_cm_roam_link_speed_update(struct wlan_objmgr_psoc *psoc,
+				    uint8_t vdev_id,
+				    bool is_link_speed_good)
+{
+	QDF_STATUS qdf_status;
+	struct scheduler_msg msg = {0};
+	struct roam_link_speed_cfg *link_speed_cfg;
+
+	link_speed_cfg = qdf_mem_malloc(sizeof(*link_speed_cfg));
+	if (!link_speed_cfg)
+		return;
+
+	link_speed_cfg->psoc = psoc;
+	link_speed_cfg->vdev_id = vdev_id;
+	link_speed_cfg->is_link_speed_good = is_link_speed_good;
+
+	msg.bodyptr = link_speed_cfg;
+	msg.callback = wlan_cm_send_roam_linkspeed_state;
+
+	qdf_status = scheduler_post_message(QDF_MODULE_ID_MLME,
+					    QDF_MODULE_ID_OS_IF,
+					    QDF_MODULE_ID_OS_IF, &msg);
+
+	if (QDF_IS_STATUS_ERROR(qdf_status)) {
+		mlme_err("post msg failed");
+		qdf_mem_free(link_speed_cfg);
+	}
+}
+
+bool wlan_cm_is_linkspeed_roam_trigger_supported(struct wlan_objmgr_psoc *psoc)
+{
+	struct wmi_unified *wmi_handle;
+
+	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
+	if (!wmi_handle) {
+		mlme_debug("Invalid WMI handle");
+		return false;
+	}
+
+	return wmi_service_enabled(wmi_handle,
+				   wmi_service_linkspeed_roam_trigger_support);
+}
+#endif
+
 QDF_STATUS
 wlan_cm_fw_roam_abort_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
 {

+ 33 - 0
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c

@@ -206,6 +206,39 @@ QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
 
 	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)
+{
+	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, req->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_linkspeed_state) {
+		mlme_err("vdev %d send_roam_linkspeed_state is NULL",
+			 req->vdev_id);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	status = roam_tx_ops->send_roam_linkspeed_state(vdev,
+							req->vdev_id, req->cfg);
+	if (QDF_IS_STATUS_ERROR(status))
+		mlme_debug("vdev %d fail to send roam linkspeed state",
+			   req->vdev_id);
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+
+	return status;
+}
+#endif
 #endif
 
 #ifdef WLAN_VENDOR_HANDOFF_CONTROL