Browse Source

Merge c6727cbd5583701488344d84a328d4db425f4d4e on remote branch

Change-Id: I39aab1046f06748a70979cca24cef8b8f764515c
Linux Build Service Account 11 tháng trước cách đây
mục cha
commit
6997e9f06a

+ 9 - 9
dp/inc/cdp_txrx_stats_struct.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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 purpose with or without fee is hereby granted, provided that the
@@ -2555,25 +2555,25 @@ struct cdp_pdev_obss_pd_stats_tlv {
 
 struct cdp_htt_tx_pdev_stats_urrn_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
-    uint32_t urrn_stats[1]; /* HTT_TX_PDEV_MAX_URRN_STATS */
+    QDF_FLEX_ARRAY(uint32_t, urrn_stats); /* HTT_TX_PDEV_MAX_URRN_STATS */
 };
 
 /* NOTE: Variable length TLV, use length spec to infer array size */
 struct cdp_htt_tx_pdev_stats_flush_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
-    uint32_t flush_errs[1]; /* HTT_TX_PDEV_MAX_FLUSH_REASON_STATS */
+    QDF_FLEX_ARRAY(uint32_t, flush_errs); /* HTT_TX_PDEV_MAX_FLUSH_REASON_STATS */
 };
 
 /* NOTE: Variable length TLV, use length spec to infer array size */
 struct cdp_htt_tx_pdev_stats_sifs_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
-    uint32_t sifs_status[1]; /* HTT_TX_PDEV_MAX_SIFS_BURST_STATS */
+    QDF_FLEX_ARRAY(uint32_t, sifs_status); /* HTT_TX_PDEV_MAX_SIFS_BURST_STATS */
 };
 
 /* NOTE: Variable length TLV, use length spec to infer array size */
 struct cdp_htt_tx_pdev_stats_phy_err_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
-    uint32_t  phy_errs[1]; /* HTT_TX_PDEV_MAX_PHY_ERR_STATS */
+    QDF_FLEX_ARRAY(uint32_t, phy_errs); /* HTT_TX_PDEV_MAX_PHY_ERR_STATS */
 };
 
 /* == RX PDEV/SOC STATS == */
@@ -2595,19 +2595,19 @@ struct cdp_htt_rx_soc_fw_stats_tlv {
 struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
     /* Num total buf refilled from refill ring */
-    uint32_t refill_ring_num_refill[1]; /* HTT_RX_STATS_REFILL_MAX_RING */
+    QDF_FLEX_ARRAY(uint32_t, refill_ring_num_refill); /* HTT_RX_STATS_REFILL_MAX_RING */
 };
 
 struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
     /* Num error MPDU for each RxDMA error type  */
-    uint32_t fw_ring_mpdu_err[1]; /* HTT_RX_STATS_RXDMA_MAX_ERR */
+    QDF_FLEX_ARRAY(uint32_t, fw_ring_mpdu_err); /* HTT_RX_STATS_RXDMA_MAX_ERR */
 };
 
 struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
     /* Num MPDU dropped  */
-    uint32_t fw_mpdu_drop[1]; /* HTT_RX_STATS_FW_DROP_REASON_MAX */
+    QDF_FLEX_ARRAY(uint32_t, fw_mpdu_drop); /* HTT_RX_STATS_FW_DROP_REASON_MAX */
 };
 
 #define HTT_STATS_PHY_ERR_MAX 43
@@ -2675,7 +2675,7 @@ struct cdp_htt_rx_pdev_fw_stats_phy_err_tlv {
 struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v {
     struct cdp_htt_tlv_hdr tlv_hdr;
     /* Num ring empty encountered */
-    uint32_t refill_ring_empty_cnt[1]; /* HTT_RX_STATS_REFILL_MAX_RING */
+    QDF_FLEX_ARRAY(uint32_t, refill_ring_empty_cnt); /* HTT_RX_STATS_REFILL_MAX_RING */
 };
 
 struct cdp_htt_tx_pdev_stats {

+ 3 - 2
dp/wifi3.0/be/dp_be_tx.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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 purpose with or without fee is hereby granted, provided that the
@@ -1238,7 +1238,8 @@ next_desc:
 						       num_avail_for_reap,
 						       hal_ring_hdl,
 						       &last_prefetch_hw_desc,
-						       &last_prefetch_sw_desc);
+						       &last_prefetch_sw_desc,
+						       NULL);
 		}
 	}
 

+ 11 - 9
dp/wifi3.0/dp_internal.h

@@ -4082,15 +4082,16 @@ static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
  * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring
  * @num_entries: Entry count
  *
- * Return: None
+ * Return: HAL ring descriptor
  */
-static inline void dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
-						hal_ring_handle_t hal_ring_hdl,
-						uint32_t num_entries)
+static inline void *dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
+						 hal_ring_handle_t hal_ring_hdl,
+						 uint32_t num_entries)
 {
 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
 
-	hal_srng_dst_inv_cached_descs(hal_soc, hal_ring_hdl, num_entries);
+	return hal_srng_dst_inv_cached_descs(hal_soc, hal_ring_hdl,
+					     num_entries);
 }
 #else
 static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
@@ -4101,10 +4102,11 @@ static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
 	return hal_srng_dst_get_next(hal_soc, hal_ring_hdl);
 }
 
-static inline void dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
-						hal_ring_handle_t hal_ring_hdl,
-						uint32_t num_entries)
+static inline void *dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
+						 hal_ring_handle_t hal_ring_hdl,
+						 uint32_t num_entries)
 {
+	return NULL;
 }
 #endif /* QCA_CACHED_RING_DESC */
 
@@ -4814,7 +4816,7 @@ struct dp_frag_history_opaque_atomic {
 	qdf_atomic_t index;
 	uint16_t num_entries_per_slot;
 	uint16_t allocated;
-	void *entry[0];
+	void *entry[];
 };
 
 static inline QDF_STATUS

