Browse Source

Merge changes If8367e9f,I5e07910d,Ia23aa9c8,Ib58b93e8,I3eb313db,I0fdcffd7,Idbd8b23d,I65a3734d,I8c9f8216,Id1b1101c,I6da8dd27,Idc8f7443,Ibca109e6,I6b4912bf,Ibbc997f3,I0dac8282,I9c5c701f,I92a2b9db,I5b581142,I244bfe9f,I8f517011,I5089db5f,I0cc344d8,I7fe97473,I85474d4f,I857ffce4,Ib5cf2c53,I6fc16706,I92b63c7e,I0a47c363,Iec0e3581,Ief8bf662,I9f74418b,I7b928b15,Id6c3d559,I9a1424ec into wlan-cld3.driver.lnx.2.0-dev

* changes:
  Release 5.2.0.51W
  qcacld-3.0: Code cleanup in Vendor ACS support code
  Release 5.2.0.51V
  qcacld-3.0: Add iwpriv support to set HE bss color
  Release 5.2.0.51U
  qcacld-3.0: Fix 80211 frame subtype value in DoS attacks check
  Release 5.2.0.51T
  qcacld-3.0: Add knobs to configure the scan paramters
  Release 5.2.0.51S
  qcacld-3.0: Add "static" to fix compilation error for HL bus
  Release 5.2.0.51R
  qcacld-3.0: Fixed wrong warning log for no return issue
  Release 5.2.0.51Q
  qcacld-3.0: Fix incorrect length of encrypted auth frame
  qcacld-3.0: Fix build error in LRO without MSM_PLATFORM
  Release 5.2.0.51P
  qcacld-3.0: Set CPU floor freq on high throughput
  Release 5.2.0.51O
  qcacld-3.0: Restrict AP switching to DFS channel
  Release 5.2.0.51N
  qcacld-3.0: Rework HDD IPA stats
  qcacld-3.0: Add warning log for IPA session control critical code path
  qcacld-3.0: Check firmware MAWC capability
  qcacld-3.0: Check vdev status before sending vdev up
  Release 5.2.0.51M
  qcacld-3.0: Return failure from cds_open for all failure paths
  qcacld-3.0: Allow recovery during firmware down
  Release 5.2.0.51L
  qcacld-3.0: Cleanup ACS channels in stop adapter
  Release 5.2.0.51K
  qcacld-3.0: Adding the missed p2p_listen_defer_interval
  Release 5.2.0.51J
  qcacld-3.0: Enable/Disable LRO for low throughput based on rx packet count
  Release 5.2.0.51I
  qcacld-3.0: add device pointer in pld snoc API
  Release 5.2.0.51H
CNSS_WLAN Service 7 years ago
parent
commit
a30b89e710
44 changed files with 1530 additions and 415 deletions
  1. 1 0
      Kbuild
  2. 44 32
      core/cds/src/cds_api.c
  3. 11 0
      core/dp/htt/htt.c
  4. 4 0
      core/dp/htt/htt_h2t.c
  5. 1 1
      core/dp/txrx/ol_tx.c
  6. 3 3
      core/dp/txrx/ol_tx_classify.c
  7. 7 7
      core/dp/txrx/ol_tx_sched.c
  8. 1 0
      core/hdd/inc/qc_sap_ioctl.h
  9. 48 0
      core/hdd/inc/wlan_hdd_cfg.h
  10. 39 0
      core/hdd/inc/wlan_hdd_ipa.h
  11. 15 0
      core/hdd/inc/wlan_hdd_lro.h
  12. 30 3
      core/hdd/inc/wlan_hdd_main.h
  13. 22 0
      core/hdd/src/wlan_hdd_cfg.c
  14. 136 31
      core/hdd/src/wlan_hdd_cfg80211.c
  15. 2 0
      core/hdd/src/wlan_hdd_driver_ops.c
  16. 73 13
      core/hdd/src/wlan_hdd_hostapd.c
  17. 495 220
      core/hdd/src/wlan_hdd_ipa.c
  18. 11 4
      core/hdd/src/wlan_hdd_lro.c
  19. 31 5
      core/hdd/src/wlan_hdd_main.c
  20. 70 3
      core/hdd/src/wlan_hdd_napi.c
  21. 2 2
      core/mac/inc/qwlan_version.h
  22. 14 0
      core/mac/inc/sir_api.h
  23. 1 0
      core/mac/inc/wni_api.h
  24. 5 0
      core/mac/src/pe/lim/lim_process_message_queue.c
  25. 56 0
      core/mac/src/pe/lim/lim_process_sme_req_messages.c
  26. 17 1
      core/mac/src/pe/lim/lim_prop_exts_utils.c
  27. 2 24
      core/mac/src/pe/lim/lim_security_utils.c
  28. 15 0
      core/mac/src/pe/lim/lim_types.h
  29. 65 4
      core/mac/src/sys/legacy/src/utils/src/parser_api.c
  30. 12 11
      core/pld/src/pld_common.c
  31. 72 3
      core/pld/src/pld_snoc.c
  32. 117 30
      core/pld/src/pld_snoc.h
  33. 2 2
      core/sap/src/sap_api_link_cntl.c
  34. 6 3
      core/sap/src/sap_fsm.c
  35. 1 1
      core/sap/src/sap_internal.h
  36. 1 1
      core/sap/src/sap_module.c
  37. 19 0
      core/sme/inc/sme_api.h
  38. 36 0
      core/sme/src/common/sme_api.c
  39. 2 0
      core/wma/inc/wma_tgt_cfg.h
  40. 2 1
      core/wma/src/wma_dev_if.c
  41. 9 0
      core/wma/src/wma_main.c
  42. 4 4
      core/wma/src/wma_mgmt.c
  43. 21 6
      core/wma/src/wma_scan_roam.c
  44. 5 0
      core/wma/src/wma_utils.c

+ 1 - 0
Kbuild

@@ -2199,6 +2199,7 @@ endif
 
 ifeq ($(CONFIG_WLAN_FEATURE_11AX),y)
 CDEFINES += -DWLAN_FEATURE_11AX
+CDEFINES += -DWLAN_FEATURE_11AX_BSS_COLOR
 endif
 
 # Dummy flag for WIN/MCL converged data path compilation

+ 44 - 32
core/cds/src/cds_api.c

@@ -410,7 +410,7 @@ cds_set_ac_specs_params(struct cds_config_info *cds_cfg)
  */
 QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 {
-	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
+	QDF_STATUS status;
 	tSirRetStatus sirStatus = eSIR_SUCCESS;
 	struct cds_config_info *cds_cfg;
 	qdf_device_t qdf_ctx;
@@ -439,37 +439,40 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 	cds_init_log_completion();
 
 	/* Initialize the probe event */
-	if (qdf_event_create(&gp_cds_context->ProbeEvent) != QDF_STATUS_SUCCESS) {
+	status = qdf_event_create(&gp_cds_context->ProbeEvent);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Unable to init probeEvent", __func__);
 		QDF_ASSERT(0);
-		return QDF_STATUS_E_FAILURE;
+		return status;
 	}
-	if (qdf_event_create(&(gp_cds_context->wmaCompleteEvent)) !=
-	    QDF_STATUS_SUCCESS) {
+
+	status = qdf_event_create(&gp_cds_context->wmaCompleteEvent);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Unable to init wmaCompleteEvent", __func__);
 		QDF_ASSERT(0);
 		goto err_probe_event;
 	}
 
-	hdd_ctx = (struct hdd_context *) (gp_cds_context->pHDDContext);
-	if ((NULL == hdd_ctx) || (NULL == hdd_ctx->config)) {
+	hdd_ctx = (struct hdd_context *)(gp_cds_context->pHDDContext);
+	if (!hdd_ctx || !hdd_ctx->config) {
 		/* Critical Error ...  Cannot proceed further */
 		cds_err("Hdd Context is Null");
 		QDF_ASSERT(0);
+
+		status = QDF_STATUS_E_FAILURE;
 		goto err_wma_complete_event;
 	}
 
 	/* Now Open the CDS Scheduler */
-
 	if (hdd_ctx->driver_status == DRIVER_MODULES_UNINITIALIZED ||
 	    cds_is_driver_recovering()) {
-		qdf_status = cds_sched_open(gp_cds_context,
-					    &gp_cds_context->qdf_sched,
-					    sizeof(cds_sched_context));
+		status = cds_sched_open(gp_cds_context,
+					&gp_cds_context->qdf_sched,
+					sizeof(cds_sched_context));
 
-		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		if (QDF_IS_STATUS_ERROR(status)) {
 			/* Critical Error ...  Cannot proceed further */
 			QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 				  "%s: Failed to open CDS Scheduler", __func__);
@@ -482,6 +485,8 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 	if (!scn) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: scn is null!", __func__);
+
+		status = QDF_STATUS_E_FAILURE;
 		goto err_sched_close;
 	}
 
@@ -489,17 +494,20 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 	if (!cds_cfg) {
 		cds_err("Cds config is NULL");
 		QDF_ASSERT(0);
+
+		status = QDF_STATUS_E_FAILURE;
 		goto err_sched_close;
 	}
+
 	hdd_enable_fastpath(hdd_ctx->config, scn);
 	hdd_wlan_update_target_info(hdd_ctx, scn);
 
-	ol_ctx = cds_get_context(QDF_MODULE_ID_BMI);
 	/* Initialize BMI and Download firmware */
-	qdf_status = bmi_download_firmware(ol_ctx);
-	if (qdf_status != QDF_STATUS_SUCCESS) {
+	ol_ctx = cds_get_context(QDF_MODULE_ID_BMI);
+	status = bmi_download_firmware(ol_ctx);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
-			  "BMI FIALED status:%d", qdf_status);
+			  "BMI FIALED status:%d", status);
 		goto err_bmi_close;
 	}
 	htcInfo.pContext = ol_ctx;
@@ -516,20 +524,22 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 	if (!gp_cds_context->htc_ctx) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Failed to Create HTC", __func__);
+
+		status = QDF_STATUS_E_FAILURE;
 		goto err_bmi_close;
 	}
 	pmo_ucfg_psoc_update_htc_handle(psoc, (void *)gp_cds_context->htc_ctx);
 
-	if (bmi_done(ol_ctx)) {
+	status = bmi_done(ol_ctx);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Failed to complete BMI phase", __func__);
 		goto err_htc_close;
 	}
 
 	/*Open the WMA module */
-	qdf_status = wma_open(psoc, hdd_update_tgt_cfg, cds_cfg);
-
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+	status = wma_open(psoc, hdd_update_tgt_cfg, cds_cfg);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		/* Critical Error ...  Cannot proceed further */
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Failed to open WMA module", __func__);
@@ -553,15 +563,16 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 	if (!HTCHandle) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: HTCHandle is null!", __func__);
+
+		status = QDF_STATUS_E_FAILURE;
 		goto err_wma_close;
 	}
 
-	qdf_status = htc_wait_target(HTCHandle);
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		cds_alert("Complete BMI phase failed. status: %d", qdf_status);
+	status = htc_wait_target(HTCHandle);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		cds_alert("Failed to complete BMI phase. status: %d", status);
 
-		if (qdf_status != QDF_STATUS_E_NOMEM
-				&& !cds_is_fw_down())
+		if (status != QDF_STATUS_E_NOMEM && !cds_is_fw_down())
 			QDF_BUG(0);
 
 		goto err_wma_close;
@@ -584,14 +595,13 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 			gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx,
 			&dp_ol_if_ops, psoc);
 
-	if (!gp_cds_context->dp_soc)
+	if (!gp_cds_context->dp_soc) {
+		status = QDF_STATUS_E_FAILURE;
 		goto err_wma_close;
+	}
 
 	pmo_ucfg_psoc_update_dp_handle(psoc, gp_cds_context->dp_soc);
 
-	if (gp_cds_context->dp_soc == NULL)
-		goto err_wma_close;
-
 	cds_set_ac_specs_params(cds_cfg);
 
 	cds_cdp_cfg_attach(cds_cfg);
@@ -606,12 +616,14 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Failed to open MAC", __func__);
 		QDF_ASSERT(0);
+
+		status = QDF_STATUS_E_FAILURE;
 		goto err_soc_detach;
 	}
 
 	/* Now proceed to open the SME */
-	qdf_status = sme_open(gp_cds_context->pMACContext);
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+	status = sme_open(gp_cds_context->pMACContext);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		/* Critical Error ...  Cannot proceed further */
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "%s: Failed to open SME", __func__);
@@ -659,7 +671,7 @@ err_wma_complete_event:
 err_probe_event:
 	qdf_event_destroy(&gp_cds_context->ProbeEvent);
 
-	return qdf_status;
+	return status;
 } /* cds_open() */
 
 QDF_STATUS cds_dp_open(struct wlan_objmgr_psoc *psoc)

+ 11 - 0
core/dp/htt/htt.c

@@ -833,6 +833,9 @@ int htt_ipa_uc_attach(struct htt_pdev_t *pdev)
 {
 	int error;
 
+	QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_INFO, "%s: enter",
+		  __func__);
+
 	/* TX resource attach */
 	error = htt_tx_ipa_uc_attach(
 		pdev,
@@ -857,6 +860,8 @@ int htt_ipa_uc_attach(struct htt_pdev_t *pdev)
 		return error;
 	}
 
