Browse Source

qcacld-3.0: Update the derived link address in mlo mgr

After all VDEV in the ML dev context are created, update the link
addresses derived in the ML dev context for connecting with 3 link APs.
For the link address which doesn't have valid VDEV id, mark the VDEV ID
invalid, for valid VDEV ID fill the corresponding VDEV ID.

Change-Id: I5e9b3414d0e0db7135cb977f48abb072cc1b6e8b
CRs-Fixed: 3492039
Vinod Kumar Pirla 1 year ago
parent
commit
0cecec6df6

+ 12 - 3
core/hdd/inc/wlan_hdd_main.h

@@ -1089,9 +1089,7 @@ struct wlan_hdd_link_info {
 	qdf_spinlock_t vdev_lock;
 	struct wlan_objmgr_vdev *vdev;
 	struct completion vdev_destroy_event;
-#ifdef WLAN_HDD_MULTI_VDEV_SINGLE_NDEV
 	struct qdf_mac_addr link_addr;
-#endif
 
 	union {
 		struct hdd_station_ctx station;
@@ -1445,7 +1443,7 @@ struct hdd_adapter {
 	bool is_dbam_configured;
 #endif
 	struct wlan_hdd_link_info *deflink;
-	struct wlan_hdd_link_info link_info[WLAN_MAX_MLD];
+	struct wlan_hdd_link_info link_info[WLAN_MAX_ML_BSS_LINKS];
 	struct wlan_hdd_tx_power tx_power;
 };
 
@@ -2872,6 +2870,17 @@ struct hdd_adapter *
 hdd_get_adapter_by_rand_macaddr(struct hdd_context *hdd_ctx,
 				tSirMacAddr mac_addr);
 
+/**
+ * hdd_adapter_update_mlo_mgr_mac_addr() - Update each link address to MLO mgr.
+ * @adapter: HDD adapter
+ *
+ * Update MLO manager with each link address and corresponding VDEV ID.
+ * Only update for ML-STA adapter types.
+ *
+ * Return: void
+ */
+void hdd_adapter_update_mlo_mgr_mac_addr(struct hdd_adapter *adapter);
+
 /**
  * hdd_is_vdev_in_conn_state() - Check whether the vdev is in
  * connected/started state.

+ 5 - 2
core/hdd/src/wlan_hdd_cfg80211.c

@@ -21438,17 +21438,19 @@ hdd_adapter_update_mac_on_mode_change(struct hdd_adapter *adapter)
 	struct hdd_adapter *link_adapter;
 	struct hdd_mlo_adapter_info *mlo_adapter_info;
 	struct hdd_context *hdd_ctx = adapter->hdd_ctx;
-	struct qdf_mac_addr link_addr[WLAN_MAX_MLD] = {0};
+	struct qdf_mac_addr link_addr[WLAN_MAX_ML_BSS_LINKS] = {0};
 
 	status = hdd_derive_link_address_from_mld(&adapter->mld_addr,
 						  &link_addr[0],
-						  WLAN_MAX_MLD);
+						  WLAN_MAX_ML_BSS_LINKS);
 	if (QDF_IS_STATUS_ERROR(status))
 		return status;
 
 	mlo_adapter_info = &adapter->mlo_adapter_info;
 	for (i = 0; i < WLAN_MAX_MLD; i++) {
 		link_adapter = mlo_adapter_info->link_adapter[i];
+		qdf_copy_macaddr(&adapter->link_info[i].link_addr,
+				 &link_addr[i]);
 		if (!link_adapter)
 			continue;
 
@@ -21456,6 +21458,7 @@ hdd_adapter_update_mac_on_mode_change(struct hdd_adapter *adapter)
 				       &link_addr[i]);
 		qdf_copy_macaddr(&link_adapter->mac_addr, &link_addr[i]);
 	}
+	qdf_copy_macaddr(&adapter->link_info[i].link_addr, &link_addr[i]);
 
 	return QDF_STATUS_SUCCESS;
 }

+ 31 - 2
core/hdd/src/wlan_hdd_main.c

@@ -246,6 +246,7 @@
 #include "wlan_ll_sap_ucfg_api.h"
 
 #include "os_if_dp_local_pkt_capture.h"
+#include <wlan_mlo_mgr_link_switch.h>
 #include "cdp_txrx_mon.h"
 
 #ifdef MULTI_CLIENT_LL_SUPPORT
@@ -3473,11 +3474,20 @@ static int hdd_start_link_adapter(struct hdd_adapter *sta_adapter)
 			link_adapter->deflink->vdev_id =
 						sta_adapter->deflink->vdev_id;
 			qdf_spin_unlock_bh(&link_adapter->deflink->vdev_lock);
+
+			sta_adapter->link_info[i].vdev_id =
+						sta_adapter->deflink->vdev_id;
 			continue;
 		}
 		ret = hdd_start_station_adapter(link_adapter);
+		if (!ret) {
+			sta_adapter->link_info[i].vdev_id =
+						link_adapter->deflink->vdev_id;
+		}
 	}
 
+	hdd_adapter_update_mlo_mgr_mac_addr(sta_adapter);
+
 	hdd_exit();
 	return ret;
 }
@@ -7736,6 +7746,25 @@ error:
 	return -EINVAL;
 }
 
+void hdd_adapter_update_mlo_mgr_mac_addr(struct hdd_adapter *adapter)
+{
+	int i = 0;
+	struct wlan_hdd_link_info *link_info;
+	struct wlan_mlo_link_mac_update link_mac = {0};
+
+	if (!hdd_adapter_is_ml_adapter(adapter))
+		return;
+
+	hdd_adapter_for_each_link_info(adapter, link_info) {
+		link_mac.link_mac_info[i].vdev_id = link_info->vdev_id;
+		qdf_copy_macaddr(&link_mac.link_mac_info[i++].link_mac_addr,
+				 &link_info->link_addr);
+	}
+
+	link_mac.num_mac_update = i;
+	mlo_mgr_update_link_info_mac_addr(adapter->deflink->vdev, &link_mac);
+}
+
 /**
  * hdd_send_coex_config_params() - Send coex config params to FW
  * @hdd_ctx: HDD context
@@ -8318,7 +8347,8 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx,
 
 	switch (session_type) {
 	case QDF_STA_MODE:
-		if (!hdd_ctx->config->mac_provision) {
+		if (!(hdd_ctx->config->mac_provision ||
+		      params->only_wdev_register)) {
 			hdd_reset_locally_admin_bit(hdd_ctx, mac_addr);
 			/*
 			 * After resetting locally administered bit
@@ -14270,7 +14300,6 @@ int hdd_start_station_adapter(struct hdd_adapter *adapter)
 	hdd_adapter_set_wlm_client_latency_level(adapter);
 
 	hdd_exit();
-
 	return 0;
 
 fail:

+ 29 - 9
core/hdd/src/wlan_hdd_mlo.c

@@ -165,17 +165,20 @@ QDF_STATUS hdd_wlan_unregister_mlo_interfaces(struct hdd_adapter *adapter,
 
 void hdd_wlan_register_mlo_interfaces(struct hdd_context *hdd_ctx)
 {
+	int i = 0;
 	QDF_STATUS status;
 	struct hdd_adapter *ml_adapter;
+	struct wlan_hdd_link_info *link_info;
 	struct hdd_adapter_create_param params = {0};
-	struct qdf_mac_addr link_addr[WLAN_MAX_MLD] = {0};
+	struct qdf_mac_addr link_addr[WLAN_MAX_ML_BSS_LINKS] = {0};
 
 	ml_adapter = hdd_get_ml_adapter(hdd_ctx);
 	if (!ml_adapter)
 		return;
 
 	status = hdd_derive_link_address_from_mld(&ml_adapter->mld_addr,
-						  &link_addr[0], WLAN_MAX_MLD);
+						  &link_addr[0],
+						  WLAN_MAX_ML_BSS_LINKS);
 	if (QDF_IS_STATUS_ERROR(status))
 		return;
 
@@ -193,8 +196,14 @@ void hdd_wlan_register_mlo_interfaces(struct hdd_context *hdd_ctx)
 	/* if target supports MLO create a new dev */
 	status = hdd_open_adapter_no_trans(hdd_ctx, QDF_STA_MODE, "null",
 					   link_addr[1].bytes, &params);
-	if (QDF_IS_STATUS_ERROR(status))
+	if (QDF_IS_STATUS_ERROR(status)) {
 		hdd_err("Failed to register link adapter:%d", status);
+	} else {
+		hdd_adapter_for_each_link_info(ml_adapter, link_info) {
+			qdf_copy_macaddr(&link_info->link_addr,
+					 &link_addr[i++]);
+		}
+	}
 }
 
 void
@@ -270,7 +279,7 @@ QDF_STATUS hdd_derive_link_address_from_mld(struct qdf_mac_addr *mld_addr,
 	struct qdf_mac_addr *link_addr;
 
 	if (!mld_addr || !link_addr_list || !max_idx ||
-	    max_idx > WLAN_MAX_MLD || qdf_is_macaddr_zero(mld_addr)) {
+	    max_idx > WLAN_MAX_ML_BSS_LINKS || qdf_is_macaddr_zero(mld_addr)) {
 		hdd_err("Invalid values");
 		return QDF_STATUS_E_INVAL;
 	}
@@ -308,8 +317,8 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	QDF_STATUS status;
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	struct wlan_hdd_link_info *link_info;
-	uint8_t *addr_list[WLAN_MAX_MLD + 2] = {0};
-	struct qdf_mac_addr link_addrs[WLAN_MAX_MLD] = {0};
+	uint8_t *addr_list[WLAN_MAX_ML_BSS_LINKS + 1] = {0};
+	struct qdf_mac_addr link_addrs[WLAN_MAX_ML_BSS_LINKS] = {0};
 
 	/* This API is only called with is ml adapter set for STA mode adapter.
 	 * For SAP mode, hdd_hostapd_set_mac_address() is the entry point for
@@ -325,7 +334,7 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	}
 
 	status = hdd_derive_link_address_from_mld(&mac_addr, &link_addrs[0],
-						  WLAN_MAX_MLD);
+						  WLAN_MAX_ML_BSS_LINKS);
 
 	if (QDF_IS_STATUS_ERROR(status))
 		return qdf_status_to_os_return(status);
@@ -340,6 +349,10 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	if (QDF_IS_STATUS_ERROR(status))
 		return qdf_status_to_os_return(status);
 
+	i = 0;
+	hdd_adapter_for_each_link_info(adapter, link_info)
+		qdf_copy_macaddr(&link_info->link_addr, &link_addrs[i++]);
+
 	i = 0;
 	hdd_adapter_for_each_active_link_info(adapter, link_info) {
 		update_self_peer =
@@ -351,6 +364,8 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 
 		qdf_copy_macaddr(&link_info->link_addr, &link_addrs[i++]);
 	}
+
+	hdd_adapter_update_mlo_mgr_mac_addr(adapter);
 	return ret;
 }
 #else
@@ -363,8 +378,8 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	struct hdd_adapter *link_adapter;
 	struct hdd_mlo_adapter_info *mlo_adapter_info;
 	struct hdd_context *hdd_ctx = adapter->hdd_ctx;
-	struct qdf_mac_addr link_addrs[WLAN_MAX_MLD] = {0};
 	uint8_t *addr_list[WLAN_MAX_MLD + 1] = {0};
+	struct qdf_mac_addr link_addrs[WLAN_MAX_ML_BSS_LINKS] = {0};
 
 	/* This API is only called with is ml adapter set for STA mode adapter.
 	 * For SAP mode, hdd_hostapd_set_mac_address() is the entry point for
@@ -380,7 +395,7 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	}
 
 	status = hdd_derive_link_address_from_mld(&mac_addr, &link_addrs[0],
-						  WLAN_MAX_MLD);
+						  WLAN_MAX_ML_BSS_LINKS);
 
 	if (QDF_IS_STATUS_ERROR(status))
 		return qdf_status_to_os_return(status);
@@ -415,8 +430,13 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 		ucfg_dp_update_inf_mac(hdd_ctx->psoc, &link_adapter->mac_addr,
 				       &link_addrs[i]);
 		qdf_copy_macaddr(&link_adapter->mac_addr, &link_addrs[i]);
+		qdf_copy_macaddr(&adapter->link_info[i].link_addr,
+				 &link_addrs[i]);
 	}
 
+	qdf_copy_macaddr(&adapter->link_info[i].link_addr, &link_addrs[i]);
+	hdd_adapter_update_mlo_mgr_mac_addr(adapter);
+
 	return ret;
 }
 #endif