+ 2 - 2
dp/wifi3.0/dp_stats.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2017-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 purpose with or without fee is hereby granted, provided that the
@@ -8560,7 +8560,7 @@ void dp_print_tso_stats(struct dp_soc *soc,
 		pdev = soc->pdev_list[loop_pdev];
 		DP_PRINT_STATS("TSO Statistics\n");
 		DP_PRINT_STATS(
-			  "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d",
+			  "From stack: %llu | Successful completions: %llu | TSO Packets: %llu | TSO Completions: %d",
 			  pdev->stats.tx_i.rcvd.num,
 			  pdev->stats.tx.tx_success.num,
 			  pdev->stats.tso_stats.num_tso_pkts.num,

+ 7 - 4
dp/wifi3.0/dp_tx.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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 purpose with or without fee is hereby granted, provided that the
@@ -6538,7 +6538,7 @@ void dp_tx_dump_tx_desc(struct dp_tx_desc_s *tx_desc)
 		dp_tx_comp_warn("tx_desc->flags: 0x%x", tx_desc->flags);
 		dp_tx_comp_warn("tx_desc->id: %u", tx_desc->id);
 		dp_tx_comp_warn("tx_desc->dma_addr: 0x%x",
-				tx_desc->dma_addr);
+				(unsigned int)tx_desc->dma_addr);
 		dp_tx_comp_warn("tx_desc->vdev_id: %u",
 				tx_desc->vdev_id);
 		dp_tx_comp_warn("tx_desc->tx_status: %u",
@@ -6704,6 +6704,7 @@ uint32_t dp_tx_comp_handler(struct dp_intr *int_ctx, struct dp_soc *soc,
 {
 	void *tx_comp_hal_desc;
 	void *last_prefetched_hw_desc = NULL;
+	void *last_hw_desc = NULL;
 	struct dp_tx_desc_s *last_prefetched_sw_desc = NULL;
 	hal_soc_handle_t hal_soc;
 	uint8_t buffer_src;
@@ -6753,7 +6754,8 @@ more_data:
 	if (num_avail_for_reap >= quota)
 		num_avail_for_reap = quota;
 
-	dp_srng_dst_inv_cached_descs(soc, hal_ring_hdl, num_avail_for_reap);
+	last_hw_desc = dp_srng_dst_inv_cached_descs(soc, hal_ring_hdl,
+						    num_avail_for_reap);
 	last_prefetched_hw_desc = dp_srng_dst_prefetch_32_byte_desc(hal_soc,
 							    hal_ring_hdl,
 							    num_avail_for_reap);
@@ -6954,7 +6956,8 @@ next_desc:
 					       num_avail_for_reap,
 					       hal_ring_hdl,
 					       &last_prefetched_hw_desc,
-					       &last_prefetched_sw_desc);
+					       &last_prefetched_sw_desc,
+					       last_hw_desc);
 
 		if (dp_tx_comp_loop_pkt_limit_hit(soc, count, max_reap_limit))
 			break;

+ 9 - 2
dp/wifi3.0/dp_tx.h

@@ -781,6 +781,7 @@ static inline QDF_STATUS dp_tx_pdev_init(struct dp_pdev *pdev)
  * @hal_ring_hdl: ring pointer
  * @last_prefetched_hw_desc: pointer to the last prefetched HW descriptor
  * @last_prefetched_sw_desc: pointer to last prefetch SW desc
+ * @last_hw_desc: pointer to last HW desc
  *
  * Return: None
  */
@@ -792,13 +793,18 @@ void dp_tx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc,
 				    hal_ring_handle_t hal_ring_hdl,
 				    void **last_prefetched_hw_desc,
 				    struct dp_tx_desc_s
-				    **last_prefetched_sw_desc)
+				    **last_prefetched_sw_desc,
+				    void *last_hw_desc)
 {
 	if (*last_prefetched_sw_desc) {
 		qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf);
 		qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf + 64);
 	}
 
+	if (qdf_unlikely(last_hw_desc &&
+			 (*last_prefetched_hw_desc == last_hw_desc)))
+		return;
+
 	if (num_avail_for_reap && *last_prefetched_hw_desc) {
 		soc->arch_ops.tx_comp_get_params_from_hal_desc(soc,
 						       *last_prefetched_hw_desc,
@@ -825,7 +831,8 @@ void dp_tx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc,
 				    hal_ring_handle_t hal_ring_hdl,
 				    void **last_prefetched_hw_desc,
 				    struct dp_tx_desc_s
-				    **last_prefetched_sw_desc)
+				    **last_prefetched_sw_desc,
+				    void *last_hw_desc)
 {
 }
 #endif

+ 1 - 2
dp/wifi3.0/monitor/dp_mon.c

@@ -261,8 +261,6 @@ QDF_STATUS dp_reset_monitor_mode_unlock(struct cdp_soc_t *soc_hdl,
 #endif
 	}
 
-	mon_pdev->mvdev = NULL;
-
 	/*
 	 * Lite monitor mode, smart monitor mode and monitor
 	 * mode uses this APIs to filter reset and mode disable
@@ -293,6 +291,7 @@ QDF_STATUS dp_reset_monitor_mode_unlock(struct cdp_soc_t *soc_hdl,
 				   soc);
 	}
 
+	mon_pdev->mvdev = NULL;
 	mon_pdev->monitor_configured = false;
 
 	return QDF_STATUS_SUCCESS;

+ 10 - 7
hal/wifi3.0/hal_api.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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 purpose with or without fee is hereby granted, provided that the
@@ -1810,11 +1810,12 @@ uint32_t hal_srng_dst_num_valid(void *hal_soc,
  *
  * Invalidates a set of cached descriptors starting from TP to cached_HP
  *
- * Return: None
+ * Return: HAL ring descriptor
  */