+	QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_INFO, "%s: exit",
+		__func__);
 	return 0;               /* success */
 }
 
@@ -868,11 +873,17 @@ int htt_ipa_uc_attach(struct htt_pdev_t *pdev)
  */
 void htt_ipa_uc_detach(struct htt_pdev_t *pdev)
 {
+	QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_INFO, "%s: enter",
+		__func__);
+
 	/* TX IPA micro controller detach */
 	htt_tx_ipa_uc_detach(pdev);
 
 	/* RX IPA micro controller detach */
 	htt_rx_ipa_uc_detach(pdev);
+
+	QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_INFO, "%s: exit",
+		__func__);
 }
 
 /**

+ 4 - 0
core/dp/htt/htt_h2t.c

@@ -1284,6 +1284,10 @@ int htt_h2t_ipa_uc_set_active(struct htt_pdev_t *pdev,
 	else if (!uc_active && !is_tx)
 		active_target = HTT_WDI_IPA_OPCODE_RX_SUSPEND;
 
+	QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_INFO,
+			"%s: HTT_H2T_MSG_TYPE_WDI_IPA_OP_REQ (%d)\n",
+			__func__, active_target);
+
 	HTT_WDI_IPA_OP_REQUEST_OP_CODE_SET(*msg_word, active_target);
 	HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_H2T_MSG_TYPE_WDI_IPA_OP_REQ);
 

+ 1 - 1
core/dp/txrx/ol_tx.c

@@ -49,6 +49,7 @@
 /* internal header files relevant only for specific systems (Pronto) */
 #include <ol_txrx_encap.h>      /* OL_TX_ENCAP, etc */
 #include <ol_tx.h>
+#include <cdp_txrx_ipa.h>
 
 #ifdef WLAN_FEATURE_FASTPATH
 #include <hif.h>              /* HIF_DEVICE */
@@ -56,7 +57,6 @@
 #include <htt_internal.h>
 #include <htt_types.h>        /* htc_endpoint */
 #include <cdp_txrx_peer_ops.h>
-#include <cdp_txrx_ipa.h>
 #include <cdp_txrx_handle.h>
 int ce_send_fast(struct CE_handle *copyeng, qdf_nbuf_t msdu,
 		 unsigned int transfer_id, uint32_t download_len);

+ 3 - 3
core/dp/txrx/ol_tx_classify.c

@@ -367,7 +367,7 @@ struct ol_txrx_peer_t *ol_tx_tdls_peer_find(struct ol_txrx_pdev_t *pdev,
 }
 
 #else
