Jelajahi Sumber

qcacmn: Add API to stop reconfig timer

Add API to stop link reconfig timer on vdev or ml dev.
Add API to query the reconfig timer state.

Change-Id: I729d403122e4e84cdf0dced21c49176397e10e5d
CRs-Fixed: 3352937
Liangwei Dong 2 tahun lalu
induk
melakukan
1ffc60a883
2 mengubah file dengan 107 tambahan dan 0 penghapusan
  1. 40 0
      umac/mlo_mgr/inc/wlan_mlo_mgr_sta.h
  2. 67 0
      umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

+ 40 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_sta.h

@@ -621,6 +621,31 @@ bool mlo_is_sta_csa_param_handled(struct wlan_objmgr_vdev *vdev,
  */
 void mlo_internal_disconnect_links(struct wlan_objmgr_vdev *vdev);
 
+/**
+ * mlo_sta_vdev_get_reconfig_timer_state() - Get ml reconfig timer state on
+ * vdev
+ * @vdev: vdev pointer
+ *
+ * Return: true if reconfig timer is active, otherwise false
+ */
+bool mlo_sta_vdev_get_reconfig_timer_state(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * mlo_sta_stop_reconfig_timer_by_vdev() - Stop ml reconfig timer
+ * @vdev: vdev pointer
+ *
+ * Return: None
+ */
+void mlo_sta_stop_reconfig_timer_by_vdev(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * mlo_sta_stop_reconfig_timer() - Stop reconfig timer on all vdev on ml dev
+ * @vdev: vdev pointer
+ *
+ * Return: None
+ */
+void mlo_sta_stop_reconfig_timer(struct wlan_objmgr_vdev *vdev);
+
 /**
  * mlo_sta_get_vdev_list() - get mlo vdev list
  * @vdev: vdev pointer
@@ -805,6 +830,21 @@ void mlo_sta_get_vdev_list(struct wlan_objmgr_vdev *vdev,
 {
 }
 
+static inline bool
+mlo_sta_vdev_get_reconfig_timer_state(struct wlan_objmgr_vdev *vdev)
+{
+	return false;
+}
+
+static inline void
+mlo_sta_stop_reconfig_timer_by_vdev(struct wlan_objmgr_vdev *vdev)
+{
+}
+
+static inline void mlo_sta_stop_reconfig_timer(struct wlan_objmgr_vdev *vdev)
+{
+}
+
 static inline
 void mlo_set_keys_saved(struct wlan_objmgr_vdev *vdev,
 			struct qdf_mac_addr *mac_address, bool value)

+ 67 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -2035,6 +2035,73 @@ void mlo_sta_get_vdev_list(struct wlan_objmgr_vdev *vdev, uint16_t *vdev_count,
 	mlo_dev_lock_release(dev_ctx);
 }
 
+bool mlo_sta_vdev_get_reconfig_timer_state(struct wlan_objmgr_vdev *vdev)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+
+	if (!vdev || !mlo_is_mld_sta(vdev))
+		return false;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		mlo_err("vdev mlme is null");
+		return false;
+	}
+
+	return vdev_mlme->ml_reconfig_started;
+}
+
+void mlo_sta_stop_reconfig_timer_by_vdev(struct wlan_objmgr_vdev *vdev)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+
+	if (!vdev || !mlo_is_mld_sta(vdev))
+		return;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		mlo_err("vdev mlme is null");
+		return;
+	}
+
+	if (!vdev_mlme->ml_reconfig_started)
+		return;
+
+	qdf_timer_stop(&vdev_mlme->ml_reconfig_timer);
+
+	mlo_debug("vdev %d reconfig timer active to stop",
+		  wlan_vdev_get_id(vdev));
+	vdev_mlme->ml_reconfig_started = false;
+}
+
+void mlo_sta_stop_reconfig_timer(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS] = {0};
+	uint16_t vdev_count = 0;
+	uint8_t i;
+
+	if (!vdev || !mlo_is_mld_sta(vdev))
+		return;
+
+	mlo_get_ml_vdev_list(vdev, &vdev_count, wlan_vdev_list);
+	if (!vdev_count) {
+		mlo_err("vdev num 0 in mld dev");
+		return;
+	}
+
+	for (i = 0; i < vdev_count; i++) {
+		if (!wlan_vdev_list[i]) {
+			mlo_err("vdev is null in mld");
+			goto release_ref;
+		}
+		mlo_sta_stop_reconfig_timer_by_vdev(wlan_vdev_list[i]);
+	}
+
+release_ref:
+	for (i = 0; i < vdev_count; i++)
+		mlo_release_vdev_ref(wlan_vdev_list[i]);
+}
+
 void mlo_set_keys_saved(struct wlan_objmgr_vdev *vdev,
 			struct qdf_mac_addr *mac_address, bool value)
 {