-static inline void hal_srng_dst_inv_cached_descs(void *hal_soc,
-						 hal_ring_handle_t hal_ring_hdl,
-						 uint32_t entry_count)
+static inline void *
+hal_srng_dst_inv_cached_descs(void *hal_soc,
+			      hal_ring_handle_t hal_ring_hdl,
+			      uint32_t entry_count)
 {
 	struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
 	uint32_t *first_desc;
@@ -1826,10 +1827,10 @@ static inline void hal_srng_dst_inv_cached_descs(void *hal_soc,
 	 * API call should be a no op
 	 */
 	if (!(srng->flags & HAL_SRNG_CACHED_DESC))
-		return;
+		return NULL;
 
 	if (!entry_count)
-		return;
+		return NULL;
 
 	first_desc = &srng->ring_base_vaddr[srng->u.dst_ring.tp];
 
@@ -1853,6 +1854,8 @@ static inline void hal_srng_dst_inv_cached_descs(void *hal_soc,
 					      (void *)last_desc);
 	}
 	qdf_dsb();
+
+	return last_desc;
 }
 
 /**

+ 1 - 1
hif/src/ipcie/if_ipci.c

@@ -575,7 +575,7 @@ void hif_ipci_irq_set_affinity_hint(struct hif_exec_context *hif_ext_group,
 			}
 		}
 	}
-	for (i = 0; i < hif_ext_group->numirq; i++) {
+	for (i = 0; i < hif_ext_group->numirq && i < HIF_MAX_GRP_IRQ; i++) {
 		if (mask_set) {
 			ret = hif_affinity_mgr_set_qrg_irq_affinity((struct hif_softc *)hif_ext_group->hif,
 								    hif_ext_group->os_irq[i],

+ 2 - 1
hif/src/sdio/native_sdio/include/hif_internal.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -326,7 +327,7 @@ struct _HIF_SCATTER_REQ {
 	enum HIF_SCATTER_METHOD   scatter_method;
 	void                 *hif_private[4]; /* HIF private area */
 	u_int8_t             *scatter_bounce_buffer; /* bounce buffers */
