Procházet zdrojové kódy

qcacmn: skip a radio as primary-umac in MLO

Allow user configuration options to skip a radio as
primary-umac in multi-link operation.

Change-Id: Ic7c8dd5c1cf7855f4fb762daf9ace7cb82e02cac
CRs-Fixed: 3437922
Rohan Dutta před 2 roky
rodič
revize
4600a3b873

+ 37 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h

@@ -415,6 +415,7 @@ struct wlan_soc_timer {
  * @tgt_if_handle:         target interface handle
  * @dp_handle:             DP module handle
  * @psoc_lock:             psoc lock
+ * @skip_mlo_pumac:        skip this psoc as MLO primary umac
  */
 struct wlan_objmgr_psoc {
 	struct wlan_objmgr_psoc_regulatory soc_reg;
@@ -429,6 +430,7 @@ struct wlan_objmgr_psoc {
 	struct target_psoc_info *tgt_if_handle;
 	void *dp_handle;
 	qdf_spinlock_t psoc_lock;
+	bool skip_mlo_pumac;
 };
 
 /**
@@ -1959,6 +1961,41 @@ static inline void *wlan_psoc_get_dp_handle(struct wlan_objmgr_psoc *psoc)
 	return psoc->dp_handle;
 }
 
+/**
+ * wlan_psoc_set_pumac_skip - set mlo primary umac skip setting
+ * @psoc: psoc object pointer
+ * @val: indicate support for MLO PUMAC feature on psoc
+ *
+ * Return: void
+ */
+static inline void wlan_psoc_set_pumac_skip(
+			struct wlan_objmgr_psoc *psoc,
+			bool val)
+{
+	if (qdf_unlikely(!psoc)) {
+		QDF_BUG(0);
+		return;
+	}
+
+	psoc->skip_mlo_pumac = val;
+}
+
+/**
+ * wlan_psoc_get_pumac_skip - get mlo primary umac skip setting
+ * @psoc: psoc object pointer
+ *
+ * Return: bool (primary umac support)
+ */
+static inline bool wlan_psoc_get_pumac_skip(struct wlan_objmgr_psoc *psoc)
+{
+	if (qdf_unlikely(!psoc)) {
+		QDF_BUG(0);
+		return false;
+	}
+
+	return psoc->skip_mlo_pumac;
+}
+
 struct wlan_logically_del_peer {
 	qdf_list_node_t list;
 	struct wlan_objmgr_peer *peer;

+ 20 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -744,6 +744,26 @@ static inline uint8_t wlan_vdev_get_psoc_id(struct wlan_objmgr_vdev *vdev)
 	return wlan_psoc_get_id(psoc);
 }
 
+/**
+ * wlan_vdev_skip_pumac() - get primary umac support
+ * @vdev: VDEV object
+ *
+ * API to get Primary umac support for MLO
+ *
+ * Return: get primary umac support (bool)
+ */
+static inline bool wlan_vdev_skip_pumac(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_psoc *psoc;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+
+	if (wlan_psoc_get_pumac_skip(psoc))
+		return true;
+
+	return false;
+}
+
 /**
  * wlan_vdev_mlme_set_opmode() - set vdev opmode
  * @vdev: VDEV object

+ 6 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_primary_umac.c

@@ -173,6 +173,12 @@ mld_get_best_primary_umac_w_rssi(struct wlan_mlo_peer_context *ml_peer,
 		if (id >= WLAN_OBJMGR_MAX_DEVICES)
 			continue;
 
+		if (wlan_vdev_skip_pumac(link_vdevs[i])) {
+			mlo_err("Skip Radio for Primary MLO umac");
+			mld_sta_links[id] = false;
+			continue;
+		}
+
 		tqm_params = &rssi_data.psoc_tqm_parms[id];
 		mld_sta_links[id] = true;