-struct ol_txrx_peer_t *ol_tx_tdls_peer_find(struct ol_txrx_pdev_t *pdev,
+static struct ol_txrx_peer_t *ol_tx_tdls_peer_find(struct ol_txrx_pdev_t *pdev,
 						struct ol_txrx_vdev_t *vdev,
 						uint8_t *peer_id)
 {
@@ -734,7 +734,7 @@ ol_tx_classify_mgmt(
 	return txq;
 }
 
-A_STATUS
+static A_STATUS
 ol_tx_classify_extension(
 	struct ol_txrx_vdev_t *vdev,
 	struct ol_tx_desc_t *tx_desc,
@@ -845,7 +845,7 @@ ol_tx_classify_extension(
 	return A_OK;
 }
 
-A_STATUS
+static A_STATUS
 ol_tx_classify_mgmt_extension(
 		struct ol_txrx_vdev_t *vdev,
 		struct ol_tx_desc_t *tx_desc,

+ 7 - 7
core/dp/txrx/ol_tx_sched.c

@@ -936,7 +936,7 @@ ol_tx_sched_txq_deactivate_wrr_adv(
 		category->state.active = 0;
 }
 
-ol_tx_frms_queue_list *
+static ol_tx_frms_queue_list *
 ol_tx_sched_category_tx_queues_wrr_adv(struct ol_txrx_pdev_t *pdev, int cat)
 {
 	struct ol_tx_sched_wrr_adv_t *scheduler = pdev->tx_sched.scheduler;
@@ -946,7 +946,7 @@ ol_tx_sched_category_tx_queues_wrr_adv(struct ol_txrx_pdev_t *pdev, int cat)
 	return &category->state.head;
 }
 
-int
+static int
 ol_tx_sched_discard_select_category_wrr_adv(struct ol_txrx_pdev_t *pdev)
 {
 	struct ol_tx_sched_wrr_adv_t *scheduler;
@@ -974,7 +974,7 @@ ol_tx_sched_discard_select_category_wrr_adv(struct ol_txrx_pdev_t *pdev)
 	return cat;
 }
 
-void
+static void
 ol_tx_sched_txq_discard_wrr_adv(
 	struct ol_txrx_pdev_t *pdev,
 	struct ol_tx_frms_queue_t *txq,
@@ -996,7 +996,7 @@ ol_tx_sched_txq_discard_wrr_adv(
 		category->state.active = 0;
 }
 
-void
+static void
 ol_tx_sched_category_info_wrr_adv(
 	struct ol_txrx_pdev_t *pdev,
 	int cat, int *active,
@@ -1077,7 +1077,7 @@ void ol_tx_sched_wrr_param_update(struct ol_txrx_pdev_t *pdev,
 	}
 }
 
-void *
+static void *
 ol_tx_sched_init_wrr_adv(
 		struct ol_txrx_pdev_t *pdev)
 {
@@ -1228,7 +1228,7 @@ void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev)
 
 /*--- congestion control discard --------------------------------------------*/
 
-struct ol_tx_frms_queue_t *
+static struct ol_tx_frms_queue_t *
 ol_tx_sched_discard_select_txq(
 		struct ol_txrx_pdev_t *pdev,
 		ol_tx_frms_queue_list *tx_queues)
@@ -1370,7 +1370,7 @@ ol_tx_sched_notify(
 
 #define OL_TX_MSDU_ID_STORAGE_ERR(ptr) (NULL == ptr)
 
-void
+static void
 ol_tx_sched_dispatch(
 	struct ol_txrx_pdev_t *pdev,
 	struct ol_tx_sched_ctx *sctx)

+ 1 - 0
core/hdd/inc/qc_sap_ioctl.h

@@ -261,6 +261,7 @@ enum {
 	QCASAP_PARAM_RANGE_EXT,
 	QCSAP_SET_DEFAULT_AMPDU,
 	QCSAP_ENABLE_RTS_BURSTING,
+	QCASAP_SET_HE_BSS_COLOR,
 };
 
 int iw_get_channel_list(struct net_device *dev,

+ 48 - 0
core/hdd/inc/wlan_hdd_cfg.h

@@ -910,6 +910,52 @@ enum hdd_dot11_mode {
 #define CFG_ACTIVE_MIN_CHANNEL_TIME_MAX        (10000)
 #define CFG_ACTIVE_MIN_CHANNEL_TIME_DEFAULT    (20)
 
+/*
+ * <ini>
+ * gScanNumProbes - Set the number of probes on each channel for active scan
+ * @Min: 0
+ * @Max: 20
+ * @Default: 0
+ *
+ * This ini is used to set number of probes on each channel for
+ * active scan
+ *
+ * Related: None
+ *
+ * Supported Feature: Scan
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SCAN_NUM_PROBES_NAME       "gScanNumProbes"
+#define CFG_SCAN_NUM_PROBES_MIN        (0)
+#define CFG_SCAN_NUM_PROBES_MAX        (20)
+#define CFG_SCAN_NUM_PROBES_DEFAULT    (0)
+
+/*
+ * <ini>
+ * gScanProbeRepeatTime - Set the probe repeat time on each channel for active scan
+ * @Min: 0
+ * @Max: 30
+ * @Default: 0
+ *
+ * This ini is used to set probe repeat time on each channel for
+ * active scan
+ *
+ * Related: None
+ *
+ * Supported Feature: Scan
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SCAN_PROBE_REPEAT_TIME_NAME       "gScanProbeRepeatTime"
+#define CFG_SCAN_PROBE_REPEAT_TIME_MIN        (0)
+#define CFG_SCAN_PROBE_REPEAT_TIME_MAX        (30)
+#define CFG_SCAN_PROBE_REPEAT_TIME_DEFAULT    (0)
+
 #ifdef FEATURE_WLAN_EXTSCAN
 /*
  * <ini>
@@ -13324,6 +13370,8 @@ struct hdd_config {
 	uint32_t nPassiveMaxChnTime;    /* in units of milliseconds */
 	uint32_t nActiveMinChnTime;     /* in units of milliseconds */
 	uint32_t nActiveMaxChnTime;     /* in units of milliseconds */
+	uint32_t scan_probe_repeat_time;
+	uint32_t scan_num_probes;
 
 	uint32_t nInitialDwellTime;     /* in units of milliseconds */
 	bool initial_scan_no_dfs_chnl;

+ 39 - 0
core/hdd/inc/wlan_hdd_ipa.h

@@ -124,7 +124,25 @@ void hdd_ipa_dump_info(struct hdd_context *hdd_ctx);
 QDF_STATUS hdd_ipa_uc_ol_init(struct hdd_context *hdd_ctx);
 void hdd_ipa_set_tx_flow_info(void);
 int hdd_ipa_uc_ol_deinit(struct hdd_context *hdd_ctx);
+
+/**
+ * hdd_ipa_uc_stat() - Print IPA uC stats
+ * @adapter: network adapter
+ *
+ * Return: None
+ */
+void hdd_ipa_uc_stat(struct hdd_adapter *adapter);
+
+/**
+ * hdd_ipa_uc_info() - Print IPA uC resource and session information
+ * @adapter: network adapter
+ *
+ * Return: None
+ */
+void hdd_ipa_uc_info(struct hdd_context *hdd_ctx);
+
 #else
+
 static inline QDF_STATUS hdd_ipa_init(struct hdd_context *hdd_ctx)
 {
 	return QDF_STATUS_SUCCESS;
@@ -277,5 +295,26 @@ static inline int hdd_ipa_uc_ol_deinit(struct hdd_context *hdd_ctx)
 {
 	return 0;
 }
+
+/**
+ * hdd_ipa_uc_stat() - Print IPA uC stats
+ * @adapter: network adapter
+ *
+ * Return: None
+ */
+static inline void hdd_ipa_uc_stat(struct hdd_adapter *adapter)
+{
+}
+
+/**
+ * hdd_ipa_uc_info() - Print IPA uC resource and session information
+ * @adapter: network adapter
+ *
+ * Return: None
+ */
+static inline void hdd_ipa_uc_info(struct hdd_context *hdd_ctx)
+{
+}
+
 #endif /* IPA_OFFLOAD */
 #endif /* #ifndef HDD_IPA_H__ */

+ 15 - 0
core/hdd/inc/wlan_hdd_lro.h

@@ -51,6 +51,16 @@ enum hdd_lro_rx_status hdd_lro_rx(struct hdd_context *hdd_ctx,
 	 struct hdd_adapter *adapter, struct sk_buff *skb);
 void hdd_lro_display_stats(struct hdd_context *hdd_ctx);
 void hdd_disable_lro_in_concurrency(bool);
+/**
+ * hdd_disable_lro_for_low_tput() - enable/disable LRO based on tput
+ * hdd_ctx: hdd context
+ * disable: boolean to enable/disable LRO
+ *
+ * This API enables/disables LRO based on tput.
+ *
+ * Return: void
+ */
+void hdd_disable_lro_for_low_tput(struct hdd_context *hdd_ctx, bool disable);
 #else
 static inline int hdd_lro_init(struct hdd_context *hdd_ctx)
 {
@@ -70,5 +80,10 @@ static inline void hdd_lro_display_stats(struct hdd_context *hdd_ctx)
 static inline void hdd_disable_lro_in_concurrency(bool disable)
 {
 }
+
+static inline void
+hdd_disable_lro_for_low_tput(struct hdd_context *hdd_ctx, bool disable)
+{
+}
 #endif /* FEATURE_LRO */
 #endif /* __WLAN_HDD_LRO_H__ */

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

@@ -1719,6 +1719,7 @@ struct hdd_context {
 	int user_configured_pkt_filter_rules;
 	bool is_fils_roaming_supported;
 	qdf_atomic_t disable_lro_in_concurrency;
+	qdf_atomic_t disable_lro_in_low_tput;
 	bool en_tcp_delack_no_lro;
 };
 
@@ -1985,6 +1986,16 @@ void hdd_bus_bandwidth_destroy(struct hdd_context *hdd_ctx);
  * Return: None.
  */
 void hdd_bus_bw_cancel_work(struct hdd_context *hdd_ctx);
+
+/**
+ * hdd_send_wlan_tp_ind() - Send throughput indication
+ * @hdd_ctx: HDD context
+ *
+ * Send throughput indication
+ *
+ * Return: None.
+ */
+void hdd_send_wlan_tp_ind(struct hdd_context *hdd_ctx);
 #else
 
 static inline
@@ -2022,6 +2033,11 @@ static inline
 void hdd_bus_bw_cancel_work(struct hdd_context *hdd_ctx)
 {
 }
+
+static inline
+void hdd_send_wlan_tp_ind(struct hdd_context *hdd_ctx)
+{
+}
 #endif
 
 int hdd_qdf_trace_enable(QDF_MODULE_ID module_id, uint32_t bitmask);
@@ -2107,6 +2123,17 @@ static inline bool hdd_scan_random_mac_addr_supported(void)
 }
 #endif
 
+/**
+ * hdd_start_vendor_acs(): Start vendor ACS procedure
+ * @adapter: pointer to SAP adapter struct
+ *
+ * This function sends the ACS config to the ACS daemon and
+ * starts the vendor ACS timer to wait for the next command.
+ *
+ * Return: Status of vendor ACS procedure
+ */
+int hdd_start_vendor_acs(struct hdd_adapter *adapter);
+
 void hdd_get_fw_version(struct hdd_context *hdd_ctx,
 			uint32_t *major_spid, uint32_t *minor_spid,
 			uint32_t *siid, uint32_t *crmid);
@@ -2134,10 +2161,10 @@ int wlan_hdd_cfg80211_start_acs(struct hdd_adapter *adapter);
  * @adapter: hdd adapter
  * @reason: channel change reason
  *
- * Return: none
+ * Return: 0 for success else error code
  */
-void hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
-				    uint8_t reason);
+int hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
+				   uint8_t reason);
 /**
  * hdd_update_acs_timer_reason() - update acs timer start reason
  * @adapter: hdd adapter

+ 22 - 0
core/hdd/src/wlan_hdd_cfg.c

@@ -742,6 +742,20 @@ struct reg_table_entry g_registry_table[] = {
 		     CFG_ACTIVE_MIN_CHANNEL_TIME_MIN,
 		     CFG_ACTIVE_MIN_CHANNEL_TIME_MAX),
 
+	REG_VARIABLE(CFG_SCAN_NUM_PROBES_NAME, WLAN_PARAM_Integer,
+		     struct hdd_config, scan_num_probes,
+		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_SCAN_NUM_PROBES_DEFAULT,
+		     CFG_SCAN_NUM_PROBES_MIN,
+		     CFG_SCAN_NUM_PROBES_MAX),
+
+	REG_VARIABLE(CFG_SCAN_PROBE_REPEAT_TIME_NAME, WLAN_PARAM_Integer,
+		     struct hdd_config, scan_probe_repeat_time,
+		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_SCAN_PROBE_REPEAT_TIME_DEFAULT,
+		     CFG_SCAN_PROBE_REPEAT_TIME_MIN,
+		     CFG_SCAN_PROBE_REPEAT_TIME_MAX),
+
 	REG_VARIABLE(CFG_RETRY_LIMIT_ZERO_NAME, WLAN_PARAM_Integer,
 		     struct hdd_config, retryLimitZero,
 		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3612,6 +3626,14 @@ struct reg_table_entry g_registry_table[] = {
 		     CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_MIN,
 		     CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_MAX),
 
+	REG_VARIABLE(CFG_P2P_LISTEN_DEFER_INTERVAL_NAME, WLAN_PARAM_Integer,
+		     struct hdd_config, p2p_listen_defer_interval,
+		     VAR_FLAGS_OPTIONAL |
+		     VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_P2P_LISTEN_DEFER_INTERVAL_DEFAULT,
+		     CFG_P2P_LISTEN_DEFER_INTERVAL_MIN,
+		     CFG_P2P_LISTEN_DEFER_INTERVAL_MAX),
+
 	REG_VARIABLE(CFG_MULTICAST_HOST_FW_MSGS, WLAN_PARAM_Integer,
 		     struct hdd_config, multicast_host_fw_msgs,
 		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,

+ 136 - 31
core/hdd/src/wlan_hdd_cfg80211.c

@@ -1610,6 +1610,8 @@ static int wlan_hdd_reset_force_acs_chan_range(struct hdd_context *hdd_ctx,
 	bool is_dfs_mode_enabled = false;
 	uint32_t i, num_channels = 0;
 	uint8_t channels[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
+	eCsrPhyMode hw_mode;
+	tSirMacHTChannelWidth ch_width;
 
 	if (hdd_ctx->config->force_sap_acs_st_ch >
 			hdd_ctx->config->force_sap_acs_end_ch) {
@@ -1646,6 +1648,62 @@ static int wlan_hdd_reset_force_acs_chan_range(struct hdd_context *hdd_ctx,
 	qdf_mem_copy(sap_config->acs_cfg.ch_list, channels, num_channels);
 	sap_config->acs_cfg.ch_list_count = num_channels;
 
+	/* Derive ACS HW mode */
+	hw_mode = hdd_cfg_xlate_to_csr_phy_mode(hdd_ctx->config->dot11Mode);
+	if (hw_mode == eCSR_DOT11_MODE_AUTO) {
+		if (sme_is_feature_supported_by_fw(DOT11AX))
+			hw_mode = eCSR_DOT11_MODE_11ax;
+		else
+			hw_mode = eCSR_DOT11_MODE_11ac;
+	}
+
+	if (hdd_ctx->config->sap_force_11n_for_11ac) {
+		if (hw_mode == eCSR_DOT11_MODE_11ac ||
+		    hw_mode == eCSR_DOT11_MODE_11ac_ONLY)
+			hw_mode = eCSR_DOT11_MODE_11n;
+	}
+
+	if ((hw_mode == eCSR_DOT11_MODE_11b ||
+	     hw_mode == eCSR_DOT11_MODE_11g ||
+	     hw_mode == eCSR_DOT11_MODE_11g_ONLY) &&
+			sap_config->acs_cfg.start_ch > 14) {
+		hdd_err("Invalid ACS HW Mode %d + CH range <%d - %d>",
+			hw_mode, sap_config->acs_cfg.start_ch,
+			sap_config->acs_cfg.end_ch);
+		return -EINVAL;
+	}
+	sap_config->acs_cfg.hw_mode = hw_mode;
+
+	/* Derive ACS BW */
+	ch_width = eHT_CHANNEL_WIDTH_20MHZ;
+	if (hw_mode == eCSR_DOT11_MODE_11ac ||
+	    hw_mode == eCSR_DOT11_MODE_11ac_ONLY ||
+	    hw_mode == eCSR_DOT11_MODE_11ax ||
+	    hw_mode == eCSR_DOT11_MODE_11ax_ONLY) {
+		ch_width = hdd_ctx->config->vhtChannelWidth;
+		/* VHT in 2.4G depends on gChannelBondingMode24GHz INI param */
+		if (sap_config->acs_cfg.end_ch <= 14)
+			ch_width =
+				hdd_ctx->config->nChannelBondingMode24GHz ?
+				eHT_CHANNEL_WIDTH_40MHZ :
+				eHT_CHANNEL_WIDTH_20MHZ;
+	}
+
+	if (hw_mode == eCSR_DOT11_MODE_11n ||
+	    hw_mode == eCSR_DOT11_MODE_11n_ONLY) {
+		if (sap_config->acs_cfg.end_ch <= 14)
+			ch_width =
+				hdd_ctx->config->nChannelBondingMode24GHz ?
+				eHT_CHANNEL_WIDTH_40MHZ :
+				eHT_CHANNEL_WIDTH_20MHZ;
+		else
+			ch_width =
+				hdd_ctx->config->nChannelBondingMode5GHz ?
+				eHT_CHANNEL_WIDTH_40MHZ :
+				eHT_CHANNEL_WIDTH_20MHZ;
+	}
+	sap_config->acs_cfg.ch_width = ch_width;
+
 	return 0;
 }
 
@@ -1656,9 +1714,9 @@ static int wlan_hdd_reset_force_acs_chan_range(struct hdd_context *hdd_ctx,
  * This function sets the default ACS start and end channel for the given band
  * and also parses the given ACS channel list.
  *
- * Return: None
+ * Return: status
  */
-static void wlan_hdd_set_acs_ch_range(tsap_Config_t *sap_cfg, bool ht_enabled,
+static int wlan_hdd_set_acs_ch_range(tsap_Config_t *sap_cfg, bool ht_enabled,
 							bool vht_enabled)
 {
 	int i;
@@ -1689,7 +1747,7 @@ static void wlan_hdd_set_acs_ch_range(tsap_Config_t *sap_cfg, bool ht_enabled,
 
 	/* Parse ACS Chan list from hostapd */
 	if (!sap_cfg->acs_cfg.ch_list)
-		return;
+		return -EINVAL;
 
 	sap_cfg->acs_cfg.start_ch = sap_cfg->acs_cfg.ch_list[0];
 	sap_cfg->acs_cfg.end_ch =
@@ -1702,6 +1760,8 @@ static void wlan_hdd_set_acs_ch_range(tsap_Config_t *sap_cfg, bool ht_enabled,
 		if (sap_cfg->acs_cfg.end_ch < sap_cfg->acs_cfg.ch_list[i])
 			sap_cfg->acs_cfg.end_ch = sap_cfg->acs_cfg.ch_list[i];
 	}
+
+	return 0;
 }
 
 
@@ -2158,12 +2218,12 @@ static void hdd_get_freq_list(uint8_t *channel_list, uint32_t *freq_list,
 		freq_list[count] = cds_chan_to_freq(channel_list[count]);
 }
 
-void hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
-				    uint8_t reason)
+int hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
+				   uint8_t reason)
 {
 	struct sk_buff *skb;
 	tsap_Config_t *sap_config;
-	uint32_t channel_count = 0, status;
+	uint32_t channel_count = 0, status = -EINVAL;
 	uint8_t channel_list[QDF_MAX_NUM_CHAN] = {0};
 	uint32_t freq_list[QDF_MAX_NUM_CHAN] = {0};
 	uint8_t vendor_pcl_list[QDF_MAX_NUM_CHAN] = {0};
@@ -2178,7 +2238,7 @@ void hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
 
 	if (!hdd_ctx) {
 		hdd_err("HDD context is NULL");
-		return;
+		return -EINVAL;
 	}
 
 	ENTER();
@@ -2238,7 +2298,7 @@ void hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
 
 	if (!skb) {
 		hdd_err("cfg80211_vendor_event_alloc failed");
-		return;
+		return -ENOMEM;
 	}
 	/*
 	 * Application expects pcl to be a subset of channel list
@@ -2324,27 +2384,45 @@ void hdd_cfg80211_update_acs_config(struct hdd_adapter *adapter,
 		goto fail;
 
 	cfg80211_vendor_event(skb, GFP_KERNEL);
-	return;
+	return 0;
 fail:
 	if (skb)
 		kfree_skb(skb);
+	return status;
 }
 
+/**
+ * hdd_create_acs_timer(): Initialize vendor ACS timer
+ * @adapter: pointer to SAP adapter struct
+ *
+ * This function initializes the vendor ACS timer.
+ *
+ * Return: Status of create vendor ACS timer
+ */
 static int hdd_create_acs_timer(struct hdd_adapter *adapter)
 {
 	struct hdd_external_acs_timer_context *timer_context;
+	QDF_STATUS status;
 
 	if (adapter->sessionCtx.ap.vendor_acs_timer_initialized)
 		return 0;
 
-	hdd_notice("Starting vendor app based ACS");
+	hdd_debug("Starting vendor app based ACS");
 	timer_context = qdf_mem_malloc(sizeof(*timer_context));
+	if (!timer_context) {
+		hdd_err("Could not allocate for timer_context");
+		return -ENOMEM;
+	}
 	timer_context->adapter = adapter;
 
 	set_bit(VENDOR_ACS_RESPONSE_PENDING, &adapter->event_flags);
-	qdf_mc_timer_init(&adapter->sessionCtx.ap.vendor_acs_timer,
+	status = qdf_mc_timer_init(&adapter->sessionCtx.ap.vendor_acs_timer,
 		  QDF_TIMER_TYPE_SW,
 		  hdd_acs_response_timeout_handler, timer_context);
+	if (status != QDF_STATUS_SUCCESS) {
+		hdd_err("Failed to initialize acs response timeout timer");
+		return -EFAULT;
+	}
 	adapter->sessionCtx.ap.vendor_acs_timer_initialized = true;
 	return 0;
 }
@@ -2360,6 +2438,35 @@ wlan_hdd_cfg80211_do_acs_policy[QCA_WLAN_VENDOR_ATTR_ACS_MAX+1] = {
 	[QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST] = { .type = NLA_UNSPEC },
 };
 
+int hdd_start_vendor_acs(struct hdd_adapter *adapter)
+{
+	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+	int status;
+
+	status = hdd_create_acs_timer(adapter);
+	if (status != 0) {
+		hdd_err("failed to create acs timer");
+		return status;
+	}
+	status = hdd_update_acs_timer_reason(adapter,
+		QCA_WLAN_VENDOR_ACS_SELECT_REASON_INIT);
+	if (status != 0) {
+		hdd_err("failed to update acs timer reason");
+		return status;
+	}
+
+	if (hdd_ctx->config->acs_support_for_dfs_ltecoex)
+		status = qdf_status_to_os_return(wlan_sap_set_vendor_acs(
+				WLAN_HDD_GET_SAP_CTX_PTR(adapter),
+				true));
+	else
+		status = qdf_status_to_os_return(wlan_sap_set_vendor_acs(
+				WLAN_HDD_GET_SAP_CTX_PTR(adapter),
+				false));
+
+	return status;
+}
+
 /**
  * __wlan_hdd_cfg80211_do_acs(): CFG80211 handler function for DO_ACS Vendor CMD
  * @wiphy:  Linux wiphy struct pointer
@@ -2372,7 +2479,6 @@ wlan_hdd_cfg80211_do_acs_policy[QCA_WLAN_VENDOR_ATTR_ACS_MAX+1] = {
  *
  * Return: ACS procedure start status
  */
-
 static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 					struct wireless_dev *wdev,
 					const void *data, int data_len)
@@ -2431,6 +2537,7 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 
 	if (!tb[QCA_WLAN_VENDOR_ATTR_ACS_HW_MODE]) {
 		hdd_err("Attr hw_mode failed");
+		status = -EINVAL;
 		goto out;
 	}
 	hw_mode = nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_ACS_HW_MODE]);
@@ -2504,8 +2611,11 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 			sap_config->acs_cfg.ch_list = qdf_mem_malloc(
 					sizeof(uint8_t) *
 					sap_config->acs_cfg.ch_list_count);
-			if (sap_config->acs_cfg.ch_list == NULL)
+			if (!sap_config->acs_cfg.ch_list) {
+				hdd_err("ACS config alloc fail");
+				status = -ENOMEM;
 				goto out;
+			}
 
 			qdf_mem_copy(sap_config->acs_cfg.ch_list, tmp,
 					sap_config->acs_cfg.ch_list_count);
@@ -2519,7 +2629,7 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 		if (sap_config->acs_cfg.ch_list_count) {
 			sap_config->acs_cfg.ch_list = qdf_mem_malloc(
 				sap_config->acs_cfg.ch_list_count);
-			if (sap_config->acs_cfg.ch_list == NULL) {
+			if (!sap_config->acs_cfg.ch_list) {
 				hdd_err("ACS config alloc fail");
 				status = -ENOMEM;
 				goto out;
@@ -2540,7 +2650,7 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 				&sap_config->acs_cfg.pcl_ch_count,
 				sap_config->acs_cfg.pcl_channels_weight_list,
 				QDF_MAX_NUM_CHAN);
-	if (QDF_STATUS_SUCCESS != qdf_status)
+	if (qdf_status != QDF_STATUS_SUCCESS)
 		hdd_err("Get PCL failed");
 
 	if (sap_config->acs_cfg.pcl_ch_count) {
@@ -2554,14 +2664,20 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 				  pcl_channels_weight_list[i]);
 	}
 
-	wlan_hdd_set_acs_ch_range(sap_config, ht_enabled, vht_enabled);
+	status = wlan_hdd_set_acs_ch_range(sap_config, ht_enabled, vht_enabled);
+	if (status) {
+		hdd_err("set acs channel range failed");
+		goto out;
+	}
 
 	if (hdd_ctx->config->force_sap_acs) {
 		hdd_debug("forcing SAP acs start and end channel");
 		status = wlan_hdd_reset_force_acs_chan_range(hdd_ctx,
 						sap_config);
-		if (status != 0)
+		if (status) {
+			hdd_err("reset force acs channel range failed");
 			goto out;
+		}
 	}
 
 	sap_config->acs_cfg.band = hw_mode;
@@ -2618,20 +2734,9 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy,
 		status = 0;
 	} else {
 		/* Check if vendor specific acs is enabled */
-		if (hdd_ctx->config->vendor_acs_support) {
-			hdd_create_acs_timer(adapter);
-			hdd_update_acs_timer_reason(adapter,
-				QCA_WLAN_VENDOR_ACS_SELECT_REASON_INIT);
-			if (hdd_ctx->config->acs_support_for_dfs_ltecoex)
-				wlan_sap_set_vendor_acs(
-					WLAN_HDD_GET_SAP_CTX_PTR(adapter),
-					true);
-			else
-				wlan_sap_set_vendor_acs(
-					WLAN_HDD_GET_SAP_CTX_PTR(adapter),
-					false);
-
-		} else
+		if (hdd_ctx->config->vendor_acs_support)
+			status = hdd_start_vendor_acs(adapter);
+		else
 			status = wlan_hdd_cfg80211_start_acs(adapter);
 	}
 

+ 2 - 0
core/hdd/src/wlan_hdd_driver_ops.c

@@ -1455,6 +1455,8 @@ static void wlan_hdd_purge_notifier(void)
 static void wlan_hdd_pld_uevent(struct device *dev,
 				struct pld_uevent_data *uevent)
 {
+
+	hdd_info("pld event %d", uevent->uevent);
 	switch (uevent->uevent) {
 	case PLD_RECOVERY:
 		cds_set_recovery_in_progress(true);

+ 73 - 13
core/hdd/src/wlan_hdd_hostapd.c

@@ -3633,6 +3633,17 @@ static __iw_softap_setparam(struct net_device *dev,
 		break;
 	}
 
+	case QCASAP_SET_HE_BSS_COLOR:
+		if (adapter->device_mode != QDF_SAP_MODE)
+			return -EINVAL;
+
+		status = sme_set_he_bss_color(hHal, adapter->sessionId,
+				set_value);
+		if (QDF_STATUS_SUCCESS != status) {
+			hdd_err("SET_HE_BSS_COLOR failed");
+			return -EIO;
+		}
+		break;
 	case QCASAP_SET_DFS_NOL:
 		wlansap_set_dfs_nol(
 			WLAN_HDD_GET_SAP_CTX_PTR(adapter),
@@ -3695,7 +3706,10 @@ static __iw_softap_setparam(struct net_device *dev,
 		/* If input value is non-zero get stats */
 		switch (set_value) {
 		case 1:
-			hdd_ipa_uc_stat_request(adapter, set_value);
+			hdd_ipa_uc_stat(adapter);
+			break;
+		case 2:
+			hdd_ipa_uc_info(hdd_ctx);
 			break;
 		case 3:
 			hdd_ipa_uc_rt_debug_host_dump(hdd_ctx);
@@ -5659,6 +5673,9 @@ static const struct iw_priv_args hostapd_private_args[] = {
 		QCASAP_RX_CHAINMASK_CMD,
 		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
 		0, "set_rxchainmask"
+	}, {
+		QCASAP_SET_HE_BSS_COLOR,
+		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_he_bss_clr"
 	}, {
 		QCASAP_NSS_CMD,
 		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_nss"
@@ -7321,8 +7338,9 @@ QDF_STATUS wlan_hdd_config_acs(struct hdd_context *hdd_ctx, struct hdd_adapter *
 }
 
 /**
- * wlan_hdd_setup_driver_overrides : Overrides SAP / P2P GO Params
- * @adapter: pointer to adapter struct
+ * wlan_hdd_sap_p2p_11ac_overrides: API to overwrite 11ac config in case of
+ * SAP or p2p go
+ * @ap_adapter: pointer to adapter
  *
  * This function overrides SAP / P2P Go configuration based on driver INI
  * parameters for 11AC override and ACS. This overrides are done to support
@@ -7334,16 +7352,11 @@ QDF_STATUS wlan_hdd_config_acs(struct hdd_context *hdd_ctx, struct hdd_adapter *
  *
  * Return: 0 for Success or Negative error codes.
  */
-static int wlan_hdd_setup_driver_overrides(struct hdd_adapter *ap_adapter)
+static int wlan_hdd_sap_p2p_11ac_overrides(struct hdd_adapter *ap_adapter)
 {
 	tsap_Config_t *sap_cfg = &ap_adapter->sessionCtx.ap.sapConfig;
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter);
 
-	if (ap_adapter->device_mode == QDF_SAP_MODE &&
-				hdd_ctx->config->force_sap_acs &&
-				!hdd_ctx->config->vendor_acs_support)
-		goto setup_acs_overrides;
-
 	/* Fixed channel 11AC override:
 	 * 11AC override in qcacld is introduced for following reasons:
 	 * 1. P2P GO also follows start_bss and since p2p GO could not be
@@ -7388,14 +7401,33 @@ static int wlan_hdd_setup_driver_overrides(struct hdd_adapter *ap_adapter)
 				sap_cfg->ch_width_orig =
 					eHT_CHANNEL_WIDTH_20MHZ;
 		}
+		sap_cfg->ch_params.ch_width = sap_cfg->ch_width_orig;
+		wlan_reg_set_channel_params(hdd_ctx->hdd_pdev, sap_cfg->channel,
+					sap_cfg->sec_ch, &sap_cfg->ch_params);
 	}
-	sap_cfg->ch_params.ch_width = sap_cfg->ch_width_orig;
-	wlan_reg_set_channel_params(hdd_ctx->hdd_pdev, sap_cfg->channel,
-				sap_cfg->sec_ch, &sap_cfg->ch_params);
 
 	return 0;
+}
+
+/**
+ * wlan_hdd_setup_acs_overrides : Overrides ACS configurations
+ * @adapter: pointer to adapter struct
+ *
+ * This function overrides ACS configuration based on driver INI
+ * parameters. These overrides are done to support android legacy
+ * configuration method.
+ *
+ * NOTE: Non android platform supports concurrency and these overrides shall
+ * not be used. Also future driver based overrides shall be consolidated in this
+ * function only. Avoid random overrides in other location based on ini.
+ *
+ * Return: 0 for Success or Negative error codes.
+ */
+static int wlan_hdd_setup_acs_overrides(struct hdd_adapter *ap_adapter)
+{
+	tsap_Config_t *sap_cfg = &ap_adapter->sessionCtx.ap.sapConfig;
+	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter);
 
-setup_acs_overrides:
 	hdd_debug("** Driver force ACS override **");
 
 	sap_cfg->channel = AUTO_CHANNEL_SELECT;
@@ -7474,6 +7506,34 @@ setup_acs_overrides:
 	return 0;
 }
 
+/**
+ * wlan_hdd_setup_driver_overrides : Overrides SAP / P2P GO Params
+ * @adapter: pointer to adapter struct
+ *
+ * This function overrides SAP / P2P Go configuration based on driver INI
+ * parameters for 11AC override and ACS. These overrides are done to support
+ * android legacy configuration method.
+ *
+ * NOTE: Non android platform supports concurrency and these overrides shall
+ * not be used. Also future driver based overrides shall be consolidated in this
+ * function only. Avoid random overrides in other location based on ini.
+ *
+ * Return: 0 for Success or Negative error codes.
+ */
+static int wlan_hdd_setup_driver_overrides(struct hdd_adapter *ap_adapter)
+{
+	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter);
+
+	if (!hdd_ctx->config->vendor_acs_support) {
+		if (ap_adapter->device_mode == QDF_SAP_MODE &&
+		    hdd_ctx->config->force_sap_acs)
+			return wlan_hdd_setup_acs_overrides(ap_adapter);
+		else
+			return wlan_hdd_sap_p2p_11ac_overrides(ap_adapter);
+	} else
+		return 0;
+}
+
 /**
  * wlan_hdd_cfg80211_start_bss() - start bss
  * @adapter: Pointer to hostapd adapter

File diff suppressed because it is too large
+ 495 - 220
core/hdd/src/wlan_hdd_ipa.c


+ 11 - 4
core/hdd/src/wlan_hdd_lro.c

@@ -148,7 +148,8 @@ enum hdd_lro_rx_status hdd_lro_rx(struct hdd_context *hdd_ctx,
 	if (((adapter->dev->features & NETIF_F_LRO) != NETIF_F_LRO) ||
 		!QDF_NBUF_CB_RX_TCP_PROTO(skb) ||
 		QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) ||
-		qdf_atomic_read(&hdd_ctx->disable_lro_in_concurrency))
+		qdf_atomic_read(&hdd_ctx->disable_lro_in_concurrency) ||
+		qdf_atomic_read(&hdd_ctx->disable_lro_in_low_tput))
 		return HDD_LRO_NO_RX;
 
 	{
@@ -222,9 +223,7 @@ void hdd_disable_lro_in_concurrency(bool disable)
 	if (disable) {
 		if (hdd_ctx->en_tcp_delack_no_lro) {
 			hdd_info("Enable TCP delack as LRO disabled in concurrency");
-			wlan_hdd_send_svc_nlink_msg(hdd_ctx->radio_index,
-				WLAN_SVC_WLAN_TP_IND, &hdd_ctx->cur_rx_level,
-				sizeof(hdd_ctx->cur_rx_level));
+			hdd_send_wlan_tp_ind(hdd_ctx);
 			hdd_ctx->en_tcp_delack_no_lro = 1;
 		}
 		qdf_atomic_set(&hdd_ctx->disable_lro_in_concurrency, 1);
@@ -237,3 +236,11 @@ void hdd_disable_lro_in_concurrency(bool disable)
 		qdf_atomic_set(&hdd_ctx->disable_lro_in_concurrency, 0);
 	}
 }
+
+void hdd_disable_lro_for_low_tput(struct hdd_context *hdd_ctx, bool disable)
+{
+	if (disable)
+		qdf_atomic_set(&hdd_ctx->disable_lro_in_low_tput, 1);
+	else
+		qdf_atomic_set(&hdd_ctx->disable_lro_in_low_tput, 0);
+}

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

@@ -1075,6 +1075,7 @@ static void hdd_update_tgt_services(struct hdd_context *hdd_ctx,
 	config->isRoamOffloadEnabled &= cfg->en_roam_offload;
 #endif
 	config->sap_get_peer_info &= cfg->get_peer_info_enabled;
+	config->MAWCEnabled &= cfg->is_fw_mawc_capable;
 	sme_update_tgt_services(hdd_ctx->hHal, cfg);
 
 }
@@ -4410,6 +4411,7 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, struct hdd_adapter *ada
 	case QDF_SAP_MODE:
 		/* Flush IPA exception path packets */
 		hdd_ipa_flush(hdd_ctx);
+
 	case QDF_P2P_GO_MODE:
 		if (QDF_SAP_MODE == adapter->device_mode) {
 			if (test_bit(ACS_PENDING, &adapter->event_flags)) {
@@ -4419,7 +4421,9 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, struct hdd_adapter *ada
 			}
 		}
 		cds_flush_work(&adapter->sap_stop_bss_work);
+
 		/* Any softap specific cleanup here... */
+		wlan_hdd_undo_acs(adapter);
 		if (adapter->device_mode == QDF_P2P_GO_MODE)
 			wlan_hdd_cleanup_remain_on_channel_ctx(adapter);
 
@@ -6406,6 +6410,11 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx,
 
 	hdd_ctx->prev_rx = rx_packets;
 
+	if (temp_rx < hdd_ctx->config->busBandwidthLowThreshold)
+		hdd_disable_lro_for_low_tput(hdd_ctx, true);
+	else
+		hdd_disable_lro_for_low_tput(hdd_ctx, false);
+
 	if (temp_rx > hdd_ctx->config->tcpDelackThresholdHigh) {
 		if ((hdd_ctx->cur_rx_level != WLAN_SVC_TP_HIGH) &&
 		   (++hdd_ctx->rx_high_ind_cnt == delack_timer_cnt)) {
@@ -6648,6 +6657,13 @@ void hdd_bus_bw_cancel_work(struct hdd_context *hdd_ctx)
 	if (hdd_ctx)
 		cancel_work_sync(&hdd_ctx->bus_bw_work);
 }
+
+void hdd_send_wlan_tp_ind(struct hdd_context *hdd_ctx)
+{
+	wlan_hdd_send_svc_nlink_msg(hdd_ctx->radio_index,
+			WLAN_SVC_WLAN_TP_IND, &hdd_ctx->cur_rx_level,
+			sizeof(hdd_ctx->cur_rx_level));
+}
 #endif
 
 /**
@@ -7183,6 +7199,8 @@ void hdd_switch_sap_channel(struct hdd_adapter *adapter, uint8_t channel)
 int hdd_update_acs_timer_reason(struct hdd_adapter *adapter, uint8_t reason)
 {
 	struct hdd_external_acs_timer_context *timer_context;
+	int status;
+	QDF_STATUS qdf_status;
 
 	set_bit(VENDOR_ACS_RESPONSE_PENDING, &adapter->event_flags);
 
@@ -7194,13 +7212,18 @@ int hdd_update_acs_timer_reason(struct hdd_adapter *adapter, uint8_t reason)
 	timer_context = (struct hdd_external_acs_timer_context *)
 			adapter->sessionCtx.ap.vendor_acs_timer.user_data;
 	timer_context->reason = reason;
-	/* Update config to application and start the timer */
-	hdd_cfg80211_update_acs_config(adapter, reason);
-	qdf_mc_timer_start(&adapter->sessionCtx.ap.vendor_acs_timer,
-		WLAN_VENDOR_ACS_WAIT_TIME);
+	qdf_status =
+		qdf_mc_timer_start(&adapter->sessionCtx.ap.vendor_acs_timer,
+				   WLAN_VENDOR_ACS_WAIT_TIME);
+	if (qdf_status != QDF_STATUS_SUCCESS) {
+		hdd_err("failed to start external acs timer");
+		return -ENOSPC;
+	}
+	/* Update config to application */
+	status = hdd_cfg80211_update_acs_config(adapter, reason);
 	hdd_notice("Updated ACS config to nl with reason %d", reason);
 
-	return 0;
+	return status;
 }
 
 /**
@@ -10419,6 +10442,7 @@ void wlan_hdd_send_svc_nlink_msg(int radio, int type, void *data, int len)
 	case WLAN_SVC_WLAN_TP_IND:
 	case WLAN_SVC_WLAN_TP_TX_IND:
 	case WLAN_SVC_RPS_ENABLE_IND:
+	case WLAN_SVC_CORE_MINFREQ:
 		ani_hdr->length = len;
 		nlh->nlmsg_len = NLMSG_LENGTH((sizeof(tAniMsgHdr) + len));
 		nl_data = (char *)ani_hdr + sizeof(tAniMsgHdr);
@@ -12116,6 +12140,8 @@ static int hdd_update_scan_config(struct hdd_context *hdd_ctx)
 	scan_cfg.rssi_cat_gap = cfg->nRssiCatGap;
 	scan_cfg.scan_dwell_time_mode = cfg->scan_adaptive_dwell_mode;
 	scan_cfg.is_snr_monitoring_enabled = cfg->fEnableSNRMonitoring;
+	scan_cfg.usr_cfg_probe_rpt_time = cfg->scan_probe_repeat_time ;
+	scan_cfg.usr_cfg_num_probes = cfg->scan_num_probes ;
 	scan_cfg.is_bssid_hint_priority = cfg->is_bssid_hint_priority;
 
 	hdd_update_pno_config(&scan_cfg.pno_cfg, cfg);

+ 70 - 3
core/hdd/src/wlan_hdd_napi.c

@@ -259,6 +259,69 @@ int hdd_napi_event(enum qca_napi_event event, void *data)
 }
 
 #ifdef HELIUMPLUS
+/**
+ * hdd_napi_perfd_cpufreq() - set/reset min CPU freq for cores
+ * @req_state:  high/low
+ *
+ * Send a message to cnss-daemon through netlink. cnss-daemon,
+ * in turn, sends a message to perf-daemon.
+ * If freq > 0, this is a set request. It sets the min frequency of the
+ * cores of the specified cluster to provided freq value (in KHz).
+ * If freq == 0, then the freq lock is removed (and frequency returns to
+ * system default).
+ *
+ * Semantical Alert:
+ * There can be at most one lock active at a time. Each "set" request must
+ * be followed by a "reset" request. Perfd behaviour is undefined otherwise.
+ *
+ * Return: == 0: netlink message sent to cnss-daemon
+ *         <  0: failure to send the message
+ */
+static int hdd_napi_perfd_cpufreq(enum qca_napi_tput_state req_state)
+{
+	int rc = 0;
+	struct wlan_core_minfreq req;
+	struct hdd_context *hdd_ctx;
+
+	NAPI_DEBUG("-> (%d)", req_state);
+
+	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	if (unlikely(hdd_ctx == NULL)) {
+		hdd_err("cannot get hdd_context");
+		rc = -EFAULT;
+		goto hnpc_ret;
+	}
+
+	switch (req_state) {
+	case QCA_NAPI_TPUT_LO:
+		req.magic    = WLAN_CORE_MINFREQ_MAGIC;
+		req.reserved = 0; /* unused */
+		req.coremask = 0; /* not valid */
+		req.freq     = 0; /* reset */
+		break;
+	case QCA_NAPI_TPUT_HI:
+		req.magic    = WLAN_CORE_MINFREQ_MAGIC;
+		req.reserved = 0; /* unused */
+		req.coremask = 0x0f0; /* perf cluster */
+		req.freq     = 700;   /* KHz */
+		break;
+	default:
+		hdd_err("invalid req_state (%d)", req_state);
+		rc = -EINVAL;
+		goto hnpc_ret;
+	} /* switch */
+
+	NAPI_DEBUG("CPU min freq to %d",
+		   (req.freq == 0)?"Resetting":"Setting", req.freq);
+	/* the following service function returns void */
+	wlan_hdd_send_svc_nlink_msg(hdd_ctx->radio_index,
+				WLAN_SVC_CORE_MINFREQ,
+				&req, sizeof(struct wlan_core_minfreq));
+hnpc_ret:
+	NAPI_DEBUG("<--[rc=%d]", rc);
+	return rc;
+}
+
 /**
  * hdd_napi_apply_throughput_policy() - implement the throughput action policy
  * @hddctx:     HDD context
@@ -285,8 +348,8 @@ int hdd_napi_event(enum qca_napi_event event, void *data)
  */
 static int napi_tput_policy_delay;
 int hdd_napi_apply_throughput_policy(struct hdd_context *hddctx,
-				     uint64_t              tx_packets,
-				     uint64_t              rx_packets)
+				     uint64_t tx_packets,
+				     uint64_t rx_packets)
 {
 	int rc = 0;
 	uint64_t packets = tx_packets + rx_packets;
@@ -325,8 +388,12 @@ int hdd_napi_apply_throughput_policy(struct hdd_context *hddctx,
 	else
 		req_state = QCA_NAPI_TPUT_LO;
 
-	if (req_state != napid->napi_mode)
+	if (req_state != napid->napi_mode) {
+		/* [re]set the floor frequency of high cluster */
+		rc = hdd_napi_perfd_cpufreq(req_state);
+		/* blacklist/boost_mode on/off */
 		rc = hdd_napi_event(NAPI_EVT_TPUT_STATE, (void *)req_state);
+	}
 	return rc;
 }
 

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

@@ -41,9 +41,9 @@
 #define QWLAN_VERSION_MAJOR            5
 #define QWLAN_VERSION_MINOR            2
 #define QWLAN_VERSION_PATCH            0
-#define QWLAN_VERSION_EXTRA            "G"
+#define QWLAN_VERSION_EXTRA            "W"
 #define QWLAN_VERSION_BUILD            51
 
-#define QWLAN_VERSIONSTR               "5.2.0.51G"
+#define QWLAN_VERSIONSTR               "5.2.0.51W"
 
 #endif /* QWLAN_VERSION_H */

+ 14 - 0
core/mac/inc/sir_api.h

@@ -2718,6 +2718,20 @@ struct sir_update_session_param {
 	uint32_t param_val;
 };
 
+/**
+ * struct sir_set_he_bss_color
+ * @message_type: SME message type
+ * @length: size of struct sir_set_he_bss_color
+ * @session_id: Session ID
+ * @bss_color: bss color value
+ */
+struct sir_set_he_bss_color {
+	uint16_t message_type;
+	uint16_t length;
+	uint8_t session_id;
+	uint8_t bss_color;
+};
+
 /**
  * struct sir_create_session - Used for creating session in monitor mode
  * @type: SME host message type.

+ 1 - 0
core/mac/inc/wni_api.h

@@ -248,6 +248,7 @@ enum eWniMsgTypes {
 	eWNI_SME_DFS_CAC_COMPLETE,
 	eWNI_SME_UPDATE_CONFIG,
 	eWNI_SME_BT_ACTIVITY_INFO_IND,
+	eWNI_SME_SET_HE_BSS_COLOR,
 	eWNI_SME_MSG_TYPES_END
 };
 

+ 5 - 0
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -1881,6 +1881,11 @@ static void lim_process_messages(tpAniSirGlobal mac_ctx,
 		qdf_mem_free((void *)msg->bodyptr);
 		msg->bodyptr = NULL;
 		break;
+	case eWNI_SME_SET_HE_BSS_COLOR:
+		lim_process_set_he_bss_color(mac_ctx, msg->bodyptr);
+		qdf_mem_free((void *)msg->bodyptr);
+		msg->bodyptr = NULL;
+		break;
 	case eWNI_SME_DEL_ALL_TDLS_PEERS:
 		lim_process_sme_del_all_tdls_peers(mac_ctx, msg->bodyptr);
 		qdf_mem_free((void *)msg->bodyptr);

+ 56 - 0
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -6046,3 +6046,59 @@ static void lim_process_set_ie_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
 		pe_err("Unable to send ExtCap to FW");
 
 }
+
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+void lim_process_set_he_bss_color(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
+{
+	struct sir_set_he_bss_color *bss_color;
+	tpPESession session_entry = NULL;
+	tUpdateBeaconParams beacon_params;
+
+	if (!msg_buf) {
+		pe_err("Buffer is Pointing to NULL");
+		return;
+	}
+
+	bss_color = (struct sir_set_he_bss_color *)msg_buf;
+	session_entry = pe_find_session_by_sme_session_id(mac_ctx,
+				bss_color->session_id);
+	if (!session_entry) {
+		pe_err("Session not found for given session_id %d",
+			bss_color->session_id);
+		return;
+	}
+
+	if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
+		pe_err("Invalid SystemRole %d",
+			GET_LIM_SYSTEM_ROLE(session_entry));
+		return;
+	}
+
+	if (bss_color->bss_color == session_entry->he_op.bss_color) {
+		pe_err("No change in  BSS color, current BSS color %d",
+			bss_color->bss_color);
+		return;
+	}
+	qdf_mem_zero(&beacon_params, sizeof(beacon_params));
+	beacon_params.paramChangeBitmap |= PARAM_BSS_COLOR_CHANGED;
+	session_entry->he_op.bss_col_disabled = 1;
+	session_entry->he_bss_color_change.countdown =
+		BSS_COLOR_SWITCH_COUNTDOWN;
+	session_entry->he_bss_color_change.new_color = bss_color->bss_color;
+	session_entry->he_op.bss_color =
+		session_entry->he_bss_color_change.new_color;
+	WMI_HEOPS_COLOR_SET(beacon_params.he_ops,
+			session_entry->he_op.bss_color);
+	WMI_HEOPS_BSSCOLORDISABLE_SET(beacon_params.he_ops,
+			session_entry->he_op.bss_col_disabled);
+	session_entry->bss_color_changing = 1;
+
+	if (sch_set_fixed_beacon_fields(mac_ctx, session_entry) !=
+			eSIR_SUCCESS) {
+		pe_err("Unable to set op mode IE in beacon");
+		return;
+	}
+
+	lim_send_beacon_params(mac_ctx, &beacon_params, session_entry);
+}
+#endif

+ 17 - 1
core/mac/src/pe/lim/lim_prop_exts_utils.c

@@ -234,7 +234,22 @@ vendor3:
 
 	return false;
 }
-
+#ifdef WLAN_FEATURE_11AX
+static void lim_extract_he_op(tpPESession session,
+		tSirProbeRespBeacon *beacon_struct)
+{
+	if (session->he_capable && beacon_struct->he_op.present) {
+		qdf_mem_copy(&session->he_op, &beacon_struct->he_op,
+				sizeof(session->he_op));
+		pe_debug("he_op.bss_color %d", session->he_op.bss_color);
+		pe_debug("he_op.default_pe %d", session->he_op.default_pe);
+	}
+}
+#else
+static inline void lim_extract_he_op(tpPESession session,
+		tSirProbeRespBeacon *beacon_struct)
+{}
+#endif
 /**
  * lim_extract_ap_capability() - extract AP's HCF/WME/WSM capability
  * @mac_ctx: Pointer to Global MAC structure
@@ -469,6 +484,7 @@ lim_extract_ap_capability(tpAniSirGlobal mac_ctx, uint8_t *p_ie,
 			pe_err("AP does not support op_mode rx");
 		}
 	}
+	lim_extract_he_op(session, beacon_struct);
 	/* Extract the UAPSD flag from WMM Parameter element */
 	if (beacon_struct->wmeEdcaPresent)
 		*uapsd = beacon_struct->edcaParams.qosInfo.uapsd;

+ 2 - 24
core/mac/src/pe/lim/lim_security_utils.c

@@ -487,29 +487,6 @@ lim_restore_from_auth_state(tpAniSirGlobal pMac, tSirResultCodes resultCode,
 	lim_post_sme_message(pMac, LIM_MLM_AUTH_CNF, (uint32_t *) &mlmAuthCnf);
 } /*** end lim_restore_from_auth_state() ***/
 
-#ifdef WLAN_FEATURE_FILS_SK
-/*
- * lim_get_fils_auth_data_len: This API will return
- * extra auth data len in case of fils session
- *
- * Return: fils data len in auth packet
- */
-static int lim_get_fils_auth_data_len(void)
-{
-	int len = sizeof(tSirMacRsnInfo) +
-			sizeof(uint8_t) + /* assoc_delay_info */
-			SIR_FILS_SESSION_LENGTH +
-			sizeof(uint8_t) + /* wrapped_data_len */
-			SIR_FILS_WRAPPED_DATA_MAX_SIZE + SIR_FILS_NONCE_LENGTH;
-	return len;
-}
-#else
-static inline int lim_get_fils_auth_data_len(void)
-{
-	return 0;
-}
-#endif
-
 /**
  * lim_encrypt_auth_frame()
  *
@@ -542,7 +519,8 @@ lim_encrypt_auth_frame(tpAniSirGlobal pMac, uint8_t keyId, uint8_t *pKey,
 	uint8_t seed[LIM_SEED_LENGTH], icv[SIR_MAC_WEP_ICV_LENGTH];
 	uint16_t frame_len;
 
-	frame_len = sizeof(tSirMacAuthFrameBody) - lim_get_fils_auth_data_len();
+	frame_len = ((tpSirMacAuthFrameBody)pPlainText)->length +
+			SIR_MAC_AUTH_FRAME_INFO_LEN + SIR_MAC_CHALLENGE_ID_LEN;
 	keyLength += 3;
 
 	/* Bytes 3-7 of seed is key */

+ 15 - 0
core/mac/src/pe/lim/lim_types.h

@@ -497,6 +497,21 @@ static inline void lim_send_reassoc_req_mgmt_frame(tpAniSirGlobal mac_ctx,
 		tLimMlmReassocReq *reassoc_req, tpPESession pe_session)
 {}
 #endif
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+/**
+ * lim_process_set_he_bss_color() - process the set he bss color request
+ *
+ * @mac_ctx: global mac context pointer
+ * @msg_buf: message buffer pointer
+ *
+ * Return: void
+ */
+void lim_process_set_he_bss_color(tpAniSirGlobal mac_ctx, uint32_t *msg_buf);
+#else
+static inline void lim_process_set_he_bss_color(tpAniSirGlobal mac_ctx,
+		uint32_t *msg_buf)
+{}
+#endif
 void lim_send_delts_req_action_frame(tpAniSirGlobal pMac, tSirMacAddr peer,
 				     uint8_t wmmTspecPresent,
 				     tSirMacTSInfo * pTsinfo,

+ 65 - 4
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -2351,6 +2351,24 @@ void update_fils_data(struct sir_fils_indication *fils_ind,
 }
 #endif
 
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+static void update_bss_color_change_ie_from_probe_rsp(
+		tDot11fProbeResponse *prb_frm,
+		tpSirProbeRespBeacon prb_rsp_struct)
+{
+	if (prb_frm->bss_color_change.present) {
+		pe_debug("11AX: HE BSS color change present");
+		qdf_mem_copy(&prb_rsp_struct->vendor_he_bss_color_change,
+			     &prb_frm->bss_color_change,
+			     sizeof(tDot11fIEbss_color_change));
+	}
+}
+#else
+static inline void update_bss_color_change_ie_from_probe_rsp(
+		tDot11fProbeResponse *prb_frm,
+		tpSirProbeRespBeacon prb_rsp_struct)
+{}
+#endif
 tSirRetStatus sir_convert_probe_frame2_struct(tpAniSirGlobal pMac,
 					      uint8_t *pFrame,
 					      uint32_t nFrame,
@@ -2624,6 +2642,8 @@ tSirRetStatus sir_convert_probe_frame2_struct(tpAniSirGlobal pMac,
 			     sizeof(tDot11fIEhe_op));
 	}
 
+	update_bss_color_change_ie_from_probe_rsp(pr, pProbeResp);
+
 	qdf_mem_free(pr);
 	return eSIR_SUCCESS;
 
@@ -3150,6 +3170,11 @@ sir_convert_assoc_resp_frame2_struct(tpAniSirGlobal pMac,
 		pe_debug("11AX: HE Operation IE present");
 		qdf_mem_copy(&pAssocRsp->he_op, &ar->he_op,
 			     sizeof(tDot11fIEhe_op));
+		pe_debug("bss_clr %d def_pe %d part_bss_clr %d bss_col_dis %d",
+				pAssocRsp->he_op.bss_color,
+				pAssocRsp->he_op.default_pe,
+				pAssocRsp->he_op.partial_bss_col,
+				pAssocRsp->he_op.bss_col_disabled);
 	}
 
 	if (ar->MBO_IE.present && ar->MBO_IE.rssi_assoc_rej.present) {
@@ -3624,6 +3649,23 @@ err_bcnrep:
 
 #endif /* FEATURE_WLAN_ESE */
 
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+static void update_bss_color_change_from_beacon_ies(tDot11fBeaconIEs *bcn_ies,
+		tpSirProbeRespBeacon bcn_struct)
+{
+	if (bcn_ies->bss_color_change.present) {
+		qdf_mem_copy(&bcn_struct->vendor_he_bss_color_change,
+			     &bcn_ies->bss_color_change,
+			     sizeof(tDot11fIEbss_color_change));
+	}
+}
+#else
+static inline void update_bss_color_change_from_beacon_ies(
+		tDot11fBeaconIEs *bcn_ies,
+		tpSirProbeRespBeacon bcn_struct)
+{}
+#endif
+
 tSirRetStatus
 sir_parse_beacon_ie(tpAniSirGlobal pMac,
 		    tpSirProbeRespBeacon pBeaconStruct,
@@ -3904,20 +3946,37 @@ sir_parse_beacon_ie(tpAniSirGlobal pMac,
 	}
 
 	if (pBies->he_cap.present) {
-		qdf_mem_copy(&pBeaconStruct->he_cap,
-			     &pBies->he_cap,
+		qdf_mem_copy(&pBeaconStruct->he_cap, &pBies->he_cap,
 			     sizeof(tDot11fIEhe_cap));
 	}
 	if (pBies->he_op.present) {
-		qdf_mem_copy(&pBeaconStruct->he_op,
-			     &pBies->he_op,
+		qdf_mem_copy(&pBeaconStruct->he_op, &pBies->he_op,
 			     sizeof(tDot11fIEhe_op));
 	}
 
+	update_bss_color_change_from_beacon_ies(pBies, pBeaconStruct);
+
 	qdf_mem_free(pBies);
 	return eSIR_SUCCESS;
 } /* End sir_parse_beacon_ie. */
 
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+static void convert_bcon_bss_color_change_ie(tDot11fBeacon *bcn_frm,
+		tpSirProbeRespBeacon bcn_struct)
+{
+	if (bcn_frm->bss_color_change.present) {
+		pe_debug("11AX: HE BSS color change present");
+		qdf_mem_copy(&bcn_struct->vendor_he_bss_color_change,
+			     &bcn_frm->bss_color_change,
+			     sizeof(tDot11fIEbss_color_change));
+	}
+}
+#else
+static inline void convert_bcon_bss_color_change_ie(tDot11fBeacon *bcn_frm,
+		tpSirProbeRespBeacon bcn_struct)
+{}
+#endif
+
 tSirRetStatus
 sir_convert_beacon_frame2_struct(tpAniSirGlobal pMac,
 				 uint8_t *pFrame,
@@ -4282,6 +4341,8 @@ sir_convert_beacon_frame2_struct(tpAniSirGlobal pMac,
 			     sizeof(tDot11fIEhe_op));
 	}
 
+	convert_bcon_bss_color_change_ie(pBeacon, pBeaconStruct);
+
 	qdf_mem_free(pBeacon);
 	return eSIR_SUCCESS;
 

+ 12 - 11
core/pld/src/pld_common.c

@@ -347,7 +347,7 @@ int pld_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
 		ret = pld_pcie_wlan_enable(dev, config, mode, host_version);
 		break;
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_wlan_enable(config, mode, host_version);
+		ret = pld_snoc_wlan_enable(dev, config, mode, host_version);
 		break;
 	case PLD_BUS_TYPE_SDIO:
 		break;
@@ -378,7 +378,7 @@ int pld_wlan_disable(struct device *dev, enum pld_driver_mode mode)
 		ret = pld_pcie_wlan_disable(dev, mode);
 		break;
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_wlan_disable(mode);
+		ret = pld_snoc_wlan_disable(dev, mode);
 		break;
 	case PLD_BUS_TYPE_SDIO:
 		break;
@@ -409,7 +409,7 @@ int pld_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
 		ret = pld_pcie_set_fw_log_mode(dev, fw_log_mode);
 		break;
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_set_fw_log_mode(fw_log_mode);
+		ret = pld_snoc_set_fw_log_mode(dev, fw_log_mode);
 		break;
 	case PLD_BUS_TYPE_SDIO:
 		break;
@@ -971,7 +971,8 @@ int pld_ce_request_irq(struct device *dev, unsigned int ce_id,
 
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_ce_request_irq(ce_id, handler, flags, name, ctx);
+		ret = pld_snoc_ce_request_irq(dev, ce_id,
+					      handler, flags, name, ctx);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		break;
@@ -998,7 +999,7 @@ int pld_ce_free_irq(struct device *dev, unsigned int ce_id, void *ctx)
 
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_ce_free_irq(ce_id, ctx);
+		ret = pld_snoc_ce_free_irq(dev, ce_id, ctx);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		break;
@@ -1021,7 +1022,7 @@ void pld_enable_irq(struct device *dev, unsigned int ce_id)
 {
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		pld_snoc_enable_irq(ce_id);
+		pld_snoc_enable_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		break;
@@ -1044,7 +1045,7 @@ void pld_disable_irq(struct device *dev, unsigned int ce_id)
 {
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		pld_snoc_disable_irq(ce_id);
+		pld_snoc_disable_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		break;
@@ -1072,7 +1073,7 @@ int pld_get_soc_info(struct device *dev, struct pld_soc_info *info)
 
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_get_soc_info(info);
+		ret = pld_snoc_get_soc_info(dev, info);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		ret = pld_pcie_get_soc_info(dev, info);
@@ -1100,7 +1101,7 @@ int pld_get_ce_id(struct device *dev, int irq)
 
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_get_ce_id(irq);
+		ret = pld_snoc_get_ce_id(dev, irq);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		ret = pld_pcie_get_ce_id(irq);
@@ -1126,7 +1127,7 @@ int pld_get_irq(struct device *dev, int ce_id)
 
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_get_irq(ce_id);
+		ret = pld_snoc_get_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 	default:
@@ -1512,7 +1513,7 @@ int pld_is_qmi_disable(struct device *dev)
 
 	switch (type) {
 	case PLD_BUS_TYPE_SNOC:
-		ret = pld_snoc_is_qmi_disable();
+		ret = pld_snoc_is_qmi_disable(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE:
 	case PLD_BUS_TYPE_SDIO:

+ 72 - 3
core/pld/src/pld_snoc.c

@@ -312,6 +312,7 @@ void pld_snoc_unregister_driver(void)
 
 /**
  * pld_snoc_wlan_enable() - Enable WLAN
+ * @dev: device
  * @config: WLAN configuration data
  * @mode: WLAN mode
  * @host_version: host software version
@@ -322,7 +323,43 @@ void pld_snoc_unregister_driver(void)
  * Return: 0 for success
  *         Non zero failure code for errors
  */
-int pld_snoc_wlan_enable(struct pld_wlan_enable_cfg *config,
+
+#ifdef ICNSS_API_WITH_DEV
+int pld_snoc_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
+			 enum pld_driver_mode mode, const char *host_version)
+{
+	struct icnss_wlan_enable_cfg cfg;
+	enum icnss_driver_mode icnss_mode;
+
+	if (!dev)
+		return -ENODEV;
+
+	cfg.num_ce_tgt_cfg = config->num_ce_tgt_cfg;
+	cfg.ce_tgt_cfg = (struct ce_tgt_pipe_cfg *)
+		config->ce_tgt_cfg;
+	cfg.num_ce_svc_pipe_cfg = config->num_ce_svc_pipe_cfg;
+	cfg.ce_svc_cfg = (struct ce_svc_pipe_cfg *)
+		config->ce_svc_cfg;
+	cfg.num_shadow_reg_cfg = config->num_shadow_reg_cfg;
+	cfg.shadow_reg_cfg = (struct icnss_shadow_reg_cfg *)
+		config->shadow_reg_cfg;
+
+	switch (mode) {
+	case PLD_FTM:
+		icnss_mode = ICNSS_FTM;
+		break;
+	case PLD_EPPING:
+		icnss_mode = ICNSS_EPPING;
+		break;
+	default:
+		icnss_mode = ICNSS_MISSION;
+		break;
+	}
+
+	return icnss_wlan_enable(dev, &cfg, icnss_mode, host_version);
+}
+#else
+int pld_snoc_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
 			 enum pld_driver_mode mode, const char *host_version)
 {
 	struct icnss_wlan_enable_cfg cfg;
@@ -349,11 +386,14 @@ int pld_snoc_wlan_enable(struct pld_wlan_enable_cfg *config,
 		icnss_mode = ICNSS_MISSION;
 		break;
 	}
+
 	return icnss_wlan_enable(&cfg, icnss_mode, host_version);
 }
+#endif
 
 /**
  * pld_snoc_wlan_disable() - Disable WLAN
+ * @dev: device
  * @mode: WLAN mode
  *
  * This function disables WLAN FW. It passes WLAN mode to FW.
@@ -361,13 +401,24 @@ int pld_snoc_wlan_enable(struct pld_wlan_enable_cfg *config,
  * Return: 0 for success
  *         Non zero failure code for errors
  */
-int pld_snoc_wlan_disable(enum pld_driver_mode mode)
+#ifdef ICNSS_API_WITH_DEV
+int pld_snoc_wlan_disable(struct device *dev, enum pld_driver_mode mode)
+{
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_wlan_disable(dev, ICNSS_OFF);
+}
+#else
+int pld_snoc_wlan_disable(struct device *dev, enum pld_driver_mode mode)
 {
 	return icnss_wlan_disable(ICNSS_OFF);
 }
+#endif
 
 /**
  * pld_snoc_get_soc_info() - Get SOC information
+ * @dev: device
  * @info: buffer to SOC information
  *
  * Return SOC info to the buffer.
@@ -375,7 +426,24 @@ int pld_snoc_wlan_disable(enum pld_driver_mode mode)
  * Return: 0 for success
  *         Non zero failure code for errors
  */
-int pld_snoc_get_soc_info(struct pld_soc_info *info)
+#ifdef ICNSS_API_WITH_DEV
+int pld_snoc_get_soc_info(struct device *dev, struct pld_soc_info *info)
+{
+	int ret = 0;
+	struct icnss_soc_info icnss_info;
+
+	if (info == NULL || !dev)
+		return -ENODEV;
+
+	ret = icnss_get_soc_info(dev, &icnss_info);
+	if (0 != ret)
+		return ret;
+
+	memcpy(info, &icnss_info, sizeof(*info));
+	return 0;
+}
+#else
+int pld_snoc_get_soc_info(struct device *dev, struct pld_soc_info *info)
 {
 	int ret = 0;
 	struct icnss_soc_info icnss_info;
@@ -391,3 +459,4 @@ int pld_snoc_get_soc_info(struct pld_soc_info *info)
 	return 0;
 }
 #endif
+#endif

+ 117 - 30
core/pld/src/pld_snoc.h

@@ -42,36 +42,41 @@ static inline int pld_snoc_register_driver(void)
 static inline void pld_snoc_unregister_driver(void)
 {
 }
-static inline int pld_snoc_wlan_enable(struct pld_wlan_enable_cfg *config,
-		    enum pld_driver_mode mode, const char *host_version)
+static inline int pld_snoc_wlan_enable(struct device *dev,
+			struct pld_wlan_enable_cfg *config,
+			enum pld_driver_mode mode, const char *host_version)
 {
 	return 0;
 }
-static inline int pld_snoc_wlan_disable(enum pld_driver_mode mode)
+static inline int pld_snoc_wlan_disable(struct device *dev,
+					enum pld_driver_mode mode)
 {
 	return 0;
 }
-static inline int pld_snoc_ce_request_irq(unsigned int ce_id,
-		       irqreturn_t (*handler)(int, void *),
-		       unsigned long flags, const char *name, void *ctx)
+static inline int pld_snoc_ce_request_irq(struct device *dev,
+					  unsigned int ce_id,
+					  irqreturn_t (*handler)(int, void *),
+					  unsigned long flags,
+					  const char *name, void *ctx)
 {
 	return 0;
 }
-static inline int pld_snoc_ce_free_irq(unsigned int ce_id, void *ctx)
+static inline int pld_snoc_ce_free_irq(struct device *dev,
+				       unsigned int ce_id, void *ctx)
 {
 	return 0;
 }
-static inline void pld_snoc_enable_irq(unsigned int ce_id)
+static inline void pld_snoc_enable_irq(struct device *dev, unsigned int ce_id)
 {
 }
-static inline void pld_snoc_disable_irq(unsigned int ce_id)
+static inline void pld_snoc_disable_irq(struct device *dev, unsigned int ce_id)
 {
 }
-static inline int pld_snoc_get_soc_info(struct pld_soc_info *info)
+static inline int pld_snoc_get_soc_info(struct device *dev, struct pld_soc_info *info)
 {
 	return 0;
 }
-static inline int pld_snoc_get_ce_id(int irq)
+static inline int pld_snoc_get_ce_id(struct device *dev, int irq)
 {
 	return 0;
 }
@@ -83,7 +88,7 @@ static inline int pld_snoc_power_off(struct device *dev)
 {
 	return 0;
 }
-static inline int pld_snoc_get_irq(int ce_id)
+static inline int pld_snoc_get_irq(struct device *dev, int ce_id)
 {
 	return 0;
 }
@@ -113,11 +118,11 @@ unsigned int pld_snoc_socinfo_get_serial_number(struct device *dev)
 {
 	return 0;
 }
-static inline int pld_snoc_is_qmi_disable(void)
+static inline int pld_snoc_is_qmi_disable(struct device *dev)
 {
 	return 0;
 }
-static inline int pld_snoc_set_fw_log_mode(u8 fw_log_mode)
+static inline int pld_snoc_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
 {
 	return 0;
 }
@@ -128,33 +133,98 @@ static inline int pld_snoc_force_assert_target(struct device *dev)
 #else
 int pld_snoc_register_driver(void);
 void pld_snoc_unregister_driver(void);
-int pld_snoc_wlan_enable(struct pld_wlan_enable_cfg *config,
+int pld_snoc_wlan_enable(struct device *dev,
+			 struct pld_wlan_enable_cfg *config,
 			 enum pld_driver_mode mode, const char *host_version);
-int pld_snoc_wlan_disable(enum pld_driver_mode mode);
-int pld_snoc_get_soc_info(struct pld_soc_info *info);
-static inline int pld_snoc_ce_request_irq(unsigned int ce_id,
+int pld_snoc_wlan_disable(struct device *dev, enum pld_driver_mode mode);
+int pld_snoc_get_soc_info(struct device *dev, struct pld_soc_info *info);
+
+#ifdef ICNSS_API_WITH_DEV
+static inline int pld_snoc_ce_request_irq(struct device *dev,
+					  unsigned int ce_id,
 					  irqreturn_t (*handler)(int, void *),
 					  unsigned long flags,
 					  const char *name, void *ctx)
 {
-	return icnss_ce_request_irq(ce_id, handler, flags, name, ctx);
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_ce_request_irq(dev, ce_id, handler, flags, name, ctx);
 }
-static inline int pld_snoc_ce_free_irq(unsigned int ce_id, void *ctx)
+
+static inline int pld_snoc_ce_free_irq(struct device *dev,
+				       unsigned int ce_id, void *ctx)
 {
-	return icnss_ce_free_irq(ce_id, ctx);
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_ce_free_irq(dev, ce_id, ctx);
+}
+
+static inline void pld_snoc_enable_irq(struct device *dev, unsigned int ce_id)
+{
+	if (dev)
+		icnss_enable_irq(dev, ce_id);
+}
+
+static inline void pld_snoc_disable_irq(struct device *dev, unsigned int ce_id)
+{
+	if (dev)
+		icnss_disable_irq(dev, ce_id);
+}
+
+static inline int pld_snoc_get_ce_id(struct device *dev, int irq)
+{
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_get_ce_id(dev, irq);
+}
+
+static inline int pld_snoc_get_irq(struct device *dev, int ce_id)
+{
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_get_irq(dev, ce_id);
+}
+#else
+static inline int pld_snoc_ce_request_irq(struct device *dev,
+					  unsigned int ce_id,
+					  irqreturn_t (*handler)(int, void *),
+					  unsigned long flags,
+					  const char *name, void *ctx)
+{
+	return icnss_ce_request_irq(ce_id, handler, flags, name, ctx);
 }
-static inline void pld_snoc_enable_irq(unsigned int ce_id)
+
+static inline void pld_snoc_enable_irq(struct device *dev, unsigned int ce_id)
 {
 	icnss_enable_irq(ce_id);
 }
-static inline void pld_snoc_disable_irq(unsigned int ce_id)
+
+static inline void pld_snoc_disable_irq(struct device *dev, unsigned int ce_id)
 {
 	icnss_disable_irq(ce_id);
 }
-static inline int pld_snoc_get_ce_id(int irq)
+
+static inline int pld_snoc_ce_free_irq(struct device *dev,
+				       unsigned int ce_id, void *ctx)
+{
+	return icnss_ce_free_irq(ce_id, ctx);
+}
+
+static inline int pld_snoc_get_ce_id(struct device *dev, int irq)
 {
 	return icnss_get_ce_id(irq);
 }
+
+static inline int pld_snoc_get_irq(struct device *dev, int ce_id)
+{
+	return icnss_get_irq(ce_id);
+}
+#endif
+
 static inline int pld_snoc_power_on(struct device *dev)
 {
 	return icnss_power_on(dev);
@@ -163,10 +233,6 @@ static inline int pld_snoc_power_off(struct device *dev)
 {
 	return icnss_power_off(dev);
 }
-static inline int pld_snoc_get_irq(int ce_id)
-{
-	return icnss_get_irq(ce_id);
-}
 static inline int pld_snoc_athdiag_read(struct device *dev, uint32_t offset,
 					uint32_t memtype, uint32_t datalen,
 					uint8_t *output)
@@ -193,14 +259,35 @@ unsigned int pld_snoc_socinfo_get_serial_number(struct device *dev)
 {
 	return icnss_socinfo_get_serial_number(dev);
 }
-static inline int pld_snoc_is_qmi_disable(void)
+
+#ifdef ICNSS_API_WITH_DEV
+static inline int pld_snoc_is_qmi_disable(struct device *dev)
+{
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_is_qmi_disable(dev);
+}
+
+static inline int pld_snoc_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
+{
+	if (!dev)
+		return -ENODEV;
+
+	return icnss_set_fw_log_mode(dev, fw_log_mode);
+}
+#else
+static inline int pld_snoc_is_qmi_disable(struct device *dev)
 {
 	return icnss_is_qmi_disable();
 }
-static inline int pld_snoc_set_fw_log_mode(u8 fw_log_mode)
+
+static inline int pld_snoc_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
 {
 	return icnss_set_fw_log_mode(fw_log_mode);
 }
+#endif
+
 static inline int pld_snoc_force_assert_target(struct device *dev)
 {
 	return icnss_trigger_recovery(dev);

+ 2 - 2
core/sap/src/sap_api_link_cntl.c

@@ -1039,8 +1039,8 @@ wlansap_roam_callback(void *ctx, tCsrRoamInfo *csr_roam_info, uint32_t roamId,
 			   0;
 		}
 		/* if external acs enabled */
-		if (sap_ctx->vendor_acs_enabled &&
-			!mac_ctx->sap.SapDfsInfo.target_channel) {
+		if (sap_ctx->vendor_acs_dfs_lte_enabled &&
+		    !mac_ctx->sap.SapDfsInfo.target_channel) {
 			/* Return from here, processing will be done later */
 			return 0;
 		}

+ 6 - 3
core/sap/src/sap_fsm.c

@@ -1726,7 +1726,10 @@ QDF_STATUS sap_goto_channel_sel(struct sap_context *sap_context,
 					sap_context->channel,
 					sap_context->csr_roamProfile.phyMode,
 					sap_context->cc_switch_mode);
-			if (con_ch) {
+			if (con_ch && !(wlan_reg_is_dfs_ch(mac_ctx->pdev,
+						con_ch) &&
+			sap_context->cc_switch_mode ==
+	QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION)) {
 				QDF_TRACE(QDF_MODULE_ID_SAP,
 					QDF_TRACE_LEVEL_ERROR,
 					"%s: Override ch %d to %d due to CC Intf",
@@ -4290,10 +4293,10 @@ uint8_t sap_indicate_radar(struct sap_context *sap_ctx)
 		return sap_ctx->chan_before_pre_cac;
 	}
 
-	if (sap_ctx->vendor_acs_enabled && (QDF_STATUS_SUCCESS ==
+	if (sap_ctx->vendor_acs_dfs_lte_enabled && (QDF_STATUS_SUCCESS ==
 	    sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NEXT_CHANNEL_REQ,
 	    (void *) eSAP_STATUS_SUCCESS)))
-			return 0;
+		return 0;
 
 	target_channel = sap_random_channel_sel(sap_ctx);
 	if (!target_channel)

+ 1 - 1
core/sap/src/sap_internal.h

@@ -247,7 +247,7 @@ struct sap_context {
 	qdf_event_t sap_session_opened_evt;
 	bool is_pre_cac_on;
 	bool pre_cac_complete;
-	bool vendor_acs_enabled;
+	bool vendor_acs_dfs_lte_enabled;
 	uint8_t dfs_vendor_channel;
 	uint8_t dfs_vendor_chan_bw;
 	uint8_t chan_before_pre_cac;

+ 1 - 1
core/sap/src/sap_module.c

@@ -2327,7 +2327,7 @@ QDF_STATUS wlan_sap_set_vendor_acs(struct sap_context *sap_context,
 			  "%s: Invalid SAP pointer", __func__);
 		return QDF_STATUS_E_FAULT;
 	}
-	sap_context->vendor_acs_enabled = is_vendor_acs;
+	sap_context->vendor_acs_dfs_lte_enabled = is_vendor_acs;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 19 - 0
core/sme/inc/sme_api.h

@@ -1855,5 +1855,24 @@ static inline QDF_STATUS sme_update_fils_config(tHalHandle hal,
 static inline void sme_free_join_rsp_fils_params(tCsrRoamInfo *roam_info)
 {}
 
+#endif
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+/**
+ * sme_set_he_bss_color() - Sets the HE BSS color
+ *
+ * @hal: The handle returned by mac_open
+ * @session_id: session_id of the request
+ * @bss_color: HE BSS color value to set
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS sme_set_he_bss_color(tHalHandle hal, uint8_t session_id,
+		uint8_t bss_color);
+#else
+static inline QDF_STATUS sme_set_he_bss_color(tHalHandle hal,
+		uint8_t session_id, uint8_t bss_color)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 #endif /* #if !defined( __SME_API_H ) */

+ 36 - 0
core/sme/src/common/sme_api.c

@@ -14792,6 +14792,42 @@ void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
 		vdev_nss->tdls, vdev_nss->ocb);
 }
 
+#ifdef WLAN_FEATURE_11AX_BSS_COLOR
+#define MAX_BSS_COLOR_VAL 63
+#define MIN_BSS_COLOR_VAL 1
+
+QDF_STATUS sme_set_he_bss_color(tHalHandle hal, uint8_t session_id,
+		uint8_t bss_color)
+
+{
+	struct sir_set_he_bss_color *bss_color_msg;
+	uint8_t len;
+
+	if (!hal) {
+		sme_err("Invalid hal pointer");
+		return QDF_STATUS_E_FAULT;
+	}
+
+	sme_debug("Set HE bss_color  %d", bss_color);
+
+	if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
+		sme_debug("Invalid HE bss_color  %d", bss_color);
+		return QDF_STATUS_E_INVAL;
+	}
+	len = sizeof(*bss_color_msg);
+	bss_color_msg = qdf_mem_malloc(len);
+	if (!bss_color_msg) {
+		sme_err("mem alloc failed");
+		return QDF_STATUS_E_NOMEM;
+	}
+	bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
+	bss_color_msg->length = len;
+	bss_color_msg->session_id = session_id;
+	bss_color_msg->bss_color = bss_color;
+	return umac_send_mb_message_to_mac(bss_color_msg);
+}
+#endif
+
 /**
  * sme_update_hw_dbs_capable() - sets the HW DBS capability
  * @hal: Pointer to HAL

+ 2 - 0
core/wma/inc/wma_tgt_cfg.h

@@ -45,6 +45,7 @@
  * @en_tdls_uapsd_sleep_sta: enable sta tdls uapsd sleep
  * @en_roam_offload: enable roam offload
  * @en_11ax: enable 11ax
+ * @is_fw_mawc_capable: Motion Aided Wireless Connectivity feature
  */
 struct wma_tgt_services {
 	uint32_t sta_power_save;
@@ -71,6 +72,7 @@ struct wma_tgt_services {
 	bool en_11ax;
 	bool get_peer_info_enabled;
 	bool is_fils_roaming_supported;
+	bool is_fw_mawc_capable;
 };
 
 /**

+ 2 - 1
core/wma/src/wma_dev_if.c

@@ -2723,7 +2723,8 @@ static inline bool wma_crash_on_fw_timeout(bool crash_enabled)
 	if (cds_is_driver_recovering())
 		return false;
 
-	if (!cds_is_fw_down())
+	/* Firmware is down send failure response */
+	if (cds_is_fw_down())
 		return false;
 
 	if (cds_is_driver_unloading())

+ 9 - 0
core/wma/src/wma_main.c

@@ -1933,6 +1933,8 @@ static void wma_cleanup_vdev_resp_queue(tp_wma_handle wma)
 		return;
 	}
 
+	WMA_LOGD(FL("Cleaning up vdev resp queue"));
+
 	/* peek front, and then cleanup it in wma_vdev_resp_timer */
 	while (qdf_list_peek_front(&wma->vdev_resp_queue, &node1) ==
 				   QDF_STATUS_SUCCESS) {
@@ -2335,6 +2337,7 @@ static int wma_flush_complete_evt_handler(void *handle,
 		if (status != QDF_STATUS_SUCCESS)
 			WMA_LOGE("Failed to stop the log completion timeout");
 		cds_logging_set_fw_flush_complete();
+		return QDF_STATUS_SUCCESS;
 	} else if (reason_code && cds_is_log_report_in_progress() == false) {
 		/* Asynchronous flush event for fatal events */
 		status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
@@ -4302,6 +4305,12 @@ static inline void wma_update_target_services(tp_wma_handle wh,
 			wh->wmi_service_ext_bitmap,
 			WMI_SERVICE_FILS_SUPPORT))
 		cfg->is_fils_roaming_supported = true;
+
+	if (WMI_SERVICE_EXT_IS_ENABLED(wh->wmi_service_bitmap,
+				       wh->wmi_service_ext_bitmap,
+				       WMI_SERVICE_MAWC_SUPPORT))
+		cfg->is_fw_mawc_capable = true;
+
 }
 
 /**

+ 4 - 4
core/wma/src/wma_mgmt.c

@@ -3476,7 +3476,7 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle,
 	peer = cdp_peer_find_by_addr(soc, pdev_ctx,
 				peer_addr, &peer_id);
 	if (!peer) {
-		if (SIR_MAC_MGMT_ASSOC_REQ != subtype) {
+		if (IEEE80211_FC0_SUBTYPE_ASSOC_REQ != subtype) {
 			WMA_LOGI(
 			   FL("Received mgmt frame: %0x from unknow peer: %pM"),
 			   subtype, peer_addr);
@@ -3486,7 +3486,7 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle,
 	}
 
 	switch (subtype) {
-	case SIR_MAC_MGMT_ASSOC_REQ:
+	case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
 		ptr = cdp_peer_last_assoc_received(soc, peer);
 		if (ptr == NULL) {
 			WMA_LOGE(FL("cdp_peer_last_assoc_received Failed"));
@@ -3502,7 +3502,7 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle,
 		*cdp_peer_last_assoc_received(soc, peer) =
 				qdf_get_system_timestamp();
 		break;
-	case SIR_MAC_MGMT_DISASSOC:
+	case IEEE80211_FC0_SUBTYPE_DISASSOC:
 		ptr = cdp_peer_last_disassoc_received(soc, peer);
 		if (ptr == NULL) {
 			WMA_LOGE(FL("cdp_peer_last_disassoc_received Failed"));
@@ -3518,7 +3518,7 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle,
 		*cdp_peer_last_disassoc_received(soc, peer) =
 				qdf_get_system_timestamp();
 		break;
-	case SIR_MAC_MGMT_DEAUTH:
+	case IEEE80211_FC0_SUBTYPE_DEAUTH:
 		ptr = cdp_peer_last_deauth_received(soc, peer);
 		if (ptr == NULL) {
 			WMA_LOGE(FL("cdp_peer_last_deauth_received Failed"));

+ 21 - 6
core/wma/src/wma_scan_roam.c

@@ -252,6 +252,7 @@ QDF_STATUS wma_get_buf_start_scan_cmd(tp_wma_handle wma_handle,
 	cmd->repeat_probe_time =
 		cmd->dwell_time_active / WMA_SCAN_NPROBES_DEFAULT;
 
+	WMA_LOGD("Repeat probe time %d", cmd->repeat_probe_time);
 	/* CSR sends min_rest_Time, max_rest_time and idle_time
 	 * for staying on home channel to continue data traffic.
 	 * Rome fw has facility to monitor the traffic
@@ -450,7 +451,9 @@ QDF_STATUS wma_get_buf_start_scan_cmd(tp_wma_handle wma_handle,
 	}
 
 	cmd->n_probes = (cmd->repeat_probe_time > 0) ?
-			cmd->dwell_time_active / cmd->repeat_probe_time : 0;
+		cmd->dwell_time_active / cmd->repeat_probe_time : 0;
+
+	WMA_LOGD("Num Probes in each ch scan %d", cmd->n_probes);
 	if (scan_req->channelList.numChannels) {
 		cmd->num_chan = scan_req->channelList.numChannels;
 		for (i = 0; i < scan_req->channelList.numChannels; ++i) {
@@ -1960,10 +1963,17 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
 						   roam_req->sessionId);
 		if (qdf_status != QDF_STATUS_SUCCESS)
 			break;
-		qdf_status = wma_roam_scan_mawc_params(wma_handle, roam_req);
-		if (qdf_status != QDF_STATUS_SUCCESS) {
-			WMA_LOGE("Sending roaming MAWC params failed");
-			break;
+		if (WMI_SERVICE_EXT_IS_ENABLED(wma_handle->wmi_service_bitmap,
+					wma_handle->wmi_service_ext_bitmap,
+					WMI_SERVICE_MAWC_SUPPORT)) {
+			qdf_status =
+				wma_roam_scan_mawc_params(wma_handle, roam_req);
+			if (qdf_status != QDF_STATUS_SUCCESS) {
+				WMA_LOGE("Sending roaming MAWC params failed");
+				break;
+			}
+		} else {
+			WMA_LOGD("MAWC roaming not supported by firmware");
 		}
 		qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
 		if (qdf_status != QDF_STATUS_SUCCESS) {
@@ -5248,6 +5258,11 @@ QDF_STATUS  wma_ipa_offload_enable_disable(tp_wma_handle wma,
 	params.vdev_id = ipa_offload->vdev_id;
 	params.enable = ipa_offload->enable;
 
+	WMA_LOGI("%s: offload_type=%d, vdev_id=%d, enable=%d",
+		__func__,
+		ipa_offload->offload_type, ipa_offload->vdev_id,
+		ipa_offload->enable);
+
 	status = wmi_unified_ipa_offload_control_cmd(wma->wmi_handle,
 						&params);
 	if (QDF_IS_STATUS_ERROR(status))
@@ -5265,7 +5280,7 @@ QDF_STATUS  wma_ipa_offload_enable_disable(tp_wma_handle wma,
 	rx_fwd_disabled = cdp_cfg_is_rx_fwd_disabled(
 		cds_get_context(QDF_MODULE_ID_SOC), vdev);
 	if (!ipa_offload->enable || rx_fwd_disabled) {
-		WMA_LOGE("%s: ipa_offload->enable=%d, rx_fwd_disabled=%d",
+		WMA_LOGI("%s: ipa_offload->enable=%d, rx_fwd_disabled=%d",
 				__func__,
 				ipa_offload->enable, rx_fwd_disabled);
 		intra_bss_fwd = 1;

+ 5 - 0
core/wma/src/wma_utils.c

@@ -4589,6 +4589,11 @@ QDF_STATUS wma_send_vdev_up_to_fw(t_wma_handle *wma,
 	QDF_STATUS status;
 	struct wma_txrx_node *vdev = &wma->interfaces[params->vdev_id];
 
+	if (wma_is_vdev_up(params->vdev_id)) {
+		WMA_LOGD("vdev %d is already up for bssid %pM. Do not send",
+			 params->vdev_id, bssid);
+		return QDF_STATUS_SUCCESS;
+	}
 	status = wmi_unified_vdev_up_send(wma->wmi_handle, bssid, params);
 	wma_release_wakelock(&vdev->vdev_start_wakelock);
 

Some files were not shown because too many files changed in this diff