-	struct _HIF_SCATTER_ITEM    scatter_list[1]; /* start of scatter list */
+	QDF_FLEX_ARRAY(struct _HIF_SCATTER_ITEM, scatter_list); /* start of scatter list */
 };
 
 typedef struct _HIF_SCATTER_REQ * (*HIF_ALLOCATE_SCATTER_REQUEST)(

+ 3 - 3
htc/htc_recv.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
- * 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 purpose with or without fee is hereby granted, provided that the
@@ -46,7 +46,7 @@ void debug_dump_bytes(uint8_t *buffer, uint16_t length, char *pDescription)
 		if (count == 16) {
 			count = 0;
 			offset = 0;
-			A_SNPRINTF(byteOffsetStr, sizeof(byteOffset), "%4.4X",
+			A_SNPRINTF(byteOffsetStr, sizeof(byteOffsetStr), "%4.4X",
 				   byteOffset);
 			A_PRINTF("[%s]: %s\n", byteOffsetStr, stream);
 			qdf_mem_zero(stream, 60);
@@ -55,7 +55,7 @@ void debug_dump_bytes(uint8_t *buffer, uint16_t length, char *pDescription)
 	}
 
 	if (offset != 0) {
-		A_SNPRINTF(byteOffsetStr, sizeof(byteOffset), "%4.4X",
+		A_SNPRINTF(byteOffsetStr, sizeof(byteOffsetStr), "%4.4X",
 			   byteOffset);
 		A_PRINTF("[%s]: %s\n", byteOffsetStr, stream);
 	}

+ 7 - 3
htc/htc_send.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013-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 purpose with or without fee is hereby granted, provided that the
@@ -1206,7 +1206,9 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
 							 HTC_PACKET_QUEUE_DEPTH(pQueue)));
 
 				pPacket = htc_get_pkt_at_head(tx_queue);
-				if (!pPacket)
+				if (!pPacket ||
+				    (pPacket->Endpoint >= ENDPOINT_MAX) ||
+				    (pPacket->Endpoint <= ENDPOINT_UNUSED))
 					break;
 				log_packet_info(target, pPacket);
 				break;
@@ -1370,7 +1372,9 @@ static void get_htc_send_packets(HTC_TARGET *target,
 				/* bus suspended, runtime resume issued */
 				QDF_ASSERT(HTC_PACKET_QUEUE_DEPTH(pQueue) == 0);
 				pPacket = htc_get_pkt_at_head(tx_queue);
-				if (!pPacket)
+				if (!pPacket ||
+				    (pPacket->Endpoint >= ENDPOINT_MAX) ||
+				    (pPacket->Endpoint <= ENDPOINT_UNUSED))
 					break;
 				log_packet_info(target, pPacket);
 				break;

+ 3 - 3
ipa/core/inc/wlan_ipa_priv.h

@@ -1,6 +1,6 @@
 /*
  * 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
  * any purpose with or without fee is hereby granted, provided that the
@@ -209,7 +209,7 @@ struct wlan_ipa_tx_hdr {
  * @reserved: Reserved not used
  */
 struct frag_header {
-	uint8_t reserved[0];
+	__QDF_DECLARE_FLEX_ARRAY(uint8_t, reserved);
 };
 #elif defined(QCA_WIFI_3_0)
 /**
@@ -241,7 +241,7 @@ struct frag_header {
  * @reserved: Reserved not used
  */
 struct ipa_header {
-	uint8_t reserved[0];
+	__QDF_DECLARE_FLEX_ARRAY(uint8_t, reserved);
 };
 #else
 /**

+ 19 - 1
os_if/linux/mlme/inc/osif_cm_util.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2015, 2020-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
  * purpose with or without fee is hereby granted, provided that the above
@@ -140,6 +140,10 @@ enum osif_cb_type {
 	OSIF_NOT_HANDLED,
 };
 
+#ifdef CONN_MGR_ADV_FEATURE
+typedef void (*osif_cm_connect_active_notify_cb)(uint8_t vdev_id);
+#endif
+
 /**
  * typedef osif_cm_connect_comp_cb  - Connect complete callback
  * @vdev: vdev pointer
@@ -364,6 +368,7 @@ typedef QDF_STATUS
 
 /**
  * struct osif_cm_ops - connection manager legacy callbacks
+ * @connect_active_notify_cb: callback for connect active to legacy modules
  * @connect_complete_cb: callback for connect complete to legacy
  * modules
  * @disconnect_complete_cb: callback for disconnect complete to
@@ -386,6 +391,9 @@ typedef QDF_STATUS
  * @perfd_set_cpufreq_cb: callback to update CPU min freq
  */
 struct osif_cm_ops {
+#ifdef CONN_MGR_ADV_FEATURE
+	osif_cm_connect_active_notify_cb connect_active_notify_cb;
+#endif
 	osif_cm_connect_comp_cb connect_complete_cb;
 	osif_cm_disconnect_comp_cb disconnect_complete_cb;
 #ifdef CONN_MGR_ADV_FEATURE
@@ -415,6 +423,16 @@ struct osif_cm_ops {
 #endif
 };
 
+#ifdef CONN_MGR_ADV_FEATURE
+/**
+ * osif_cm_connect_active_notify() - Function to notify connect active
+ * @vdev_id: VDEV ID on which connect req is active
+ *
+ * This API notifies connect active to legacy module
+ */
+void osif_cm_connect_active_notify(uint8_t vdev_id);
+#endif
+
 /**
  * osif_cm_connect_comp_ind() - Function to indicate connect
  * complete to legacy module

+ 12 - 1
os_if/linux/mlme/src/osif_cm_util.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2015, 2020-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
  * purpose with or without fee is hereby granted, provided that the above
@@ -662,6 +662,9 @@ static void osif_cm_perfd_reset_cpufreq_ctrl_cb(void)
 #endif
 
 static struct mlme_cm_ops cm_ops = {
+#ifdef CONN_MGR_ADV_FEATURE
+	.mlme_cm_connect_active_notify_cb = osif_cm_connect_active_notify,
+#endif
 	.mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb,
 	.mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb,
 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
@@ -748,6 +751,14 @@ QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef CONN_MGR_ADV_FEATURE
+void osif_cm_connect_active_notify(uint8_t vdev_id)
+{
+	if (osif_cm_legacy_ops && osif_cm_legacy_ops->connect_active_notify_cb)
+		osif_cm_legacy_ops->connect_active_notify_cb(vdev_id);
+}
+#endif
+
 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
 				    struct wlan_cm_connect_resp *rsp,
 				    enum osif_cb_type type)

+ 2 - 2
qdf/inc/qdf_ptr_hash.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 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
  * any purpose with or without fee is hereby granted, provided that the
@@ -65,7 +65,7 @@ struct qdf_ptr_hash_bucket {
 struct qdf_ptr_hash {
 	int8_t bits;
 	int16_t count;
-	struct qdf_ptr_hash_bucket buckets[0];
+	struct qdf_ptr_hash_bucket buckets[];
 };
 
 /**

+ 7 - 4
qdf/inc/qdf_types.h

@@ -37,14 +37,17 @@
 /* Preprocessor definitions and constants */
 #define QDF_MAX_SGLIST 4
 
+#define __QDF_DECLARE_FLEX_ARRAY(type, name) \
+	struct { \
+		struct {} dummy_struct; \
+		type name[]; \
+	}
+
 /* Define a QDF macro for declaring flexible arrays */
 #define QDF_FLEX_ARRAY(type, name) \
 	union { \
 		type name ## _first_element; \
-		struct { \
-			struct {} dummy_struct; \
-			type name[]; \
-		}; \
+		__QDF_DECLARE_FLEX_ARRAY(type, name); \
 	}
 
 /*

+ 3 - 3
spectral/dispatcher/inc/spectral_ioctl.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2011, 2017-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 purpose with or without fee is hereby granted, provided that the
@@ -562,7 +562,7 @@ struct samp_detector_info {
 	uint8_t is_sec80;
 	uint8_t blanking_status;
 	/* Padding bits to make struct size multiple of 4 bytes */
-	uint8_t padding_detector_info[0];
+	uint8_t padding_detector_info[];
 } __packed;
 
 /* Compile time assert to check struct size is divisible by 4 Bytes */
@@ -641,7 +641,7 @@ struct spectral_samp_msg {
 	uint8_t dcs_enabled;
 	uint8_t int_type;
 	uint8_t num_freq_spans;
-	uint8_t bin_pwr[0];  /*This should be the last item in the structure*/
+	uint8_t bin_pwr[];  /*This should be the last item in the structure*/
 } __packed;
 
 #else

+ 3 - 3
target_if/spectral/target_if_spectral.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2011,2017-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 purpose with or without fee is hereby granted, provided that the
@@ -285,7 +285,7 @@ typedef uint32_t SPECTRAL_SEGID_INFO;
  * @buf: fft report
  */
 struct spectral_phyerr_fft_gen2 {
-	uint8_t buf[0];
+	__QDF_DECLARE_FLEX_ARRAY(uint8_t, buf);
 };
 
 /**
@@ -463,7 +463,7 @@ struct spectral_phyerr_fft_report_gen3 {
 	uint32_t hdr_b;
 	uint32_t hdr_c;
 	uint32_t resv;
-	uint8_t buf[0];
+	uint8_t buf[];
 } __ATTRIB_PACK;
 
 /**

+ 13 - 1
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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 purpose with or without fee is hereby granted, provided that the
@@ -60,6 +60,16 @@
 #define mgmttxrx_nofl_debug(params...) \
 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_MGMT_TXRX, params)
 
+/**
+ * mgmt_txrx_frame_hex_dump() - Print the type and dump the rx tx frame
+ * @frame_data: The base address of the mgmt frame data to be logged.
+ * @frame_len: The size of the frame to be logged.
+ * @is_tx: is tx frame
+ *
+ * Return:  None
+ */
+void mgmt_txrx_frame_hex_dump(void *frame_data, int frame_len, bool is_tx);
+
 /**
  * enum mgmt_subtype - enum of mgmt. subtypes
  * @MGMT_SUBTYPE_ASSOC_REQ:       association request frame
@@ -317,12 +327,14 @@ enum sa_query_action {
 
 /**
  * enum protected_dual_actioncode - protected dual action frames
+ * @PDPA_ACTION_VENDOR_SPECIFIC: PDPA action vendor specific frame
  * @PDPA_GAS_INIT_REQ: pdpa gas init request frame
  * @PDPA_GAS_INIT_RSP: pdpa gas init response frame
  * @PDPA_GAS_COMEBACK_REQ: pdpa gas comeback request frame
  * @PDPA_GAS_COMEBACK_RSP: pdpa gas comeback response frame
  */
 enum protected_dual_actioncode {
+	PDPA_ACTION_VENDOR_SPECIFIC = 9,
 	PDPA_GAS_INIT_REQ = 10,
 	PDPA_GAS_INIT_RSP = 11,
 	PDPA_GAS_COMEBACK_REQ = 12,

+ 180 - 1
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_tgt_api.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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 purpose with or without fee is hereby granted, provided that the
@@ -387,6 +387,9 @@ mgmt_get_pdpa_action_subtype(uint8_t action_code)
 	enum mgmt_frame_type frm_type;
 
 	switch (action_code) {
+	case PDPA_ACTION_VENDOR_SPECIFIC:
+		frm_type = MGMT_ACTION_VENDOR_SPECIFIC;
+		break;
 	case PDPA_GAS_INIT_REQ:
 		frm_type = MGMT_ACTION_PDPA_GAS_INIT_REQ;
 		break;
@@ -1011,6 +1014,182 @@ mgmt_txrx_get_frm_type(uint8_t mgmt_subtype, uint8_t *mpdu_data_ptr)
 	return frm_type;
 }
 
+static uint8_t *mgmt_txrx_get_frm_type_string(enum mgmt_frame_type frm_type)
+{
+	switch (frm_type) {
+	CASE_RETURN_STRING(MGMT_ASSOC_REQ);
+	CASE_RETURN_STRING(MGMT_ASSOC_RESP);
+	CASE_RETURN_STRING(MGMT_REASSOC_REQ);
+	CASE_RETURN_STRING(MGMT_REASSOC_RESP);
+	CASE_RETURN_STRING(MGMT_PROBE_REQ);
+	CASE_RETURN_STRING(MGMT_PROBE_RESP);
+	CASE_RETURN_STRING(MGMT_BEACON);
+	CASE_RETURN_STRING(MGMT_ATIM);
+	CASE_RETURN_STRING(MGMT_DISASSOC);
+	CASE_RETURN_STRING(MGMT_AUTH);
+	CASE_RETURN_STRING(MGMT_DEAUTH);
+	CASE_RETURN_STRING(MGMT_ACTION_MEAS_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_MEAS_REPORT);
+	CASE_RETURN_STRING(MGMT_ACTION_TPC_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_TPC_REPORT);
+	CASE_RETURN_STRING(MGMT_ACTION_CHAN_SWITCH);
+	CASE_RETURN_STRING(MGMT_ACTION_QOS_ADD_TS_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_QOS_ADD_TS_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_QOS_DEL_TS_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_QOS_SCHEDULE);
+	CASE_RETURN_STRING(MGMT_ACTION_QOS_MAP_CONFIGURE);
+	CASE_RETURN_STRING(MGMT_ACTION_DLS_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_DLS_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_DLS_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_BA_ADDBA_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_BA_ADDBA_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_BA_DELBA);
+	CASE_RETURN_STRING(MGMT_ACTION_2040_BSS_COEXISTENCE);
+	CASE_RETURN_STRING(MGMT_ACTION_CATEGORY_VENDOR_SPECIFIC);
+	CASE_RETURN_STRING(MGMT_ACTION_CATEGORY_VENDOR_SPECIFIC_PROTECTED);
+	CASE_RETURN_STRING(MGMT_ACTION_EXT_CHANNEL_SWITCH_ID);
+	CASE_RETURN_STRING(MGMT_ACTION_VENDOR_SPECIFIC);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_DISCRESP);
+	CASE_RETURN_STRING(MGMT_ACTION_RRM_RADIO_MEASURE_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_RRM_RADIO_MEASURE_RPT);
+	CASE_RETURN_STRING(MGMT_ACTION_RRM_LINK_MEASUREMENT_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_RRM_LINK_MEASUREMENT_RPT);
+	CASE_RETURN_STRING(MGMT_ACTION_RRM_NEIGHBOR_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_RRM_NEIGHBOR_RPT);
+	CASE_RETURN_STRING(MGMT_ACTION_FT_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_FT_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_FT_CONFIRM);
+	CASE_RETURN_STRING(MGMT_ACTION_FT_ACK);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_NOTIFY_CHANWIDTH);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_SMPS);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_PSMP);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_PCO_PHASE);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_CSI);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_NONCOMPRESSED_BF);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_COMPRESSED_BF);
+	CASE_RETURN_STRING(MGMT_ACTION_HT_ASEL_IDX_FEEDBACK);
+	CASE_RETURN_STRING(MGMT_ACTION_SA_QUERY_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_SA_QUERY_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_PDPA_GAS_INIT_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_PDPA_GAS_INIT_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_PDPA_GAS_COMEBACK_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_PDPA_GAS_COMEBACK_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_BSS_TM_QUERY);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_BSS_TM_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_BSS_TM_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_NOTIF_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_NOTIF_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_FMS_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_FMS_RESP);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_TFS_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_TFS_RESP);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_TFS_NOTIFY);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_SLEEP_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_SLEEP_RESP);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_TIM_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_WNM_TIM_RESP);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_SETUP_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_SETUP_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_SETUP_CNF);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_PEER_TRAFFIC_IND);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_CH_SWITCH_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_CH_SWITCH_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_PEER_PSM_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_PEER_PSM_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_PEER_TRAFFIC_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_TDLS_DIS_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_LINK_METRIC_REPORT);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_HWMP_PATH_SELECTION);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_GATE_ANNOUNCEMENT);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_CONGESTION_CONTROL_NOTIFICATION);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_MCCA_SETUP_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_MCCA_SETUP_REPLY);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_MCCA_ADVERTISEMENT_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_MCCA_ADVERTISEMENT);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_MCCA_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_TBTT_ADJUSTMENT_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_MESH_TBTT_ADJUSTMENT_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_SP_MESH_PEERING_OPEN);
+	CASE_RETURN_STRING(MGMT_ACTION_SP_MESH_PEERING_CONFIRM);
+	CASE_RETURN_STRING(MGMT_ACTION_SP_MESH_PEERING_CLOSE);
+	CASE_RETURN_STRING(MGMT_ACTION_SP_MGK_INFORM);
+	CASE_RETURN_STRING(MGMT_ACTION_SP_MGK_ACK);
+	CASE_RETURN_STRING(MGMT_ACTION_WMM_QOS_SETUP_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_WMM_QOS_SETUP_RESP);
+	CASE_RETURN_STRING(MGMT_ACTION_WMM_QOS_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_VHT_COMPRESSED_BF);
+	CASE_RETURN_STRING(MGMT_ACTION_VHT_GID_NOTIF);
+	CASE_RETURN_STRING(MGMT_ACTION_VHT_OPMODE_NOTIF);
+	CASE_RETURN_STRING(MGMT_ACTION_GAS_INITIAL_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_GAS_INITIAL_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_GAS_COMEBACK_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_GAS_COMEBACK_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_FST_SETUP_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_FST_SETUP_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_FST_TEAR_DOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_FST_ACK_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_FST_ACK_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_FST_ON_CHANNEL_TUNNEL);
+	CASE_RETURN_STRING(MGMT_ACTION_SCS_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_SCS_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_GROUP_MEMBERSHIP_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_GROUP_MEMBERSHIP_RSP);
+	CASE_RETURN_STRING(MGMT_ACTION_MCSC_REQ);
+	CASE_RETURN_STRING(MGMT_ACTION_MCSC_RSP);
+	CASE_RETURN_STRING(MGMT_FRAME_TYPE_ALL);
+	CASE_RETURN_STRING(MGMT_CTRL_FRAME);
+	CASE_RETURN_STRING(MGMT_ACTION_TWT_SETUP);
+	CASE_RETURN_STRING(MGMT_ACTION_TWT_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_TWT_INFORMATION);
+	CASE_RETURN_STRING(MGMT_ACTION_EHT_T2LM_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_EHT_T2LM_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_EHT_T2LM_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_EHT_EPCS_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_EHT_EPCS_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_EHT_EPCS_TEARDOWN);
+	CASE_RETURN_STRING(MGMT_ACTION_FTM_REQUEST);
+	CASE_RETURN_STRING(MGMT_ACTION_FTM_RESPONSE);
+	CASE_RETURN_STRING(MGMT_ACTION_FILS_DISCOVERY);
+	default:
+		break;
+	}
+
+	return (uint8_t *)"MGMT_UNKNOWN";
+}
+
+void mgmt_txrx_frame_hex_dump(void *frame_data, int frame_len, bool is_tx)
+{
+	struct ieee80211_frame *wh;
+	uint8_t mgmt_type, mgmt_subtype;
+	enum mgmt_frame_type frm_type;
+	uint8_t *mpdu_data_ptr = NULL;
+
+	if (frame_len < sizeof(struct ieee80211_frame)) {
+		mgmt_txrx_debug("frame len %d less than hdr size", frame_len);
+		return;
+	}
+	wh = (struct ieee80211_frame *)frame_data;
+	mgmt_type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
+	mgmt_subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
+
+	if (mgmt_type != IEEE80211_FC0_TYPE_MGT) {
+		mgmt_txrx_debug("frame type %d not mgmt type", mgmt_type);
+		return;
+	}
+	/* mpdu_data_ptr is pointer to action header */
+	mpdu_data_ptr = (uint8_t *)frame_data + sizeof(struct ieee80211_frame);
+
+	frm_type = mgmt_txrx_get_frm_type(mgmt_subtype, mpdu_data_ptr);
+	mgmttxrx_nofl_debug("%s MGMT: %s(%d) seq %d len %d:",
+			    is_tx ? "TX" : "RX",
+			    mgmt_txrx_get_frm_type_string(frm_type), frm_type,
+			    le16toh(*(uint16_t *)wh->i_seq) >>
+			    WLAN_SEQ_SEQ_SHIFT, frame_len);
+	qdf_trace_hex_dump(QDF_MODULE_ID_MGMT_TXRX, QDF_TRACE_LEVEL_DEBUG,
+			   frame_data, frame_len);
+}
+
 #ifdef WLAN_IOT_SIM_SUPPORT
 static QDF_STATUS simulation_frame_update(struct wlan_objmgr_psoc *psoc,
 					  qdf_nbuf_t buf,

+ 2 - 2
umac/cmn_services/regulatory/inc/wlan_reg_afc.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 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
  * purpose with or without fee is hereby granted, provided that the above
@@ -180,7 +180,7 @@ struct wlan_afc_host_resp {
 	uint32_t time_to_live;
 	uint32_t length;
 	uint32_t resp_format;
-	uint8_t  afc_resp[0];
+	uint8_t afc_resp[];
 } qdf_packed;
 
 /**

+ 3 - 3
umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2011, 2016-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.
  * Copyright (c) 2010, Atheros Communications Inc.
  * All Rights Reserved.
  *
@@ -358,7 +358,7 @@ struct synthetic_pulse {
 struct synthetic_seq {
 	uint8_t num_pulses;
 	uint32_t total_len_seq;
-	struct synthetic_pulse *pulse[0];
+	struct synthetic_pulse *pulse[];
 };
 
 /**
@@ -370,7 +370,7 @@ struct synthetic_seq {
 
 struct seq_store {
 	uint8_t num_sequence;
-	struct synthetic_seq *seq_arr[0];
+	struct synthetic_seq *seq_arr[];
 };
 #endif /* WLAN_DFS_PARTIAL_OFFLOAD && WLAN_DFS_SYNTHETIC_RADAR */
 

+ 50 - 3
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -2458,9 +2458,11 @@ QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 	 * free vdev keys before setting crypto params for 1x/ owe roaming,
 	 * link vdev keys would be cleaned in osif
 	 */
-	if (!wlan_vdev_mlme_is_mlo_link_vdev(cm_ctx->vdev) &&
-	    !wlan_cm_check_mlo_roam_auth_status(cm_ctx->vdev))
-		wlan_crypto_free_vdev_key(cm_ctx->vdev);
+	if (!wlan_vdev_mlme_is_mlo_link_vdev(cm_ctx->vdev)) {
+		mlme_cm_osif_connect_active_notify(wlan_vdev_get_id(cm_ctx->vdev));
+		if (!wlan_cm_check_mlo_roam_auth_status(cm_ctx->vdev))
+			wlan_crypto_free_vdev_key(cm_ctx->vdev);
+	}
 	cm_fill_vdev_crypto_params(cm_ctx, req);
 	cm_store_wep_key(cm_ctx, &req->crypto, *cm_id);
 
@@ -3273,6 +3275,44 @@ post_err:
 	return qdf_status;
 }
 
