Эх сурвалжийг харах

Merge f608c16908896a240e24b1aa412521dc8464f254 on remote branch

Change-Id: I86a911ca7563df7b48ffa2c7223f543ca1ffe055
Linux Build Service Account 7 сар өмнө
parent
commit
1351c18d6f
54 өөрчлөгдсөн 1200 нэмэгдсэн , 500 устгасан
  1. 7 0
      Android.mk
  2. 1 1
      components/action_oui/dispatcher/inc/wlan_action_oui_public_struct.h
  3. 7 2
      components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c
  4. 2 2
      components/cmn_services/policy_mgr/src/wlan_policy_mgr_ll_sap.c
  5. 2 2
      components/coex/dispatcher/src/wlan_coex_ucfg_api.c
  6. 17 4
      components/denylist_mgr/core/src/wlan_dlm_core.c
  7. 27 0
      components/target_if/connection_mgr/src/target_if_cm_roam_offload.c
  8. 2 0
      components/tdls/core/src/wlan_tdls_mgmt.c
  9. 10 6
      components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c
  10. 16 0
      components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h
  11. 8 11
      components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload_event.c
  12. 19 3
      components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h
  13. 13 0
      components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h
  14. 18 0
      components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h
  15. 13 1
      components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h
  16. 139 17
      components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c
  17. 1 2
      components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c
  18. 32 1
      components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c
  19. 11 26
      components/wmi/src/wmi_unified_roam_tlv.c
  20. 28 0
      configs/parrot_consolidate_qca6750_defconfig
  21. 331 0
      configs/parrot_gki_qca6750_defconfig
  22. 5 2
      core/hdd/inc/wlan_hdd_main.h
  23. 23 0
      core/hdd/inc/wlan_hdd_mlo.h
  24. 1 0
      core/hdd/src/wlan_hdd_assoc.c
  25. 18 1
      core/hdd/src/wlan_hdd_cm_api.h
  26. 23 0
      core/hdd/src/wlan_hdd_cm_connect.c
  27. 3 3
      core/hdd/src/wlan_hdd_fips.h
  28. 9 10
      core/hdd/src/wlan_hdd_main.c
  29. 20 3
      core/hdd/src/wlan_hdd_mlo.c
  30. 184 46
      core/hdd/src/wlan_hdd_stats.c
  31. 3 3
      core/mac/inc/qwlan_version.h
  32. 3 3
      core/mac/inc/sir_api.h
  33. 7 8
      core/mac/src/pe/include/lim_api.h
  34. 16 25
      core/mac/src/pe/lim/lim_api.c
  35. 3 3
      core/mac/src/pe/lim/lim_assoc_utils.c
  36. 3 1
      core/mac/src/pe/lim/lim_process_beacon_frame.c
  37. 4 10
      core/mac/src/pe/lim/lim_process_message_queue.c
  38. 1 54
      core/mac/src/pe/lim/lim_process_mlm_req_messages.c
  39. 5 5
      core/mac/src/pe/lim/lim_process_probe_rsp_frame.c
  40. 3 5
      core/mac/src/pe/lim/lim_process_sme_req_messages.c
  41. 1 1
      core/mac/src/pe/lim/lim_process_tdls.c
  42. 5 25
      core/mac/src/pe/lim/lim_send_management_frames.c
  43. 2 2
      core/mac/src/pe/lim/lim_utils.c
  44. 3 3
      core/mac/src/pe/lim/lim_utils.h
  45. 70 137
      core/mac/src/pe/rrm/rrm_api.c
  46. 13 9
      core/mac/src/sys/legacy/src/utils/src/parser_api.c
  47. 0 5
      core/sme/src/csr/csr_api_roam.c
  48. 7 22
      core/wma/src/wma_data.c
  49. 4 0
      core/wma/src/wma_dev_if.c
  50. 45 29
      core/wma/src/wma_scan_roam.c
  51. 3 1
      core/wma/src/wma_utils.c
  52. 3 3
      uapi/linux/dbglog_common.h
  53. 3 3
      uapi/linux/pktlog_ac_fmt.h
  54. 3 0
      wlan_qcacld3_modules.bzl

+ 7 - 0
Android.mk

@@ -35,6 +35,13 @@ LOCAL_MODULE_DDK_BUILD := true
 LOCAL_MODULE_DDK_ALLOW_UNSAFE_HEADERS := true
 LOCAL_MODULE_DDK_ALLOW_UNSAFE_HEADERS := true
 endif
 endif
 
 
+ifeq ($(TARGET_BOARD_PLATFORM),parrot)
+ifeq ($(TARGET_BOARD_SUFFIX),66)
+LOCAL_MODULE_DDK_BUILD := true
+LOCAL_MODULE_DDK_ALLOW_UNSAFE_HEADERS := true
+endif
+endif
+
 LOCAL_PATH := $(call my-dir)
 LOCAL_PATH := $(call my-dir)
 $(call wlog,LOCAL_PATH=$(LOCAL_PATH))
 $(call wlog,LOCAL_PATH=$(LOCAL_PATH))
 BOARD_OPENSOURCE_DIR ?= vendor/qcom/opensource
 BOARD_OPENSOURCE_DIR ?= vendor/qcom/opensource

+ 1 - 1
components/action_oui/dispatcher/inc/wlan_action_oui_public_struct.h

@@ -231,7 +231,7 @@ struct action_oui_request {
 	enum action_oui_id action_id;
 	enum action_oui_id action_id;
 	uint32_t no_oui_extensions;
 	uint32_t no_oui_extensions;
 	uint32_t total_no_oui_extensions;
 	uint32_t total_no_oui_extensions;
-	struct action_oui_extension extension[0];
+	struct action_oui_extension extension[];
 };
 };
 
 
 /**
 /**

+ 7 - 2
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -6718,6 +6718,7 @@ policy_mgr_link_switch_notifier_cb(struct wlan_objmgr_vdev *vdev,
 			info[MAX_NUMBER_OF_CONC_CONNECTIONS] = { {0} };
 			info[MAX_NUMBER_OF_CONC_CONNECTIONS] = { {0} };
 	uint8_t num_del = 0;
 	uint8_t num_del = 0;
 	struct ml_nlink_change_event data;
 	struct ml_nlink_change_event data;
+	uint16_t dyn_inact_bmap = 0, force_inact_bmap = 0;
 
 
 	if (notify_reason > MLO_LINK_SWITCH_NOTIFY_REASON_PRE_START_POST_SER)
 	if (notify_reason > MLO_LINK_SWITCH_NOTIFY_REASON_PRE_START_POST_SER)
 		return QDF_STATUS_SUCCESS;
 		return QDF_STATUS_SUCCESS;
@@ -6749,7 +6750,11 @@ policy_mgr_link_switch_notifier_cb(struct wlan_objmgr_vdev *vdev,
 		psoc, vdev_id, info, &num_del);
 		psoc, vdev_id, info, &num_del);
 	conc_ext_flags.value =
 	conc_ext_flags.value =
 	policy_mgr_get_conc_ext_flags(vdev, true);
 	policy_mgr_get_conc_ext_flags(vdev, true);
-	if (!policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE,
+	ml_nlink_get_dynamic_inactive_links(psoc, vdev, &dyn_inact_bmap,
+					    &force_inact_bmap);
+
+	if (!(dyn_inact_bmap & BIT(new_ieee_link_id)) &&
+	    !policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE,
 					       new_primary_freq,
 					       new_primary_freq,
 					       HW_MODE_20_MHZ,
 					       HW_MODE_20_MHZ,
 					       conc_ext_flags.value,
 					       conc_ext_flags.value,
@@ -7789,7 +7794,7 @@ policy_mgr_is_ml_links_in_mcc_allowed(struct wlan_objmgr_psoc *psoc,
 	if (*num_ml_sta < 2 || *num_ml_sta > MAX_NUMBER_OF_CONC_CONNECTIONS ||
 	if (*num_ml_sta < 2 || *num_ml_sta > MAX_NUMBER_OF_CONC_CONNECTIONS ||
 	    num_disabled_ml_sta) {
 	    num_disabled_ml_sta) {
 		policy_mgr_debug("num_ml_sta invalid %d or link already disabled%d",
 		policy_mgr_debug("num_ml_sta invalid %d or link already disabled%d",
-				 num_ml_sta, num_disabled_ml_sta);
+				 *num_ml_sta, num_disabled_ml_sta);
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
 	}
 	}
 
 

+ 2 - 2
components/cmn_services/policy_mgr/src/wlan_policy_mgr_ll_sap.c

@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * purpose with or without fee is hereby granted, provided that the above
@@ -80,7 +80,7 @@ policy_mgr_check_scc:
 	policy_mgr_check_scc_channel(psoc, new_sap_freq, sap_ch_freq, vdev_id,
 	policy_mgr_check_scc_channel(psoc, new_sap_freq, sap_ch_freq, vdev_id,
 				     cc_switch_mode);
 				     cc_switch_mode);
 	policy_mgr_debug("vdev_id %d old_freq %d new_freq %d", vdev_id,
 	policy_mgr_debug("vdev_id %d old_freq %d new_freq %d", vdev_id,
-			 sap_ch_freq, new_sap_freq);
+			 sap_ch_freq, *new_sap_freq);
 }
 }
 
 
 uint8_t wlan_policy_mgr_get_ll_lt_sap_vdev_id(struct wlan_objmgr_psoc *psoc)
 uint8_t wlan_policy_mgr_get_ll_lt_sap_vdev_id(struct wlan_objmgr_psoc *psoc)

+ 2 - 2
components/coex/dispatcher/src/wlan_coex_ucfg_api.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * purpose with or without fee is hereby granted, provided that the above
@@ -157,7 +157,7 @@ ucfg_coex_send_logging_config(struct wlan_objmgr_psoc *psoc,
 	param.config_arg5 = apps_args[5];
 	param.config_arg5 = apps_args[5];
 	param.config_arg6 = apps_args[6];
 	param.config_arg6 = apps_args[6];
 
 
-	coex_debug("send logging_config arg: %d for vdev %d", apps_args,
+	coex_debug("send logging_config arg: %u for vdev %d", *apps_args,
 		   param.vdev_id);
 		   param.vdev_id);
 
 
 	status = wlan_coex_config_send(vdev, &param);
 	status = wlan_coex_config_send(vdev, &param);

+ 17 - 4
components/denylist_mgr/core/src/wlan_dlm_core.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -27,6 +27,7 @@
 #include <wlan_scan_utils_api.h>
 #include <wlan_scan_utils_api.h>
 #include "wlan_dlm_tgt_api.h"
 #include "wlan_dlm_tgt_api.h"
 #include <wlan_cm_bss_score_param.h>
 #include <wlan_cm_bss_score_param.h>
+#include <wlan_dlm_public_struct.h>
 
 
 #define SECONDS_TO_MS(params)       ((params) * 1000)
 #define SECONDS_TO_MS(params)       ((params) * 1000)
 #define MINUTES_TO_MS(params)       (SECONDS_TO_MS(params) * 60)
 #define MINUTES_TO_MS(params)       (SECONDS_TO_MS(params) * 60)
@@ -197,8 +198,15 @@ dlm_prune_old_entries_and_get_action(struct dlm_reject_ap *dlm_entry,
 			  dlm_entry->reject_ap_type);
 			  dlm_entry->reject_ap_type);
 
 
 		if (DLM_IS_AP_DENYLISTED_BY_USERSPACE(dlm_entry) ||
 		if (DLM_IS_AP_DENYLISTED_BY_USERSPACE(dlm_entry) ||
-		    DLM_IS_AP_IN_RSSI_REJECT_LIST(dlm_entry))
-			return CM_DLM_FORCE_REMOVE;
+		    DLM_IS_AP_IN_RSSI_REJECT_LIST(dlm_entry)) {
+			if (dlm_entry->reject_ap_reason == REASON_UNKNOWN ||
+			    dlm_entry->reject_ap_reason == REASON_NUD_FAILURE ||
+			    dlm_entry->reject_ap_reason == REASON_STA_KICKOUT ||
+			    dlm_entry->reject_ap_reason == REASON_ROAM_HO_FAILURE)
+				return CM_DLM_REMOVE;
+			else
+				return CM_DLM_FORCE_REMOVE;
+		}
 
 
 		return CM_DLM_REMOVE;
 		return CM_DLM_REMOVE;
 	}
 	}
@@ -1388,6 +1396,11 @@ dlm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
 				   &next_node);
 				   &next_node);
 		dlm_entry = qdf_container_of(cur_node, struct dlm_reject_ap,
 		dlm_entry = qdf_container_of(cur_node, struct dlm_reject_ap,
 					     node);
 					     node);
+		if (!dlm_entry && next_node) {
+			cur_node = next_node;
+			next_node = NULL;
+			continue;
+		}
 
 
 		if (!qdf_mem_cmp(dlm_entry->bssid.bytes, bssid.bytes,
 		if (!qdf_mem_cmp(dlm_entry->bssid.bytes, bssid.bytes,
 				 QDF_MAC_ADDR_SIZE)) {
 				 QDF_MAC_ADDR_SIZE)) {
@@ -1402,7 +1415,7 @@ dlm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
 	}
 	}
 
 
 	/* This means that the BSSID was not added in the reject list of DLM */
 	/* This means that the BSSID was not added in the reject list of DLM */
-	if (!entry_found) {
+	if (!entry_found || !dlm_entry) {
 		qdf_mutex_release(&dlm_ctx->reject_ap_list_lock);
 		qdf_mutex_release(&dlm_ctx->reject_ap_list_lock);
 		return;
 		return;
 	}
 	}

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

@@ -2194,6 +2194,32 @@ end:
 	return status;
 	return status;
 }
 }
 
 
+/**
+ * target_if_cm_roam_update_freqs() - Send roam frequencies to fw
+ * @vdev: vdev object
+ * @req: roam channels to update to firmware
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+target_if_cm_roam_update_freqs(struct wlan_objmgr_vdev *vdev,
+			       struct wlan_roam_scan_channel_list *req)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	wmi_unified_t wmi_handle;
+
+	wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
+	if (!wmi_handle)
+		return QDF_STATUS_E_FAILURE;
+
+	status = target_if_cm_roam_offload_chan_list(wmi_handle, req);
+	if (QDF_IS_STATUS_ERROR(status))
+		target_if_err("vdev:%d Send channel list command failed",
+			      req->vdev_id);
+
+	return status;
+}
+
 /**
 /**
  * target_if_cm_roam_abort() - Send roam abort to wmi
  * target_if_cm_roam_abort() - Send roam abort to wmi
  * @vdev: vdev object
  * @vdev: vdev object
@@ -2305,6 +2331,7 @@ target_if_cm_roam_register_rso_req_ops(struct wlan_cm_roam_tx_ops *tx_ops)
 	tx_ops->send_roam_triggers = target_if_cm_roam_triggers;
 	tx_ops->send_roam_triggers = target_if_cm_roam_triggers;
 	tx_ops->send_roam_disable_config =
 	tx_ops->send_roam_disable_config =
 					target_if_cm_roam_send_disable_config;
 					target_if_cm_roam_send_disable_config;
+	tx_ops->send_roam_frequencies = target_if_cm_roam_update_freqs;
 	target_if_cm_roam_register_mlo_req_ops(tx_ops);
 	target_if_cm_roam_register_mlo_req_ops(tx_ops);
 }
 }
 
 

+ 2 - 0
components/tdls/core/src/wlan_tdls_mgmt.c

@@ -561,6 +561,8 @@ static QDF_STATUS tdls_process_rx_mgmt(
 				tdls_vdev =
 				tdls_vdev =
 				     wlan_objmgr_vdev_get_comp_private_obj(vdev,
 				     wlan_objmgr_vdev_get_comp_private_obj(vdev,
 							   WLAN_UMAC_COMP_TDLS);
 							   WLAN_UMAC_COMP_TDLS);
+				if (!tdls_vdev)
+					return QDF_STATUS_E_EXISTS;
 				rx_mgmt = tdls_vdev->rx_mgmt;
 				rx_mgmt = tdls_vdev->rx_mgmt;
 				tdls_vdev_select = true;
 				tdls_vdev_select = true;
 				tdls_debug("choice vdev %d as tdls vdev",
 				tdls_debug("choice vdev %d as tdls vdev",

+ 10 - 6
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -857,6 +857,8 @@ QDF_STATUS cm_roam_update_vendor_handoff_config(struct wlan_objmgr_psoc *psoc,
 		case VENDOR_CONTROL_PARAM_ROAM_TRIGGER:
 		case VENDOR_CONTROL_PARAM_ROAM_TRIGGER:
 			cfg_params->neighbor_lookup_threshold =
 			cfg_params->neighbor_lookup_threshold =
 							abs(param_value);
 							abs(param_value);
+			cfg_params->next_rssi_threshold =
+					cfg_params->neighbor_lookup_threshold;
 			break;
 			break;
 		case VENDOR_CONTROL_PARAM_ROAM_DELTA:
 		case VENDOR_CONTROL_PARAM_ROAM_DELTA:
 			cfg_params->roam_rssi_diff = param_value;
 			cfg_params->roam_rssi_diff = param_value;
@@ -2275,12 +2277,11 @@ static void cm_update_rso_freq_list_from_partner_link(
 }
 }
 #endif
 #endif
 
 
-static void
-cm_fill_rso_channel_list(struct wlan_objmgr_psoc *psoc,
-			 struct wlan_objmgr_vdev *vdev,
-			 struct rso_config *rso_cfg,
-			 struct wlan_roam_scan_channel_list *chan_info,
-			 uint8_t reason)
+void cm_fill_rso_channel_list(struct wlan_objmgr_psoc *psoc,
+			      struct wlan_objmgr_vdev *vdev,
+			      struct rso_config *rso_cfg,
+			      struct wlan_roam_scan_channel_list *chan_info,
+			      uint8_t reason)
 {
 {
 	QDF_STATUS status;
 	QDF_STATUS status;
 	uint8_t ch_cache_str[128] = {0};
 	uint8_t ch_cache_str[128] = {0};
@@ -5312,6 +5313,7 @@ QDF_STATUS cm_neighbor_roam_update_config(struct wlan_objmgr_pdev *pdev,
 	case REASON_LOOKUP_THRESH_CHANGED:
 	case REASON_LOOKUP_THRESH_CHANGED:
 		old_value = cfg_params->neighbor_lookup_threshold;
 		old_value = cfg_params->neighbor_lookup_threshold;
 		cfg_params->neighbor_lookup_threshold = value;
 		cfg_params->neighbor_lookup_threshold = value;
+		cfg_params->next_rssi_threshold = value;
 		break;
 		break;
 	case REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED:
 	case REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED:
 		old_value = cfg_params->opportunistic_threshold_diff;
 		old_value = cfg_params->opportunistic_threshold_diff;
@@ -5377,6 +5379,8 @@ cm_restore_default_roaming_params(struct wlan_mlme_psoc_ext_obj *mlme_obj,
 			mlme_obj->cfg.lfr.neighbor_scan_timer_period;
 			mlme_obj->cfg.lfr.neighbor_scan_timer_period;
 	cfg_params->neighbor_lookup_threshold =
 	cfg_params->neighbor_lookup_threshold =
 			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
 			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
+	cfg_params->next_rssi_threshold =
+			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
 	cfg_params->roam_rssi_diff =
 	cfg_params->roam_rssi_diff =
 			mlme_obj->cfg.lfr.roam_rssi_diff;
 			mlme_obj->cfg.lfr.roam_rssi_diff;
 	cfg_params->roam_rssi_diff_6ghz =
 	cfg_params->roam_rssi_diff_6ghz =

+ 16 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h

@@ -757,4 +757,20 @@ cm_roam_btm_block_event(uint8_t vdev_id, uint8_t token,
  * Return: True if connected AP is MBO capable without PMF
  * Return: True if connected AP is MBO capable without PMF
  */
  */
 bool cm_is_mbo_ap_without_pmf(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id);
 bool cm_is_mbo_ap_without_pmf(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id);
+
+/**
+ * cm_fill_rso_channel_list() - Fill roam frequencies in chan_info
+ * @psoc: PSOC pointer
+ * @vdev: vdev pointer
+ * @rso_cfg: roam config
+ * @chan_info: roam scan channel list
+ * @reason: Channel update reason
+ *
+ * Return: None
+ */
+void cm_fill_rso_channel_list(struct wlan_objmgr_psoc *psoc,
+			      struct wlan_objmgr_vdev *vdev,
+			      struct rso_config *rso_cfg,
+			      struct wlan_roam_scan_channel_list *chan_info,
+			      uint8_t reason);
 #endif /* _WLAN_CM_ROAM_OFFLOAD_H_ */
 #endif /* _WLAN_CM_ROAM_OFFLOAD_H_ */

+ 8 - 11
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload_event.c

@@ -564,15 +564,14 @@ QDF_STATUS cm_roam_sync_event_handler_cb(struct wlan_objmgr_vdev *vdev,
 	    !is_multi_link_roam(sync_ind)) {
 	    !is_multi_link_roam(sync_ind)) {
 		mlme_err("vdev:%d Ignoring RSI as its already in progress on roamed vdev:%d",
 		mlme_err("vdev:%d Ignoring RSI as its already in progress on roamed vdev:%d",
 			 vdev_id, sync_ind->roamed_vdev_id);
 			 vdev_id, sync_ind->roamed_vdev_id);
-		status = QDF_STATUS_E_FAILURE;
-		goto err;
+		return QDF_STATUS_E_FAILURE;
 	}
 	}
 
 
 	status = cm_fw_roam_sync_start_ind(vdev, sync_ind);
 	status = cm_fw_roam_sync_start_ind(vdev, sync_ind);
 	if (QDF_IS_STATUS_ERROR(status)) {
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("LFR3: vdev:%d CSR Roam synch cb failed", vdev_id);
 		mlme_err("LFR3: vdev:%d CSR Roam synch cb failed", vdev_id);
 		wlan_cm_free_roam_synch_frame_ind(rso_cfg);
 		wlan_cm_free_roam_synch_frame_ind(rso_cfg);
-		goto err;
+		return status;
 	}
 	}
 
 
 	/* 24 byte MAC header and 12 byte to ssid IE */
 	/* 24 byte MAC header and 12 byte to ssid IE */
@@ -585,8 +584,7 @@ QDF_STATUS cm_roam_sync_event_handler_cb(struct wlan_objmgr_vdev *vdev,
 		} else {
 		} else {
 			mlme_err("LFR3: MLO: vdev:%d Invalid link Beacon Length",
 			mlme_err("LFR3: MLO: vdev:%d Invalid link Beacon Length",
 				 vdev_id);
 				 vdev_id);
-			status = QDF_STATUS_E_FAILURE;
-			goto err;
+			return QDF_STATUS_E_FAILURE;
 		}
 		}
 	} else if (sync_ind->beacon_probe_resp_length >
 	} else if (sync_ind->beacon_probe_resp_length >
 			(QDF_IEEE80211_3ADDR_HDR_LEN + MAC_B_PR_SSID_OFFSET)) {
 			(QDF_IEEE80211_3ADDR_HDR_LEN + MAC_B_PR_SSID_OFFSET)) {
@@ -613,18 +611,18 @@ QDF_STATUS cm_roam_sync_event_handler_cb(struct wlan_objmgr_vdev *vdev,
 	} else {
 	} else {
 		mlme_err("LFR3: vdev:%d Invalid Beacon Length:%d", vdev_id,
 		mlme_err("LFR3: vdev:%d Invalid Beacon Length:%d", vdev_id,
 			 sync_ind->beacon_probe_resp_length);
 			 sync_ind->beacon_probe_resp_length);
-		status = QDF_STATUS_E_FAILURE;
-		goto err;
+		return QDF_STATUS_E_FAILURE;
 	}
 	}
 
 
 	if (QDF_IS_STATUS_ERROR(cm_roam_pe_sync_callback(sync_ind, vdev_id,
 	if (QDF_IS_STATUS_ERROR(cm_roam_pe_sync_callback(sync_ind, vdev_id,
 							 ie_len))) {
 							 ie_len))) {
 		mlme_err("LFR3: vdev:%d PE roam synch cb failed", vdev_id);
 		mlme_err("LFR3: vdev:%d PE roam synch cb failed", vdev_id);
-		status = QDF_STATUS_E_BUSY;
-		goto err;
+		return QDF_STATUS_E_BUSY;
 	}
 	}
 
 
