Browse Source

qcacld-3.0: Update linkspeed state to F/W for roaming hdd 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: I38c60c55cca80ad9c71fcffda6712ac5984daef0
CRs-Fixed: 3264981
Jianmin Zhu 2 years ago
parent
commit
ebfe40c98a
3 changed files with 80 additions and 0 deletions
  1. 21 0
      core/hdd/inc/wlan_hdd_main.h
  2. 48 0
      core/hdd/src/wlan_hdd_cfg80211.c
  3. 11 0
      core/hdd/src/wlan_hdd_main.c

+ 21 - 0
core/hdd/inc/wlan_hdd_main.h

@@ -4680,4 +4680,25 @@ hdd_is_dynamic_set_mac_addr_allowed(struct hdd_adapter *adapter)
 }
 
 #endif /* WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE */
+
+#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
+defined(FEATURE_RX_LINKSPEED_ROAM_TRIGGER)
+/**
+ * wlan_hdd_link_speed_update() - Update link speed to F/W
+ * @psoc: pointer to soc
+ * @vdev_id: Vdev ID
+ * @is_link_speed_good: true means good link speed,  false means bad link speed
+ *
+ * Return: None
+ */
+void wlan_hdd_link_speed_update(struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id,
+				bool is_link_speed_good);
+#else
+static inline void wlan_hdd_link_speed_update(struct wlan_objmgr_psoc *psoc,
+					      uint8_t vdev_id,
+					      bool is_link_speed_good)
+{}
+#endif
+
 #endif /* end #if !defined(WLAN_HDD_MAIN_H) */

+ 48 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -5006,6 +5006,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
 	[QCA_ATTR_ROAM_CONTROL_USER_REASON] = {.type = NLA_U32},
 	[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},
 };
 
 /**
@@ -5398,6 +5399,44 @@ hdd_send_roam_scan_period_to_sme(struct hdd_context *hdd_ctx,
 	return status;
 }
 
+#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
+defined(FEATURE_RX_LINKSPEED_ROAM_TRIGGER)
+/**
+ * hdd_set_roam_rx_linkspeed_threshold() - Set rx link speed threshold
+ * @psoc: Pointer to psoc
+ * @vdev_id: vdev id
+ *
+ * Return: none
+ */
+static QDF_STATUS
+hdd_set_roam_rx_linkspeed_threshold(struct wlan_objmgr_psoc *psoc,
+				    struct wlan_objmgr_vdev *vdev,
+				    uint32_t linkspeed_threshold)
+{
+	if (!ucfg_cm_is_linkspeed_roam_trigger_supported(psoc))
+		return QDF_STATUS_E_NOSUPPORT;
+
+	if (linkspeed_threshold) {
+		dp_ucfg_enable_link_monitoring(psoc, vdev,
+					       linkspeed_threshold);
+	} else {
+		dp_ucfg_disable_link_monitoring(psoc, vdev);
+		wlan_hdd_link_speed_update(psoc, wlan_vdev_get_id(vdev),
+					   false);
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+#else
+static inline QDF_STATUS
+hdd_set_roam_rx_linkspeed_threshold(struct wlan_objmgr_psoc *psoc,
+				    struct wlan_objmgr_vdev *vdev,
+				    uint32_t linkspeed_threshold)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
+#endif
+
 /**
  * hdd_set_roam_with_control_config() - Set roam control configuration
  * @hdd_ctx: HDD context
@@ -5420,6 +5459,7 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
 	struct wlan_cm_roam_vendor_btm_params param = {0};
 	bool is_wtc_param_updated = false;
 	uint32_t band_mask;
+	uint16_t threshold;
 	struct hdd_adapter *adapter;
 	uint8_t roam_control_enable = false;
 
@@ -5639,6 +5679,14 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
 		}
 	}
 
+	attr = tb2[QCA_ATTR_ROAM_CONTROL_RX_LINKSPEED_THRESHOLD];
+	if (attr) {
+		threshold = nla_get_u16(attr);
+		status = hdd_set_roam_rx_linkspeed_threshold(hdd_ctx->psoc,
+							     adapter->vdev,
+							     threshold);
+	}
+
 	if (is_wtc_param_updated) {
 		wlan_cm_roam_set_vendor_btm_params(hdd_ctx->psoc, &param);
 		/* Sends RSO update */

+ 11 - 0
core/hdd/src/wlan_hdd_main.c

@@ -10509,6 +10509,16 @@ static inline void wlan_hdd_send_mscs_action_frame(hdd_cb_handle context,
 }
 #endif
 
+#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
+defined(FEATURE_RX_LINKSPEED_ROAM_TRIGGER)
+void wlan_hdd_link_speed_update(struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id,
+				bool is_link_speed_good)
+{
+	ucfg_cm_roam_link_speed_update(psoc, vdev_id, is_link_speed_good);
+}
+#endif
+
 /**
  * hdd_dp_register_callbacks() - Register DP callbacks with HDD
  * @hdd_ctx: HDD context
@@ -10551,6 +10561,7 @@ static void hdd_dp_register_callbacks(struct hdd_context *hdd_ctx)
 	cb_obj.dp_get_tsf_time = hdd_get_tsf_time_cb;
 	cb_obj.dp_tsf_timestamp_rx = hdd_tsf_timestamp_rx;
 	cb_obj.dp_gro_rx_legacy_get_napi = hdd_legacy_gro_get_napi;
+	cb_obj.link_monitoring_cb = wlan_hdd_link_speed_update;
 
 	os_if_dp_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj);
 }