+#if defined(CONN_MGR_ADV_FEATURE) && defined(WLAN_FEATURE_11BE_MLO)
+QDF_STATUS cm_bss_peer_create_resp_mlo_attach(struct wlan_objmgr_vdev *vdev,
+					      struct qdf_mac_addr *peer_mac)
+{
+	QDF_STATUS status;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_objmgr_peer *link_peer;
+	struct mlo_partner_info partner_info;
+
+	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
+		return QDF_STATUS_SUCCESS;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc)
+		return QDF_STATUS_E_NULL_VALUE;
+
+	link_peer = wlan_objmgr_get_peer_by_mac(psoc, (uint8_t *)peer_mac,
+						WLAN_MLME_CM_ID);
+	if (!link_peer)
+		return QDF_STATUS_E_NULL_VALUE;
+
+	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 = wlan_vdev_get_link_id(vdev);
+
+	status = wlan_mlo_peer_create(vdev, link_peer, &partner_info, NULL, 0);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mlme_err("Failed to attach MLO peer " QDF_MAC_ADDR_FMT,
+			 QDF_MAC_ADDR_REF(peer_mac->bytes));
+	}
+
+	wlan_objmgr_peer_release_ref(link_peer, WLAN_MLME_CM_ID);
+
+	return status;
+}
+#endif
+
 QDF_STATUS cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 				  QDF_STATUS status,
 				  struct qdf_mac_addr *peer_mac)