-	cm_roam_update_vdev(vdev, sync_ind);
+	status = cm_roam_update_vdev(vdev, sync_ind);
+	if (QDF_IS_STATUS_ERROR(status))
+		return status;
 
 
 	/*
 	/*
 	 * update phy_mode in wma to avoid mismatch in phymode between host and
 	 * update phy_mode in wma to avoid mismatch in phymode between host and
@@ -640,6 +638,5 @@ QDF_STATUS cm_roam_sync_event_handler_cb(struct wlan_objmgr_vdev *vdev,
 					     vdev_id,
 					     vdev_id,
 					     sync_ind);
 					     sync_ind);
 
 
-err:
 	return status;
 	return status;
 }
 }

+ 19 - 3
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h

@@ -1343,6 +1343,22 @@ QDF_STATUS
 wlan_cm_roam_stats_info_get(struct wlan_objmgr_vdev *vdev,
 wlan_cm_roam_stats_info_get(struct wlan_objmgr_vdev *vdev,
 			    struct enhance_roam_info **roam_info,
 			    struct enhance_roam_info **roam_info,
 			    uint32_t  *roam_num);
 			    uint32_t  *roam_num);
+
+/**
+ * wlan_cm_roam_info_get() - get vdev roam info
+ *
+ * @vdev: pointer to vdev
+ * @roam_info: pointer to buffer to copy roam stats info
+ * @idx: index of roam stats cache buffer
+ *
+ * Return: QDF_STATUS
+ */
+
+QDF_STATUS
+wlan_cm_roam_info_get(struct wlan_objmgr_vdev *vdev,
+		      struct enhance_roam_info **roam_info,
+		      uint8_t idx);
+
 #else
 #else
 static inline
 static inline
 void mlme_cm_alloc_roam_stats_info(struct vdev_mlme_obj *vdev_mlme)
 void mlme_cm_alloc_roam_stats_info(struct vdev_mlme_obj *vdev_mlme)
@@ -1973,10 +1989,10 @@ cm_roam_vendor_handoff_event_handler(struct wlan_objmgr_psoc *psoc,
  * respect to the self sta and the peer after roaming and completes
  * respect to the self sta and the peer after roaming and completes
  * the roam synch propagation with respect to WMA layer.
  * the roam synch propagation with respect to WMA layer.
  *
  *
- * Return: None
+ * Return: QDF_STATUS
  */
  */
-void cm_roam_update_vdev(struct wlan_objmgr_vdev *vdev,
-			 struct roam_offload_synch_ind *sync_ind);
+QDF_STATUS cm_roam_update_vdev(struct wlan_objmgr_vdev *vdev,
+			       struct roam_offload_synch_ind *sync_ind);
 
 
 /**
 /**
  * cm_roam_pe_sync_callback() - Callback registered at pe, gets invoked when
  * cm_roam_pe_sync_callback() - Callback registered at pe, gets invoked when

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

@@ -293,6 +293,7 @@ struct rso_chan_info {
  * @neighbor_scan_min_period:
  * @neighbor_scan_min_period:
  * @specific_chan_info:
  * @specific_chan_info:
  * @neighbor_lookup_threshold:
  * @neighbor_lookup_threshold:
+ * @next_rssi_threshold: Next roam can trigger rssi threshold
  * @rssi_thresh_offset_5g:
  * @rssi_thresh_offset_5g:
  * @min_chan_scan_time:
  * @min_chan_scan_time:
  * @max_chan_scan_time:
  * @max_chan_scan_time:
@@ -323,6 +324,7 @@ struct rso_cfg_params {
 	uint32_t neighbor_scan_min_period;
 	uint32_t neighbor_scan_min_period;
 	struct rso_chan_info specific_chan_info;
 	struct rso_chan_info specific_chan_info;
 	uint8_t neighbor_lookup_threshold;
 	uint8_t neighbor_lookup_threshold;
+	uint8_t next_rssi_threshold;
 	int8_t rssi_thresh_offset_5g;
 	int8_t rssi_thresh_offset_5g;
 	uint32_t min_chan_scan_time;
 	uint32_t min_chan_scan_time;
 	uint32_t max_chan_scan_time;
 	uint32_t max_chan_scan_time;
@@ -756,6 +758,7 @@ struct rso_config_params {
  * @ROAM_SPECIFIC_CHAN: specific channel list
  * @ROAM_SPECIFIC_CHAN: specific channel list
  * @ROAM_RSSI_DIFF: rssi diff
  * @ROAM_RSSI_DIFF: rssi diff
  * @NEIGHBOUR_LOOKUP_THRESHOLD: lookup threshold
  * @NEIGHBOUR_LOOKUP_THRESHOLD: lookup threshold
+ * @NEXT_RSSI_THRESHOLD: Next roam can trigger rssi threshold
  * @SCAN_N_PROBE: scan n probe
  * @SCAN_N_PROBE: scan n probe
  * @SCAN_HOME_AWAY: scan and away
  * @SCAN_HOME_AWAY: scan and away
  * @NEIGHBOUR_SCAN_REFRESH_PERIOD: scan refresh
  * @NEIGHBOUR_SCAN_REFRESH_PERIOD: scan refresh
@@ -788,6 +791,7 @@ enum roam_cfg_param {
 	ROAM_SPECIFIC_CHAN,
 	ROAM_SPECIFIC_CHAN,
 	ROAM_RSSI_DIFF,
 	ROAM_RSSI_DIFF,
 	NEIGHBOUR_LOOKUP_THRESHOLD,
 	NEIGHBOUR_LOOKUP_THRESHOLD,
+	NEXT_RSSI_THRESHOLD,
 	SCAN_N_PROBE,
 	SCAN_N_PROBE,
 	SCAN_HOME_AWAY,
 	SCAN_HOME_AWAY,
 	NEIGHBOUR_SCAN_REFRESH_PERIOD,
 	NEIGHBOUR_SCAN_REFRESH_PERIOD,
@@ -1069,6 +1073,7 @@ enum roam_scan_dwell_type {
 /**
 /**
  * enum eroam_frame_subtype - Enhanced roam frame subtypes.
  * enum eroam_frame_subtype - Enhanced roam frame subtypes.
  *
  *
+ * @WLAN_ROAM_STATS_FRAME_SUBTYPE_INVALID: Invalid subtype
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_AUTH_RESP: Authentication resp frame
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_AUTH_RESP: Authentication resp frame
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_REASSOC_RESP: Reassociation resp frame
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_REASSOC_RESP: Reassociation resp frame
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_EAPOL_M1: EAPOL-Key M1 frame
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_EAPOL_M1: EAPOL-Key M1 frame
@@ -1081,6 +1086,7 @@ enum roam_scan_dwell_type {
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_REASSOC_REQ: Reassociation req frame
  * @WLAN_ROAM_STATS_FRAME_SUBTYPE_REASSOC_REQ: Reassociation req frame
  */
  */
 enum eroam_frame_subtype {
 enum eroam_frame_subtype {
+	WLAN_ROAM_STATS_FRAME_SUBTYPE_INVALID = 0,
 	WLAN_ROAM_STATS_FRAME_SUBTYPE_AUTH_RESP = 1,
 	WLAN_ROAM_STATS_FRAME_SUBTYPE_AUTH_RESP = 1,
 	WLAN_ROAM_STATS_FRAME_SUBTYPE_REASSOC_RESP = 2,
 	WLAN_ROAM_STATS_FRAME_SUBTYPE_REASSOC_RESP = 2,
 	WLAN_ROAM_STATS_FRAME_SUBTYPE_EAPOL_M1 = 3,
 	WLAN_ROAM_STATS_FRAME_SUBTYPE_EAPOL_M1 = 3,
@@ -2553,6 +2559,8 @@ struct roam_frame_stats {
  * @vdev_id: vdev id
  * @vdev_id: vdev id
  * @num_tlv: Number of roam scans triggered
  * @num_tlv: Number of roam scans triggered
  * @num_roam_msg_info: Number of roam_msg_info present in event
  * @num_roam_msg_info: Number of roam_msg_info present in event
+ * @enhance_roam_rt_event:  flag of whether we need send event for
+ *  real time enhance roam stats info to user space
  * @trigger: Roam trigger related details
  * @trigger: Roam trigger related details
  * @scan: Roam scan event details
  * @scan: Roam scan event details
  * @result: Roam result related info
  * @result: Roam result related info
@@ -2567,6 +2575,7 @@ struct roam_stats_event {
 	uint8_t vdev_id;
 	uint8_t vdev_id;
 	uint8_t num_tlv;
 	uint8_t num_tlv;
 	uint8_t num_roam_msg_info;
 	uint8_t num_roam_msg_info;
+	bool enhance_roam_rt_event;
 	struct wmi_roam_trigger_info trigger[MAX_ROAM_SCAN_STATS_TLV];
 	struct wmi_roam_trigger_info trigger[MAX_ROAM_SCAN_STATS_TLV];
 	struct wmi_roam_scan_data scan[MAX_ROAM_SCAN_STATS_TLV];
 	struct wmi_roam_scan_data scan[MAX_ROAM_SCAN_STATS_TLV];
 	struct wmi_roam_result result[MAX_ROAM_SCAN_STATS_TLV];
 	struct wmi_roam_result result[MAX_ROAM_SCAN_STATS_TLV];
@@ -2635,6 +2644,7 @@ struct roam_pmkid_req_event {
  * @send_roam_mlo_config: send MLO config to FW
  * @send_roam_mlo_config: send MLO config to FW
  * @send_roam_scan_offload_rssi_params: Set the RSSI parameters for roam
  * @send_roam_scan_offload_rssi_params: Set the RSSI parameters for roam
  * offload scan
  * offload scan
+ * @send_roam_frequencies: send roam frequencies to FW
  */
  */
 struct wlan_cm_roam_tx_ops {
 struct wlan_cm_roam_tx_ops {
 	QDF_STATUS (*send_vdev_set_pcl_cmd)(struct wlan_objmgr_vdev *vdev,
 	QDF_STATUS (*send_vdev_set_pcl_cmd)(struct wlan_objmgr_vdev *vdev,
@@ -2693,6 +2703,9 @@ struct wlan_cm_roam_tx_ops {
 	QDF_STATUS (*send_roam_mlo_config)(struct wlan_objmgr_vdev *vdev,
 	QDF_STATUS (*send_roam_mlo_config)(struct wlan_objmgr_vdev *vdev,
 					   struct wlan_roam_mlo_config *req);
 					   struct wlan_roam_mlo_config *req);
 #endif
 #endif
+	QDF_STATUS (*send_roam_frequencies)(
+			struct wlan_objmgr_vdev *vdev,
+			struct wlan_roam_scan_channel_list *rso_ch_info);
 };
 };
 
 
 /**
 /**

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

@@ -777,6 +777,24 @@ ucfg_cm_roam_stats_info_put(struct enhance_roam_info *roam_info)
 {
 {
 	qdf_mem_free(roam_info);
 	qdf_mem_free(roam_info);
 }
 }
+
+/**
+ * ucfg_cm_roam_info_get() - get vdev roam info
+ *
+ * @vdev: pointer to vdev
+ * @roam_info: pointer to buffer to copy roam stats info
+ * @idx: index of roam stats cache buffer
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+ucfg_cm_roam_info_get(struct wlan_objmgr_vdev *vdev,
+		      struct enhance_roam_info **roam_info,
+		      uint8_t idx)
+{
+	return wlan_cm_roam_info_get(vdev, roam_info, idx);
+}
+
 #else
 #else
 static inline QDF_STATUS
 static inline QDF_STATUS
 ucfg_cm_roam_stats_info_get(struct wlan_objmgr_vdev *vdev,
 ucfg_cm_roam_stats_info_get(struct wlan_objmgr_vdev *vdev,

+ 13 - 1
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * purpose with or without fee is hereby granted, provided that the above
@@ -255,6 +255,18 @@ QDF_STATUS wlan_cm_tgt_send_roam_stop_req(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS wlan_cm_tgt_send_roam_update_req(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS wlan_cm_tgt_send_roam_update_req(struct wlan_objmgr_psoc *psoc,
 					   uint8_t vdev_id,
 					   uint8_t vdev_id,
 					   struct wlan_roam_update_config *req);
 					   struct wlan_roam_update_config *req);
+/**
+ * wlan_cm_tgt_send_roam_freqs()  - Send roam frequencies to firmware
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @req: roam frequency list to be sent to fw
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_cm_tgt_send_roam_freqs(struct wlan_objmgr_psoc *psoc,
+			    uint8_t vdev_id,
+			    struct wlan_roam_scan_channel_list *req);
 
 
 /**
 /**
  * wlan_cm_tgt_send_roam_abort_req()  - Send roam abort command to firmware
  * wlan_cm_tgt_send_roam_abort_req()  - Send roam abort command to firmware

+ 139 - 17
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -829,6 +829,9 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 		dst_config->uint_value = src_cfg->neighbor_lookup_threshold;
 		dst_config->uint_value = src_cfg->neighbor_lookup_threshold;
 		break;
 		break;
+	case NEXT_RSSI_THRESHOLD:
+		dst_config->uint_value = src_cfg->next_rssi_threshold;
+		break;
 	case SCAN_N_PROBE:
 	case SCAN_N_PROBE:
 		dst_config->uint_value = src_cfg->roam_scan_n_probes;
 		dst_config->uint_value = src_cfg->roam_scan_n_probes;
 		break;
 		break;
@@ -1285,6 +1288,7 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	struct rso_config *rso_cfg;
 	struct rso_config *rso_cfg;
 	struct rso_cfg_params *dst_cfg;
 	struct rso_cfg_params *dst_cfg;
 	struct wlan_mlme_psoc_ext_obj *mlme_obj;
 	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+	struct wlan_roam_scan_channel_list chan_info = {0};
 
 
 	mlme_obj = mlme_get_psoc_ext_obj(psoc);
 	mlme_obj = mlme_get_psoc_ext_obj(psoc);
 	if (!mlme_obj)
 	if (!mlme_obj)
@@ -1378,9 +1382,30 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 					src_config->chan_info.num_chan, true);
 					src_config->chan_info.num_chan, true);
 		if (QDF_IS_STATUS_ERROR(status))
 		if (QDF_IS_STATUS_ERROR(status))
 			break;
 			break;
-		if (mlme_obj->cfg.lfr.roam_scan_offload_enabled)
-			cm_roam_update_cfg(psoc, vdev_id,
-					   REASON_CHANNEL_LIST_CHANGED);
+		if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled)
+			break;
+
+		chan_info.vdev_id = vdev_id;
+		chan_info.chan_count = dst_cfg->pref_chan_info.num_chan;
+		qdf_mem_copy(chan_info.chan_freq_list,
+			     dst_cfg->pref_chan_info.freq_list,
+			     chan_info.chan_count * sizeof(uint32_t));
+		chan_info.chan_cache_type = CHANNEL_LIST_DYNAMIC;
+
+		status = cm_roam_acquire_lock(vdev);
+		if (QDF_IS_STATUS_ERROR(status))
+			break;
+		if (!MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
+			mlme_debug("PREF_CHAN received while ROAM RSO not started");
+			cm_roam_release_lock(vdev);
+			status = QDF_STATUS_E_INVAL;
+			break;
+		}
+		cm_fill_rso_channel_list(psoc, vdev, rso_cfg,
+					 &chan_info,
+					 REASON_CHANNEL_LIST_CHANGED);
+		wlan_cm_tgt_send_roam_freqs(psoc, vdev_id, &chan_info);
+		cm_roam_release_lock(vdev);
 		break;
 		break;
 	case ROAM_SPECIFIC_CHAN:
 	case ROAM_SPECIFIC_CHAN:
 		status = cm_update_roam_scan_channel_list(psoc, vdev, rso_cfg,
 		status = cm_update_roam_scan_channel_list(psoc, vdev, rso_cfg,
@@ -1390,9 +1415,30 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 					false);
 					false);
 		if (QDF_IS_STATUS_ERROR(status))
 		if (QDF_IS_STATUS_ERROR(status))
 			break;
 			break;
-		if (mlme_obj->cfg.lfr.roam_scan_offload_enabled)
-			cm_roam_update_cfg(psoc, vdev_id,
-					   REASON_CHANNEL_LIST_CHANGED);
+		if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled)
+			break;
+
+		chan_info.vdev_id = vdev_id;
+		chan_info.chan_count = dst_cfg->specific_chan_info.num_chan;
+		qdf_mem_copy(chan_info.chan_freq_list,
+			     dst_cfg->specific_chan_info.freq_list,
+			     chan_info.chan_count * sizeof(uint32_t));
+		chan_info.chan_cache_type = CHANNEL_LIST_DYNAMIC;
+
+		status = cm_roam_acquire_lock(vdev);
+		if (QDF_IS_STATUS_ERROR(status))
+			break;
+		if (!MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
+			mlme_debug("SPECIFIC_CHAN received while ROAM RSO not started");
+			cm_roam_release_lock(vdev);
+			status = QDF_STATUS_E_INVAL;
+			break;
+		}
+		cm_fill_rso_channel_list(psoc, vdev, rso_cfg,
+					 &chan_info,
+					 REASON_CHANNEL_LIST_CHANGED);
+		wlan_cm_tgt_send_roam_freqs(psoc, vdev_id, &chan_info);
+		cm_roam_release_lock(vdev);
 		break;
 		break;
 	case ROAM_RSSI_DIFF:
 	case ROAM_RSSI_DIFF:
 		dst_cfg->roam_rssi_diff = src_config->uint_value;
 		dst_cfg->roam_rssi_diff = src_config->uint_value;
@@ -1405,6 +1451,9 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 		break;
 		break;
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 		dst_cfg->neighbor_lookup_threshold = src_config->uint_value;
 		dst_cfg->neighbor_lookup_threshold = src_config->uint_value;
+		fallthrough;
+	case NEXT_RSSI_THRESHOLD:
+		dst_cfg->next_rssi_threshold = src_config->uint_value;
 		break;
 		break;
 	case SCAN_N_PROBE:
 	case SCAN_N_PROBE:
 		dst_cfg->roam_scan_n_probes = src_config->uint_value;
 		dst_cfg->roam_scan_n_probes = src_config->uint_value;
@@ -1566,6 +1615,8 @@ QDF_STATUS wlan_cm_rso_config_init(struct wlan_objmgr_vdev *vdev,
 		mlme_obj->cfg.lfr.neighbor_scan_min_chan_time;
 		mlme_obj->cfg.lfr.neighbor_scan_min_chan_time;
 	cfg_params->neighbor_lookup_threshold =
 	cfg_params->neighbor_lookup_threshold =
 		mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
 		mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
+	cfg_params->next_rssi_threshold =
+		mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
 	cfg_params->rssi_thresh_offset_5g =
 	cfg_params->rssi_thresh_offset_5g =
 		mlme_obj->cfg.lfr.rssi_threshold_offset_5g;
 		mlme_obj->cfg.lfr.rssi_threshold_offset_5g;
 	cfg_params->opportunistic_threshold_diff =
 	cfg_params->opportunistic_threshold_diff =
@@ -3131,7 +3182,36 @@ cm_roam_stats_print_roam_initial_info(struct roam_initial_data *data,
 }
 }
 
 
 /**
 /**
- * cm_roam_stats_print_roam_msg_info - Roaming related message details
+ * cm_roam_update_next_rssi_threshold()  - Update neighbor_lookup_threshold
+ * @psoc: Pointer to psoc object
+ * @next_rssi_threshold: value of next rssi threshold coming from FW
+ * @vdev_id: vdev id
+ *
+ * Host updates the configured RSSI threshold from INI
+ * "gNeighborLookupThreshold RoamRSSI_Trigger" over the
+ * GETROAMTRIGGER command. But this RSSI threshold is reduced by
+ * firmware in steps for reasons like candidate not found during
+ * roam scan. So, the expectation is to print the next RSSI
+ * threshold at which the roam scan will be triggered. This value
+ * is received from firmware via the WMI_ROAM_SCAN_STATS_EVENTID.
+ *
+ * Return: None
+ */
+static void
+cm_roam_update_next_rssi_threshold(struct wlan_objmgr_psoc *psoc,
+				   uint32_t next_rssi_threshold,
+				   uint8_t vdev_id)
+{
+	struct cm_roam_values_copy src_config = {};
+
+	src_config.uint_value = next_rssi_threshold;
+	wlan_cm_roam_cfg_set_value(psoc, vdev_id, NEXT_RSSI_THRESHOLD,
+				   &src_config);
+}
+
+/**
+ * cm_roam_stats_process_roam_msg_info - Roaming related message details
+ * @psoc: Pointer to psoc object
  * @data:    Pointer to the btm rsp data
  * @data:    Pointer to the btm rsp data
  * @vdev_id: vdev id
  * @vdev_id: vdev id
  *
  *
@@ -3139,8 +3219,9 @@ cm_roam_stats_print_roam_initial_info(struct roam_initial_data *data,
  *
  *
  * Return: None
  * Return: None
  */
  */
-static void cm_roam_stats_print_roam_msg_info(struct roam_msg_info *data,
-					      uint8_t vdev_id)
+static void cm_roam_stats_process_roam_msg_info(struct wlan_objmgr_psoc *psoc,
+						struct roam_msg_info *data,
+						uint8_t vdev_id)
 {
 {
 	char time[TIME_STRING_LEN];
 	char time[TIME_STRING_LEN];
 	static const char msg_id1_str[] = "Roam RSSI TH Reset";
 	static const char msg_id1_str[] = "Roam RSSI TH Reset";
@@ -3150,6 +3231,8 @@ static void cm_roam_stats_print_roam_msg_info(struct roam_msg_info *data,
 		mlme_nofl_info("%s [ROAM MSG INFO]: VDEV[%d] %s, Current rssi: %d dbm, next_rssi_threshold: %d dbm",
 		mlme_nofl_info("%s [ROAM MSG INFO]: VDEV[%d] %s, Current rssi: %d dbm, next_rssi_threshold: %d dbm",
 			       time, vdev_id, msg_id1_str, data->msg_param1,
 			       time, vdev_id, msg_id1_str, data->msg_param1,
 			       data->msg_param2);
 			       data->msg_param2);
+		cm_roam_update_next_rssi_threshold(psoc, data->msg_param2,
+						   vdev_id);
 	}
 	}
 }
 }
 
 
@@ -3688,9 +3771,9 @@ log_btm_frames_only:
 	if (stats_info->roam_msg_info && stats_info->roam_msg_info[i].present &&
 	if (stats_info->roam_msg_info && stats_info->roam_msg_info[i].present &&
 	    i < stats_info->num_roam_msg_info) {
 	    i < stats_info->num_roam_msg_info) {
 		*rem_tlv_len = *rem_tlv_len + 1;
 		*rem_tlv_len = *rem_tlv_len + 1;
-		cm_roam_stats_print_roam_msg_info(
-						  &stats_info->roam_msg_info[i],
-						  stats_info->vdev_id);
+		cm_roam_stats_process_roam_msg_info(psoc,
+						&stats_info->roam_msg_info[i],
+						stats_info->vdev_id);
 	}
 	}
 
 
 	cm_report_roam_rt_stats(psoc, stats_info->vdev_id,
 	cm_report_roam_rt_stats(psoc, stats_info->vdev_id,
@@ -4185,7 +4268,7 @@ wlan_cm_update_roam_frame_info(struct mlme_legacy_priv *mlme_priv,
 	for (i = 0; i < frame_data->num_frame; i++) {
 	for (i = 0; i < frame_data->num_frame; i++) {
 		if (!wlan_cm_get_valid_frame_type(&frame_data->frame_info[i]))
 		if (!wlan_cm_get_valid_frame_type(&frame_data->frame_info[i]))
 			continue;
 			continue;
-		j++;
+
 		if (j >= WLAN_ROAM_MAX_FRAME_INFO)
 		if (j >= WLAN_ROAM_MAX_FRAME_INFO)
 			break;
 			break;
 		/*
 		/*
@@ -4210,6 +4293,7 @@ wlan_cm_update_roam_frame_info(struct mlme_legacy_priv *mlme_priv,
 			   info->timestamp[j].timestamp,
 			   info->timestamp[j].timestamp,
 			   info->timestamp[j].status,
 			   info->timestamp[j].status,
 			   QDF_MAC_ADDR_REF(info->timestamp[j].bssid.bytes));
 			   QDF_MAC_ADDR_REF(info->timestamp[j].bssid.bytes));
+		j++;
 	}
 	}
 }
 }
 
 
@@ -4337,6 +4421,10 @@ wlan_cm_update_roam_stats_info(struct wlan_objmgr_psoc *psoc,
 			wlan_cm_update_roam_bssid(mlme_priv,
 			wlan_cm_update_roam_bssid(mlme_priv,
 						  &stats_info->scan[index]);
 						  &stats_info->scan[index]);
 
 
+		stats_info->enhance_roam_rt_event = true;
+		mlme_cm_osif_roam_rt_stats(stats_info,
+					   mlme_priv->roam_write_index);
+
 		mlme_priv->roam_write_index += 1;
 		mlme_priv->roam_write_index += 1;
 		if (mlme_priv->roam_write_index == mlme_priv->roam_cache_num)
 		if (mlme_priv->roam_write_index == mlme_priv->roam_cache_num)
 			mlme_priv->roam_write_index = 0;
 			mlme_priv->roam_write_index = 0;
@@ -4423,6 +4511,28 @@ wlan_cm_roam_stats_info_get(struct wlan_objmgr_vdev *vdev,
 
 
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }
+
+QDF_STATUS
+wlan_cm_roam_info_get(struct wlan_objmgr_vdev *vdev,
+		      struct enhance_roam_info **roam_info,
+		      uint8_t idx)
+{
+	struct mlme_legacy_priv *mlme_priv;
+
+	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
+	if (!mlme_priv) {
+		mlme_err("vdev legacy private object is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (mlme_priv->roam_cache_num == 0) {
+		mlme_debug("Enhanced roam stats not supported");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+	*roam_info = &mlme_priv->roam_info[idx];
+	return QDF_STATUS_SUCCESS;
+}
+
 #else
 #else
 static void
 static void
 wlan_cm_update_roam_stats_info(struct wlan_objmgr_psoc *psoc,
 wlan_cm_update_roam_stats_info(struct wlan_objmgr_psoc *psoc,
@@ -4573,6 +4683,8 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 	bool is_wtc = false;
 	bool is_wtc = false;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev;
+	uint32_t trigger;
+	struct wmi_roam_scan_data *scan = NULL;
 
 
 	if (!stats_info)
 	if (!stats_info)
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
@@ -4613,8 +4725,18 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 					stats_info->vdev_id,
 					stats_info->vdev_id,
 					stats_info->trigger[i].trigger_reason,
 					stats_info->trigger[i].trigger_reason,
 					stats_info->trigger[i].timestamp);
 					stats_info->trigger[i].timestamp);
+
 				cm_cp_stats_cstats_roam_scan_done
 				cm_cp_stats_cstats_roam_scan_done
 				     (vdev, &stats_info->scan[i], is_full_scan);
 				     (vdev, &stats_info->scan[i], is_full_scan);
+
+				trigger = stats_info->trigger[i].trigger_reason;
+				scan = &stats_info->scan[i];
+				if (trigger == ROAM_TRIGGER_REASON_LOW_RSSI ||
+				    trigger == ROAM_TRIGGER_REASON_PERIODIC) {
+					cm_roam_update_next_rssi_threshold(
+						psoc, scan->next_rssi_threshold,
+						stats_info->vdev_id);
+				}
 			}
 			}
 		}
 		}
 
 
@@ -4662,9 +4784,9 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 		    i < stats_info->num_roam_msg_info &&
 		    i < stats_info->num_roam_msg_info &&
 		    stats_info->roam_msg_info[i].present) {
 		    stats_info->roam_msg_info[i].present) {
 			rem_tlv++;
 			rem_tlv++;
-			cm_roam_stats_print_roam_msg_info(
-						  &stats_info->roam_msg_info[i],
-						  stats_info->vdev_id);
+			cm_roam_stats_process_roam_msg_info(psoc,
+						&stats_info->roam_msg_info[i],
+						stats_info->vdev_id);
 		}
 		}
 
 
 		cm_report_roam_rt_stats(psoc, stats_info->vdev_id,
 		cm_report_roam_rt_stats(psoc, stats_info->vdev_id,
@@ -4730,7 +4852,7 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 	    stats_info->num_roam_msg_info - rem_tlv) {
 	    stats_info->num_roam_msg_info - rem_tlv) {
 		for (i = 0; i < (stats_info->num_roam_msg_info-rem_tlv); i++) {
 		for (i = 0; i < (stats_info->num_roam_msg_info-rem_tlv); i++) {
 			if (stats_info->roam_msg_info[rem_tlv + i].present)
 			if (stats_info->roam_msg_info[rem_tlv + i].present)
-				cm_roam_stats_print_roam_msg_info(
+				cm_roam_stats_process_roam_msg_info(psoc,
 					&stats_info->roam_msg_info[rem_tlv + i],
 					&stats_info->roam_msg_info[rem_tlv + i],
 					stats_info->vdev_id);
 					stats_info->vdev_id);
 		}
 		}

+ 1 - 2
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c

@@ -571,8 +571,7 @@ ucfg_cm_get_neighbor_lookup_rssi_threshold(struct wlan_objmgr_psoc *psoc,
 {
 {
 	struct cm_roam_values_copy temp;
 	struct cm_roam_values_copy temp;
 
 
-	wlan_cm_roam_cfg_get_value(psoc, vdev_id,
-				   NEIGHBOUR_LOOKUP_THRESHOLD, &temp);
+	wlan_cm_roam_cfg_get_value(psoc, vdev_id, NEXT_RSSI_THRESHOLD, &temp);
 	*lookup_threshold = temp.uint_value;
 	*lookup_threshold = temp.uint_value;
 
 
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;

+ 32 - 1
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * purpose with or without fee is hereby granted, provided that the above
@@ -553,6 +553,37 @@ QDF_STATUS wlan_cm_tgt_send_roam_update_req(struct wlan_objmgr_psoc *psoc,
 	return status;
 	return status;
 }
 }
 
 
+QDF_STATUS
+wlan_cm_tgt_send_roam_freqs(struct wlan_objmgr_psoc *psoc,
+			    uint8_t vdev_id,
+			    struct wlan_roam_scan_channel_list *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, 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_frequencies) {
+		mlme_err("CM_RSO: vdev %d send_roam_frequencies is NULL",
+			 vdev_id);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	status = roam_tx_ops->send_roam_frequencies(vdev, req);
+	if (QDF_IS_STATUS_ERROR(status))
+		mlme_err("CM_RSO: vdev %d fail to send roam freqs", vdev_id);
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+
+	return status;
+}
+
 QDF_STATUS wlan_cm_tgt_send_roam_abort_req(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS wlan_cm_tgt_send_roam_abort_req(struct wlan_objmgr_psoc *psoc,
 					   uint8_t vdev_id)
 					   uint8_t vdev_id)
 {
 {

+ 11 - 26
components/wmi/src/wmi_unified_roam_tlv.c

@@ -2353,6 +2353,7 @@ wmi_fill_roam_sync_buffer(wmi_unified_t wmi_handle,
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	uint8_t kck_len;
 	uint8_t kck_len;
 	uint8_t kek_len;
 	uint8_t kek_len;
+	struct roam_scan_candidate_frame roam_candidate = {0};
 
 
 	synch_event = param_buf->fixed_param;
 	synch_event = param_buf->fixed_param;
 	roam_sync_ind->roamed_vdev_id = synch_event->vdev_id;
 	roam_sync_ind->roamed_vdev_id = synch_event->vdev_id;
@@ -2403,6 +2404,16 @@ wmi_fill_roam_sync_buffer(wmi_unified_t wmi_handle,
 		wmi_fill_data_synch_frame_event(rso_cfg, roam_sync_ind);
 		wmi_fill_data_synch_frame_event(rso_cfg, roam_sync_ind);
 	} else {
 	} else {
 		wmi_fill_data_synch_event(roam_sync_ind, param_buf);
 		wmi_fill_data_synch_event(roam_sync_ind, param_buf);
+
+		roam_candidate.vdev_id = roam_sync_ind->roamed_vdev_id;
+		roam_candidate.frame_length =
+				roam_sync_ind->beacon_probe_resp_length;
+		roam_candidate.frame = (uint8_t *)roam_sync_ind +
+				       roam_sync_ind->beacon_probe_resp_offset;
+		roam_candidate.rssi = roam_sync_ind->rssi;
+		roam_candidate.roam_offload_candidate_frm = false;
+		wlan_cm_add_all_link_probe_rsp_to_scan_db(wlan_vdev_get_psoc(vdev),
+							  &roam_candidate);
 	}
 	}
 	chan = param_buf->chan;
 	chan = param_buf->chan;
 	if (chan) {
 	if (chan) {
@@ -2648,34 +2659,8 @@ extract_roam_sync_event_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 		reassoc_req_len = synch_event->reassoc_req_len;
 		reassoc_req_len = synch_event->reassoc_req_len;
 		reassoc_rsp_len = synch_event->reassoc_rsp_len;
 		reassoc_rsp_len = synch_event->reassoc_rsp_len;
 
 
-		if (synch_event->bcn_probe_rsp_len > WMI_SVC_MSG_MAX_SIZE) {
-			status = QDF_STATUS_E_FAILURE;
-			goto abort_roam;
-		}
-		if (synch_event->reassoc_rsp_len >
-			(WMI_SVC_MSG_MAX_SIZE - synch_event->bcn_probe_rsp_len)) {
-			status = QDF_STATUS_E_FAILURE;
-			goto abort_roam;
-		}
-		if (synch_event->reassoc_req_len >
-			WMI_SVC_MSG_MAX_SIZE - (synch_event->bcn_probe_rsp_len +
-			synch_event->reassoc_rsp_len)) {
-			status = QDF_STATUS_E_FAILURE;
-			goto abort_roam;
-		}
 		roam_synch_data_len = bcn_probe_rsp_len +
 		roam_synch_data_len = bcn_probe_rsp_len +
 			reassoc_rsp_len + reassoc_req_len;
 			reassoc_rsp_len + reassoc_req_len;
-
-		/*
-		 * Below is the check for the entire size of the message
-		 * received from the firmware.
-		 */
-		if (roam_synch_data_len > WMI_SVC_MSG_MAX_SIZE -
-			(sizeof(*synch_event) + sizeof(wmi_channel) +
-			 sizeof(wmi_key_material) + sizeof(uint32_t))) {
-			status = QDF_STATUS_E_FAILURE;
-			goto abort_roam;
-		}
 		roam_synch_data_len += sizeof(struct roam_offload_synch_ind);
 		roam_synch_data_len += sizeof(struct roam_offload_synch_ind);
 	}
 	}
 
 

+ 28 - 0
configs/parrot_consolidate_qca6750_defconfig

@@ -0,0 +1,28 @@
+CONFIG_ALLOW_PKT_DROPPING=y
+CONFIG_ATH_DIAG_EXT_DIRECT=y
+CONFIG_DESC_TIMESTAMP_DEBUG_INFO=y
+CONFIG_DP_RX_REFILL_CPU_PERF_AFFINE_MASK=y
+CONFIG_DP_TX_HW_DESC_HISTORY=y
+CONFIG_DSC_DEBUG=y
+CONFIG_DSC_TEST=y
+CONFIG_ENABLE_QDF_PTR_HASH_DEBUG=y
+CONFIG_FEATURE_HIF_LATENCY_PROFILE_ENABLE=y
+CONFIG_FEATURE_UNIT_TEST_SUSPEND=y
+CONFIG_HAL_DEBUG=y
+CONFIG_HIF_CE_DEBUG_DATA_BUF=y
+CONFIG_HIF_CPU_PERF_AFFINE_MASK=y
+CONFIG_LEAK_DETECTION=y
+CONFIG_MAX_LOGS_PER_SEC=500
+CONFIG_ENABLE_MAX_LOGS_PER_SEC=y
+CONFIG_QDF_NBUF_HISTORY_SIZE=16384
+CONFIG_SCHED_HISTORY_SIZE=256
+CONFIG_REGISTER_OP_DEBUG=y
+CONFIG_REO_QDESC_HISTORY=y
+CONFIG_RX_DESC_DEBUG_CHECK=y
+CONFIG_TALLOC_DEBUG=y
+CONFIG_UNIT_TEST=y
+CONFIG_WLAN_FEATURE_DP_RX_RING_HISTORY=y
+CONFIG_WLAN_FEATURE_DP_TX_DESC_HISTORY=y
+CONFIG_WLAN_RECORD_RX_PADDR=y
+CONFIG_QDF_TEST=y
+CONFIG_FEATURE_WLM_STATS=y

+ 331 - 0
configs/parrot_gki_qca6750_defconfig

@@ -0,0 +1,331 @@
+CONFIG_QCA_CLD_WLAN=y
+CONFIG_160MHZ_SUPPORT=y
+CONFIG_6G_SCAN_CHAN_SORT_ALGO=y
+CONFIG_ADAPTIVE_11R=y
+CONFIG_ANI_LEVEL_REQUEST=y
+CONFIG_AR900B=y
+CONFIG_ATH_11AC_TXCOMPACT=y
+CONFIG_ATH_BUS_PM=y
+CONFIG_ATH_PERF_PWR_OFFLOAD=y
+CONFIG_BAND_6GHZ=y
+CONFIG_BCN_RATECODE_ENABLE=y
+CONFIG_BUS_AUTO_SUSPEND=y
+CONFIG_CHECKSUM_OFFLOAD=y
+CONFIG_CNSS2_MODULE=y
+CONFIG_CNSS_GENL_MODULE=y
+CONFIG_CNSS_UTILS_MODULE=y
+CONFIG_CONNECTIVITY_PKTLOG=y
+CONFIG_CONVERGED_P2P_ENABLE=y
+CONFIG_CP_STATS=y
+CONFIG_DDP_MON_RSSI_IN_DBM=y
+CONFIG_DEBUG_RX_RING_BUFFER=y
+CONFIG_DELIVERY_TO_STACK_STATUS_CHECK=y
+CONFIG_DESC_DUP_DETECT_DEBUG=y
+CONFIG_DIRECT_BUF_RX_ENABLE=y
+CONFIG_DISABLE_CHANNEL_LIST=y
+CONFIG_WLAN_BCN_RECV_FEATURE=y
+CONFIG_DISABLE_EAPOL_INTRABSS_FWD=y
+CONFIG_DP_HW_TX_DELAY_STATS_ENABLE=y
+CONFIG_DP_INTR_POLL_BASED=y
+CONFIG_DP_LEGACY_MODE_CSM_DEFAULT_DISABLE=1
+CONFIG_DP_LFR=y
+CONFIG_DP_MEM_PRE_ALLOC=y
+CONFIG_DP_PKT_ADD_TIMESTAMP=y
+CONFIG_DP_RX_BUFFER_POOL_ALLOC_THRES=5
+CONFIG_DP_RX_BUFFER_POOL_SIZE=128
+CONFIG_DP_RX_DROP_RAW_FRM=y
+CONFIG_DP_RX_PKT_NO_PEER_DELIVER=y
+CONFIG_DP_RX_REFILL_BUFF_POOL_SIZE=2048
+CONFIG_DP_RX_REFILL_THRD_THRESHOLD=512
+CONFIG_DP_RX_SPECIAL_FRAME_NEED=y
+CONFIG_DP_SWLM=y
+CONFIG_DP_TRACE=y
+CONFIG_DP_TRAFFIC_END_INDICATION=y
+CONFIG_DP_TXRX_SOC_ATTACH=y
+CONFIG_DP_TX_TRACKING=y
+CONFIG_DP_WAR_VALIDATE_RX_ERR_MSDU_COOKIE=y
+CONFIG_DUP_RX_DESC_WAR=y
+CONFIG_DYNAMIC_RX_AGGREGATION=y
+CONFIG_ENABLE_CE4_COMP_DISABLE_HTT_HTC_MISC_LIST=y
+CONFIG_ENABLE_HAL_REG_WR_HISTORY=y
+CONFIG_ENABLE_HAL_SOC_STATS=y
+CONFIG_ENABLE_MTRACE_LOG=y
+CONFIG_FEATURE_ACTIVE_TOS=y
+CONFIG_FEATURE_ALIGN_STATS_FROM_DP=y
+CONFIG_FEATURE_AST=y
+CONFIG_FEATURE_BECN_STATS=y
+CONFIG_FEATURE_BSS_TRANSITION=y
+CONFIG_FEATURE_CLUB_LL_STATS_AND_GET_STATION=y
+CONFIG_FEATURE_CONCURRENCY_MATRIX=y
+CONFIG_FEATURE_DELAYED_PEER_OBJ_DESTROY=y
+CONFIG_FEATURE_DENYLIST_MGR=y
+CONFIG_FEATURE_EPPING=y
+CONFIG_FEATURE_FORCE_WAKE=y
+CONFIG_FEATURE_FW_LOG_PARSING=y
+CONFIG_FEATURE_GPIO_CFG=y
+CONFIG_FEATURE_HAL_DELAYED_REG_WRITE=y
+CONFIG_FEATURE_HTC_CREDIT_HISTORY=y
+CONFIG_FEATURE_INTEROP_ISSUES_AP=y
+CONFIG_FEATURE_MEMDUMP_ENABLE=y
+CONFIG_FEATURE_MONITOR_MODE_SUPPORT=y
+CONFIG_FEATURE_MSCS=y
+CONFIG_FEATURE_NO_DBS_INTRABAND_MCC_SUPPORT=y
+CONFIG_FEATURE_OEM_DATA=y
+CONFIG_FEATURE_OTA_TEST=y
+CONFIG_FEATURE_P2P_LISTEN_OFFLOAD=y
+CONFIG_FEATURE_PKTLOG=y
+CONFIG_FEATURE_RADAR_HISTORY=y
+CONFIG_FEATURE_ROAM_DEBUG=y
+CONFIG_FEATURE_RSSI_MONITOR=y
+CONFIG_FEATURE_RX_LINKSPEED_ROAM_TRIGGER=y
+CONFIG_FEATURE_SAP_COND_CHAN_SWITCH=y
+CONFIG_FEATURE_SAR_LIMITS=y
+CONFIG_FEATURE_SET=y
+CONFIG_FEATURE_STATION_INFO=y
+CONFIG_FEATURE_STATS_EXT=y
+CONFIG_FEATURE_STATS_EXT_V2=y
+CONFIG_FEATURE_TSO=y
+CONFIG_FEATURE_TSO_STATS=y
+CONFIG_FEATURE_TX_POWER=y
+CONFIG_FEATURE_VDEV_OPS_WAKELOCK=y
+CONFIG_FEATURE_WLAN_LPHB=y
+CONFIG_FEATURE_WLAN_PRE_CAC=y
+CONFIG_FEATURE_WLAN_RA_FILTERING=y
+CONFIG_FEATURE_WLAN_SCAN_PNO=y
+CONFIG_FEATURE_WLAN_WAPI=y
+CONFIG_FIX_TXDMA_LIMITATION=y
+CONFIG_FOURTH_CONNECTION=y
+CONFIG_FW_THERMAL_THROTTLE=y
+CONFIG_GTK_OFFLOAD=y
+CONFIG_HAL_DISABLE_NON_BA_2K_JUMP_ERROR=y
+CONFIG_HANDLE_BC_EAP_TX_FRM=y
+CONFIG_HANDLE_RX_REROUTE_ERR=y
+CONFIG_HASTINGS_BT_WAR=y
+CONFIG_HDD_INIT_WITH_RTNL_LOCK=y
+CONFIG_HIF_DEBUG=y
+CONFIG_HIF_IPCI=y
+CONFIG_HOST_OPCLASS=y
+CONFIG_HOST_WAKEUP_OVER_QMI=y
+CONFIG_HTT_PADDR64=y
+CONFIG_IPA_SET_RESET_TX_DB_PA=y
+CONFIG_LFR_SUBNET_DETECTION=y
+CONFIG_LINUX_QCMBR=y
+CONFIG_LITHIUM=y
+CONFIG_LITTLE_ENDIAN=y
+CONFIG_LL_DP_SUPPORT=y
+CONFIG_LTE_COEX=y
+CONFIG_MARK_ICMP_REQ_TO_FW=y
+CONFIG_MAX_ALLOC_PAGE_SIZE=y
+CONFIG_MCC_TO_SCC_SWITCH=y
+CONFIG_MON_ENABLE_DROP_FOR_MAC=y
+CONFIG_MORE_TX_DESC=y
+CONFIG_MULTI_CLIENT_LL_SUPPORT=y
+CONFIG_PANIC_ON_BUG=y
+CONFIG_PCI_LINK_STATUS_SANITY=y
+CONFIG_PEER_PROTECTED_ACCESS=y
+CONFIG_PKTLOG_HAS_SPECIFIC_DATA=y
+CONFIG_POWER_MANAGEMENT_OFFLOAD=y
+CONFIG_PTT_SOCK_SVC_ENABLE=y
+CONFIG_QCA6750_HEADERS_DEF=y
+CONFIG_QCACLD_FEATURE_APF=y
+CONFIG_QCACLD_FEATURE_FW_STATE=y
+CONFIG_QCACLD_FEATURE_GREEN_AP=y
+CONFIG_QCACLD_FEATURE_NAN=y
+CONFIG_QCACLD_RX_DESC_MULTI_PAGE_ALLOC=y
+CONFIG_QCACLD_WLAN_CONNECTIVITY_DIAG_EVENT=y
+CONFIG_QCACLD_WLAN_LFR3=y
+CONFIG_QCA_MONITOR_PKT_SUPPORT=y
+CONFIG_QCA_SUPPORT_TX_THROTTLE=y
+CONFIG_QCA_TARGET_IF_MLME=y
+CONFIG_QCA_WIFI_FTM=y
+CONFIG_QCA_WIFI_FTM_NL80211=y
+CONFIG_QCA_WIFI_QCA6750=y
+CONFIG_QCA_WIFI_QCA8074=y
+CONFIG_QCA_WIFI_QCA8074_VP=y
+CONFIG_QCOM_ESE=y
+CONFIG_QCOM_LTE_COEX=y
+CONFIG_QCOM_TDLS=y
+CONFIG_QCOM_VOWIFI_11R=y
+CONFIG_QMI_SUPPORT=y
+CONFIG_REG_CLIENT=y
+CONFIG_REMOVE_PKT_LOG=y
+CONFIG_REO_DESC_DEFER_FREE=y
+CONFIG_ROME_IF="ipci"
+CONFIG_PLD_IPCI_ICNSS_FLAG=y
+CONFIG_RXDMA_ERR_PKT_DROP=y
+CONFIG_RX_DEFRAG_DO_NOT_REINJECT=y
+CONFIG_RX_DESC_SANITY_WAR=y
+CONFIG_RX_FISA=y
+CONFIG_RX_HASH_DEBUG=y
+CONFIG_RX_OL=y
+CONFIG_SAE_SINGLE_PMK=y
+CONFIG_SAP_AVOID_ACS_FREQ_LIST=y
+CONFIG_SAP_DHCP_FW_IND=y
+CONFIG_SAR_SAFETY_FEATURE=y
+CONFIG_SCALE_INCLUDES=y
+CONFIG_SERIALIZE_QUEUE_SETUP=y
+CONFIG_SHADOW_V2=y
+CONFIG_SOFTAP_CHANNEL_RANGE=y
+CONFIG_SUPPORT_11AX=y
+CONFIG_SYSTEM_PM_CHECK=y
+CONFIG_TARGET_11D_SCAN=y
+CONFIG_TARGET_RAMDUMP_AFTER_KERNEL_PANIC=y
+CONFIG_THERMAL_STATS_SUPPORT=y
+CONFIG_TRACE_RECORD_FEATURE=y
+CONFIG_TSO_DEBUG_LOG_ENABLE=y
+CONFIG_TX_MULTIQ_PER_AC=y
+CONFIG_TX_MULTI_TCL=y
+CONFIG_TX_PER_PDEV_DESC_POOL=y
+CONFIG_TX_TID_OVERRIDE=y
+CONFIG_VERBOSE_DEBUG=y
+CONFIG_WAPI_BIG_ENDIAN=y
+CONFIG_WCNSS_MEM_PRE_ALLOC_MODULE=y
+CONFIG_WDI3_IPA_OVER_GSI=y
+CONFIG_WDI_EVENT_ENABLE=y
+CONFIG_WIFI_MONITOR_SUPPORT=y
+CONFIG_WIFI_POS_CONVERGED=y
+CONFIG_WLAN_BMISS=y
+CONFIG_WLAN_CE_INTERRUPT_THRESHOLD_CONFIG=y
+CONFIG_WLAN_CFR_ENABLE=y
+CONFIG_WLAN_CLD_DEV_PM_QOS=y
+CONFIG_WLAN_CLD_PM_QOS=y
+CONFIG_WLAN_CONV_SPECTRAL_ENABLE=y
+CONFIG_WLAN_CUSTOM_DSCP_UP_MAP=y
+CONFIG_WLAN_DEBUGFS=y
+CONFIG_WLAN_DEBUG_CRASH_INJECT=y
+CONFIG_WLAN_DEBUG_LINK_VOTE=y
+CONFIG_WLAN_DEBUG_VERSION=y
+CONFIG_WLAN_DFS_MASTER_ENABLE=y
+CONFIG_WLAN_DFS_STATIC_MEM_ALLOC=y
+CONFIG_WLAN_DIAG_VERSION=y
+CONFIG_WLAN_DL_MODES=y
+CONFIG_WLAN_DP_FEATURE_DEFERRED_REO_QDESC_DESTROY=y
+CONFIG_WLAN_DP_PENDING_MEM_FLUSH=y
+CONFIG_WLAN_DP_PER_RING_TYPE_CONFIG=y
+CONFIG_WLAN_DP_PROFILE_SUPPORT=y
+CONFIG_WLAN_DYNAMIC_CVM=y
+CONFIG_WLAN_ENABLE_SOCIAL_CHANNELS_5G_ONLY=y
+CONFIG_WLAN_ENH_CFR_ENABLE=y
+CONFIG_WLAN_FEATURE_11AX=y
+CONFIG_WLAN_FEATURE_ACTION_OUI=y
+CONFIG_WLAN_FEATURE_BIG_DATA_STATS=y
+CONFIG_WLAN_FEATURE_CAL_FAILURE_TRIGGER=y
+CONFIG_WLAN_FEATURE_CE_RX_BUFFER_REUSE=y
+CONFIG_WLAN_FEATURE_DFS_OFFLOAD=y
+CONFIG_WLAN_FEATURE_DISA=y
+CONFIG_WLAN_FEATURE_DP_BUS_BANDWIDTH=y
+CONFIG_WLAN_FEATURE_DP_EVENT_HISTORY=y
+CONFIG_WLAN_FEATURE_DP_RX_THREADS=y
+CONFIG_WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE=y
+CONFIG_WLAN_FEATURE_ELNA=y
+CONFIG_WLAN_FEATURE_FILS=y
+CONFIG_WLAN_FEATURE_FIPS=y
+CONFIG_WLAN_FEATURE_GET_USABLE_CHAN_LIST=y
+CONFIG_WLAN_FEATURE_ICMP_OFFLOAD=y
+CONFIG_WLAN_FEATURE_IGMP_OFFLOAD=y
+CONFIG_WLAN_FEATURE_LINK_LAYER_STATS=y
+CONFIG_WLAN_FEATURE_LPSS=y
+CONFIG_WLAN_FEATURE_LRO_CTX_IN_CB=y
+CONFIG_WLAN_FEATURE_MBSSID=y
+CONFIG_WLAN_FEATURE_MDNS_OFFLOAD=y
+CONFIG_WLAN_FEATURE_MEDIUM_ASSESS=y
+CONFIG_WLAN_FEATURE_MIB_STATS=y
+CONFIG_WLAN_FEATURE_P2P_DEBUG=y
+CONFIG_WLAN_FEATURE_P2P_P2P_STA=y
+CONFIG_WLAN_FEATURE_PACKET_FILTERING=y
+CONFIG_WLAN_FEATURE_PEER_TXQ_FLUSH_CONF=y
+CONFIG_WLAN_FEATURE_RX_BUFFER_POOL=y
+CONFIG_WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT=y
+CONFIG_WLAN_FEATURE_SAE=y
+CONFIG_WLAN_FEATURE_SAP_ACS_OPTIMIZE=y
+CONFIG_WLAN_FEATURE_SARV1_TO_SARV2=y
+CONFIG_WLAN_FEATURE_SR=y
+CONFIG_WLAN_FEATURE_TWT=y
+CONFIG_WLAN_FEATURE_WMI_DIAG_OVER_CE7=y
+CONFIG_WLAN_FREQ_LIST=y
+CONFIG_WLAN_FW_OFFLOAD=y
+CONFIG_WLAN_GTX_BW_MASK=y
+CONFIG_WLAN_HANG_EVENT=y
+CONFIG_WLAN_LOGGING_SOCK_SVC=y
+CONFIG_WLAN_LOG_DEBUG=y
+CONFIG_WLAN_LOG_ENTER=y
+CONFIG_WLAN_LOG_ERROR=y
+CONFIG_WLAN_LOG_EXIT=y
+CONFIG_WLAN_LOG_FATAL=y
+CONFIG_WLAN_LOG_INFO=y
+CONFIG_WLAN_LOG_WARN=y
+CONFIG_WLAN_MWS_INFO_DEBUGFS=y
+CONFIG_WLAN_NAPI=y
+CONFIG_WLAN_NS_OFFLOAD=y
+CONFIG_WLAN_NUD_TRACKING=y
+CONFIG_WLAN_OBJMGR_DEBUG=y
+CONFIG_WLAN_OBJMGR_REF_ID_TRACE=y
+CONFIG_WLAN_OFFLOAD_PACKETS=y
+CONFIG_WLAN_OPEN_P2P_INTERFACE=y
+CONFIG_WLAN_OPEN_SOURCE=y
+CONFIG_WLAN_PDEV_VDEV_SEND_MULTI_PARAM=y
+CONFIG_WLAN_PMO_ENABLE=y
+CONFIG_WLAN_POLICY_MGR_ENABLE=y
+CONFIG_WLAN_POWER_DEBUG=y
+CONFIG_WLAN_REASSOC=y
+CONFIG_WLAN_SCAN_DISABLE=y
+CONFIG_WLAN_SKIP_BAR_UPDATE=y
+CONFIG_WLAN_SPECTRAL_ENABLE=y
+CONFIG_WLAN_SUPPORT_DATA_STALL=y
+CONFIG_WLAN_SYNC_TSF=y
+CONFIG_WLAN_SYSFS=y
+CONFIG_WLAN_SYSFS_CHANNEL=y
+CONFIG_WLAN_SYSFS_CONNECT_INFO=y
+CONFIG_WLAN_SYSFS_DCM=y
+CONFIG_WLAN_SYSFS_DFSNOL=y
+CONFIG_WLAN_SYSFS_DP_TRACE=y
+CONFIG_WLAN_SYSFS_FW_MODE_CFG=y
+CONFIG_WLAN_SYSFS_HE_BSS_COLOR=y
+CONFIG_WLAN_SYSFS_LOG_BUFFER=y
+CONFIG_WLAN_SYSFS_MEM_STATS=y
+CONFIG_WLAN_SYSFS_MONITOR_MODE_CHANNEL=y
+CONFIG_WLAN_SYSFS_RADAR=y
+CONFIG_WLAN_SYSFS_RANGE_EXT=y
+CONFIG_WLAN_SYSFS_RF_TEST_MODE=y
+CONFIG_WLAN_SYSFS_ROAM_TRIGGER_BITMAP=y
+CONFIG_WLAN_SYSFS_RTS_CTS=y
+CONFIG_WLAN_SYSFS_SCAN_CFG=y
+CONFIG_WLAN_SYSFS_STATS=y
+CONFIG_WLAN_SYSFS_STA_INFO=y
+CONFIG_WLAN_SYSFS_TDLS_PEERS=y
+CONFIG_WLAN_SYSFS_TEMPERATURE=y
+CONFIG_WLAN_SYSFS_TX_STBC=y
+CONFIG_WLAN_SYSFS_WDS_MODE=y
+CONFIG_WLAN_SYSFS_WLAN_DBG=y
+CONFIG_WLAN_THERMAL_CFG=y
+CONFIG_WLAN_THERMAL_MULTI_CLIENT_SUPPORT=y
+CONFIG_WLAN_TRACEPOINTS=y
+CONFIG_WLAN_TRACE_HIDE_MAC_ADDRESS=y
+CONFIG_WLAN_TWT_CONVERGED=y
+CONFIG_WLAN_TXRX_FW_STATS=y
+CONFIG_WLAN_TXRX_FW_ST_RST=y
+CONFIG_WLAN_TXRX_STATS=y
+CONFIG_WLAN_TX_FLOW_CONTROL_V2=y
+CONFIG_WLAN_VENDOR_HANDOFF_CONTROL=y
+CONFIG_WLAN_WARN_ON_ASSERT=y
+CONFIG_WLAN_WBUFF=y
+CONFIG_WLAN_WOWL_ADD_PTRN=y
+CONFIG_WLAN_WOWL_DEL_PTRN=y
+CONFIG_WLAN_WOW_ITO=y
+CONFIG_WMI_BCN_OFFLOAD=y
+CONFIG_WMI_CMD_STRINGS=y
+CONFIG_WMI_CONCURRENCY_SUPPORT=y
+CONFIG_WMI_DBR_SUPPORT=y
+CONFIG_WMI_INTERFACE_EVENT_LOGGING=y
+CONFIG_WMI_ROAM_SUPPORT=y
+CONFIG_WMI_SEND_RECV_QMI=y
+CONFIG_WMI_STA_SUPPORT=y
+CONFIG_WLAN_CTRL_NAME="wlan"
+CONFIG_NUM_SOC_PERF_CLUSTER=2
+CONFIG_MULTI_IF_NAME="qca6750"
+CONFIG_CNSS_QCA6750=y
+CONFIG_BUILD_TAG=y
+CONFIG_DP_RX_DESC_COOKIE_INVALIDATE=y
+CONFIG_FEATURE_COEX=y
+CONFIG_WLAN_FEATURE_COEX_DBAM=y
+CONFIG_CFG80211_MLD_AP_STA_CONNECT_UPSTREAM_SUPPORT=y

+ 5 - 2
core/hdd/inc/wlan_hdd_main.h

@@ -2841,15 +2841,18 @@ wlan_hdd_get_link_info_from_objmgr(struct wlan_objmgr_vdev *vdev);
 /**
 /**
  * hdd_adapter_disable_all_links() - Reset the links on stop adapter.
  * hdd_adapter_disable_all_links() - Reset the links on stop adapter.
  * @adapter: HDD adapter
  * @adapter: HDD adapter
+ * @clear_macaddr: Clears mac address if set to true
  *
  *
  * Resets the MAC address in each link info and resets the link info
  * Resets the MAC address in each link info and resets the link info
  * mapping in adapter array.
  * mapping in adapter array.
  *
  *
  * Return: void
  * Return: void
  */
  */
-void hdd_adapter_disable_all_links(struct hdd_adapter *adapter);
+void
+hdd_adapter_disable_all_links(struct hdd_adapter *adapter, bool clear_macaddr);
 #else
 #else
-static inline void hdd_adapter_disable_all_links(struct hdd_adapter *adapter)
+static inline void
+hdd_adapter_disable_all_links(struct hdd_adapter *adapter, bool clear_macaddr)
 {
 {
 }
 }
 #endif
 #endif

+ 23 - 0
core/hdd/inc/wlan_hdd_mlo.h

@@ -355,6 +355,22 @@ QDF_STATUS hdd_derive_link_address_from_mld(struct wlan_objmgr_psoc *psoc,
 					    uint8_t max_idx);
 					    uint8_t max_idx);
 
 
 #ifdef WLAN_HDD_MULTI_VDEV_SINGLE_NDEV
 #ifdef WLAN_HDD_MULTI_VDEV_SINGLE_NDEV
+/**
+ * hdd_adapter_restore_link_vdev_map() - Change the VDEV to link info mapping
+ * in adapter.
+ * @adapter: HDD adapter pointer
+ * @same_vdev_mac_map: Maintain VDEV to MAC address mapping during the restore.
+ *
+ * This API restores the VDEV to HDD link info mapping to its initial order
+ * which could have got remapped in the process of link switch. If
+ * @same_vdev_mac_map is set to %true then the MAC address to VDEV mapping is
+ * preserved.
+ *
+ * Returns: %true if any mapping changes or %false otherwise.
+ */
+bool hdd_adapter_restore_link_vdev_map(struct hdd_adapter *adapter,
+				       bool same_vdev_mac_map);
+
 /**
 /**
  * hdd_mlo_mgr_register_osif_ops() - Register OSIF ops with global MLO manager
  * hdd_mlo_mgr_register_osif_ops() - Register OSIF ops with global MLO manager
  * for callback to notify.
  * for callback to notify.
@@ -376,6 +392,13 @@ QDF_STATUS hdd_mlo_mgr_register_osif_ops(void);
  */
  */
 QDF_STATUS hdd_mlo_mgr_unregister_osif_ops(void);
 QDF_STATUS hdd_mlo_mgr_unregister_osif_ops(void);
 #else
 #else
+static inline bool
+hdd_adapter_restore_link_vdev_map(struct hdd_adapter *adapter,
+				  bool same_vdev_mac_map)
+{
+	return false;
+}
+
 static inline QDF_STATUS hdd_mlo_mgr_register_osif_ops(void)
 static inline QDF_STATUS hdd_mlo_mgr_register_osif_ops(void)
 {
 {
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;

+ 1 - 0
core/hdd/src/wlan_hdd_assoc.c

@@ -2912,6 +2912,7 @@ void hdd_roam_profile_init(struct wlan_hdd_link_info *link_info)
 }
 }
 
 
 struct osif_cm_ops osif_ops = {
 struct osif_cm_ops osif_ops = {
+	.connect_active_notify_cb = hdd_cm_connect_active_notify,
 	.connect_complete_cb = hdd_cm_connect_complete,
 	.connect_complete_cb = hdd_cm_connect_complete,
 	.disconnect_complete_cb = hdd_cm_disconnect_complete,
 	.disconnect_complete_cb = hdd_cm_disconnect_complete,
 	.netif_queue_control_cb = hdd_cm_netif_queue_control,
 	.netif_queue_control_cb = hdd_cm_netif_queue_control,

+ 18 - 1
core/hdd/src/wlan_hdd_cm_api.h

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
  * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * purpose with or without fee is hereby granted, provided that the above
@@ -81,6 +81,23 @@ QDF_STATUS hdd_cm_netif_queue_control(struct wlan_objmgr_vdev *vdev,
 				      enum netif_action_type action,
 				      enum netif_action_type action,
 				      enum netif_reason_type reason);
 				      enum netif_reason_type reason);
 
 
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC)
+/**
+ * hdd_cm_connect_active_notify() - Callback to HDD on  connection request
+ * becomes active.
+ * @vdev_id: VDEV ID on which connection became active.
+ *
+ * The callback to make sure connection related fields are properly set
+ * from HDD.
+ *
+ * Returns: void
+ */
+void hdd_cm_connect_active_notify(uint8_t vdev_id);
+#else
+static inline void hdd_cm_connect_active_notify(uint8_t vdev_id)
+{
+}
+#endif
 QDF_STATUS hdd_cm_connect_complete(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS hdd_cm_connect_complete(struct wlan_objmgr_vdev *vdev,
 				   struct wlan_cm_connect_resp *rsp,
 				   struct wlan_cm_connect_resp *rsp,
 				   enum osif_cb_type type);
 				   enum osif_cb_type type);

+ 23 - 0
core/hdd/src/wlan_hdd_cm_connect.c

@@ -23,6 +23,7 @@
  */
  */
 
 
 #include "wlan_hdd_main.h"
 #include "wlan_hdd_main.h"
+#include <wlan_hdd_mlo.h>
 #include "wlan_hdd_cm_api.h"
 #include "wlan_hdd_cm_api.h"
 #include "wlan_hdd_trace.h"
 #include "wlan_hdd_trace.h"
 #include "wlan_hdd_object_manager.h"
 #include "wlan_hdd_object_manager.h"
@@ -1868,6 +1869,28 @@ static void hdd_cm_connect_success(struct wlan_objmgr_vdev *vdev,
 	}
 	}
 }
 }
 
 
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC)
+void hdd_cm_connect_active_notify(uint8_t vdev_id)
+{
+	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	struct wlan_hdd_link_info *link_info;
+
+	if (!hdd_ctx) {
+		hdd_err("HDD context is NULL");
+		return;
+	}
+
+	link_info = hdd_get_link_info_by_vdev(hdd_ctx, vdev_id);
+	if (!link_info) {
+		hdd_err("Link info not found for vdev %d", vdev_id);
+		return;
+	}
+
+	if (hdd_adapter_restore_link_vdev_map(link_info->adapter, true))
+		hdd_adapter_update_mlo_mgr_mac_addr(link_info->adapter);
+}
+#endif
+
 QDF_STATUS hdd_cm_connect_complete(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS hdd_cm_connect_complete(struct wlan_objmgr_vdev *vdev,
 				   struct wlan_cm_connect_resp *rsp,
 				   struct wlan_cm_connect_resp *rsp,
 				   enum osif_cb_type type)
 				   enum osif_cb_type type)

+ 3 - 3
core/hdd/src/wlan_hdd_fips.h

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2017 The Linux Foundation. All rights reserved.
  * Copyright (c) 2017 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -39,13 +39,13 @@ struct iw_fips_test_request {
 	uint32_t key_len;
 	uint32_t key_len;
 	uint8_t  key[FIPS_KEY_LEN];
 	uint8_t  key[FIPS_KEY_LEN];
 	uint32_t data_len;
 	uint32_t data_len;
-	uint8_t  data[0];
+	uint8_t data[];
 };
 };
 
 
 struct iw_fips_test_response {
 struct iw_fips_test_response {
 	uint32_t status;
 	uint32_t status;
 	uint32_t data_len;
 	uint32_t data_len;
-	uint8_t  data[0];
+	uint8_t data[];
 };
 };
 
 
 
 

+ 9 - 10
core/hdd/src/wlan_hdd_main.c

@@ -594,8 +594,7 @@ wlan_hdd_lpc_del_monitor_interface(struct hdd_context *hdd_ctx,
 void wlan_hdd_lpc_handle_concurrency(struct hdd_context *hdd_ctx,
 void wlan_hdd_lpc_handle_concurrency(struct hdd_context *hdd_ctx,
 				     bool is_virtual_iface)
 				     bool is_virtual_iface)
 {
 {
-	if (policy_mgr_is_sta_mon_concurrency(hdd_ctx->psoc))
-		wlan_hdd_lpc_del_monitor_interface(hdd_ctx, is_virtual_iface);
+	wlan_hdd_lpc_del_monitor_interface(hdd_ctx, is_virtual_iface);
 }
 }
 
 
 bool hdd_lpc_is_work_scheduled(struct hdd_context *hdd_ctx)
 bool hdd_lpc_is_work_scheduled(struct hdd_context *hdd_ctx)
@@ -8856,21 +8855,21 @@ wlan_hdd_set_ml_cap_for_sap_intf(struct hdd_adapter_create_param *create_params,
 
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC) && \
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC) && \
 	defined(WLAN_HDD_MULTI_VDEV_SINGLE_NDEV)
 	defined(WLAN_HDD_MULTI_VDEV_SINGLE_NDEV)
-void hdd_adapter_disable_all_links(struct hdd_adapter *adapter)
+void
+hdd_adapter_disable_all_links(struct hdd_adapter *adapter, bool clear_macaddr)
 {
 {
 	uint8_t idx_pos;
 	uint8_t idx_pos;
 	struct wlan_hdd_link_info *link_info;
 	struct wlan_hdd_link_info *link_info;
 
 
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 	hdd_adapter_for_each_link_info(adapter, link_info) {
-		qdf_zero_macaddr(&link_info->link_addr);
+		if (clear_macaddr)
+			qdf_zero_macaddr(&link_info->link_addr);
 		idx_pos = hdd_adapter_get_index_of_link_info(link_info);
 		idx_pos = hdd_adapter_get_index_of_link_info(link_info);
 		adapter->curr_link_info_map[idx_pos] = idx_pos;
 		adapter->curr_link_info_map[idx_pos] = idx_pos;
 	}
 	}
+
 	adapter->deflink = &adapter->link_info[WLAN_HDD_DEFLINK_IDX];
 	adapter->deflink = &adapter->link_info[WLAN_HDD_DEFLINK_IDX];
-	if (adapter->device_mode == QDF_STA_MODE)
-		adapter->active_links = (1 << adapter->num_links_on_create) - 1;
-	else
-		adapter->active_links = 0x1;
+	adapter->active_links = (1 << adapter->num_links_on_create) - 1;
 }
 }
 #endif
 #endif
 
 
@@ -9920,7 +9919,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 	/* Disable all links (expect default index) in adapter.
 	/* Disable all links (expect default index) in adapter.
 	 * Set link address to NULL
 	 * Set link address to NULL
 	 */
 	 */
-	hdd_adapter_disable_all_links(adapter);
+	hdd_adapter_disable_all_links(adapter, true);
 
 
 	/* This function should be invoked at the end of this api*/
 	/* This function should be invoked at the end of this api*/
 	hdd_dump_func_call_map();
 	hdd_dump_func_call_map();
@@ -17817,7 +17816,7 @@ static QDF_STATUS hdd_ssr_on_pagefault_cb(struct hdd_context *hdd_ctx)
 
 
 	if (!hdd_ctx->last_pagefault_ssr_time ||
 	if (!hdd_ctx->last_pagefault_ssr_time ||
 	    (curr_time - hdd_ctx->last_pagefault_ssr_time) >= ssr_threshold) {
 	    (curr_time - hdd_ctx->last_pagefault_ssr_time) >= ssr_threshold) {
-		hdd_info("curr_time %lu last_pagefault_ssr_time %lu ssr_frequency %d",
+		hdd_info("curr_time %lu last_pagefault_ssr_time %lu ssr_frequency %lu",
 			 curr_time, hdd_ctx->last_pagefault_ssr_time,
 			 curr_time, hdd_ctx->last_pagefault_ssr_time,
 			 ssr_threshold);
 			 ssr_threshold);
 		hdd_ctx->last_pagefault_ssr_time = curr_time;
 		hdd_ctx->last_pagefault_ssr_time = curr_time;

+ 20 - 3
core/hdd/src/wlan_hdd_mlo.c

@@ -377,14 +377,17 @@ QDF_STATUS hdd_derive_link_address_from_mld(struct wlan_objmgr_psoc *psoc,
 
 
 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
 #ifdef WLAN_HDD_MULTI_VDEV_SINGLE_NDEV
 #ifdef WLAN_HDD_MULTI_VDEV_SINGLE_NDEV
-static void hdd_adapter_restore_link_vdev_map(struct hdd_adapter *adapter)
+bool hdd_adapter_restore_link_vdev_map(struct hdd_adapter *adapter,
+				       bool same_vdev_mac_map)
 {
 {
 	int i;
 	int i;
+	bool mapping_changed = false;
 	unsigned long link_flags;
 	unsigned long link_flags;
 	uint8_t vdev_id, cur_link_idx, temp_link_idx;
 	uint8_t vdev_id, cur_link_idx, temp_link_idx;
 	struct vdev_osif_priv *osif_priv;
 	struct vdev_osif_priv *osif_priv;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_hdd_link_info *temp_link_info, *link_info;
 	struct wlan_hdd_link_info *temp_link_info, *link_info;
+	struct qdf_mac_addr temp_mac;
 
 
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 		cur_link_idx = hdd_adapter_get_index_of_link_info(link_info);
 		cur_link_idx = hdd_adapter_get_index_of_link_info(link_info);
@@ -437,6 +440,14 @@ static void hdd_adapter_restore_link_vdev_map(struct hdd_adapter *adapter)
 				osif_priv->legacy_osif_priv = link_info;
 				osif_priv->legacy_osif_priv = link_info;
 		}
 		}
 
 
+		/* Preserve the VDEV-MAC mapping if requested */
+		if (same_vdev_mac_map) {
+			qdf_copy_macaddr(&temp_mac, &temp_link_info->link_addr);
+			qdf_copy_macaddr(&temp_link_info->link_addr,
+					 &link_info->link_addr);
+			qdf_copy_macaddr(&link_info->link_addr, &temp_mac);
+		}
+
 		/* Swap link flags */
 		/* Swap link flags */
 		link_flags = temp_link_info->link_flags;
 		link_flags = temp_link_info->link_flags;
 		temp_link_info->link_flags = link_info->link_flags;
 		temp_link_info->link_flags = link_info->link_flags;
@@ -448,8 +459,14 @@ static void hdd_adapter_restore_link_vdev_map(struct hdd_adapter *adapter)
 		adapter->curr_link_info_map[temp_link_idx] =
 		adapter->curr_link_info_map[temp_link_idx] =
 				adapter->curr_link_info_map[cur_link_idx];
 				adapter->curr_link_info_map[cur_link_idx];
 		adapter->curr_link_info_map[cur_link_idx] = cur_link_idx;
 		adapter->curr_link_info_map[cur_link_idx] = cur_link_idx;
+
+		if (!mapping_changed)
+			mapping_changed = true;
 	}
 	}
-	hdd_adapter_disable_all_links(adapter);
+
+	hdd_adapter_disable_all_links(adapter, !same_vdev_mac_map);
+
+	return mapping_changed;
 }
 }
 
 
 int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
@@ -483,7 +500,7 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	if (QDF_IS_STATUS_ERROR(status))
 	if (QDF_IS_STATUS_ERROR(status))
 		return qdf_status_to_os_return(status);
 		return qdf_status_to_os_return(status);
 
 
-	hdd_adapter_restore_link_vdev_map(adapter);
+	hdd_adapter_restore_link_vdev_map(adapter, false);
 
 
 	i = 0;
 	i = 0;
 	hdd_adapter_for_each_active_link_info(adapter, link_info) {
 	hdd_adapter_for_each_active_link_info(adapter, link_info) {

+ 184 - 46
core/hdd/src/wlan_hdd_stats.c

@@ -729,13 +729,24 @@ static void
 wlan_hdd_get_mlo_links_count(struct hdd_adapter *adapter, uint32_t *count)
 wlan_hdd_get_mlo_links_count(struct hdd_adapter *adapter, uint32_t *count)
 {
 {
 	struct wlan_hdd_link_info *link_info;
 	struct wlan_hdd_link_info *link_info;
-	struct hdd_station_ctx *sta_ctx;
+	struct hdd_station_ctx *sta_ctx = NULL;
 	u32 num_links = 0;
 	u32 num_links = 0;
 
 
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 	hdd_adapter_for_each_link_info(adapter, link_info) {
-		sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
-		if (sta_ctx->conn_info.ieee_link_id != WLAN_INVALID_LINK_ID)
-			num_links++;
+		if (link_info->adapter->device_mode == QDF_P2P_CLIENT_MODE ||
+		    link_info->adapter->device_mode == QDF_STA_MODE) {
+			sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
+			if (sta_ctx->conn_info.ieee_link_id !=
+			    WLAN_INVALID_LINK_ID) {
+				num_links++;
+			}
+		} else if (link_info->adapter->device_mode == QDF_SAP_MODE ||
+			   link_info->adapter->device_mode == QDF_P2P_GO_MODE) {
+			if (test_bit(SOFTAP_BSS_STARTED,
+				     &link_info->link_flags)) {
+				num_links++;
+			}
+		}
 	}
 	}
 
 
 	*count = num_links;
 	*count = num_links;
@@ -956,23 +967,34 @@ wlan_hdd_put_mlo_link_iface_info(struct wlan_hdd_mlo_iface_stats_info *info,
  * @link_info: Link info pointerin adapter
  * @link_info: Link info pointerin adapter
  * @info: Pointer to wlan_hdd_mlo_iface_stats_info struct
  * @info: Pointer to wlan_hdd_mlo_iface_stats_info struct
  *
  *
- * Return: True on success, False on failure
+ * Return: void
  */
  */
 static void
 static void
 wlan_hdd_get_connected_link_info(struct wlan_hdd_link_info *link_info,
 wlan_hdd_get_connected_link_info(struct wlan_hdd_link_info *link_info,
 				 struct wlan_hdd_mlo_iface_stats_info *info)
 				 struct wlan_hdd_mlo_iface_stats_info *info)
 {
 {
-	struct hdd_station_ctx *sta_ctx;
+	struct hdd_station_ctx *sta_ctx = NULL;
+	struct hdd_ap_ctx *ap_ctx = NULL;
+
+	info->link_id = WLAN_INVALID_LINK_ID;
 
 
 	if (!link_info) {
 	if (!link_info) {
 		hdd_err("Invalid link_info");
 		hdd_err("Invalid link_info");
-		info->link_id = WLAN_INVALID_LINK_ID;
 		return;
 		return;
 	}
 	}
 
 
-	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
-	info->link_id = sta_ctx->conn_info.ieee_link_id;
-	info->freq = sta_ctx->conn_info.chan_freq;
+	if (link_info->adapter->device_mode == QDF_P2P_CLIENT_MODE ||
+	    link_info->adapter->device_mode == QDF_STA_MODE) {
+		sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
+		info->link_id = sta_ctx->conn_info.ieee_link_id;
+		info->freq = sta_ctx->conn_info.chan_freq;
+	} else if ((link_info->adapter->device_mode == QDF_SAP_MODE ||
+		    link_info->adapter->device_mode == QDF_P2P_GO_MODE) &&
+		   test_bit(SOFTAP_BSS_STARTED, &link_info->link_flags)) {
+		ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(link_info);
+		info->link_id = ap_ctx->sap_config.link_id;
+		info->freq = ap_ctx->sap_config.chan_freq;
+	}
 }
 }
 #endif
 #endif
 
 
@@ -1070,21 +1092,30 @@ static bool put_wifi_wmm_ac_stat(wmi_wmm_ac_stats *stats,
  * put_wifi_interface_info() - put wifi interface info
  * put_wifi_interface_info() - put wifi interface info
  * @stats: Pointer to stats context
  * @stats: Pointer to stats context
  * @vendor_event: Pointer to vendor event
  * @vendor_event: Pointer to vendor event
+ * @link_info: Pointer to link_info
  *
  *
  * Return: bool
  * Return: bool
  */
  */
 static bool put_wifi_interface_info(struct wifi_interface_info *stats,
 static bool put_wifi_interface_info(struct wifi_interface_info *stats,
-				    struct sk_buff *vendor_event)
+				    struct sk_buff *vendor_event,
+				    struct wlan_hdd_link_info *link_info)
 {
 {
+	if (link_info->adapter->device_mode == QDF_P2P_CLIENT_MODE ||
+	    link_info->adapter->device_mode == QDF_STA_MODE) {
+		if (nla_put_u32(vendor_event,
+				QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_STATE,
+				stats->state)) {
+			hdd_err("QCA_WLAN_VENDOR_ATTR put fail");
+			return false;
+		}
+	}
+
 	if (nla_put_u32(vendor_event,
 	if (nla_put_u32(vendor_event,
 			QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_MODE,
 			QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_MODE,
 			stats->mode) ||
 			stats->mode) ||
 	    nla_put(vendor_event,
 	    nla_put(vendor_event,
 		    QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_MAC_ADDR,
 		    QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_MAC_ADDR,
 		    QDF_MAC_ADDR_SIZE, stats->macAddr.bytes) ||
 		    QDF_MAC_ADDR_SIZE, stats->macAddr.bytes) ||
-	    nla_put_u32(vendor_event,
-			QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_STATE,
-			stats->state) ||
 	    nla_put_u32(vendor_event,
 	    nla_put_u32(vendor_event,
 			QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_ROAMING,
 			QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_INFO_ROAMING,
 			stats->roaming) ||
 			stats->roaming) ||
@@ -1118,11 +1149,13 @@ static bool put_wifi_interface_info(struct wifi_interface_info *stats,
  * @if_stat: Pointer to interface stats context
  * @if_stat: Pointer to interface stats context
  * @num_peers: Number of peers
  * @num_peers: Number of peers
  * @vendor_event: Pointer to vendor event
  * @vendor_event: Pointer to vendor event
+ * @link_info: Pointer to link_info
  *
  *
  * Return: bool
  * Return: bool
  */
  */
 static bool put_wifi_iface_stats(struct wifi_interface_stats *if_stat,
 static bool put_wifi_iface_stats(struct wifi_interface_stats *if_stat,
-				 u32 num_peers, struct sk_buff *vendor_event)
+				 u32 num_peers, struct sk_buff *vendor_event,
+				 struct wlan_hdd_link_info *link_info)
 {
 {
 	int i = 0;
 	int i = 0;
 	struct nlattr *wmm_info;
 	struct nlattr *wmm_info;
@@ -1130,7 +1163,7 @@ static bool put_wifi_iface_stats(struct wifi_interface_stats *if_stat,
 	u64 average_tsf_offset;
 	u64 average_tsf_offset;
 	wmi_iface_link_stats *link_stats = &if_stat->link_stats;
 	wmi_iface_link_stats *link_stats = &if_stat->link_stats;
 
 
-	if (!put_wifi_interface_info(&if_stat->info, vendor_event)) {
+	if (!put_wifi_interface_info(&if_stat->info, vendor_event, link_info)) {
 		hdd_err("QCA_WLAN_VENDOR_ATTR put fail");
 		hdd_err("QCA_WLAN_VENDOR_ATTR put fail");
 		return false;
 		return false;
 
 
@@ -1856,7 +1889,8 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 	if (QDF_IS_STATUS_ERROR(status))
 	if (QDF_IS_STATUS_ERROR(status))
 		hdd_err_rl("mlo_iface_stats: failed to get bss peer_mld_mac");
 		hdd_err_rl("mlo_iface_stats: failed to get bss peer_mld_mac");
 
 
-	if (!put_wifi_iface_stats(&cumulative_if_stat, num_links, skb)) {
+	if (!put_wifi_iface_stats(&cumulative_if_stat, num_links, skb,
+				  ml_adapter->deflink)) {
 		hdd_err("put_wifi_iface_stats fail");
 		hdd_err("put_wifi_iface_stats fail");
 		goto err;
 		goto err;
 	}
 	}
@@ -1886,7 +1920,7 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 			goto err;
 			goto err;
 
 
 		if (!put_wifi_iface_stats(&link_if_stat[i],
 		if (!put_wifi_iface_stats(&link_if_stat[i],
-					  per_link_peers, skb)) {
+					  per_link_peers, skb, link_info)) {
 			hdd_err("put_wifi_iface_stats failed for link[%u]", i);
 			hdd_err("put_wifi_iface_stats failed for link[%u]", i);
 			goto err;
 			goto err;
 		}
 		}
@@ -1921,6 +1955,7 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 	struct sk_buff *skb;
 	struct sk_buff *skb;
 	struct wlan_hdd_link_info *link_info;
 	struct wlan_hdd_link_info *link_info;
 	struct qdf_mac_addr *netdev_addr;
 	struct qdf_mac_addr *netdev_addr;
+	int8_t rssi_data;
 
 
 	if (!wlan_hdd_is_mlo_connection(adapter->deflink))
 	if (!wlan_hdd_is_mlo_connection(adapter->deflink))
 		return;
 		return;
@@ -1944,11 +1979,25 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 
 
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 		wlan_hdd_get_connected_link_info(link_info, &info);
 		wlan_hdd_get_connected_link_info(link_info, &info);
+
 		if (info.link_id == WLAN_INVALID_LINK_ID)
 		if (info.link_id == WLAN_INVALID_LINK_ID)
 			continue;
 			continue;
 
 
-		if ((link_info->rssi != 0) && (rssi <= link_info->rssi)) {
-			rssi = link_info->rssi;
+		rssi_data = link_info->ll_iface_stats.link_stats.rssi_data;
+
+		if ((link_info->adapter->device_mode == QDF_P2P_GO_MODE ||
+		     link_info->adapter->device_mode == QDF_SAP_MODE) &&
+		    rssi <= rssi_data) {
+			rssi = rssi_data;
+			update_stats = true;
+			if (!hdd_get_interface_info(link_info,
+						    &cumulative_if_stat.info)) {
+				hdd_err("failed to get iface info for link %u",
+					info.link_id);
+				goto err;
+			}
+		} else if (rssi_data != 0 && (rssi <= rssi_data)) {
+			rssi = rssi_data;
 			update_stats = true;
 			update_stats = true;
 			if (!hdd_get_interface_info(link_info,
 			if (!hdd_get_interface_info(link_info,
 						    &cumulative_if_stat.info)) {
 						    &cumulative_if_stat.info)) {
@@ -1978,7 +2027,8 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 	if (QDF_IS_STATUS_ERROR(status))
 	if (QDF_IS_STATUS_ERROR(status))
 		hdd_err_rl("mlo_iface_stats: failed to get bss peer_mld_mac");
 		hdd_err_rl("mlo_iface_stats: failed to get bss peer_mld_mac");
 
 
-	if (!put_wifi_iface_stats(&cumulative_if_stat, num_links, skb)) {
+	if (!put_wifi_iface_stats(&cumulative_if_stat, num_links, skb,
+				  adapter->deflink)) {
 		hdd_err("put_wifi_iface_stats fail");
 		hdd_err("put_wifi_iface_stats fail");
 		goto err;
 		goto err;
 	}
 	}
@@ -1993,6 +2043,7 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 
 
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 	hdd_adapter_for_each_link_info(adapter, link_info) {
 		wlan_hdd_get_connected_link_info(link_info, &info);
 		wlan_hdd_get_connected_link_info(link_info, &info);
+
 		if (info.link_id == WLAN_INVALID_LINK_ID)
 		if (info.link_id == WLAN_INVALID_LINK_ID)
 			continue;
 			continue;
 
 
@@ -2008,7 +2059,8 @@ wlan_hdd_send_mlo_ll_iface_stats_to_user(struct hdd_adapter *adapter)
 		if (!wlan_hdd_put_mlo_link_iface_info(&info, skb))
 		if (!wlan_hdd_put_mlo_link_iface_info(&info, skb))
 			goto err;
 			goto err;
 
 
-		if (!put_wifi_iface_stats(stats, per_link_peers, skb)) {
+		if (!put_wifi_iface_stats(stats, per_link_peers, skb,
+					  link_info)) {
 			hdd_err("put iface stats failed for link[%u]", info.link_id);
 			hdd_err("put iface stats failed for link[%u]", info.link_id);
 			goto err;
 			goto err;
 		}
 		}
@@ -2215,7 +2267,7 @@ hdd_link_layer_process_iface_stats(struct wlan_hdd_link_info *link_info,
 		return;
 		return;
 	}
 	}
 
 
-	if (!put_wifi_iface_stats(if_stat, num_peers, skb)) {
+	if (!put_wifi_iface_stats(if_stat, num_peers, skb, link_info)) {
 		hdd_err("put_wifi_iface_stats fail");
 		hdd_err("put_wifi_iface_stats fail");
 		wlan_cfg80211_vendor_free_skb(skb);
 		wlan_cfg80211_vendor_free_skb(skb);
 		return;
 		return;
@@ -5576,34 +5628,20 @@ roam_rt_stats_fill_cand_info(struct sk_buff *vendor_event, uint8_t idx,
 	nla_nest_end(vendor_event, nl_array);
 	nla_nest_end(vendor_event, nl_array);
 }
 }
 
 
-void
-wlan_hdd_cfg80211_roam_events_callback(struct roam_stats_event *roam_stats,
-				       uint8_t idx)
+static void
+wlan_hdd_cfg80211_typical_roam_events_callback(struct wlan_hdd_link_info *link_info,
+					       struct roam_stats_event *roam_stats,
+					       uint8_t idx)
 {
 {
-	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
-	int status;
 	uint32_t data_size, roam_event_type = 0;
 	uint32_t data_size, roam_event_type = 0;
 	struct sk_buff *vendor_event;
 	struct sk_buff *vendor_event;
-	struct wlan_hdd_link_info *link_info;
+	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
 
 
-	status = wlan_hdd_validate_context(hdd_ctx);
-	if (status) {
+	if (wlan_hdd_validate_context(hdd_ctx)) {
 		hdd_err("Invalid hdd_ctx");
 		hdd_err("Invalid hdd_ctx");
 		return;
 		return;
 	}
 	}
 
 
-	if (!roam_stats) {
-		hdd_err("msg received here is null");
-		return;
-	}
-
-	link_info = hdd_get_link_info_by_vdev(hdd_ctx, roam_stats->vdev_id);
-	if (!link_info) {
-		hdd_err("vdev_id %d does not exist with host",
-			roam_stats->vdev_id);
-		return;
-	}
-
 	data_size = hdd_get_roam_rt_stats_event_len(roam_stats, idx);
 	data_size = hdd_get_roam_rt_stats_event_len(roam_stats, idx);
 	if (!data_size) {
 	if (!data_size) {
 		hdd_err("No data requested");
 		hdd_err("No data requested");
@@ -9136,7 +9174,7 @@ int wlan_hdd_get_sap_go_peer_linkspeed(struct wlan_hdd_link_info *link_info,
 	struct hdd_station_info *sta_info, *tmp = NULL;
 	struct hdd_station_info *sta_info, *tmp = NULL;
 
 
 	value = value + command_len;
 	value = value + command_len;
-	ret = sscanf(value, "%17s", &macaddr_string);
+	ret = sscanf(value, "%17s", macaddr_string);
 
 
 	if (ret != 1)
 	if (ret != 1)
 		return -EINVAL;
 		return -EINVAL;
@@ -9639,6 +9677,8 @@ void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx)
 	QCA_WLAN_VENDOR_ATTR_ROAM_STATS_FRAME_STATUS
 	QCA_WLAN_VENDOR_ATTR_ROAM_STATS_FRAME_STATUS
 #define ROAM_STATS_FRAME_TIMESTAMP \
 #define ROAM_STATS_FRAME_TIMESTAMP \
 	QCA_WLAN_VENDOR_ATTR_ROAM_STATS_FRAME_TIMESTAMP
 	QCA_WLAN_VENDOR_ATTR_ROAM_STATS_FRAME_TIMESTAMP
+#define ROAM_STATS_EVENT_INDEX \
+	QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS_INDEX
 
 
 static enum qca_roam_reason
 static enum qca_roam_reason
 hdd_convert_roam_trigger_reason(enum roam_trigger_reason reason)
 hdd_convert_roam_trigger_reason(enum roam_trigger_reason reason)
@@ -9921,8 +9961,9 @@ hdd_convert_roam_failures_reason(enum wlan_roam_failure_reason_code fail)
  *
  *
  * Return: required length of an individual record of roaming stats
  * Return: required length of an individual record of roaming stats
  */
  */
-static uint32_t hdd_get_roam_stats_individual_record_len(struct enhance_roam_info *roam_info,
-							 uint32_t index)
+static uint32_t
+hdd_get_roam_stats_individual_record_len(struct enhance_roam_info *roam_info,
+					 uint32_t index)
 {
 {
 	struct enhance_roam_info *info;
 	struct enhance_roam_info *info;
 	enum qca_roam_reason vendor_trigger_reason;
 	enum qca_roam_reason vendor_trigger_reason;
@@ -10452,6 +10493,9 @@ static int hdd_nla_put_roam_stats_info(struct sk_buff *skb,
 	}
 	}
 
 
 	for (i = 0; i < WLAN_ROAM_MAX_FRAME_INFO; i++) {
 	for (i = 0; i < WLAN_ROAM_MAX_FRAME_INFO; i++) {
+		if (info->timestamp[i].frame_type ==
+				WLAN_ROAM_STATS_FRAME_SUBTYPE_INVALID)
+			break;
 		roam_frame = nla_nest_start(skb, i);
 		roam_frame = nla_nest_start(skb, i);
 		if (!roam_frame) {
 		if (!roam_frame) {
 			hdd_err("nla_nest_start fail");
 			hdd_err("nla_nest_start fail");
@@ -10690,6 +10734,100 @@ int wlan_hdd_cfg80211_get_roam_stats(struct wiphy *wiphy,
 }
 }
 #endif
 #endif
 
 
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+#ifdef WLAN_FEATURE_ROAM_INFO_STATS
+static void
+wlan_hdd_cfg80211_enhance_roam_events_callback(struct wlan_hdd_link_info *link_info,
+					       struct roam_stats_event *roam_stats,
+					       uint8_t idx)
+{
+	int status;
+	uint32_t data_size = 0;
+	struct sk_buff *vendor_event;
+	struct wlan_objmgr_vdev *vdev = NULL;
+	struct enhance_roam_info *roam_info = NULL;
+	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+
+	status = wlan_hdd_validate_context(hdd_ctx);
+	if (status) {
+		hdd_err("Invalid hdd_ctx");
+		return;
+	}
+
+	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_STATS_ID);
+	if (!vdev)
+		return;
+	ucfg_cm_roam_info_get(vdev, &roam_info, idx);
+	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_STATS_ID);
+
+	/* QCA_WLAN_VENDOR_ATTR_ROAM_STATS_INFO */
+	data_size += nla_total_size(0);
+	/* nest attribute */
+	data_size += nla_total_size(0);
+
+	data_size += hdd_get_roam_stats_individual_record_len(roam_info, idx);
+
+	data_size += NLMSG_HDRLEN;
+
+	vendor_event =
+		wlan_cfg80211_vendor_event_alloc(hdd_ctx->wiphy,
+						 &link_info->adapter->wdev,
+						 data_size,
+						 ROAM_STATS_EVENT_INDEX,
+						 GFP_KERNEL);
+
+	if (hdd_nla_put_roam_stats_info(vendor_event, roam_info, 0)) {
+		wlan_cfg80211_vendor_free_skb(vendor_event);
+		hdd_err("nla put failure");
+		return;
+	}
+
+	roam_stats->enhance_roam_rt_event = false;
+
+	wlan_cfg80211_vendor_event(vendor_event, GFP_KERNEL);
+}
+#else
+static void
+wlan_hdd_cfg80211_enhance_roam_events_callback(struct wlan_hdd_link_info *link_info,
+					       struct roam_stats_event *roam_stats,
+					       uint8_t idx)
+{
+}
+#endif
+void
+wlan_hdd_cfg80211_roam_events_callback(struct roam_stats_event *roam_stats,
+				       uint8_t idx)
+{
+	int status;
+	struct wlan_hdd_link_info *link_info;
+	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+
+	status = wlan_hdd_validate_context(hdd_ctx);
+	if (status) {
+		hdd_err("Invalid hdd_ctx");
+		return;
+	}
+
+	if (!roam_stats) {
+		hdd_err("msg received here is null");
+		return;
+	}
+
+	link_info = hdd_get_link_info_by_vdev(hdd_ctx, roam_stats->vdev_id);
+	if (!link_info) {
+		hdd_err("vdev_id %d does not exist with host",
+			roam_stats->vdev_id);
+		return;
+	}
+	if (roam_stats->enhance_roam_rt_event)
+		wlan_hdd_cfg80211_enhance_roam_events_callback(link_info,
+							       roam_stats, idx);
+	else
+		wlan_hdd_cfg80211_typical_roam_events_callback(link_info,
+							       roam_stats, idx);
+}
+#endif
+
 #ifdef WLAN_FEATURE_TX_LATENCY_STATS
 #ifdef WLAN_FEATURE_TX_LATENCY_STATS
 #define TX_LATENCY_BUCKET_DISTRIBUTION_LEN \
 #define TX_LATENCY_BUCKET_DISTRIBUTION_LEN \
 	(sizeof(uint32_t) * CDP_TX_LATENCY_TYPE_MAX)
 	(sizeof(uint32_t) * CDP_TX_LATENCY_TYPE_MAX)

+ 3 - 3
core/mac/inc/qwlan_version.h

@@ -32,9 +32,9 @@
 #define QWLAN_VERSION_MAJOR            5
 #define QWLAN_VERSION_MAJOR            5
 #define QWLAN_VERSION_MINOR            2
 #define QWLAN_VERSION_MINOR            2
 #define QWLAN_VERSION_PATCH            1
 #define QWLAN_VERSION_PATCH            1
-#define QWLAN_VERSION_EXTRA            "N"
-#define QWLAN_VERSION_BUILD            91
+#define QWLAN_VERSION_EXTRA            "C"
+#define QWLAN_VERSION_BUILD            92
 
 
-#define QWLAN_VERSIONSTR               "5.2.1.91N"
+#define QWLAN_VERSIONSTR               "5.2.1.92C"
 
 
 #endif /* QWLAN_VERSION_H */
 #endif /* QWLAN_VERSION_H */

+ 3 - 3
core/mac/inc/sir_api.h

@@ -2873,7 +2873,7 @@ typedef struct {
 
 
 	uint32_t peer_event_number;
 	uint32_t peer_event_number;
 	/* Variable  length field - Do not add anything after this */
 	/* Variable  length field - Do not add anything after this */
-	uint8_t results[0];
+	uint8_t results[];
 } tSirLLStatsResults, *tpSirLLStatsResults;
 } tSirLLStatsResults, *tpSirLLStatsResults;
 
 
 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -3107,7 +3107,7 @@ struct wifi_peer_info {
 		uint32_t power_saving;
 		uint32_t power_saving;
 		uint32_t num_rate;
 		uint32_t num_rate;
 	};
 	};
-	struct wifi_rate_stat rate_stats[0];
+	struct wifi_rate_stat rate_stats[];
 };
 };
 
 
 /**
 /**
@@ -3151,7 +3151,7 @@ struct wifi_interface_stats {
  */
  */
 struct wifi_peer_stat {
 struct wifi_peer_stat {
 	uint32_t num_peers;
 	uint32_t num_peers;
-	struct wifi_peer_info peer_info[0];
+	struct wifi_peer_info peer_info[];
 };
 };
 
 
 /* wifi statistics bitmap  for getting statistics */
 /* wifi statistics bitmap  for getting statistics */

+ 7 - 8
core/mac/src/pe/include/lim_api.h

@@ -904,12 +904,11 @@ lim_cm_fill_link_session(struct mac_context *mac_ctx,
  *
  *
  * This api will create mlo peer called during mlo roaming scenario
  * This api will create mlo peer called during mlo roaming scenario
  *
  *
- * Return: none
+ * Return: QDF_STATUS
  */
  */
-void lim_roam_mlo_create_peer(struct mac_context *mac,
-			      struct roam_offload_synch_ind *sync_ind,
-			      uint8_t vdev_id,
-			      uint8_t *peer_mac);
+QDF_STATUS lim_roam_mlo_create_peer(struct mac_context *mac,
+				    struct roam_offload_synch_ind *sync_ind,
+				    uint8_t vdev_id, uint8_t *peer_mac);
 
 
 /**
 /**
  * lim_mlo_roam_delete_link_peer() - Delete mlo link peer
  * lim_mlo_roam_delete_link_peer() - Delete mlo link peer
@@ -951,12 +950,12 @@ lim_cm_fill_link_session(struct mac_context *mac_ctx,
 	return QDF_STATUS_E_NOSUPPORT;
 	return QDF_STATUS_E_NOSUPPORT;
 }
 }
 
 
-static inline void
+static inline QDF_STATUS
 lim_roam_mlo_create_peer(struct mac_context *mac,
 lim_roam_mlo_create_peer(struct mac_context *mac,
 			 struct roam_offload_synch_ind *sync_ind,
 			 struct roam_offload_synch_ind *sync_ind,
-			 uint8_t vdev_id,
-			 uint8_t *peer_mac)
+			 uint8_t vdev_id, uint8_t *peer_mac)
 {
 {
+	return QDF_STATUS_SUCCESS;
 }
 }
 
 
 static inline void
 static inline void

+ 16 - 25
core/mac/src/pe/lim/lim_api.c

@@ -1856,12 +1856,8 @@ static void pe_update_crypto_params(struct mac_context *mac_ctx,
 	hdr = (tpSirMacMgmtHdr)((uint8_t *)roam_synch +
 	hdr = (tpSirMacMgmtHdr)((uint8_t *)roam_synch +
 		roam_synch->reassoc_req_offset);
 		roam_synch->reassoc_req_offset);
 	if (hdr->fc.type == SIR_MAC_MGMT_FRAME &&
 	if (hdr->fc.type == SIR_MAC_MGMT_FRAME &&
-	    hdr->fc.subType == SIR_MAC_MGMT_ASSOC_REQ) {
+	    hdr->fc.subType == SIR_MAC_MGMT_ASSOC_REQ)
 		ies_offset = WLAN_ASSOC_REQ_IES_OFFSET;
 		ies_offset = WLAN_ASSOC_REQ_IES_OFFSET;
-		pe_debug("roam assoc req frm");
-	} else {
-		pe_debug("roam reassoc req frm");
-	}
 
 
 	if (roam_synch->reassoc_req_length <
 	if (roam_synch->reassoc_req_length <
 	    (sizeof(tSirMacMgmtHdr) + ies_offset)) {
 	    (sizeof(tSirMacMgmtHdr) + ies_offset)) {
@@ -1869,10 +1865,6 @@ static void pe_update_crypto_params(struct mac_context *mac_ctx,
 		       roam_synch->reassoc_req_length);
 		       roam_synch->reassoc_req_length);
 		return;
 		return;
 	}
 	}
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
-			   (uint8_t *)roam_synch +
-				roam_synch->reassoc_req_offset,
-			   roam_synch->reassoc_req_length);
 
 
 	ft_session->limRmfEnabled = false;
 	ft_session->limRmfEnabled = false;
 
 
@@ -2227,10 +2219,7 @@ lim_roam_fill_bss_descr(struct mac_context *mac,
 			roam_synch_ind->is_beacon,
 			roam_synch_ind->is_beacon,
 		 QDF_MAC_ADDR_REF(bssid.bytes),
 		 QDF_MAC_ADDR_REF(bssid.bytes),
 		 QDF_MAC_ADDR_REF(mac_hdr->bssId));
 		 QDF_MAC_ADDR_REF(mac_hdr->bssId));
-
-	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
-			   bcn_proberesp_ptr,
-			   bcn_proberesp_len);
+	mgmt_txrx_frame_hex_dump(bcn_proberesp_ptr, bcn_proberesp_len, false);
 
 
 	status = lim_roam_gen_beacon_descr(mac, bcn_proberesp_ptr,
 	status = lim_roam_gen_beacon_descr(mac, bcn_proberesp_ptr,
 					   bcn_proberesp_len, is_mlo_link,
 					   bcn_proberesp_len, is_mlo_link,
@@ -3043,7 +3032,8 @@ pe_roam_synch_callback(struct mac_context *mac_ctx,
 
 
 	reassoc_resp = (uint8_t *)roam_sync_ind_ptr +
 	reassoc_resp = (uint8_t *)roam_sync_ind_ptr +
 			roam_sync_ind_ptr->reassoc_resp_offset;
 			roam_sync_ind_ptr->reassoc_resp_offset;
-
+	mgmt_txrx_frame_hex_dump(reassoc_resp,
+				 roam_sync_ind_ptr->reassoc_resp_length, false);
 	if (wlan_vdev_mlme_get_is_mlo_link(mac_ctx->psoc, vdev_id)) {
 	if (wlan_vdev_mlme_get_is_mlo_link(mac_ctx->psoc, vdev_id)) {
 		status = lim_gen_link_specific_assoc_rsp(mac_ctx,
 		status = lim_gen_link_specific_assoc_rsp(mac_ctx,
 						ft_session_ptr,
 						ft_session_ptr,
@@ -3710,23 +3700,22 @@ fail:
 	return QDF_STATUS_E_FAILURE;
 	return QDF_STATUS_E_FAILURE;
 }
 }
 
 
-void lim_roam_mlo_create_peer(struct mac_context *mac,
-			      struct roam_offload_synch_ind *sync_ind,
-			      uint8_t vdev_id,
-			      uint8_t *peer_mac)
+QDF_STATUS lim_roam_mlo_create_peer(struct mac_context *mac,
+				    struct roam_offload_synch_ind *sync_ind,
+				    uint8_t vdev_id, uint8_t *peer_mac)
 {
 {
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_peer *link_peer = NULL;
 	struct wlan_objmgr_peer *link_peer = NULL;
 	uint8_t link_id;
 	uint8_t link_id;
 	struct mlo_partner_info partner_info;
 	struct mlo_partner_info partner_info;
 	struct qdf_mac_addr link_addr;
 	struct qdf_mac_addr link_addr;
-	QDF_STATUS status;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
 						    vdev_id,
 						    vdev_id,
 						    WLAN_LEGACY_MAC_ID);
 						    WLAN_LEGACY_MAC_ID);
 	if (!vdev)
 	if (!vdev)
-		return;
+		return QDF_STATUS_E_INVAL;
 
 
 	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
 	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
 		goto end;
 		goto end;
@@ -3750,19 +3739,21 @@ void lim_roam_mlo_create_peer(struct mac_context *mac,
 	/* Get the bss peer obj */
 	/* Get the bss peer obj */
 	link_peer = wlan_objmgr_get_peer_by_mac(mac->psoc, peer_mac,
 	link_peer = wlan_objmgr_get_peer_by_mac(mac->psoc, peer_mac,
 						WLAN_LEGACY_MAC_ID);
 						WLAN_LEGACY_MAC_ID);
-	if (!link_peer)
+	if (!link_peer) {
+		status = QDF_STATUS_E_INVAL;
 		goto end;
 		goto end;
+	}
 
 
-	status = wlan_mlo_peer_create(vdev, link_peer,
-				      &partner_info, NULL, 0);
-
+	status = wlan_mlo_peer_create(vdev, link_peer, &partner_info, NULL, 0);
 	if (QDF_IS_STATUS_ERROR(status))
 	if (QDF_IS_STATUS_ERROR(status))
-		pe_err("Peer creation failed");
+		pe_err("MLO peer creation failed");
 
 
 	wlan_objmgr_peer_release_ref(link_peer, WLAN_LEGACY_MAC_ID);
 	wlan_objmgr_peer_release_ref(link_peer, WLAN_LEGACY_MAC_ID);
 
 
 end:
 end:
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
+
+	return status;
 }
 }
 
 
 void
 void

+ 3 - 3
core/mac/src/pe/lim/lim_assoc_utils.c

@@ -1575,7 +1575,7 @@ QDF_STATUS lim_populate_own_rate_set(struct mac_context *mac_ctx,
 	lim_populate_he_mcs_set(mac_ctx, rates, he_caps,
 	lim_populate_he_mcs_set(mac_ctx, rates, he_caps,
 			session_entry, session_entry->nss);
 			session_entry, session_entry->nss);
 	lim_populate_eht_mcs_set(mac_ctx, rates, eht_caps,
 	lim_populate_eht_mcs_set(mac_ctx, rates, eht_caps,
-				 session_entry, session_entry->nss);
+				 session_entry, session_entry->ch_width);
 
 
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }
@@ -1830,7 +1830,7 @@ QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac,
 	lim_populate_he_mcs_set(mac, pRates, peer_he_caps,
 	lim_populate_he_mcs_set(mac, pRates, peer_he_caps,
 			pe_session, pe_session->nss);
 			pe_session, pe_session->nss);
 	lim_populate_eht_mcs_set(mac, pRates, eht_caps,
 	lim_populate_eht_mcs_set(mac, pRates, eht_caps,
-				 pe_session, pe_session->nss);
+				 pe_session, pe_session->ch_width);
 
 
 	pe_debug("nss 1x1 %d nss %d", pe_session->supported_nss_1x1,
 	pe_debug("nss 1x1 %d nss %d", pe_session->supported_nss_1x1,
 		 pe_session->nss);
 		 pe_session->nss);
@@ -2066,7 +2066,7 @@ QDF_STATUS lim_populate_matching_rate_set(struct mac_context *mac_ctx,
 	lim_populate_he_mcs_set(mac_ctx, &sta_ds->supportedRates, he_caps,
 	lim_populate_he_mcs_set(mac_ctx, &sta_ds->supportedRates, he_caps,
 				session_entry, session_entry->nss);
 				session_entry, session_entry->nss);
 	lim_populate_eht_mcs_set(mac_ctx, &sta_ds->supportedRates, eht_caps,
 	lim_populate_eht_mcs_set(mac_ctx, &sta_ds->supportedRates, eht_caps,
-				 session_entry, session_entry->nss);
+				 session_entry, sta_ds->ch_width);
 	/*
 	/*
 	 * Set the erpEnabled bit if the phy is in G mode and at least
 	 * Set the erpEnabled bit if the phy is in G mode and at least
 	 * one A rate is supported
 	 * one A rate is supported

+ 3 - 1
core/mac/src/pe/lim/lim_process_beacon_frame.c

@@ -609,7 +609,9 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 			qdf_mem_copy(session->beacon,
 			qdf_mem_copy(session->beacon,
 				WMA_GET_RX_MAC_HEADER(rx_pkt_info),
 				WMA_GET_RX_MAC_HEADER(rx_pkt_info),
 				session->bcnLen);
 				session->bcnLen);
-
+		mgmt_txrx_frame_hex_dump((uint8_t *)mac_hdr,
+					 WMA_GET_RX_MPDU_LEN(rx_pkt_info),
+					 false);
 		lim_check_and_announce_join_success(mac_ctx, bcn_ptr,
 		lim_check_and_announce_join_success(mac_ctx, bcn_ptr,
 				mac_hdr, session);
 				mac_hdr, session);
 	}
 	}

+ 4 - 10
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -1346,16 +1346,10 @@ lim_handle80211_frames(struct mac_context *mac, struct scheduler_msg *limMsg,
 		    (fc.subType != SIR_MAC_MGMT_PROBE_REQ) &&
 		    (fc.subType != SIR_MAC_MGMT_PROBE_REQ) &&
 		    (fc.subType != SIR_MAC_MGMT_PROBE_RSP) &&
 		    (fc.subType != SIR_MAC_MGMT_PROBE_RSP) &&
 		    (fc.subType != SIR_MAC_MGMT_BEACON) &&
 		    (fc.subType != SIR_MAC_MGMT_BEACON) &&
-		    (fc.subType != SIR_MAC_MGMT_ACTION)) {
-			pe_debug("RX MGMT - Type %hu, SubType %hu, seq num[%d]",
-				 fc.type, fc.subType,
-				 ((pHdr->seqControl.seqNumHi << HIGH_SEQ_NUM_OFFSET) |
-				 pHdr->seqControl.seqNumLo));
-			QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE,
-					   QDF_TRACE_LEVEL_DEBUG, pHdr,
-					   WMA_GET_RX_PAYLOAD_LEN(pRxPacketInfo)
-					   + SIR_MAC_HDR_LEN_3A);
-		}
+		    (fc.subType != SIR_MAC_MGMT_ACTION))
+			mgmt_txrx_frame_hex_dump((uint8_t *)pHdr,
+					 WMA_GET_RX_MPDU_LEN(pRxPacketInfo),
+					 false);
 	}
 	}
 
 
 #ifdef FEATURE_WLAN_EXTSCAN
 #ifdef FEATURE_WLAN_EXTSCAN

+ 1 - 54
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -424,58 +424,6 @@ end:
 		lim_send_start_bss_confirm(mac_ctx, &mlm_start_cnf);
 		lim_send_start_bss_confirm(mac_ctx, &mlm_start_cnf);
 }
 }
 
 
-#ifdef WLAN_FEATURE_11BE_MLO
-static void
-lim_send_peer_create_resp_mlo(struct wlan_objmgr_vdev *vdev,
-			      struct mac_context *mac,
-			      uint8_t *peer_mac,
-			      QDF_STATUS status)
-{
-	uint8_t link_id;
-	struct mlo_partner_info partner_info;
-	struct wlan_objmgr_peer *link_peer = NULL;
-
-	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
-		return;
-
-	link_id = vdev->vdev_mlme.mlo_link_id;
-	/* currently only 2 link MLO supported */
-	partner_info.num_partner_links = 1;
-	qdf_mem_copy(partner_info.partner_link_info[0].link_addr.bytes,
-		     vdev->vdev_mlme.macaddr, QDF_MAC_ADDR_SIZE);
-	partner_info.partner_link_info[0].link_id = link_id;
-	pe_debug("link_addr " QDF_MAC_ADDR_FMT,
-		 QDF_MAC_ADDR_REF(
-			partner_info.partner_link_info[0].link_addr.bytes));
-
-	if (QDF_IS_STATUS_SUCCESS(status)) {
-		/* Get the bss peer obj */
-		link_peer = wlan_objmgr_get_peer_by_mac(mac->psoc, peer_mac,
-							WLAN_LEGACY_MAC_ID);
-		if (!link_peer) {
-			pe_err("Link peer is NULL");
-			return;
-		}
-
-		status = wlan_mlo_peer_create(vdev, link_peer,
-					      &partner_info, NULL, 0);
-
-		if (QDF_IS_STATUS_ERROR(status))
-			pe_err("Peer creation failed");
-
-		wlan_objmgr_peer_release_ref(link_peer, WLAN_LEGACY_MAC_ID);
-	}
-}
-#else /* WLAN_FEATURE_11BE_MLO */
-static inline void
-lim_send_peer_create_resp_mlo(struct wlan_objmgr_vdev *vdev,
-			      struct mac_context *mac,
-			      uint8_t *peer_mac,
-			      QDF_STATUS status)
-{
-}
-#endif /* WLAN_FEATURE_11BE_MLO */
-
 #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
 #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
 void
 void
 lim_pasn_peer_del_all_resp_vdev_delete_resume(struct mac_context *mac,
 lim_pasn_peer_del_all_resp_vdev_delete_resume(struct mac_context *mac,
@@ -516,7 +464,6 @@ void lim_send_peer_create_resp(struct mac_context *mac, uint8_t vdev_id,
 		return;
 		return;
 	status = wlan_cm_bss_peer_create_rsp(vdev, qdf_status,
 	status = wlan_cm_bss_peer_create_rsp(vdev, qdf_status,
 					     (struct qdf_mac_addr *)peer_mac);
 					     (struct qdf_mac_addr *)peer_mac);
-	lim_send_peer_create_resp_mlo(vdev, mac, peer_mac, status);
 
 
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
 }
 }

+ 5 - 5
core/mac/src/pe/lim/lim_process_probe_rsp_frame.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -343,9 +343,6 @@ lim_process_probe_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_Packet_info
 	if (!lim_validate_probe_rsp_mld_addr(session_entry, probe_rsp))
 	if (!lim_validate_probe_rsp_mld_addr(session_entry, probe_rsp))
 		goto mem_free;
 		goto mem_free;
 
 
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, body,
-			   frame_len);
-
 	lim_update_mlo_mgr_prb_info(mac_ctx, session_entry,
 	lim_update_mlo_mgr_prb_info(mac_ctx, session_entry,
 				    (struct qdf_mac_addr *)header->bssId,
 				    (struct qdf_mac_addr *)header->bssId,
 				    probe_rsp);
 				    probe_rsp);
@@ -394,7 +391,10 @@ lim_process_probe_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_Packet_info
 					     (rx_Packet_info),
 					     (rx_Packet_info),
 				     session_entry->bcnLen);
 				     session_entry->bcnLen);
 		}
 		}
-			/* STA in WT_JOIN_BEACON_STATE */
+		/* STA in WT_JOIN_BEACON_STATE */
+		mgmt_txrx_frame_hex_dump((uint8_t *)header,
+					 WMA_GET_RX_MPDU_LEN(rx_Packet_info),
+					 false);
 		lim_check_and_announce_join_success(mac_ctx, probe_rsp,
 		lim_check_and_announce_join_success(mac_ctx, probe_rsp,
 						header,
 						header,
 						session_entry);
 						session_entry);

+ 3 - 5
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -4530,11 +4530,9 @@ lim_fill_session_params(struct mac_context *mac_ctx,
 
 
 	pe_join_req = session->lim_join_req;
 	pe_join_req = session->lim_join_req;
 	bss_desc = &session->lim_join_req->bssDescription;
 	bss_desc = &session->lim_join_req->bssDescription;
-	pe_debug("Beacon/probe frame received:");
-	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
-			   util_scan_entry_frame_ptr(req->entry),
-			   util_scan_entry_frame_len(req->entry));
-
+	mgmt_txrx_frame_hex_dump(util_scan_entry_frame_ptr(req->entry),
+				 util_scan_entry_frame_len(req->entry),
+				 false);
 	status = wlan_fill_bss_desc_from_scan_entry(mac_ctx, bss_desc,
 	status = wlan_fill_bss_desc_from_scan_entry(mac_ctx, bss_desc,
 						    req->entry);
 						    req->entry);
 	if (QDF_IS_STATUS_ERROR(status)) {
 	if (QDF_IS_STATUS_ERROR(status)) {

+ 1 - 1
core/mac/src/pe/lim/lim_process_tdls.c

@@ -3333,7 +3333,7 @@ lim_tdls_populate_eht_mcs(struct mac_context *mac_ctx, tpDphHashNode stads,
 {
 {
 	lim_populate_eht_mcs_set(mac_ctx, &stads->supportedRates,
 	lim_populate_eht_mcs_set(mac_ctx, &stads->supportedRates,
 				 &stads->eht_config, session_entry,
 				 &stads->eht_config, session_entry,
-				 session_entry->nss);
+				 session_entry->ch_width);
 }
 }
 #else
 #else
 static void
 static void

+ 5 - 25
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -483,8 +483,7 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
 		      vdev_id, mac_ctx->mgmtSeqNum,
 		      vdev_id, mac_ctx->mgmtSeqNum,
 		      QDF_MAC_ADDR_REF(bssid),
 		      QDF_MAC_ADDR_REF(bssid),
 		      (int)sizeof(tSirMacMgmtHdr) + payload);
 		      (int)sizeof(tSirMacMgmtHdr) + payload);
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, frame,
-			   sizeof(tSirMacMgmtHdr) + payload);
+	mgmt_txrx_frame_hex_dump(frame, sizeof(tSirMacMgmtHdr) + payload, true);
 
 
 	/* If this probe request is sent during P2P Search State, then we need
 	/* If this probe request is sent during P2P Search State, then we need
 	 * to send it at OFDM rate.
 	 * to send it at OFDM rate.
@@ -6680,10 +6679,9 @@ lim_send_epcs_action_req_frame(struct wlan_objmgr_vdev *vdev,
 	frm.Action.action = args->action;
 	frm.Action.action = args->action;
 	frm.DialogToken.token = args->arg1;
 	frm.DialogToken.token = args->arg1;
 
 
-	pe_debug("Sending a EPCS negotiation Request from " QDF_MAC_ADDR_FMT " to " QDF_MAC_ADDR_FMT,
-		 QDF_MAC_ADDR_REF(session->self_mac_addr),
+	pe_debug("Sending a EPCS negotiation Request token %d from " QDF_MAC_ADDR_FMT " to " QDF_MAC_ADDR_FMT,
+		 frm.DialogToken.token, QDF_MAC_ADDR_REF(session->self_mac_addr),
 		 QDF_MAC_ADDR_REF(peer_mac));
 		 QDF_MAC_ADDR_REF(peer_mac));
-	pe_debug("Dialog token %d", frm.DialogToken.token);
 
 
 	status = dot11f_get_packed_epcs_neg_reqSize(mac_ctx, &frm,
 	status = dot11f_get_packed_epcs_neg_reqSize(mac_ctx, &frm,
 						    &payload_size);
 						    &payload_size);
@@ -6729,10 +6727,6 @@ lim_send_epcs_action_req_frame(struct wlan_objmgr_vdev *vdev,
 			status);
 			status);
 	}
 	}
 
 
-	pe_debug("Dump EPCS TX req action frame");
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, frame_ptr,
-			   num_bytes);
-
 	if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq) ||
 	if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq) ||
 	    session->opmode == QDF_P2P_CLIENT_MODE ||
 	    session->opmode == QDF_P2P_CLIENT_MODE ||
 	    session->opmode == QDF_P2P_GO_MODE)
 	    session->opmode == QDF_P2P_GO_MODE)
@@ -6840,10 +6834,6 @@ lim_send_epcs_action_teardown_frame(struct wlan_objmgr_vdev *vdev,
 			status);
 			status);
 	}
 	}
 
 
-	pe_debug("Dump EPCS TX tear down action frame");
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, frame_ptr,
-			   num_bytes);
-
 	if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq) ||
 	if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq) ||
 	    session->opmode == QDF_P2P_CLIENT_MODE ||
 	    session->opmode == QDF_P2P_CLIENT_MODE ||
 	    session->opmode == QDF_P2P_GO_MODE)
 	    session->opmode == QDF_P2P_GO_MODE)
@@ -7171,11 +7161,6 @@ lim_send_t2lm_action_req_frame(struct wlan_objmgr_vdev *vdev,
 	}
 	}
 
 
 	frm.t2lm_ie[0].num_data = ie_buf->elem_len - 1;
 	frm.t2lm_ie[0].num_data = ie_buf->elem_len - 1;
-
-	pe_debug("Dump T2LM IE buff len %d", ie_buf->elem_len);
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, ie_buf,
-			   ie_buf->elem_len +  sizeof(struct ie_header));
-
 	qdf_mem_copy(&frm.t2lm_ie[0].data, ie_buf->data,
 	qdf_mem_copy(&frm.t2lm_ie[0].data, ie_buf->data,
 		     frm.t2lm_ie[0].num_data);
 		     frm.t2lm_ie[0].num_data);
 
 
@@ -7187,10 +7172,9 @@ lim_send_t2lm_action_req_frame(struct wlan_objmgr_vdev *vdev,
 	frm.num_t2lm_ie = 1;
 	frm.num_t2lm_ie = 1;
 	frm.t2lm_ie[0].present = 1;
 	frm.t2lm_ie[0].present = 1;
 
 
-	pe_debug("Sending a T2LM negotiation Request from " QDF_MAC_ADDR_FMT " to " QDF_MAC_ADDR_FMT,
-		 QDF_MAC_ADDR_REF(session->self_mac_addr),
+	pe_debug("Sending a T2LM negotiation Request token %d from " QDF_MAC_ADDR_FMT " to " QDF_MAC_ADDR_FMT,
+		 frm.DialogToken.token, QDF_MAC_ADDR_REF(session->self_mac_addr),
 		 QDF_MAC_ADDR_REF(peer_mac));
 		 QDF_MAC_ADDR_REF(peer_mac));
-	pe_debug("Dialog token %d", frm.DialogToken.token);
 
 
 	status = dot11f_get_packed_t2lm_neg_reqSize(mac_ctx, &frm,
 	status = dot11f_get_packed_t2lm_neg_reqSize(mac_ctx, &frm,
 						    &payload_size);
 						    &payload_size);
@@ -7237,10 +7221,6 @@ lim_send_t2lm_action_req_frame(struct wlan_objmgr_vdev *vdev,
 			status);
 			status);
 	}
 	}
 
 
-	pe_debug("Dump T2LM TX req action frame");
-	qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, frame_ptr,
-			   num_bytes);
-
 	if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq) ||
 	if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq) ||
 	    session->opmode == QDF_P2P_CLIENT_MODE ||
 	    session->opmode == QDF_P2P_CLIENT_MODE ||
 	    session->opmode == QDF_P2P_GO_MODE)
 	    session->opmode == QDF_P2P_GO_MODE)

+ 2 - 2
core/mac/src/pe/lim/lim_utils.c

@@ -8553,7 +8553,7 @@ QDF_STATUS lim_populate_eht_mcs_set(struct mac_context *mac_ctx,
 				    struct supported_rates *rates,
 				    struct supported_rates *rates,
 				    tDot11fIEeht_cap *peer_eht_caps,
 				    tDot11fIEeht_cap *peer_eht_caps,
 				    struct pe_session *session_entry,
 				    struct pe_session *session_entry,
-				    uint8_t nss)
+				    enum phy_ch_width ch_width)
 {
 {
 	if ((!peer_eht_caps) || (!peer_eht_caps->present)) {
 	if ((!peer_eht_caps) || (!peer_eht_caps->present)) {
 		pe_debug("peer not eht capable or eht_caps NULL");
 		pe_debug("peer not eht capable or eht_caps NULL");
@@ -8564,7 +8564,7 @@ QDF_STATUS lim_populate_eht_mcs_set(struct mac_context *mac_ctx,
 		return QDF_STATUS_SUCCESS;
 		return QDF_STATUS_SUCCESS;
 	}
 	}
 
 
-	switch (session_entry->ch_width) {
+	switch (ch_width) {
 	case CH_WIDTH_320MHZ:
 	case CH_WIDTH_320MHZ:
 		lim_populate_eht_320_mcs_set(mac_ctx, rates, peer_eht_caps);
 		lim_populate_eht_320_mcs_set(mac_ctx, rates, peer_eht_caps);
 		fallthrough;
 		fallthrough;

+ 3 - 3
core/mac/src/pe/lim/lim_utils.h

@@ -1827,7 +1827,7 @@ QDF_STATUS lim_strip_eht_cap_ie(struct mac_context *mac_ctx,
  * @rates: pointer to supported rate set
  * @rates: pointer to supported rate set
  * @peer_eht_caps: pointer to peer EHT capabilities
  * @peer_eht_caps: pointer to peer EHT capabilities
  * @session_entry: pe session entry
  * @session_entry: pe session entry
- * @nss: number of spatial streams
+ * @ch_width: channel width of the association
  *
  *
  * Populates EHT mcs rate set based on peer and self capabilities
  * Populates EHT mcs rate set based on peer and self capabilities
  *
  *
@@ -1837,7 +1837,7 @@ QDF_STATUS lim_populate_eht_mcs_set(struct mac_context *mac_ctx,
 				    struct supported_rates *rates,
 				    struct supported_rates *rates,
 				    tDot11fIEeht_cap *peer_eht_caps,
 				    tDot11fIEeht_cap *peer_eht_caps,
 				    struct pe_session *session_entry,
 				    struct pe_session *session_entry,
-				    uint8_t nss);
+				    enum phy_ch_width ch_width);
 
 
 /**
 /**
  * lim_update_eht_bw_cap_mcs(): Update eht mcs map per bandwidth
  * lim_update_eht_bw_cap_mcs(): Update eht mcs map per bandwidth
@@ -2204,7 +2204,7 @@ QDF_STATUS lim_populate_eht_mcs_set(struct mac_context *mac_ctx,
 				    struct supported_rates *rates,
 				    struct supported_rates *rates,
 				    tDot11fIEeht_cap *peer_eht_caps,
 				    tDot11fIEeht_cap *peer_eht_caps,
 				    struct pe_session *session_entry,
 				    struct pe_session *session_entry,
-				    uint8_t nss)
+				    enum phy_ch_width ch_width)
 {
 {
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }

+ 70 - 137
core/mac/src/pe/rrm/rrm_api.c

@@ -61,20 +61,13 @@
 /* Max passive scan dwell for wide band rrm scan, in milliseconds */
 /* Max passive scan dwell for wide band rrm scan, in milliseconds */
 #define RRM_SCAN_MAX_DWELL_TIME 110
 #define RRM_SCAN_MAX_DWELL_TIME 110
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_cache_mgmt_tx_power
- **
- * FUNCTION:  Store Tx power for management frames.
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
+ * rrm_cache_mgmt_tx_power() - Store Tx power for management frames.
+ * @mac: pointer to mac context
+ * @txPower: TX power
+ * @pe_session: per vdev pe context
  *
  *
- * @param pe_session session entry.
- * @return None
+ * Return: None
  */
  */
 void
 void
 rrm_cache_mgmt_tx_power(struct mac_context *mac, int8_t txPower,
 rrm_cache_mgmt_tx_power(struct mac_context *mac, int8_t txPower,
@@ -88,20 +81,12 @@ rrm_cache_mgmt_tx_power(struct mac_context *mac, int8_t txPower,
 		pe_session->txMgmtPower = txPower;
 		pe_session->txMgmtPower = txPower;
 }
 }
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_get_mgmt_tx_power
- *
- * FUNCTION:  Get the Tx power for management frames.
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
+ * rrm_get_mgmt_tx_power() - Get the Tx power for management frames.
+ * @mac: pointer to mac context
+ * @pe_session: per vdev pe context
  *
  *
- * @param pe_session session entry.
- * @return txPower
+ * Return: TX power
  */
  */
 int8_t rrm_get_mgmt_tx_power(struct mac_context *mac, struct pe_session *pe_session)
 int8_t rrm_get_mgmt_tx_power(struct mac_context *mac, struct pe_session *pe_session)
 {
 {
@@ -113,21 +98,14 @@ int8_t rrm_get_mgmt_tx_power(struct mac_context *mac, struct pe_session *pe_sess
 	return pe_session->txMgmtPower;
 	return pe_session->txMgmtPower;
 }
 }
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_send_set_max_tx_power_req
- *
- * FUNCTION:  Send WMA_SET_MAX_TX_POWER_REQ message to change the max tx power.
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
+ * rrm_send_set_max_tx_power_req() - Send WMA_SET_MAX_TX_POWER_REQ message
+ * to change the max tx power.
+ * @mac: pointer to mac context
+ * @txPower: TX power to be set
+ * @pe_session: per vdev pe context
  *
  *
- * @param txPower txPower to be set.
- * @param pe_session session entry.
- * @return None
+ * Return: None
  */
  */
 QDF_STATUS
 QDF_STATUS
 rrm_send_set_max_tx_power_req(struct mac_context *mac, int8_t txPower,
 rrm_send_set_max_tx_power_req(struct mac_context *mac, int8_t txPower,
@@ -171,21 +149,12 @@ rrm_send_set_max_tx_power_req(struct mac_context *mac, int8_t txPower,
 	return retCode;
 	return retCode;
 }
 }
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_set_max_tx_power_rsp
- *
- * FUNCTION:  Process WMA_SET_MAX_TX_POWER_RSP message.
- *
- * LOGIC:
+ * rrm_set_max_tx_power_rsp() - Process WMA_SET_MAX_TX_POWER_RSP message
+ * @mac: pointer to mac context
+ * @limMsgQ: pointer to scheduler message
  *
  *
- * ASSUMPTIONS:
- *
- * NOTE:
- *
- * @param txPower txPower to be set.
- * @param pe_session session entry.
- * @return None
+ * Return: None
  */
  */
 QDF_STATUS rrm_set_max_tx_power_rsp(struct mac_context *mac,
 QDF_STATUS rrm_set_max_tx_power_rsp(struct mac_context *mac,
 				    struct scheduler_msg *limMsgQ)
 				    struct scheduler_msg *limMsgQ)
@@ -238,22 +207,15 @@ static void rrm_calculate_and_fill_rcpi(uint8_t *rcpi, int8_t cur_rssi)
 		*rcpi = RCPI_MAX_VALUE;
 		*rcpi = RCPI_MAX_VALUE;
 }
 }
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_process_link_measurement_request
- *
- * FUNCTION:  Processes the Link measurement request and send the report.
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
+ * rrm_process_link_measurement_request() - Processes the Link measurement
+ * request and send the report.
+ * @mac: pointer to mac context
+ * @pRxPacketInfo: pointer to packet info structure
+ * @pLinkReq: pointer to the Link request frame structure.
+ * @pe_session: session entry.
  *
  *
- * NOTE:
- *
- * @param pBd pointer to BD to extract RSSI and SNR
- * @param pLinkReq pointer to the Link request frame structure.
- * @param pe_session session entry.
- * @return None
+ * Return: None
  */
  */
 QDF_STATUS
 QDF_STATUS
 rrm_process_link_measurement_request(struct mac_context *mac,
 rrm_process_link_measurement_request(struct mac_context *mac,
@@ -366,21 +328,14 @@ rrm_process_link_measurement_request(struct mac_context *mac,
 						 pe_session);
 						 pe_session);
 }
 }
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_process_neighbor_report_response
- *
- * FUNCTION:  Processes the Neighbor Report response from the peer AP.
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
+ * rrm_process_neighbor_report_response() - Processes the Neighbor Report
+ * response from the peer AP.
+ * @mac: pointer to mac context
+ * @pNeighborRep: pointer to the Neighbor report frame structure.
+ * @pe_session: session entry.
  *
  *
- * @param pNeighborRep pointer to the Neighbor report frame structure.
- * @param pe_session session entry.
- * @return None
+ * Return: None
  */
  */
 QDF_STATUS
 QDF_STATUS
 rrm_process_neighbor_report_response(struct mac_context *mac,
 rrm_process_neighbor_report_response(struct mac_context *mac,
@@ -494,20 +449,13 @@ rrm_process_neighbor_report_response(struct mac_context *mac,
 
 
 }
 }
 
 
-/* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_process_neighbor_report_req
- *
- * FUNCTION:
+ * rrm_process_neighbor_report_req() - Create a Neighbor report request
+ * and send it to peer.
+ * @mac: pointer to mac context
+ * @pNeighborReq: Neighbor report request params
  *
  *
- * LOGIC: Create a Neighbor report request and send it to peer.
- *
- * ASSUMPTIONS:
- *
- * NOTE:
- *
- * @param pNeighborReq Neighbor report request params .
- * @return None
+ * Return: None
  */
  */
 QDF_STATUS
 QDF_STATUS
 rrm_process_neighbor_report_req(struct mac_context *mac,
 rrm_process_neighbor_report_req(struct mac_context *mac,
@@ -797,7 +745,7 @@ rrm_update_vdev_stats(tpSirMacRadioMeasureReport rrm_report, uint8_t vdev_id)
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
 	}
 	}
 
 
-	pe_nofl_debug("counter stats count: fragment (tx: %d rx: %d) group tx: %d mac stats count: retry : %d multiple retry: %d frame duplicate %d",
+	pe_nofl_debug("counter stats count: fragment (tx: %d rx: %d) group tx: %llu mac stats count: retry : %d multiple retry: %d frame duplicate %d",
 		      stats->tx.fragment_count, stats->rx.fragment_count,
 		      stats->tx.fragment_count, stats->rx.fragment_count,
 		      stats->tx.mcast.num, stats->tx.retry_count,
 		      stats->tx.mcast.num, stats->tx.retry_count,
 		      stats->tx.multiple_retry_count,
 		      stats->tx.multiple_retry_count,
@@ -942,7 +890,7 @@ static uint16_t rrm_get_max_meas_duration(struct mac_context *mac,
  * rrm_process_sta_stats_report_req: Process RRM sta stats request
  * rrm_process_sta_stats_report_req: Process RRM sta stats request
  * @mac: mac context
  * @mac: mac context
  * @pCurrentReq: Current RRM request
  * @pCurrentReq: Current RRM request
- * @pStaStatsReq: RRM Measurement Request
+ * @sta_stats_req: RRM Measurement Request
  * @pe_session: pe session
  * @pe_session: pe session
  *
  *
  * Return: rrm status
  * Return: rrm status
@@ -1102,6 +1050,7 @@ rrm_check_other_sta_sats_req_in_progress(
 /**
 /**
  * rrm_process_sta_stats_req: Process RRM sta stats request
  * rrm_process_sta_stats_req: Process RRM sta stats request
  * @mac: mac context
  * @mac: mac context
+ * @peer: peer mac
  * @session_entry: pe session
  * @session_entry: pe session
  * @radiomes_report: measurement report
  * @radiomes_report: measurement report
  * @rrm_req: measurement request
  * @rrm_req: measurement request
@@ -1178,20 +1127,14 @@ failure:
 }
 }
 
 
 /**
 /**
- * rrm_process_beacon_report_req
- *
- * FUNCTION:  Processes the Beacon report request from the peer AP.
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
+ * rrm_process_beacon_report_req() - Processes the Beacon report request
+ * from the peer AP
+ * @mac: pointer to mac context
+ * @pCurrentReq: pointer to the current Req comtext
+ * @pBeaconReq: pointer to the beacon report request IE from the peer
+ * @pe_session: session entry
  *
  *
- * NOTE:
- *
- * @param pCurrentReq pointer to the current Req comtext.
- * @param pBeaconReq pointer to the beacon report request IE from the peer.
- * @param pe_session session entry.
- * @return None
+ * Return: None
  */
  */
 static tRrmRetStatus
 static tRrmRetStatus
 rrm_process_beacon_report_req(struct mac_context *mac,
 rrm_process_beacon_report_req(struct mac_context *mac,
@@ -1488,7 +1431,8 @@ rrm_check_ml_ie(uint8_t *ies, uint16_t len, uint8_t *mlie_copy_len)
 		return NULL;
 		return NULL;
 	}
 	}
 
 
-	mlo_debug("[802.11 BCN_RPT]: ML IE is present ml_ie_total_len:%d", ml_ie_total_len);
+	mlo_debug("[802.11 BCN_RPT]: ML IE is present ml_ie_total_len:%zu",
+		  ml_ie_total_len);
 
 
 	util_get_mlie_common_info_len(ml_ie, ml_ie_total_len,
 	util_get_mlie_common_info_len(ml_ie, ml_ie_total_len,
 				      &ml_common_info_length);
 				      &ml_common_info_length);
@@ -1539,13 +1483,17 @@ rrm_copy_ml_ie(uint8_t eid, uint8_t extn_eid, uint8_t *ml_ie,
 /**
 /**
  * rrm_fill_beacon_ies() - Fills fixed fields and Ies in bss description to an
  * rrm_fill_beacon_ies() - Fills fixed fields and Ies in bss description to an
  * array of uint8_t.
  * array of uint8_t.
- * @pIes - pointer to the buffer that should be populated with ies.
- * @pNumIes - returns the num of ies filled in this param.
- * @pIesMaxSize - Max size of the buffer pIes.
- * @eids - pointer to array of eids. If NULL, all ies will be populated.
- * @numEids - number of elements in array eids.
+ * @mac: pointer to mac context
+ * @pIes: pointer to the buffer that should be populated with ies.
+ * @pNumIes: returns the num of ies filled in this param.
+ * @pIesMaxSize: Max size of the buffer pIes.
+ * @eids: pointer to array of eids. If NULL, all ies will be populated.
+ * @numEids: number of elements in array eids.
+ * @eid: EID
+ * @extn_eids: pointer to array of ext eids
+ * @extn_eids_count: count of elements in array extn_eids
  * @start_offset: Offset from where the IEs in the bss_desc should be parsed
  * @start_offset: Offset from where the IEs in the bss_desc should be parsed
- * @bss_desc - pointer to Bss Description.
+ * @bss_desc: pointer to Bss Description.
  *
  *
  * Return: Remaining length of IEs in current bss_desc which are not included
  * Return: Remaining length of IEs in current bss_desc which are not included
  *	   in pIes.
  *	   in pIes.
@@ -2337,7 +2285,7 @@ rrm_process_chan_load_report_xmit(struct mac_context *mac_ctx,
 		     sizeof(channel_load_report->bw_ind));
 		     sizeof(channel_load_report->bw_ind));
 	qdf_mem_copy(&channel_load_report->wide_bw, &chan_load_ind->wide_bw,
 	qdf_mem_copy(&channel_load_report->wide_bw, &chan_load_ind->wide_bw,
 		     sizeof(channel_load_report->wide_bw));
 		     sizeof(channel_load_report->wide_bw));
-	pe_err("send chan load report for bssId:"QDF_MAC_ADDR_FMT" reg_class:%d, channel:%d, measStartTime:%llu, measDuration:%d, chan_load:%d",
+	pe_err("send chan load report for bssId:" QDF_MAC_ADDR_FMT " reg_class:%d, channel:%d, measStartTime:%lu, measDuration:%d, chan_load:%d",
 	       QDF_MAC_ADDR_REF(sessionBssId.bytes),
 	       QDF_MAC_ADDR_REF(sessionBssId.bytes),
 	       channel_load_report->op_class,
 	       channel_load_report->op_class,
 	       channel_load_report->channel,
 	       channel_load_report->channel,
@@ -2628,18 +2576,11 @@ end:
 }
 }
 
 
 /**
 /**
- * rrm_get_start_tsf
- *
- * FUNCTION:  Get the Start TSF.
+ * rrm_get_start_tsf() - Get the Start TSF.
+ * @mac: pointer to mac context
+ * @pStartTSF: store star TSF in this buffer.
  *
  *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
- *
- * @param startTSF - store star TSF in this buffer.
- * @return txPower
+ * Return: None
  */
  */
 void rrm_get_start_tsf(struct mac_context *mac, uint32_t *pStartTSF)
 void rrm_get_start_tsf(struct mac_context *mac, uint32_t *pStartTSF)
 {
 {
@@ -2650,19 +2591,12 @@ void rrm_get_start_tsf(struct mac_context *mac, uint32_t *pStartTSF)
 
 
 /* -------------------------------------------------------------------- */
 /* -------------------------------------------------------------------- */
 /**
 /**
- * rrm_get_capabilities
- *
- * FUNCTION:
- * Returns a pointer to tpRRMCaps with all the caps enabled in RRM
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
+ * rrm_get_capabilities() - Returns a pointer to tpRRMCaps with all the
+ * caps enabled in RRM
+ * @mac: pointer to mac context
+ * @pe_session: pointer to pe session
  *
  *
- * @param pe_session
- * @return pointer to tRRMCaps
+ * Return: pointer to tRRMCaps
  */
  */
 tpRRMCaps rrm_get_capabilities(struct mac_context *mac, struct pe_session *pe_session)
 tpRRMCaps rrm_get_capabilities(struct mac_context *mac, struct pe_session *pe_session)
 {
 {
@@ -2741,9 +2675,8 @@ void rrm_cleanup(struct mac_context *mac, uint8_t idx)
 /**
 /**
  * lim_update_rrm_capability() - Update PE context's rrm capability
  * lim_update_rrm_capability() - Update PE context's rrm capability
  * @mac_ctx: Global pointer to MAC context
  * @mac_ctx: Global pointer to MAC context
- * @join_req: Pointer to SME join request.
  *
  *
- * Update PE context's rrm capability based on SME join request.
+ * Update PE context's rrm capability
  *
  *
  * Return: None
  * Return: None
  */
  */

+ 13 - 9
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -759,9 +759,9 @@ out:
 
 
 /**
 /**
  * populate_dot11f_ds_params() - To populate DS IE params
  * populate_dot11f_ds_params() - To populate DS IE params
- * mac_ctx: Pointer to global mac context
- * dot11f_param: pointer to DS params IE
- * freq: freq
+ * @mac_ctx: Pointer to global mac context
+ * @dot11f_param: pointer to DS params IE
+ * @freq: freq
  *
  *
  * This routine will populate DS param in management frame like
  * This routine will populate DS param in management frame like
  * beacon, probe response, and etc.
  * beacon, probe response, and etc.
@@ -2174,10 +2174,10 @@ populate_dot11f_supp_rates(struct mac_context *mac,
 /**
 /**
  * populate_dot11f_rates_tdls() - populate supported rates and
  * populate_dot11f_rates_tdls() - populate supported rates and
  *                                extended supported rates IE.
  *                                extended supported rates IE.
- * @p_mac global - header.
- * @p_supp_rates - pointer to supported rates IE
- * @p_ext_supp_rates - pointer to extended supported rates IE
- * @curr_oper_channel - current operating channel
+ * @p_mac: Pointer to global mac context
+ * @p_supp_rates: pointer to supported rates IE
+ * @p_ext_supp_rates: pointer to extended supported rates IE
+ * @curr_oper_channel: current operating channel
  *
  *
  * This function populates the supported rates and extended supported
  * This function populates the supported rates and extended supported
  * rates IE based in the STA capability. If the number of rates
  * rates IE based in the STA capability. If the number of rates
@@ -7135,7 +7135,7 @@ populate_dot11f_chan_load_report(struct mac_context *mac,
 		dot11f->report.channel_load_report.bw_indication.ccfs1 = channel_load_report->bw_ind.center_freq_seg1;
 		dot11f->report.channel_load_report.bw_indication.ccfs1 = channel_load_report->bw_ind.center_freq_seg1;
 	}
 	}
 
 
-	pe_debug("regClass %d chan %d meas_time %d meas_dur %d, chan_load %d",
+	pe_debug("regClass %d chan %d meas_time %lu meas_dur %d, chan_load %d",
 		 dot11f->report.channel_load_report.op_class,
 		 dot11f->report.channel_load_report.op_class,
 		 dot11f->report.channel_load_report.channel,
 		 dot11f->report.channel_load_report.channel,
 		 channel_load_report->rrm_scan_tsf,
 		 channel_load_report->rrm_scan_tsf,
@@ -7509,7 +7509,7 @@ void populate_dot11f_timeout_interval(struct mac_context *mac,
 
 
 /**
 /**
  * populate_dot11f_timing_advert_frame() - Populate the TA mgmt frame fields
  * populate_dot11f_timing_advert_frame() - Populate the TA mgmt frame fields
- * @mac: the MAC context
+ * @mac_ctx: the MAC context
  * @frame: pointer to the TA frame
  * @frame: pointer to the TA frame
  *
  *
  * Return: The SIR status.
  * Return: The SIR status.
@@ -7860,6 +7860,8 @@ populate_dot11f_he_bss_color_change(struct mac_context *mac_ctx,
  * lim_get_ext_ie_ptr_from_ext_id() - Find out ext ie
  * lim_get_ext_ie_ptr_from_ext_id() - Find out ext ie
  * @ie: source ie address
  * @ie: source ie address
  * @ie_len: source ie length
  * @ie_len: source ie length
+ * @oui: oui buffer
+ * @oui_size: oui size
  *
  *
  * This API is used to find out ext ie from ext id
  * This API is used to find out ext ie from ext id
  *
  *
@@ -8936,6 +8938,7 @@ QDF_STATUS lim_ieee80211_unpack_ehtcap(const uint8_t *eht_cap_ie,
 			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
 			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
 				      EHTCAP_TX_MCS_NSS_MAP_IDX,
 				      EHTCAP_TX_MCS_NSS_MAP_IDX,
 				      EHTCAP_TX_MCS_NSS_MAP_BITS);
 				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
 
 
 		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_8_and_9 =
 		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_8_and_9 =
 			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
 			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
@@ -11426,6 +11429,7 @@ QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx,
 /**
 /**
  * wlan_fill_single_pmk_ap_cap_from_scan_entry() - WAP3_SPMK VSIE from scan
  * wlan_fill_single_pmk_ap_cap_from_scan_entry() - WAP3_SPMK VSIE from scan
  * entry
  * entry
+ * @mac_ctx: pointer to mac_context
  * @bss_desc: BSS Descriptor
  * @bss_desc: BSS Descriptor
  * @scan_entry: scan entry
  * @scan_entry: scan entry
  *
  *

+ 0 - 5
core/sme/src/csr/csr_api_roam.c

@@ -5536,11 +5536,6 @@ static void csr_fill_connected_profile(struct mac_context *mac_ctx,
 		goto purge_list;
 		goto purge_list;
 
 
 	wlan_fill_bss_desc_from_scan_entry(mac_ctx, bss_desc, cur_node->entry);
 	wlan_fill_bss_desc_from_scan_entry(mac_ctx, bss_desc, cur_node->entry);
-	pe_debug("Dump scan entry frm:");
-	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
-			   cur_node->entry->raw_frame.ptr,
-			   cur_node->entry->raw_frame.len);
-
 	src_cfg.uint_value = bss_desc->mbo_oce_enabled_ap;
 	src_cfg.uint_value = bss_desc->mbo_oce_enabled_ap;
 	wlan_cm_roam_cfg_set_value(mac_ctx->psoc, vdev_id, MBO_OCE_ENABLED_AP,
 	wlan_cm_roam_cfg_set_value(mac_ctx->psoc, vdev_id, MBO_OCE_ENABLED_AP,
 				   &src_cfg);
 				   &src_cfg);

+ 7 - 22
core/wma/src/wma_data.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -2686,31 +2686,16 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 	}
 	}
 
 
 	if (pFc->type == SIR_MAC_MGMT_FRAME) {
 	if (pFc->type == SIR_MAC_MGMT_FRAME) {
-		if ((mac->mlme_cfg->gen.debug_packet_log &
+		if (((mac->mlme_cfg->gen.debug_packet_log &
 		    DEBUG_PKTLOG_TYPE_MGMT) &&
 		    DEBUG_PKTLOG_TYPE_MGMT) &&
 		    (pFc->subType != SIR_MAC_MGMT_PROBE_REQ) &&
 		    (pFc->subType != SIR_MAC_MGMT_PROBE_REQ) &&
 		    (pFc->subType != SIR_MAC_MGMT_PROBE_RSP) &&
 		    (pFc->subType != SIR_MAC_MGMT_PROBE_RSP) &&
-		    (pFc->subType != SIR_MAC_MGMT_ACTION)) {
-			wma_debug("TX MGMT - Type %hu, SubType %hu seq_num[%d]",
-				  pFc->type, pFc->subType,
-				  ((mHdr->seqControl.seqNumHi << 4) |
-				  mHdr->seqControl.seqNumLo));
-			qdf_trace_hex_dump(QDF_MODULE_ID_WMA,
-					   QDF_TRACE_LEVEL_DEBUG, pData,
-					   frmLen);
-		} else if ((mac->mlme_cfg->gen.debug_packet_log &
-			   DEBUG_PKTLOG_TYPE_ACTION) &&
-			   (pFc->subType == SIR_MAC_MGMT_ACTION)) {
-			wma_debug("TX MGMT - Type %hu, SubType %hu seq_num[%d]",
-				  pFc->type, pFc->subType,
-				 ((mHdr->seqControl.seqNumHi << 4) |
-				 mHdr->seqControl.seqNumLo));
-			qdf_trace_hex_dump(QDF_MODULE_ID_WMA,
-					   QDF_TRACE_LEVEL_DEBUG, pData,
-					   frmLen);
-		}
+		    (pFc->subType != SIR_MAC_MGMT_ACTION)) ||
+		    ((mac->mlme_cfg->gen.debug_packet_log &
+		      DEBUG_PKTLOG_TYPE_ACTION) &&
+		     (pFc->subType == SIR_MAC_MGMT_ACTION)))
+			mgmt_txrx_frame_hex_dump(pData, frmLen, true);
 	}
 	}
-
 	if (wlan_reg_is_5ghz_ch_freq(wma_handle->interfaces[vdev_id].ch_freq))
 	if (wlan_reg_is_5ghz_ch_freq(wma_handle->interfaces[vdev_id].ch_freq))
 		is_5g = true;
 		is_5g = true;
 
 

+ 4 - 0
core/wma/src/wma_dev_if.c

@@ -473,6 +473,10 @@ wma_release_vdev_ref(struct wma_txrx_node *iface)
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev;
 
 
 	vdev = iface->vdev;
 	vdev = iface->vdev;
+	if (!vdev) {
+		wma_debug("vdev context is NULL");
+		return;
+	}
 	wma_debug("vdev state: %d", vdev->obj_state);
 	wma_debug("vdev state: %d", vdev->obj_state);
 	if (vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
 	if (vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
 		wma_debug("no vdev delete");
 		wma_debug("no vdev delete");

+ 45 - 29
core/wma/src/wma_scan_roam.c

@@ -689,9 +689,9 @@ wma_delete_all_peers(tp_wma_handle wma,
  * respect to the self sta and the peer after roaming and completes
  * respect to the self sta and the peer after roaming and completes
  * the roam synch propagation with respect to WMA layer.
  * the roam synch propagation with respect to WMA layer.
  *
  *
- * Return: None
+ * Return: QDF_STATUS
  */
  */
-static void
+static QDF_STATUS
 wma_roam_update_vdev(tp_wma_handle wma,
 wma_roam_update_vdev(tp_wma_handle wma,
 		     struct roam_offload_synch_ind *roam_synch_ind_ptr,
 		     struct roam_offload_synch_ind *roam_synch_ind_ptr,
 		     uint8_t roamed_vdev_id)
 		     uint8_t roamed_vdev_id)
@@ -707,8 +707,7 @@ wma_roam_update_vdev(tp_wma_handle wma,
 	wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
 	wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
 
 
 	/* update channel width */
 	/* update channel width */
-	wma->interfaces[vdev_id].chan_width =
-		roam_synch_ind_ptr->chan_width;
+	wma->interfaces[vdev_id].chan_width = roam_synch_ind_ptr->chan_width;
 	/* Fill link freq from roam_synch_ind */
 	/* Fill link freq from roam_synch_ind */
 	if (is_multi_link_roam(roam_synch_ind_ptr))
 	if (is_multi_link_roam(roam_synch_ind_ptr))
 		wma->interfaces[vdev_id].ch_freq =
 		wma->interfaces[vdev_id].ch_freq =
@@ -718,9 +717,8 @@ wma_roam_update_vdev(tp_wma_handle wma,
 			roam_synch_ind_ptr->chan_freq;
 			roam_synch_ind_ptr->chan_freq;
 
 
 	add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
 	add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
-	if (!add_sta_params) {
-		return;
-	}
+	if (!add_sta_params)
+		return QDF_STATUS_E_INVAL;
 
 
 	if (is_multi_link_roam(roam_synch_ind_ptr))
 	if (is_multi_link_roam(roam_synch_ind_ptr))
 		mlo_get_sta_link_mac_addr(vdev_id, roam_synch_ind_ptr,
 		mlo_get_sta_link_mac_addr(vdev_id, roam_synch_ind_ptr,
@@ -745,35 +743,45 @@ wma_roam_update_vdev(tp_wma_handle wma,
 
 
 	add_sta_params->staType = STA_ENTRY_SELF;
 	add_sta_params->staType = STA_ENTRY_SELF;
 	add_sta_params->smesessionId = vdev_id;
 	add_sta_params->smesessionId = vdev_id;
-	qdf_mem_copy(&add_sta_params->bssId, &mac_addr,
-			 QDF_MAC_ADDR_SIZE);
+	qdf_mem_copy(&add_sta_params->bssId, &mac_addr, QDF_MAC_ADDR_SIZE);
 	add_sta_params->assocId = roam_synch_ind_ptr->aid;
 	add_sta_params->assocId = roam_synch_ind_ptr->aid;
 
 
 	bssid = wma_get_vdev_bssid(wma->interfaces[vdev_id].vdev);
 	bssid = wma_get_vdev_bssid(wma->interfaces[vdev_id].vdev);
 	if (!bssid) {
 	if (!bssid) {
 		wma_err("Failed to get bssid for vdev_%d", vdev_id);
 		wma_err("Failed to get bssid for vdev_%d", vdev_id);
-		return;
+		return QDF_STATUS_E_INVAL;
 	}
 	}
 
 
 	is_assoc_peer = wlan_vdev_mlme_get_is_mlo_vdev(wma->psoc, vdev_id);
 	is_assoc_peer = wlan_vdev_mlme_get_is_mlo_vdev(wma->psoc, vdev_id);
 	if (is_multi_link_roam(roam_synch_ind_ptr)) {
 	if (is_multi_link_roam(roam_synch_ind_ptr)) {
-		wma_create_peer(wma, mac_addr.bytes,
-				WMI_PEER_TYPE_DEFAULT, vdev_id,
-				roam_synch_ind_ptr->bssid.bytes,
-				is_assoc_peer);
+		status = wma_create_peer(wma, mac_addr.bytes,
+					 WMI_PEER_TYPE_DEFAULT, vdev_id,
+					 roam_synch_ind_ptr->bssid.bytes,
+					 is_assoc_peer);
 	} else {
 	} else {
-		wma_create_peer(wma, mac_addr.bytes,
-				WMI_PEER_TYPE_DEFAULT,
-				vdev_id,
-				NULL,
-				is_assoc_peer);
+		status = wma_create_peer(wma, mac_addr.bytes,
+					 WMI_PEER_TYPE_DEFAULT, vdev_id, NULL,
+					 is_assoc_peer);
 	}
 	}
 
 
-	if (is_multi_link_roam(roam_synch_ind_ptr))
-		lim_roam_mlo_create_peer(wma->mac_context,
-					 roam_synch_ind_ptr,
-					 vdev_id,
-					 mac_addr.bytes);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		wma_err("Failed to create peer " QDF_MAC_ADDR_FMT,
+			QDF_MAC_ADDR_REF(mac_addr.bytes));
+		goto end;
+	}
+
+	if (is_multi_link_roam(roam_synch_ind_ptr)) {
+		status = lim_roam_mlo_create_peer(wma->mac_context,
+						  roam_synch_ind_ptr, vdev_id,
+						  mac_addr.bytes);
+
+		/* The created peer will be destroyed on HO failure cleanup */
+		if (QDF_IS_STATUS_ERROR(status)) {
+			wma_err("Failed to attach MLO peer " QDF_MAC_ADDR_FMT,
+				QDF_MAC_ADDR_REF(mac_addr.bytes));
+			goto end;
+		}
+	}
 
 
 	if (wlan_vdev_mlme_get_opmode(wma->interfaces[vdev_id].vdev) ==
 	if (wlan_vdev_mlme_get_opmode(wma->interfaces[vdev_id].vdev) ==
 								QDF_STA_MODE)
 								QDF_STA_MODE)
@@ -796,6 +804,7 @@ wma_roam_update_vdev(tp_wma_handle wma,
 				      roam_synch_ind_ptr);
 				      roam_synch_ind_ptr);
 end:
 end:
 	qdf_mem_free(add_sta_params);
 	qdf_mem_free(add_sta_params);
+	return status;
 }
 }
 
 
 static void wma_update_phymode_on_roam(tp_wma_handle wma,
 static void wma_update_phymode_on_roam(tp_wma_handle wma,
@@ -3148,19 +3157,24 @@ QDF_STATUS wma_send_ht40_obss_scanind(tp_wma_handle wma,
 }
 }
 
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
-void cm_roam_update_vdev(struct wlan_objmgr_vdev *vdev,
-			 struct roam_offload_synch_ind *sync_ind)
+QDF_STATUS cm_roam_update_vdev(struct wlan_objmgr_vdev *vdev,
+			       struct roam_offload_synch_ind *sync_ind)
 {
 {
+	QDF_STATUS status;
 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 	struct qdf_mac_addr *self_mac_addr;
 	struct qdf_mac_addr *self_mac_addr;
 	uint8_t vdev_id;
 	uint8_t vdev_id;
 
 
 	if (!wma)
 	if (!wma)
-		return;
+		return QDF_STATUS_E_INVAL;
 
 
 	vdev_id = wlan_vdev_get_id(vdev);
 	vdev_id = wlan_vdev_get_id(vdev);
 
 
-	wma_roam_update_vdev(wma, sync_ind, vdev_id);
+	status = wma_roam_update_vdev(wma, sync_ind, vdev_id);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		wma_debug("VDEV update failed for roam on %d", vdev_id);
+		return status;
+	}
 
 
 	if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
 	if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
 		self_mac_addr =
 		self_mac_addr =
@@ -3170,13 +3184,15 @@ void cm_roam_update_vdev(struct wlan_objmgr_vdev *vdev,
 
 
 	if (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
 	if (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
 	    wlan_vdev_mlme_is_mlo_link_vdev(vdev))
 	    wlan_vdev_mlme_is_mlo_link_vdev(vdev))
-		return;
+		return QDF_STATUS_SUCCESS;
 
 
 	self_mac_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_mldaddr(vdev);
 	self_mac_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_mldaddr(vdev);
 
 
 update_deflink:
 update_deflink:
 	/* Set the assoc vdev as DP deflink after roaming */
 	/* Set the assoc vdev as DP deflink after roaming */
 	wlan_dp_update_def_link(wma->psoc, self_mac_addr, vdev);
 	wlan_dp_update_def_link(wma->psoc, self_mac_addr, vdev);
+
+	return QDF_STATUS_SUCCESS;
 }
 }
 
 
 QDF_STATUS
 QDF_STATUS

+ 3 - 1
core/wma/src/wma_utils.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -4449,6 +4449,8 @@ void wma_remove_bss_peer_on_failure(tp_wma_handle wma, uint8_t vdev_id)
 		return;
 		return;
 	}
 	}
 
 
+	wma_delete_peer_mlo(wma->psoc, bss_peer.bytes);
+
 	wma_remove_peer(wma, bss_peer.bytes, vdev_id, false);
 	wma_remove_peer(wma, bss_peer.bytes, vdev_id, false);
 }
 }
 
 

+ 3 - 3
uapi/linux/dbglog_common.h

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
  * Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -94,7 +94,7 @@ struct wlan_diag_data {
 	unsigned int word0;             /* type, length */
 	unsigned int word0;             /* type, length */
 	unsigned int target_time;
 	unsigned int target_time;
 	unsigned int code;              /* Diag log or event Code */
 	unsigned int code;              /* Diag log or event Code */
-	uint8_t payload[0];
+	uint8_t payload[];
 };
 };
 
 
 struct dbglog_slot {
 struct dbglog_slot {
@@ -103,7 +103,7 @@ struct dbglog_slot {
 	unsigned int length;
 	unsigned int length;
 	unsigned int dropped;
 	unsigned int dropped;
 	/* max ATH6KL_FWLOG_PAYLOAD_SIZE bytes */
 	/* max ATH6KL_FWLOG_PAYLOAD_SIZE bytes */
-	uint8_t payload[0];
+	uint8_t payload[];
 } __packed;
 } __packed;
 
 
 typedef struct event_report_s {
 typedef struct event_report_s {

+ 3 - 3
uapi/linux/pktlog_ac_fmt.h

@@ -1,6 +1,6 @@
 /*
 /*
  * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
  * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
  * any purpose with or without fee is hereby granted, provided that the
@@ -207,7 +207,7 @@ struct ath_pktlog_txctl {
 struct ath_pktlog_tx_status {
 struct ath_pktlog_tx_status {
 	struct ath_pktlog_hdr pl_hdr;
 	struct ath_pktlog_hdr pl_hdr;
 	void *ds_status;
 	void *ds_status;
-	int32_t misc[0];        /* Can be used for HT specific or other misc info */
+	int32_t misc[];	/* Can be used for HT specific or other misc info */
 } __ATTRIB_PACK;
 } __ATTRIB_PACK;
 
 
 struct ath_pktlog_msdu_info {
 struct ath_pktlog_msdu_info {
@@ -282,7 +282,7 @@ struct ath_pktlog_buf {
 	uint32_t msg_index;
 	uint32_t msg_index;
 	/* Offset for read */
 	/* Offset for read */
 	loff_t offset;
 	loff_t offset;
-	char log_data[0];
+	char log_data[];
 };
 };
 
 
 #define PKTLOG_MOV_RD_IDX(_rd_offset, _log_buf, _log_size)  \
 #define PKTLOG_MOV_RD_IDX(_rd_offset, _log_buf, _log_size)  \

+ 3 - 0
wlan_qcacld3_modules.bzl

@@ -18,6 +18,9 @@ _target_chipset_map = {
     "volcano": [
     "volcano": [
         "qca6750",
         "qca6750",
     ],
     ],
+    "parrot": [
+        "qca6750",
+    ],
 }
 }
 
 
 _chipset_hw_map = {
 _chipset_hw_map = {