@@ -3298,6 +3338,12 @@ QDF_STATUS cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 	}
 
 	if (QDF_IS_STATUS_SUCCESS(status)) {
+		qdf_status = cm_bss_peer_create_resp_mlo_attach(vdev, peer_mac);
+		if (QDF_IS_STATUS_ERROR(qdf_status)) {
+			mlme_cm_bss_peer_delete_req(vdev);
+			goto next_candidate;
+		}
+
 		qdf_status =
 			cm_sm_deliver_event(vdev,
 					  WLAN_CM_SM_EV_BSS_CREATE_PEER_SUCCESS,
@@ -3309,6 +3355,7 @@ QDF_STATUS cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 		goto post_err;
 	}
 
+next_candidate:
 	/* In case of failure try with next candidate */
 	resp = qdf_mem_malloc(sizeof(*resp));
 	if (!resp) {

+ 23 - 16
umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2011-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
  * purpose with or without fee is hereby granted, provided that the above
@@ -898,26 +898,33 @@ QDF_STATUS cm_roam_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (QDF_IS_STATUS_ERROR(status)) {
-		cm_req = cm_get_req_by_cm_id(cm_ctx, cm_id);
-		if (!cm_req)
-			return QDF_STATUS_E_INVAL;
+	if (QDF_IS_STATUS_SUCCESS(status)) {
+		qdf_status = cm_bss_peer_create_resp_mlo_attach(vdev, peer_mac);
+		if (QDF_IS_STATUS_ERROR(qdf_status)) {
+			mlme_cm_bss_peer_delete_req(vdev);
+			goto send_err;
+		}
 
-		return cm_send_reassoc_start_fail(
-				cm_ctx, cm_id,
-				CM_PEER_CREATE_FAILED, false);
-	}
+		qdf_status =
+		    cm_sm_deliver_event(vdev,
+					WLAN_CM_SM_EV_BSS_CREATE_PEER_SUCCESS,
+					sizeof(wlan_cm_id), &cm_id);
+
+		if (QDF_IS_STATUS_ERROR(qdf_status)) {
+			mlme_cm_bss_peer_delete_req(vdev);
+			cm_reassoc_handle_event_post_fail(cm_ctx, cm_id);
+		}
 
-	qdf_status = cm_sm_deliver_event(
-			vdev, WLAN_CM_SM_EV_BSS_CREATE_PEER_SUCCESS,
-			sizeof(wlan_cm_id), &cm_id);
-	if (QDF_IS_STATUS_SUCCESS(qdf_status))
 		return qdf_status;
+	}
 
-	mlme_cm_bss_peer_delete_req(vdev);
-	cm_reassoc_handle_event_post_fail(cm_ctx, cm_id);
+send_err:
+	cm_req = cm_get_req_by_cm_id(cm_ctx, cm_id);
+	if (!cm_req)
+		return QDF_STATUS_E_INVAL;
 
-	return qdf_status;
+	return cm_send_reassoc_start_fail(cm_ctx, cm_id,
+					  CM_PEER_CREATE_FAILED, false);
 }
 
 QDF_STATUS cm_roam_disconnect_rsp(struct wlan_objmgr_vdev *vdev,

+ 22 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h

@@ -219,6 +219,28 @@ QDF_STATUS cm_try_next_candidate(struct cnx_mgr *cm_ctx,
 QDF_STATUS
 cm_resume_connect_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
 
+#if defined(CONN_MGR_ADV_FEATURE) && defined(WLAN_FEATURE_11BE_MLO)
+/**
+ * cm_bss_peer_create_resp_mlo_attach() - Create MLO peer and attach objmgr peer
+ * @vdev: VDEV object manager pointer
+ * @peer_mac: MAC addr pointer for BSS peer created
+ *
+ * Creates MLO peer for the peer with @peer_mac and adds the objmgr peer to
+ * the created MLO peer context and holds reference for the MLO peer.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cm_bss_peer_create_resp_mlo_attach(struct wlan_objmgr_vdev *vdev,
+					      struct qdf_mac_addr *peer_mac);
+#else
+static inline QDF_STATUS
+cm_bss_peer_create_resp_mlo_attach(struct wlan_objmgr_vdev *vdev,
+				   struct qdf_mac_addr *peer_mac)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 /**
  * cm_bss_peer_create_rsp() - handle bss peer create response
  * @vdev: vdev

+ 18 - 1
umac/mlme/include/wlan_mlme_cmn.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2019-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
  * purpose with or without fee is hereby granted, provided that the above
@@ -32,6 +32,7 @@
 
 /**
  * struct mlme_cm_ops: connection manager osif callbacks
+ * @mlme_cm_connect_active_notify_cb: Connect active notify callback
  * @mlme_cm_connect_complete_cb: Connect done callback
  * @vdev: vdev pointer
  * @rsp: connect response
@@ -105,6 +106,7 @@
  * @mlme_cm_perfd_reset_cpufreq_ctrl_cb: callback to reset CPU min freq
  */
 struct mlme_cm_ops {
+	void (*mlme_cm_connect_active_notify_cb)(uint8_t vdev_id);
 	QDF_STATUS (*mlme_cm_connect_complete_cb)(
 					struct wlan_objmgr_vdev *vdev,
 					struct wlan_cm_connect_resp *rsp);
@@ -734,6 +736,21 @@ QDF_STATUS mlme_cm_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS mlme_cm_connect_req(struct wlan_objmgr_vdev *vdev,
 			       struct wlan_cm_vdev_connect_req *req);
 
+#ifdef CONN_MGR_ADV_FEATURE
+/**
+ * mlme_cm_osif_connect_active_notify() - CNX manager ext connect active
+ * notification.
+ * @vdev_id: VDEV ID
+ *
+ * Return: void
+ */
+void mlme_cm_osif_connect_active_notify(uint8_t vdev_id);
+#else
+static inline void mlme_cm_osif_connect_active_notify(uint8_t vdev_id)
+{
+}
+#endif
+
 /**
  * mlme_cm_connect_complete_ind() - Connection manager ext connect complete
  * indication

+ 9 - 1
umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2019-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
  * purpose with or without fee is hereby granted, provided that the above
@@ -409,6 +409,14 @@ QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
 	return ret;
 }
 
+#ifdef CONN_MGR_ADV_FEATURE
+void mlme_cm_osif_connect_active_notify(uint8_t vdev_id)
+{
+	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_connect_active_notify_cb)
+		glbl_cm_ops->mlme_cm_connect_active_notify_cb(vdev_id);
+}
+#endif
+
 QDF_STATUS mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 					struct wlan_cm_connect_resp *rsp)
 {

+ 3 - 2
utils/fwlog/dbglog_host.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013-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 purpose with or without fee is hereby granted, provided that the
@@ -1598,7 +1598,8 @@ dbglog_debugfs_raw_data(wmi_unified_t wmi_handle, const uint8_t *buf,
 	/* drop oldest entries */
 	while (skb_queue_len(&fwlog->fwlog_queue) > ATH6KL_FWLOG_MAX_ENTRIES) {
 		skb = __skb_dequeue(&fwlog->fwlog_queue);
-		kfree_skb(skb);
+		if (skb)
+			kfree_skb(skb);
 	}
 
 	spin_unlock(&fwlog->fwlog_queue.lock);

+ 1 - 1
wmi/inc/wmi_unified_param.h

@@ -9149,7 +9149,7 @@ struct wmi_roam_scan_stats_params {
  */
 struct wmi_roam_scan_stats_res {
 	uint32_t num_roam_scans;
-	struct wmi_roam_scan_stats_params roam_scan[0];
+	struct wmi_roam_scan_stats_params roam_scan[];
 };
 
 #define MAX_ROAM_CANDIDATE_AP    9

+ 1 - 1
wmi/inc/wmi_unified_priv.h

@@ -158,7 +158,7 @@ struct wmi_ext_dbg_msg {
 	uint32_t len;
 	uint64_t ts;
 	enum WMI_MSG_TYPE type;
-	uint8_t buf[0];
+	uint8_t buf[];
 };
 #endif /*WMI_EXT_DBG */