Przeglądaj źródła

Merge remote-tracking branch 'remotes/origin/wlan-cld3.driver.lnx.1.1-dev' into wlan-cld3.driver.lnx.2.0-dev

Fast forward CLD3.0-2.0-dev branch to CLD3-1.1-dev from 5.1.0.29J to 5.1.0.30P

* remotes/origin/wlan-cld3.driver.lnx.1.1-dev: (113 commits)
  Release 5.1.0.30P
  qcacld-3.0: Add support to configure the 80MHz preference
  Release 5.1.0.30O
  qcacld-3.0: Add ini to configure RTS profiles to FW
  Release 5.1.0.30N
  qcacld-3.0: Update get_concurrency_matrix to advertise STA + NAN
  qcacld-3.0: Validate CCXBEACONREQ IE fields
  qcacld-3.0: Add back these ese functions
  qcacld-3.0: Fix buffer overwrite problem in CCXBEACONREQ
  Release 5.1.0.30M
  qcacld-3.0: Invalidate session ID after successful session close
  Release 5.1.0.30L
  qcacld-3.0: Fix -Wmissing-prototypes in lim_process_assoc_rsp_frame
  qcacld-3.0: Fix -Wmissing-prototypes in lim_ibss_peer_mgmt
  qcacld-3.0: Fix -Wmissing-prototypes in lim_assoc_utils
  qcacld-3.0: Fix -Wmissing-prototypes in lim_admit_control
  qcacld-3.0: Fix -Wmissing-prototypes in dph_hash_table
  qcacld-3.0: Fix -Wmissing-prototypes in cfg_api
  qcacld-3.0: Fix -Wmissing-prototypes in wlan_hdd_tdls
  Release 5.1.0.30K
  ...
  Release 5.1.0.29M
  qcacld-3.0: Fill regulatory info before wiphy init
  Release 5.1.0.29L
  qcacld-3.0: Fix HDD logging API in wlan_hdd_assoc
  Release 5.1.0.29K
  qcacld-3.0: Do NULL check on adapter->dev in hdd_lro_flush

Change-Id: Ie3a4ac2e2fa709b4f8fe94b2e7f2991060630d5f
CRs-Fixed: 688141 1075815 940886 987047 1025185 950762 993561 1074111 1075090 1074336 1076422 1074146 1075582 1075544 1075533 1075166 1076096 1075102 1073824 1073756 1075098 1017278 1072234 1074043 1063177 1065451 1072839 1066077 1071366 1071312 1074565 1075289 970761 958534 1072885 924814 1062308 955357 1026420 990161 964146 1073581 1070005 1072651 1072423 1073593 1073739 1035768 932264 937586 1073808
Prakash Dhavali 8 lat temu
rodzic
commit
568b6a86d2
97 zmienionych plików z 3441 dodań i 1630 usunięć
  1. 2 2
      core/bmi/src/bmi.c
  2. 7 6
      core/bmi/src/ol_fw.c
  3. 26 1
      core/cds/inc/cds_concurrency.h
  4. 9 2
      core/cds/src/cds_api.c
  5. 40 25
      core/cds/src/cds_concurrency.c
  6. 16 11
      core/cds/src/cds_reg_service.c
  7. 0 41
      core/cds/src/cds_regdomain.c
  8. 2 2
      core/cds/src/cds_utils.c
  9. 54 19
      core/dp/txrx/ol_txrx.c
  10. 1 0
      core/dp/txrx/ol_txrx.h
  11. 117 17
      core/dp/txrx/ol_txrx_peer_find.c
  12. 3 0
      core/dp/txrx/ol_txrx_peer_find.h
  13. 11 1
      core/dp/txrx/ol_txrx_types.h
  14. 2 17
      core/hdd/inc/wlan_hdd_assoc.h
  15. 83 1
      core/hdd/inc/wlan_hdd_cfg.h
  16. 43 0
      core/hdd/inc/wlan_hdd_driver_ops.h
  17. 1 2
      core/hdd/inc/wlan_hdd_includes.h
  18. 23 5
      core/hdd/inc/wlan_hdd_main.h
  19. 18 0
      core/hdd/inc/wlan_hdd_memdump.h
  20. 0 190
      core/hdd/inc/wlan_hdd_mib.h
  21. 49 0
      core/hdd/inc/wlan_hdd_power.h
  22. 34 10
      core/hdd/inc/wlan_hdd_tdls.h
  23. 1 0
      core/hdd/inc/wlan_hdd_tsf.h
  24. 150 259
      core/hdd/src/wlan_hdd_assoc.c
  25. 72 3
      core/hdd/src/wlan_hdd_cfg.c
  26. 64 17
      core/hdd/src/wlan_hdd_cfg80211.c
  27. 8 0
      core/hdd/src/wlan_hdd_cfg80211.h
  28. 1 0
      core/hdd/src/wlan_hdd_debugfs.c
  29. 14 45
      core/hdd/src/wlan_hdd_driver_ops.c
  30. 6 6
      core/hdd/src/wlan_hdd_ext_scan.c
  31. 79 21
      core/hdd/src/wlan_hdd_hostapd.c
  32. 143 21
      core/hdd/src/wlan_hdd_ioctl.c
  33. 4 4
      core/hdd/src/wlan_hdd_ipa.c
  34. 7 4
      core/hdd/src/wlan_hdd_lro.c
  35. 124 26
      core/hdd/src/wlan_hdd_main.c
  36. 234 0
      core/hdd/src/wlan_hdd_memdump.c
  37. 28 19
      core/hdd/src/wlan_hdd_p2p.c
  38. 174 23
      core/hdd/src/wlan_hdd_power.c
  39. 7 7
      core/hdd/src/wlan_hdd_regulatory.c
  40. 1 1
      core/hdd/src/wlan_hdd_scan.c
  41. 2 1
      core/hdd/src/wlan_hdd_softap_tx_rx.c
  42. 95 18
      core/hdd/src/wlan_hdd_tdls.c
  43. 3 2
      core/hdd/src/wlan_hdd_tsf.c
  44. 5 13
      core/hdd/src/wlan_hdd_tx_rx.c
  45. 41 63
      core/hdd/src/wlan_hdd_wext.c
  46. 1 0
      core/mac/inc/ani_global.h
  47. 3 3
      core/mac/inc/qwlan_version.h
  48. 14 0
      core/mac/inc/sir_api.h
  49. 0 5
      core/mac/inc/wni_api.h
  50. 9 9
      core/mac/src/cfg/cfgUtil/dot11f.frms
  51. 1 1
      core/mac/src/cfg/cfg_api.c
  52. 2 1
      core/mac/src/dph/dph_hash_table.c
  53. 20 20
      core/mac/src/include/dot11f.h
  54. 3 2
      core/mac/src/include/parser_api.h
  55. 2 0
      core/mac/src/include/sir_params.h
  56. 17 1
      core/mac/src/pe/include/lim_api.h
  57. 5 0
      core/mac/src/pe/include/lim_session.h
  58. 6 4
      core/mac/src/pe/lim/lim_admit_control.c
  59. 60 4
      core/mac/src/pe/lim/lim_api.c
  60. 32 30
      core/mac/src/pe/lim/lim_assoc_utils.c
  61. 6 0
      core/mac/src/pe/lim/lim_assoc_utils.h
  62. 2 1
      core/mac/src/pe/lim/lim_ibss_peer_mgmt.c
  63. 3 1
      core/mac/src/pe/lim/lim_p2p.c
  64. 31 8
      core/mac/src/pe/lim/lim_process_assoc_req_frame.c
  65. 3 3
      core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c
  66. 33 50
      core/mac/src/pe/lim/lim_process_message_queue.c
  67. 4 0
      core/mac/src/pe/lim/lim_process_mlm_req_messages.c
  68. 2 0
      core/mac/src/pe/lim/lim_process_sme_req_messages.c
  69. 23 10
      core/mac/src/pe/lim/lim_process_tdls.c
  70. 3 2
      core/mac/src/pe/lim/lim_prop_exts_utils.c
  71. 5 5
      core/mac/src/pe/lim/lim_send_frames_host_roam.c
  72. 23 6
      core/mac/src/pe/lim/lim_send_management_frames.c
  73. 1 1
      core/mac/src/pe/lim/lim_send_sme_rsp_messages.c
  74. 5 3
      core/mac/src/pe/lim/lim_types.h
  75. 70 67
      core/mac/src/sys/legacy/src/utils/src/dot11f.c
  76. 0 4
      core/mac/src/sys/legacy/src/utils/src/mac_trace.c
  77. 61 44
      core/mac/src/sys/legacy/src/utils/src/parser_api.c
  78. 2 2
      core/sap/inc/sap_api.h
  79. 16 0
      core/sap/src/sap_fsm.c
  80. 20 9
      core/sme/inc/csr_api.h
  81. 3 0
      core/sme/inc/csr_internal.h
  82. 9 0
      core/sme/inc/sme_api.h
  83. 136 2
      core/sme/src/common/sme_api.c
  84. 245 137
      core/sme/src/csr/csr_api_roam.c
  85. 1 1
      core/sme/src/csr/csr_util.c
  86. 71 19
      core/utils/pktlog/pktlog_internal.c
  87. 101 0
      core/wma/inc/wma.h
  88. 26 4
      core/wma/inc/wma_api.h
  89. 4 0
      core/wma/inc/wma_if.h
  90. 1 0
      core/wma/inc/wma_types.h
  91. 27 3
      core/wma/src/wma_dev_if.c
  92. 65 0
      core/wma/src/wma_features.c
  93. 372 11
      core/wma/src/wma_main.c
  94. 28 0
      core/wma/src/wma_mgmt.c
  95. 9 128
      core/wma/src/wma_power.c
  96. 50 123
      core/wma/src/wma_utils.c
  97. 1 1
      core/wma/src/wma_utils_ut.c

+ 2 - 2
core/bmi/src/bmi.c

@@ -333,7 +333,7 @@ QDF_STATUS bmi_write_soc_register(uint32_t address, uint32_t param,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS
+static QDF_STATUS
 bmilz_data(uint8_t *buffer, uint32_t length, struct ol_context *ol_ctx)
 {
 	uint32_t cid;
@@ -455,7 +455,7 @@ QDF_STATUS bmi_sign_stream_start(uint32_t address, uint8_t *buffer,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS
+static QDF_STATUS
 bmilz_stream_start(uint32_t address, struct ol_context *ol_ctx)
 {
 	uint32_t cid;

+ 7 - 6
core/bmi/src/ol_fw.c

@@ -848,8 +848,8 @@ ol_check_dataset_patch(struct hif_opaque_softc *scn, uint32_t *address)
 }
 
 
-QDF_STATUS ol_fw_populate_clk_settings(A_refclk_speed_t refclk,
-				     struct cmnos_clock_s *clock_s)
+static QDF_STATUS ol_fw_populate_clk_settings(A_refclk_speed_t refclk,
+					      struct cmnos_clock_s *clock_s)
 {
 	if (!clock_s)
 		return QDF_STATUS_E_FAILURE;
@@ -913,7 +913,7 @@ QDF_STATUS ol_fw_populate_clk_settings(A_refclk_speed_t refclk,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS ol_patch_pll_switch(struct ol_context *ol_ctx)
+static QDF_STATUS ol_patch_pll_switch(struct ol_context *ol_ctx)
 {
 	struct hif_opaque_softc *hif = ol_ctx->scn;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -1207,7 +1207,7 @@ end:
 /* AXI Start Address */
 #define TARGET_ADDR (0xa0000)
 
-void ol_transfer_codeswap_struct(struct ol_context *ol_ctx)
+static void ol_transfer_codeswap_struct(struct ol_context *ol_ctx)
 {
 	struct pld_codeswap_codeseg_info wlan_codeswap;
 	QDF_STATUS rv;
@@ -1411,8 +1411,8 @@ QDF_STATUS ol_download_firmware(struct ol_context *ol_ctx)
 	return status;
 }
 
-int ol_diag_read(struct hif_opaque_softc *scn, uint8_t *buffer,
-		 uint32_t pos, size_t count)
+static int ol_diag_read(struct hif_opaque_softc *scn, uint8_t *buffer,
+			uint32_t pos, size_t count)
 {
 	int result = 0;
 
@@ -1549,6 +1549,7 @@ out:
 	return result;
 }
 
+static
 void ol_dump_target_memory(struct hif_opaque_softc *scn, void *memory_block)
 {
 	char *buffer_loc = memory_block;

+ 26 - 1
core/cds/inc/cds_concurrency.h

@@ -90,7 +90,7 @@ enum hw_mode_ss_config {
 /**
  * enum hw_mode_dbs_capab - DBS HW mode capability
  * @HW_MODE_DBS_NONE: Non DBS capable
- * @HW_MODE_DBS: DFS capable
+ * @HW_MODE_DBS: DBS capable
  */
 enum hw_mode_dbs_capab {
 	HW_MODE_DBS_NONE,
@@ -107,6 +107,16 @@ enum hw_mode_agile_dfs_capab {
 	HW_MODE_AGILE_DFS,
 };
 
+/**
+ * enum hw_mode_sbs_capab - SBS HW mode capability
+ * @HW_MODE_SBS_NONE: Non SBS capable
+ * @HW_MODE_SBS: SBS capable
+ */
+enum hw_mode_sbs_capab {
+	HW_MODE_SBS_NONE,
+	HW_MODE_SBS,
+};
+
 /**
  * enum cds_pcl_group_id - Identifies the pcl groups to be used
  * @CDS_PCL_GROUP_ID1_ID2: Use weights of group1 and group2
@@ -592,8 +602,22 @@ struct cds_conc_connection_info {
 
 bool cds_is_connection_in_progress(void);
 void cds_dump_concurrency_info(void);
+
+#ifdef FEATURE_WLAN_TDLS
 bool cds_check_is_tdls_allowed(enum tQDF_ADAPTER_MODE device_mode);
 void cds_set_tdls_ct_mode(hdd_context_t *hdd_ctx);
+#else
+static inline bool cds_check_is_tdls_allowed(enum tQDF_ADAPTER_MODE device_mode)
+{
+	return false;
+}
+
+static inline void cds_set_tdls_ct_mode(hdd_context_t *hdd_ctx)
+{
+
+}
+#endif
+
 void cds_set_concurrency_mode(enum tQDF_ADAPTER_MODE mode);
 void cds_clear_concurrency_mode(enum tQDF_ADAPTER_MODE mode);
 uint32_t cds_get_connection_count(void);
@@ -766,6 +790,7 @@ QDF_STATUS cds_pdev_set_hw_mode(uint32_t session_id,
 		enum hw_mode_bandwidth mac1_bw,
 		enum hw_mode_dbs_capab dbs,
 		enum hw_mode_agile_dfs_capab dfs,
+		enum hw_mode_sbs_capab sbs,
 		enum sir_conn_update_reason reason);
 enum cds_conc_next_action cds_need_opportunistic_upgrade(void);
 QDF_STATUS cds_next_actions(uint32_t session_id,

+ 9 - 2
core/cds/src/cds_api.c

@@ -101,6 +101,7 @@ v_CONTEXT_t cds_init(void)
 #if defined(TRACE_RECORD)
 	qdf_trace_init();
 #endif
+	qdf_register_debugcb_init();
 
 	cds_ssr_protect_init();
 
@@ -323,7 +324,13 @@ QDF_STATUS cds_open(void)
 	 * and keeps correct limit in cds_cfg.max_station. So, make sure
 	 * config entry pHddCtx->config->maxNumberOfPeers has adjusted value
 	 */
-	pHddCtx->config->maxNumberOfPeers = cds_cfg->max_station;
+	/* In FTM mode cds_cfg->max_stations will be zero. On updating same
+	 * into hdd context config entry, leads to pe_open() to fail, if
+	 * con_mode change happens from FTM mode to any other mode.
+	 */
+	if (DRIVER_TYPE_PRODUCTION == cds_cfg->driver_type)
+		pHddCtx->config->maxNumberOfPeers = cds_cfg->max_station;
+
 	HTCHandle = cds_get_context(QDF_MODULE_ID_HTC);
 	if (!HTCHandle) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
@@ -512,8 +519,8 @@ QDF_STATUS cds_pre_enable(v_CONTEXT_t cds_context)
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "Failed to get ready event from target firmware");
+		QDF_BUG(0);
 		htc_stop(gp_cds_context->htc_ctx);
-		QDF_ASSERT(0);
 		return QDF_STATUS_E_FAILURE;
 	}
 

+ 40 - 25
core/cds/src/cds_concurrency.c

@@ -2485,8 +2485,8 @@ static void cds_pdev_set_hw_mode_cb(uint32_t status,
 		hw_mode.mac0_tx_ss, hw_mode.mac0_rx_ss, hw_mode.mac0_bw);
 	cds_info("MAC1: TxSS:%d, RxSS:%d, Bw:%d",
 		hw_mode.mac1_tx_ss, hw_mode.mac1_rx_ss, hw_mode.mac1_bw);
-	cds_info("DBS:%d, Agile DFS:%d",
-		hw_mode.dbs_cap, hw_mode.agile_dfs_cap);
+	cds_info("DBS:%d, Agile DFS:%d, SBS:%d",
+		hw_mode.dbs_cap, hw_mode.agile_dfs_cap, hw_mode.sbs_cap);
 
 	/* update conc_connection_list */
 	cds_update_hw_mode_conn_info(num_vdev_mac_entries,
@@ -2544,8 +2544,8 @@ void cds_hw_mode_transition_cb(uint32_t old_hw_mode_index,
 		hw_mode.mac0_tx_ss, hw_mode.mac0_rx_ss, hw_mode.mac0_bw);
 	cds_info("MAC1: TxSS:%d, RxSS:%d, Bw:%d",
 		hw_mode.mac1_tx_ss, hw_mode.mac1_rx_ss, hw_mode.mac1_bw);
-	cds_info("DBS:%d, Agile DFS:%d",
-		hw_mode.dbs_cap, hw_mode.agile_dfs_cap);
+	cds_info("DBS:%d, Agile DFS:%d, SBS:%d",
+		hw_mode.dbs_cap, hw_mode.agile_dfs_cap, hw_mode.sbs_cap);
 
 	/* update conc_connection_list */
 	cds_update_hw_mode_conn_info(num_vdev_mac_entries,
@@ -2564,6 +2564,7 @@ void cds_hw_mode_transition_cb(uint32_t old_hw_mode_index,
  * @mac1_bw: MAC1 bandwidth configuration
  * @dbs: HW DBS capability
  * @dfs: HW Agile DFS capability
+ * @sbs: HW SBS capability
  * @reason: Reason for connection update
  *
  * Sends the set hw mode to the SME module which will pass on
@@ -2572,15 +2573,18 @@ void cds_hw_mode_transition_cb(uint32_t old_hw_mode_index,
  * e.g.: To configure 2x2_80
  *       mac0_ss = HW_MODE_SS_2x2, mac0_bw = HW_MODE_80_MHZ
  *       mac1_ss = HW_MODE_SS_0x0, mac1_bw = HW_MODE_BW_NONE
- *       dbs = HW_MODE_DBS_NONE, dfs = HW_MODE_AGILE_DFS_NONE
+ *       dbs = HW_MODE_DBS_NONE, dfs = HW_MODE_AGILE_DFS_NONE,
+ *       sbs = HW_MODE_SBS_NONE
  * e.g.: To configure 1x1_80_1x1_40 (DBS)
  *       mac0_ss = HW_MODE_SS_1x1, mac0_bw = HW_MODE_80_MHZ
  *       mac1_ss = HW_MODE_SS_1x1, mac1_bw = HW_MODE_40_MHZ
- *       dbs = HW_MODE_DBS, dfs = HW_MODE_AGILE_DFS_NONE
+ *       dbs = HW_MODE_DBS, dfs = HW_MODE_AGILE_DFS_NONE,
+ *       sbs = HW_MODE_SBS_NONE
  * e.g.: To configure 1x1_80_1x1_40 (Agile DFS)
  *       mac0_ss = HW_MODE_SS_1x1, mac0_bw = HW_MODE_80_MHZ
  *       mac1_ss = HW_MODE_SS_1x1, mac1_bw = HW_MODE_40_MHZ
- *       dbs = HW_MODE_DBS, dfs = HW_MODE_AGILE_DFS
+ *       dbs = HW_MODE_DBS, dfs = HW_MODE_AGILE_DFS,
+ *       sbs = HW_MODE_SBS_NONE
  *
  * Return: Success if the message made it down to the next layer
  */
@@ -2591,6 +2595,7 @@ QDF_STATUS cds_pdev_set_hw_mode(uint32_t session_id,
 		enum hw_mode_bandwidth mac1_bw,
 		enum hw_mode_dbs_capab dbs,
 		enum hw_mode_agile_dfs_capab dfs,
+		enum hw_mode_sbs_capab sbs,
 		enum sir_conn_update_reason reason)
 {
 	int8_t hw_mode_index;
@@ -2618,7 +2623,7 @@ QDF_STATUS cds_pdev_set_hw_mode(uint32_t session_id,
 	}
 
 	hw_mode_index = wma_get_hw_mode_idx_from_dbs_hw_list(mac0_ss,
-			mac0_bw, mac1_ss, mac1_bw, dbs, dfs);
+			mac0_bw, mac1_ss, mac1_bw, dbs, dfs, sbs);
 	if (hw_mode_index < 0) {
 		cds_err("Invalid HW mode index obtained");
 		return QDF_STATUS_E_FAILURE;
@@ -3340,6 +3345,7 @@ void cds_dump_concurrency_info(void)
 	hdd_ctx->mcc_mode = !cds_current_concurrency_is_scc();
 }
 
+#ifdef FEATURE_WLAN_TDLS
 /*
  * cds_check_is_tdls_allowed() - check is tdls allowed or not
  * @adapter: pointer to adapter
@@ -3419,6 +3425,7 @@ set_state:
 	cds_info("enable_tdls_connection_tracker %d",
 		 hdd_ctx->enable_tdls_connection_tracker);
 }
+#endif
 
 /**
  * cds_set_concurrency_mode() - To set concurrency mode
@@ -3898,7 +3905,7 @@ void cds_decr_active_session(enum tQDF_ADAPTER_MODE mode,
  *
  * Return: None
  */
-void cds_dbs_opportunistic_timer_handler(void *data)
+static void cds_dbs_opportunistic_timer_handler(void *data)
 {
 	enum cds_conc_next_action action = CDS_NOP;
 	cds_context_type *cds_ctx = (cds_context_type *)data;
@@ -4056,7 +4063,7 @@ QDF_STATUS cds_init_policy_mgr(struct cds_sme_cbacks *sme_cbacks)
  *
  * Return: index in the connection table
  */
-uint32_t cds_get_connection_for_vdev_id(uint32_t vdev_id)
+static uint32_t cds_get_connection_for_vdev_id(uint32_t vdev_id)
 {
 	uint32_t conn_index = 0;
 	for (conn_index = 0; conn_index < MAX_NUMBER_OF_CONC_CONNECTIONS;
@@ -4364,6 +4371,8 @@ QDF_STATUS cds_decr_connection_count(uint32_t vdev_id)
 			conc_connection_list[next_conn_index].mac;
 		conc_connection_list[conn_index].chan =
 			conc_connection_list[next_conn_index].chan;
+		conc_connection_list[conn_index].bw =
+			conc_connection_list[next_conn_index].bw;
 		conc_connection_list[conn_index].chain_mask =
 			conc_connection_list[next_conn_index].chain_mask;
 		conc_connection_list[conn_index].original_nss =
@@ -4399,6 +4408,7 @@ QDF_STATUS cds_decr_connection_count(uint32_t vdev_id)
  *
  * Return: QDF_STATUS
  */
+static
 QDF_STATUS cds_get_connection_channels(uint8_t *channels,
 			uint32_t *len, enum cds_pcl_channel_order order,
 			bool skip_dfs_channel,
@@ -4610,10 +4620,11 @@ void cds_update_with_safe_channel_list(uint8_t *pcl_channels, uint32_t *len,
  *
  * Return: Channel List
  */
-QDF_STATUS cds_get_channel_list(enum cds_pcl_type pcl,
-			uint8_t *pcl_channels, uint32_t *len,
-			enum cds_con_mode mode,
-			uint8_t *pcl_weights, uint32_t weight_len)
+static QDF_STATUS cds_get_channel_list(enum cds_pcl_type pcl,
+				       uint8_t *pcl_channels, uint32_t *len,
+				       enum cds_con_mode mode,
+				       uint8_t *pcl_weights,
+				       uint32_t weight_len)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	uint32_t num_channels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
@@ -4644,7 +4655,7 @@ QDF_STATUS cds_get_channel_list(enum cds_pcl_type pcl,
 
 	if (CDS_NONE == pcl) {
 		/* msg */
-		cds_err("pcl is 0");
+		cds_info("pcl is 0");
 		return QDF_STATUS_SUCCESS;
 	}
 	/* get the channel list for current domain */
@@ -5127,7 +5138,7 @@ QDF_STATUS cds_get_pcl(enum cds_con_mode mode,
  *
  * Return: True/False
  */
-bool cds_disallow_mcc(uint8_t channel)
+static bool cds_disallow_mcc(uint8_t channel)
 {
 	uint32_t index = 0;
 	bool match = false;
@@ -5162,7 +5173,8 @@ bool cds_disallow_mcc(uint8_t channel)
  *
  * Return: True/False
  */
-bool cds_allow_new_home_channel(uint8_t channel, uint32_t num_connections)
+static bool cds_allow_new_home_channel(uint8_t channel,
+				       uint32_t num_connections)
 {
 	bool status = true;
 
@@ -5237,7 +5249,7 @@ bool cds_is_ibss_conn_exist(uint8_t *ibss_channel)
  *
  * Return: true if vht160 connection exist else false
  */
-bool cds_vht160_conn_exist(void)
+static bool cds_vht160_conn_exist(void)
 {
 	uint32_t conn_index;
 	bool status = false;
@@ -6114,9 +6126,9 @@ done:
  *
  * Return: None
  */
-void cds_nss_update_cb(void *context, uint8_t tx_status, uint8_t vdev_id,
-				uint8_t next_action,
-				enum sir_conn_update_reason reason)
+static void cds_nss_update_cb(void *context, uint8_t tx_status, uint8_t vdev_id,
+			      uint8_t next_action,
+			      enum sir_conn_update_reason reason)
 {
 	cds_context_type *cds_ctx;
 	uint32_t conn_index = 0;
@@ -6163,9 +6175,9 @@ void cds_nss_update_cb(void *context, uint8_t tx_status, uint8_t vdev_id,
  *
  * Return: QDF_STATUS enum
  */
-QDF_STATUS cds_complete_action(uint8_t  new_nss, uint8_t next_action,
-				enum sir_conn_update_reason reason,
-				uint32_t session_id)
+static QDF_STATUS cds_complete_action(uint8_t  new_nss, uint8_t next_action,
+				      enum sir_conn_update_reason reason,
+				      uint32_t session_id)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	uint32_t index, count;
@@ -6302,6 +6314,7 @@ QDF_STATUS cds_next_actions(uint32_t session_id,
 						HW_MODE_SS_1x1, HW_MODE_40_MHZ,
 						HW_MODE_DBS,
 						HW_MODE_AGILE_DFS_NONE,
+						HW_MODE_SBS_NONE,
 						reason);
 		break;
 	case CDS_SINGLE_MAC_UPGRADE:
@@ -6314,6 +6327,7 @@ QDF_STATUS cds_next_actions(uint32_t session_id,
 						HW_MODE_SS_0x0, HW_MODE_BW_NONE,
 						HW_MODE_DBS_NONE,
 						HW_MODE_AGILE_DFS_NONE,
+						HW_MODE_SBS_NONE,
 						reason);
 		/*
 		* check if we have a beaconing entity that advertised 2x2
@@ -6330,6 +6344,7 @@ QDF_STATUS cds_next_actions(uint32_t session_id,
 						HW_MODE_SS_0x0, HW_MODE_BW_NONE,
 						HW_MODE_DBS_NONE,
 						HW_MODE_AGILE_DFS_NONE,
+						HW_MODE_SBS_NONE,
 						reason);
 		break;
 	default:
@@ -8134,7 +8149,7 @@ QDF_STATUS qdf_init_connection_update(void)
  * Return: No change (CDS_NOP), MCC (CDS_SINGLE_MAC_UPGRADE),
  *         DBS (CDS_DBS_DOWNGRADE)
  */
-enum cds_conc_next_action cds_get_current_pref_hw_mode(void)
+static enum cds_conc_next_action cds_get_current_pref_hw_mode(void)
 {
 	uint32_t num_connections;
 	uint8_t band1, band2, band3;

+ 16 - 11
core/cds/src/cds_reg_service.c

@@ -449,8 +449,8 @@ static void cds_set_5g_channel_params(uint16_t oper_ch,
 {
 	enum channel_state chan_state = CHANNEL_STATE_ENABLE;
 	enum channel_state chan_state2 = CHANNEL_STATE_ENABLE;
-	const struct bonded_chan *bonded_chan_ptr;
-	const struct bonded_chan *bonded_chan_ptr2;
+	const struct bonded_chan *bonded_chan_ptr = NULL;
+	const struct bonded_chan *bonded_chan_ptr2 = NULL;
 
 	if (CH_WIDTH_MAX <= ch_params->ch_width)
 		ch_params->ch_width = CH_WIDTH_80P80MHZ;
@@ -481,16 +481,19 @@ static void cds_set_5g_channel_params(uint16_t oper_ch,
 							bonded_chan_40mhz_array,
 					QDF_ARRAY_SIZE(bonded_chan_40mhz_array),
 							     &bonded_chan_ptr2);
-				if (oper_ch == bonded_chan_ptr2->start_ch)
-					ch_params->sec_ch_offset =
+				if (bonded_chan_ptr && bonded_chan_ptr2) {
+					if (oper_ch ==
+					    bonded_chan_ptr2->start_ch)
+						ch_params->sec_ch_offset =
 						PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
-				else
-					ch_params->sec_ch_offset =
+					else
+						ch_params->sec_ch_offset =
 						PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
 
-				ch_params->center_freq_seg0 =
-					(bonded_chan_ptr->start_ch +
-					 bonded_chan_ptr->end_ch)/2;
+					ch_params->center_freq_seg0 =
+						(bonded_chan_ptr->start_ch +
+						 bonded_chan_ptr->end_ch)/2;
+				}
 			}
 			break;
 		}
@@ -501,8 +504,10 @@ static void cds_set_5g_channel_params(uint16_t oper_ch,
 		chan_state = cds_search_5g_bonded_channel(oper_ch,
 							  CH_WIDTH_80MHZ,
 							  &bonded_chan_ptr);
-		ch_params->center_freq_seg0 = (bonded_chan_ptr->start_ch +
-				bonded_chan_ptr->end_ch)/2;
+		if (bonded_chan_ptr)
+			ch_params->center_freq_seg0 =
+				(bonded_chan_ptr->start_ch +
+				 bonded_chan_ptr->end_ch)/2;
 	}
 	QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO,
 			"ch %d ch_wd %d freq0 %d freq1 %d", oper_ch,

+ 0 - 41
core/cds/src/cds_regdomain.c

@@ -691,25 +691,6 @@ int32_t cds_fill_some_regulatory_info(struct regulatory *reg)
 	return 0;
 }
 
-/**
- * get_reg_dmn_for_country() - get regulatory domain for country
- * @alpha2: country alpha2
- *
- * Return: regulatory domain
- */
-int32_t get_reg_dmn_for_country(uint8_t *alpha2)
-{
-	uint8_t i;
-
-	for (i = 0; i < g_reg_dmn_tbl.all_countries_cnt; i++) {
-		if ((g_reg_dmn_tbl.all_countries[i].alpha2[0] == alpha2[0]) &&
-		    (g_reg_dmn_tbl.all_countries[i].alpha2[1] == alpha2[1]))
-			return g_reg_dmn_tbl.all_countries[i].reg_dmn_pair;
-	}
-
-	return -1;
-}
-
 /**
  * cds_fill_and_send_ctl_to_fw() - fill and send ctl to firmware
  * @reg: the regulatory handle
@@ -778,28 +759,6 @@ void cds_set_wma_dfs_region(uint8_t dfs_region)
 	wma_set_dfs_region(wma, dfs_region);
 }
 
-/**
- * cds_get_reg_dmn_5g() - get the 5G reg-domain
- * @reg_dmn: the complete reg domain
- *
- * Return: 5 G reg domain
- */
-uint16_t cds_get_reg_dmn_5g(uint32_t reg_dmn)
-{
-	uint16_t i;
-
-	for (i = 0; i < g_reg_dmn_tbl.reg_dmn_pairs_cnt; i++) {
-		if (g_reg_dmn_tbl.reg_dmn_pairs[i].reg_dmn_pair == reg_dmn)
-			return g_reg_dmn_tbl.reg_dmn_pairs[i].reg_dmn_5ghz;
-	}
-
-	QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
-		  "invalid regulatory domain/country code 0x%x",
-		  reg_dmn);
-
-	return 0;
-}
-
 /**
  * cds_reg_dmn_get_chanwidth_from_opclass() - return chan width based on opclass
  * @country: country name

+ 2 - 2
core/cds/src/cds_utils.c

@@ -607,7 +607,7 @@ static void hmac_sha1_complete(struct crypto_async_request *req, int err)
 	complete(&r->completion);
 }
 
-int
+static int
 hmac_sha1(uint8_t *key, uint8_t ksize, char *plaintext, uint8_t psize,
 	  uint8_t *output, uint8_t outlen)
 {
@@ -768,7 +768,7 @@ static void hmac_md5_complete(struct crypto_async_request *req, int err)
 	complete(&r->completion);
 }
 
-int
+static int
 hmac_md5(uint8_t *key, uint8_t ksize, char *plaintext, uint8_t psize,
 	 uint8_t *output, uint8_t outlen)
 {

+ 54 - 19
core/dp/txrx/ol_txrx.c

@@ -1224,12 +1224,6 @@ ol_txrx_pdev_post_attach(ol_txrx_pdev_handle pdev)
 			c_element->tx_desc.htt_frag_desc = htt_frag_desc;
 			c_element->tx_desc.htt_frag_desc_paddr = frag_paddr;
 		}
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW,
-			"%s:%d - %d FRAG VA 0x%p FRAG PA 0x%llx",
-			__func__, __LINE__, i,
-			c_element->tx_desc.htt_frag_desc,
-			(long long unsigned int)
-			c_element->tx_desc.htt_frag_desc_paddr);
 #ifdef QCA_SUPPORT_TXDESC_SANITY_CHECKS
 		c_element->tx_desc.pkt_type = 0xff;
 #ifdef QCA_COMPUTE_TX_DELAY
@@ -1750,6 +1744,7 @@ ol_txrx_vdev_attach(ol_txrx_pdev_handle pdev,
 		    uint8_t vdev_id, enum wlan_op_mode op_mode)
 {
 	struct ol_txrx_vdev_t *vdev;
+	QDF_STATUS qdf_status;
 
 	/* preconditions */
 	TXRX_ASSERT2(pdev);
@@ -1809,6 +1804,7 @@ ol_txrx_vdev_attach(ol_txrx_pdev_handle pdev,
 	/* Default MAX Q depth for every VDEV */
 	vdev->ll_pause.max_q_depth =
 		ol_tx_cfg_max_tx_queue_depth_ll(vdev->pdev->ctrl_pdev);
+	qdf_status = qdf_event_create(&vdev->wait_delete_comp);
 	/* add this vdev into the pdev's list */
 	TAILQ_INSERT_TAIL(&pdev->vdev_list, vdev, vdev_list_elem);
 
@@ -1986,6 +1982,7 @@ ol_txrx_vdev_detach(ol_txrx_vdev_handle vdev,
 		return;
 	}
 	qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
+	qdf_event_destroy(&vdev->wait_delete_comp);
 
 	TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
 		   "%s: deleting vdev obj %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
@@ -2111,7 +2108,7 @@ ol_txrx_peer_attach(ol_txrx_vdev_handle vdev, uint8_t *peer_mac_addr)
 				peer_mac_addr[4], peer_mac_addr[5]);
 			if (qdf_atomic_read(&temp_peer->delete_in_progress)) {
 				vdev->wait_on_peer_id = temp_peer->local_id;
-				qdf_event_create(&vdev->wait_delete_comp);
+				qdf_event_reset(&vdev->wait_delete_comp);
 				wait_on_deletion = true;
 			} else {
 				qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
@@ -2125,10 +2122,10 @@ ol_txrx_peer_attach(ol_txrx_vdev_handle vdev, uint8_t *peer_mac_addr)
 		/* wait for peer deletion */
 		rc = qdf_wait_single_event(&vdev->wait_delete_comp,
 					   PEER_DELETION_TIMEOUT);
-		if (!rc) {
+		if (QDF_STATUS_SUCCESS != rc) {
 			TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
-				"timedout waiting for peer(%d) deletion\n",
-				vdev->wait_on_peer_id);
+				"error waiting for peer(%d) deletion, status %d\n",
+				vdev->wait_on_peer_id, (int) rc);
 			vdev->wait_on_peer_id = OL_TXRX_INVALID_LOCAL_PEER_ID;
 			return NULL;
 		}
@@ -2787,15 +2784,15 @@ void ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
 	 * concurrently with the empty check.
 	 */
 	qdf_spin_lock_bh(&pdev->peer_ref_mutex);
+
 	if (qdf_atomic_dec_and_test(&peer->ref_cnt)) {
 		u_int16_t peer_id;
 
 		TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
-			   "Deleting peer %p (%02x:%02x:%02x:%02x:%02x:%02x)",
+			   "Deleting peer %p (%pM) ref_cnt %d\n",
 			   peer,
-			   peer->mac_addr.raw[0], peer->mac_addr.raw[1],
-			   peer->mac_addr.raw[2], peer->mac_addr.raw[3],
-			   peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
+			   peer->mac_addr.raw,
+			   qdf_atomic_read(&peer->ref_cnt));
 
 		peer_id = peer->local_id;
 		/* remove the reference to the peer from the hash table */
@@ -2946,14 +2943,15 @@ QDF_STATUS ol_txrx_clear_peer(uint8_t sta_id)
 }
 
 /**
- * ol_txrx_peer_detach - Delete a peer's data object.
- * @data_peer - the object to delete
+ * ol_txrx_peer_detach() - Delete a peer's data object.
+ * @peer - the object to detach
  *
  * When the host's control SW disassociates a peer, it calls
- * this function to delete the peer's data object. The reference
+ * this function to detach and delete the peer. The reference
  * stored in the control peer object to the data peer
  * object (set up by a call to ol_peer_store()) is provided.
  *
+ * Return: None
  */
 void ol_txrx_peer_detach(ol_txrx_peer_handle peer)
 {
@@ -2989,9 +2987,12 @@ void ol_txrx_peer_detach(ol_txrx_peer_handle peer)
 
 	qdf_spinlock_destroy(&peer->peer_info_lock);
 	qdf_spinlock_destroy(&peer->bufq_lock);
-	/* set delete_in_progress to identify that wma
-	 * is waiting for unmap massage for this peer */
+	/*
+	 * set delete_in_progress to identify that wma
+	 * is waiting for unmap massage for this peer
+	 */
 	qdf_atomic_set(&peer->delete_in_progress, 1);
+
 	/*
 	 * Remove the reference added during peer_attach.
 	 * The peer will still be left allocated until the
@@ -3001,6 +3002,40 @@ void ol_txrx_peer_detach(ol_txrx_peer_handle peer)
 	ol_txrx_peer_unref_delete(peer);
 }
 
+/**
+ * ol_txrx_peer_detach_force_delete() - Detach and delete a peer's data object
+ * @peer - the object to detach
+ *
+ * Detach a peer and force the peer object to be removed. It is called during
+ * roaming scenario when the firmware has already deleted a peer.
+ * Peer object is freed immediately to avoid duplicate peers during roam sync
+ * indication processing.
+ *
+ * Return: None
+ */
+void ol_txrx_peer_detach_force_delete(ol_txrx_peer_handle peer)
+{
+	ol_txrx_pdev_handle pdev = peer->vdev->pdev;
+
+	TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "%s peer %p, peer->ref_cnt %d",
+		__func__, peer, qdf_atomic_read(&peer->ref_cnt));
+
+	/* Clear the peer_id_to_obj map entries */
+	qdf_spin_lock_bh(&pdev->peer_map_unmap_lock);
+	ol_txrx_peer_remove_obj_map_entries(pdev, peer);
+	qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
+
+	/*
+	 * Set ref_cnt = 1 so that ol_txrx_peer_unref_delete() called by
+	 * ol_txrx_peer_detach() will actually delete this peer entry properly.
+	 */
+	qdf_spin_lock_bh(&pdev->peer_ref_mutex);
+	qdf_atomic_set(&peer->ref_cnt, 1);
+	qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
+
+	ol_txrx_peer_detach(peer);
+}
+
 ol_txrx_peer_handle
 ol_txrx_peer_find_by_addr(struct ol_txrx_pdev_t *pdev, uint8_t *peer_mac_addr)
 {

+ 1 - 0
core/dp/txrx/ol_txrx.h

@@ -134,4 +134,5 @@ void htt_pkt_log_init(struct ol_txrx_pdev_t *handle, void *scn);
 QDF_STATUS ol_txrx_set_wisa_mode(ol_txrx_vdev_handle vdev,
 			bool enable);
 void ol_txrx_update_mac_id(uint8_t vdev_id, uint8_t mac_id);
+void ol_txrx_peer_detach_force_delete(ol_txrx_peer_handle peer);
 #endif /* _OL_TXRX__H_ */

+ 117 - 17
core/dp/txrx/ol_txrx_peer_find.c

@@ -327,14 +327,27 @@ static void ol_txrx_peer_find_map_detach(struct ol_txrx_pdev_t *pdev)
 	qdf_mem_free(pdev->peer_id_to_obj_map);
 }
 
-static inline void
-ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
-			 uint8_t *peer_mac_addr, uint16_t peer_id)
+/*
+ * ol_txrx_peer_find_add_id() - Add peer_id entry to peer
+ *
+ * @pdev: Handle to pdev object
+ * @peer_mac_addr: MAC address of peer provided by firmware
+ * @peer_id: peer_id provided by firmware
+ *
+ * Search for peer object for the MAC address, add the peer_id to
+ * its array of peer_id's and update the peer_id_to_obj map entry
+ * for that peer_id. Increment corresponding reference counts.
+ *
+ * Return: None
+ */
+static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
+				uint8_t *peer_mac_addr, uint16_t peer_id)
 {
 	struct ol_txrx_peer_t *peer;
 	int status;
 	int del_peer_ref = 0;
 	int i;
+	bool found = false;
 
 	/* check if there's already a peer object with this MAC address */
 	peer =
@@ -366,10 +379,18 @@ ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
 	qdf_atomic_inc
 		(&pdev->peer_id_to_obj_map[peer_id].peer_id_ref_cnt);
 
-	if (peer->peer_ids[0] == HTT_INVALID_PEER)
+	/* Check if entire peer_id array is empty */
+	for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) {
+		if (peer->peer_ids[i] != HTT_INVALID_PEER) {
+			found = true;
+			break;
+		}
+	}
+	if (!found)
 		del_peer_ref = 1;
-
 	status = 1;
+
+	/* find a place in peer_id array and insert peer_id */
 	for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) {
 		if (peer->peer_ids[i] == HTT_INVALID_PEER) {
 			peer->peer_ids[i] = peer_id;
@@ -506,7 +527,20 @@ void ol_txrx_peer_tx_ready_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 
 #endif
 
-
+/*
+ * ol_rx_peer_unmap_handler() - Handle peer unmap event from firmware
+ *
+ * @pdev: Handle to pdev pbject
+ * @peer_id: peer_id unmapped by firmware
+ *
+ * Decrement reference count for the peer_id in peer_id_to_obj_map,
+ * decrement reference count in corresponding peer object and clear the entry
+ * in peer's peer_ids array.
+ * In case of unmap events for a peer that is already deleted, just decrement
+ * del_peer_id_ref_cnt.
+ *
+ * Return: None
+ */
 void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 {
 	struct ol_txrx_peer_t *peer;
@@ -518,24 +552,39 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 		return;
 	}
 
-	qdf_spin_lock(&pdev->peer_map_unmap_lock);
+	qdf_spin_lock_bh(&pdev->peer_map_unmap_lock);
 
+	if (qdf_atomic_read(
+		&pdev->peer_id_to_obj_map[peer_id].del_peer_id_ref_cnt)) {
+		/* This peer_id belongs to a peer already deleted */
+		qdf_atomic_dec(&pdev->peer_id_to_obj_map[peer_id].
+					del_peer_id_ref_cnt);
+		TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+			   "%s: Remove the ID %d reference to deleted peer. del_peer_id_ref_cnt %d",
+			   __func__, peer_id,
+			   qdf_atomic_read(&pdev->peer_id_to_obj_map[peer_id].
+							del_peer_id_ref_cnt));
+		qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
+		return;
+	}
 	peer = pdev->peer_id_to_obj_map[peer_id].peer;
 
 	if (peer == NULL) {
-	/*
-	 * Currently peer IDs are assigned for vdevs as well as peers.
-	 * If the peer ID is for a vdev, then the peer pointer stored
-	 * in peer_id_to_obj_map will be NULL.
-	 */
-		qdf_spin_unlock(&pdev->peer_map_unmap_lock);
+		/*
+		 * Currently peer IDs are assigned for vdevs as well as peers.
+		 * If the peer ID is for a vdev, then the peer pointer stored
+		 * in peer_id_to_obj_map will be NULL.
+		 */
+		TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+			   "%s: peer not found for peer_id %d",
+			   __func__, peer_id);
+		qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
 		return;
 	}
 
 	if (qdf_atomic_dec_and_test
 		(&pdev->peer_id_to_obj_map[peer_id].peer_id_ref_cnt)) {
 		pdev->peer_id_to_obj_map[peer_id].peer = NULL;
-
 		for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) {
 			if (peer->peer_ids[i] == peer_id) {
 				peer->peer_ids[i] = HTT_INVALID_PEER;
@@ -543,9 +592,6 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 			}
 		}
 	}
-
-	qdf_spin_unlock(&pdev->peer_map_unmap_lock);
-
 	TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
 		   "%s: Remove the ID %d reference to peer %p peer_id_ref_cnt %d",
 		   __func__, peer_id, peer,
@@ -557,6 +603,59 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 	 * If there are no more references, delete the peer object.
 	 */
 	ol_txrx_peer_unref_delete(peer);
+
+	qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
+}
+
+/**
+ * ol_txrx_peer_remove_obj_map_entries() - Remove matching pdev peer map entries
+ * @pdev: pdev handle
+ * @peer: peer to be removed
+ *
+ * Return: None
+ */
+void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
+					struct ol_txrx_peer_t *peer)
+{
+	int i;
+	uint16_t peer_id;
+	int32_t peer_id_ref_cnt;
+
+	for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) {
+		peer_id = peer->peer_ids[i];
+		if (peer_id == HTT_INVALID_PEER ||
+			pdev->peer_id_to_obj_map[peer_id].peer == NULL) {
+			/* unused peer_id, or object is already dereferenced */
+			continue;
+		}
+		if (pdev->peer_id_to_obj_map[peer_id].peer != peer) {
+			QDF_TRACE(QDF_MODULE_ID_TXRX,
+				QDF_TRACE_LEVEL_ERROR,
+				FL("peer pointer mismatch in peer_id_to_obj"));
+			continue;
+		}
+		peer_id_ref_cnt = qdf_atomic_read(
+					&pdev->peer_id_to_obj_map[peer_id].
+						peer_id_ref_cnt);
+		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW,
+			  FL("peer_id = %d, peer_id_ref_cnt = %d, index = %d"),
+			  peer_id, peer_id_ref_cnt, i);
+		/*
+		 * Transfer peer_id_ref_cnt into del_peer_id_ref_cnt so that
+		 * ol_txrx_peer_unref_delete will decrement del_peer_id_ref_cnt
+		 * and any map events will increment peer_id_ref_cnt. Otherwise
+		 * accounting will be messed up.
+		 *
+		 * Add operation will ensure that back to back roaming in the
+		 * middle of unmap/map event sequence will be accounted for.
+		 */
+		qdf_atomic_add(peer_id_ref_cnt,
+			&pdev->peer_id_to_obj_map[peer_id].del_peer_id_ref_cnt);
+		qdf_atomic_init(&pdev->peer_id_to_obj_map[peer_id].
+				peer_id_ref_cnt);
+		pdev->peer_id_to_obj_map[peer_id].peer = NULL;
+		peer->peer_ids[i] = HTT_INVALID_PEER;
+	}
 }
 
 struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev)
@@ -623,4 +722,5 @@ void ol_txrx_peer_find_display(ol_txrx_pdev_handle pdev, int indent)
 		}
 	}
 }
+
 #endif /* if TXRX_DEBUG_LEVEL */

+ 3 - 0
core/dp/txrx/ol_txrx_peer_find.h

@@ -107,6 +107,9 @@ void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev);
 
 struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev);
 
+void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
+					struct ol_txrx_peer_t *peer);
+
 #if defined(TXRX_DEBUG_LEVEL) && TXRX_DEBUG_LEVEL > 5
 void ol_txrx_peer_find_display(ol_txrx_pdev_handle pdev, int indent);
 #else

+ 11 - 1
core/dp/txrx/ol_txrx_types.h

@@ -58,7 +58,7 @@
  * multicast key the peer uses, and another ID to represent the
  * unicast key the peer uses.
  */
-#define MAX_NUM_PEER_ID_PER_PEER 8
+#define MAX_NUM_PEER_ID_PER_PEER 16
 
 #define OL_TXRX_INVALID_NUM_PEERS (-1)
 
@@ -484,9 +484,19 @@ struct ol_tx_flow_pool_t {
 
 #endif
 
+/*
+ * struct ol_txrx_peer_id_map - Map of firmware peer_ids to peers on host
+ * @peer: Pointer to peer object
+ * @peer_id_ref_cnt: No. of firmware references to the peer_id
+ * @del_peer_id_ref_cnt: No. of outstanding unmap events for peer_id
+ *                       after the peer object is deleted on the host.
+ *
+ * peer_id is used as an index into the array of ol_txrx_peer_id_map.
+ */
 struct ol_txrx_peer_id_map {
 	struct ol_txrx_peer_t *peer;
 	qdf_atomic_t peer_id_ref_cnt;
+	qdf_atomic_t del_peer_id_ref_cnt;
 };
 
 /*

+ 2 - 17
core/hdd/inc/wlan_hdd_assoc.h

@@ -34,7 +34,6 @@
  */
 
 /* Include files */
-#include <wlan_hdd_mib.h>
 #include <sme_api.h>
 #include <wlan_defs.h>
 #include "ol_txrx_ctrl_api.h"
@@ -149,10 +148,6 @@ struct hdd_conn_flag {
 /**
  * typedef connection_info_t - structure to store connection information
  * @connState: connection state of the NIC
- * @connDot11DesiredBssType: BSS type of the current connection.
- *		Comes from the MIB at the time the connect request is issued
- *		in combination with the BssDescription from the
- *		associated entity
  * @bssId: BSSID
  * @SSID: SSID Info
  * @staId: Station ID
@@ -182,7 +177,6 @@ struct hdd_conn_flag {
  */
 typedef struct connection_info_s {
 	eConnectionState connState;
-	eMib_dot11DesiredBssType connDot11DesiredBssType;
 	struct qdf_mac_addr bssId;
 	tCsrSSIDInfo SSID;
 	uint8_t staId[MAX_PEERS];
@@ -260,17 +254,6 @@ QDF_STATUS hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo,
 				 eRoamCmdStatus roamStatus,
 				 eCsrRoamResult roamResult);
 
-/**
- * hdd_conn_get_connected_bss_type() - get current bss type
- * @pHddStaCtx:         pointer to global HDD Station context
- * @pConnectedBssType:  pointer to connected bss type
- *
- * Return: false if any errors encountered, true otherwise
- */
-bool
-hdd_conn_get_connected_bss_type(hdd_station_ctx_t *pHddStaCtx,
-				eMib_dot11DesiredBssType *pConnectedBssType);
-
 /**
  * hdd_set_genie_to_csr() - set genie to csr
  * @pAdapter: pointer to adapter
@@ -289,6 +272,7 @@ int hdd_set_genie_to_csr(hdd_adapter_t *pAdapter, eCsrAuthType *RSNAuthType);
  */
 int hdd_set_csr_auth_type(hdd_adapter_t *pAdapter, eCsrAuthType RSNAuthType);
 
+#ifdef FEATURE_WLAN_TDLS
 /**
  * hdd_roam_register_tdlssta() - register new TDLS station
  * @pAdapter: pointer to adapter
@@ -304,6 +288,7 @@ int hdd_set_csr_auth_type(hdd_adapter_t *pAdapter, eCsrAuthType RSNAuthType);
 QDF_STATUS hdd_roam_register_tdlssta(hdd_adapter_t *pAdapter,
 				     const uint8_t *peerMac, uint16_t staId,
 				     uint8_t ucastSig, uint8_t qos);
+#endif
 
 /**
  * hdd_perform_roam_set_key_complete() - perform set key complete

+ 83 - 1
core/hdd/inc/wlan_hdd_cfg.h

@@ -1098,6 +1098,14 @@ typedef enum {
 #define CFG_VHT_ENABLE_2x2_CAP_FEATURE_MAX     (1)
 #define CFG_VHT_ENABLE_2x2_CAP_FEATURE_DEFAULT (0)
 
+/* 0 - Connects in 160MHz 1x1 when AP is 160MHz 2x2
+ * 1 - Connects in 80MHz 2x2 when AP is 160MHz 2x2
+ */
+#define CFG_STA_PREFER_80MHZ_OVER_160MHZ         "gStaPrefer80MHzOver160MHz"
+#define CFG_STA_PREFER_80MHZ_OVER_160MHZ_MIN     (0)
+#define CFG_STA_PREFER_80MHZ_OVER_160MHZ_MAX     (1)
+#define CFG_STA_PREFER_80MHZ_OVER_160MHZ_DEFAULT (1)
+
 /*
  * NSS cfg bit definition.
  * STA          BIT[0:1]
@@ -1279,6 +1287,21 @@ typedef enum {
 #define CFG_ENABLE_FW_MODULE_LOG_LEVEL    "gFwDebugModuleLoglevel"
 #define CFG_ENABLE_FW_MODULE_LOG_DEFAULT  ""
 
+/*
+ * gEnableRTSProfiles for configuring different RTS profiles
+ * to firmware.
+ * Following are the valid values for the rtsprofile:
+ * RTSCTS_DISABLED                           0
+ * RTSCTS_ENABLED_4_SECOND_RATESERIES        17
+ * CTS2SELF_ENABLED_4_SECOND_RATESERIES      18
+ * RTSCTS_ENABLED_4_SWRETRIES                33
+ * CTS2SELF_ENABLED_4_SWRETRIES              34
+ */
+#define CFG_ENABLE_FW_RTS_PROFILE              "gEnableRTSProfiles"
+#define CFG_ENABLE_FW_RTS_PROFILE_MIN          (0)
+#define CFG_ENABLE_FW_RTS_PROFILE_MAX          (34)
+#define CFG_ENABLE_FW_RTS_PROFILE_DEFAULT      (33)
+
 #ifdef FEATURE_GREEN_AP
 #define CFG_ENABLE_GREEN_AP_FEATURE         "gEnableGreenAp"
 #define CFG_ENABLE_GREEN_AP_FEATURE_MIN     (0)
@@ -1974,6 +1997,16 @@ typedef enum {
 #define CFG_ENABLE_VHT_FOR_24GHZ_MAX              (1)
 #define CFG_ENABLE_VHT_FOR_24GHZ_DEFAULT          (0)
 
+/*
+ * Parameter to control VHT support based on vendor ie in 2.4 GHz band
+ * This parameter will enable SAP to read VHT capability in vendor ie in Assoc
+ * Req and send VHT caps in Resp to establish connection in VHT Mode.
+ */
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_NAME      "gEnableVendorVhtFor24GHzBand"
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MIN       (0)
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MAX       (1)
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_DEFAULT   (1)
+
 #define CFG_MAX_MEDIUM_TIME                      "gMaxMediumTime"
 #define CFG_MAX_MEDIUM_TIME_STAMIN               WNI_CFG_MAX_MEDIUM_TIME_STAMIN
 #define CFG_MAX_MEDIUM_TIME_STAMAX               WNI_CFG_MAX_MEDIUM_TIME_STAMAX
@@ -2360,7 +2393,7 @@ typedef enum {
 #define CFG_RA_FILTER_ENABLE_NAME                  "gRAFilterEnable"
 #define CFG_RA_FILTER_ENABLE_MIN                   (0)
 #define CFG_RA_FILTER_ENABLE_MAX                   (1)
-#define CFG_RA_FILTER_ENABLE_DEFAULT               (0)
+#define CFG_RA_FILTER_ENABLE_DEFAULT               (1)
 
 #define CFG_RA_RATE_LIMIT_INTERVAL_NAME            "gRArateLimitInterval"
 #define CFG_RA_RATE_LIMIT_INTERVAL_MIN             (60)
@@ -2822,6 +2855,24 @@ typedef enum {
 #define CFG_SELF_GEN_FRM_PWR_MAX      (0xffff)
 #define CFG_SELF_GEN_FRM_PWR_DEFAULT  (0)
 
+/*
+ * gTxAggregationSize gives an option to configure Tx aggregation size
+ * in no of MPDUs. This can be useful in debugging throughput issues
+ */
+#define CFG_TX_AGGREGATION_SIZE      "gTxAggregationSize"
+#define CFG_TX_AGGREGATION_SIZE_MIN      (0)
+#define CFG_TX_AGGREGATION_SIZE_MAX      (64)
+#define CFG_TX_AGGREGATION_SIZE_DEFAULT  (64)
+
+/*
+ * gRxAggregationSize gives an option to configure Rx aggregation size
+ * in no of MPDUs. This can be useful in debugging throughput issues
+ */
+#define CFG_RX_AGGREGATION_SIZE      "gRxAggregationSize"
+#define CFG_RX_AGGREGATION_SIZE_MIN      (1)
+#define CFG_RX_AGGREGATION_SIZE_MAX      (64)
+#define CFG_RX_AGGREGATION_SIZE_DEFAULT  (64)
+
 /*
  * fine timing measurement capability information
  *
@@ -2917,6 +2968,16 @@ enum dot11p_mode {
 #define CFG_EXTSCAN_ACTIVE_MIN_CHANNEL_TIME_DEFAULT    (20)
 #endif
 
+/* When gEnable_go_cts2self_for_sta is
+ * enabled  then if a legacy client connects to P2P GO,
+ * Host will send a WMI VDEV command to FW to stop using NOA for P2P GO
+ * and start using CTS2SELF.
+ */
+#define CFG_ENABLE_GO_CTS2SELF_FOR_STA   "gEnable_go_cts2self_for_sta"
+#define CFG_ENABLE_GO_CTS2SELF_FOR_STA_DEFAULT  (0)
+#define CFG_ENABLE_GO_CTS2SELF_FOR_STA_MIN      (0)
+#define CFG_ENABLE_GO_CTS2SELF_FOR_STA_MAX      (1)
+
 #define CFG_CE_CLASSIFY_ENABLE_NAME	"gCEClassifyEnable"
 #define CFG_CE_CLASSIFY_ENABLE_MIN	(0)
 #define CFG_CE_CLASSIFY_ENABLE_MAX	(1)
@@ -3367,6 +3428,18 @@ enum dot11p_mode {
 #define CFG_ADAPTIVE_EXTSCAN_DWELL_MODE_MAX      (4)
 #define CFG_ADAPTIVE_EXTSCAN_DWELL_MODE_DEFAULT  (0)
 
+/*
+ * This parameter will help to debug ssr reinit failure issues
+ * by raising vos bug so dumps can be collected. If OEM
+ * wants to avoid this crash, just disable this parameter.
+ * wlan driver will only recover after driver unload and load.
+ * Default: Enable
+ */
+#define CFG_BUG_ON_REINIT_FAILURE_NAME     "g_bug_on_reinit_failure"
+#define CFG_BUG_ON_REINIT_FAILURE_MIN      (0)
+#define CFG_BUG_ON_REINIT_FAILURE_MAX      (1)
+#define CFG_BUG_ON_REINIT_FAILURE_DEFAULT  (1)
+
 /*
  * This parameter will set the algo used in dwell time optimization during
  * pno scan. see enum wmi_dwelltime_adaptive_mode.
@@ -3861,6 +3934,7 @@ struct hdd_config {
 	bool enableSSR;
 	uint32_t cfgMaxMediumTime;
 	bool enableVhtFor24GHzBand;
+	bool enable_sap_vendor_vht;
 	/* Flag indicating whether legacy fast roam during concurrency is enabled in cfg.ini or not */
 	bool bFastRoamInConIniFeatureEnabled;
 	bool fEnableAdaptRxDrain;
@@ -3973,6 +4047,9 @@ struct hdd_config {
 	uint32_t enableFwLogLevel;
 	uint8_t enableFwModuleLogLevel[FW_MODULE_LOG_LEVEL_STRING_LENGTH];
 
+	/* RTS profile parameter */
+	uint32_t rts_profile;
+
 #ifdef WLAN_FEATURE_11W
 	uint32_t pmfSaQueryMaxRetries;
 	uint32_t pmfSaQueryRetryInterval;
@@ -4139,6 +4216,7 @@ struct hdd_config {
 	uint8_t adapt_dwell_passive_mon_intval;
 	uint8_t adapt_dwell_wifi_act_threshold;
 	bool bug_report_for_no_scan_results;
+	bool bug_on_reinit_failure;
 #ifdef WLAN_FEATURE_NAN_DATAPATH
 	bool enable_nan_datapath;
 	uint8_t nan_datapath_ndi_channel;
@@ -4152,6 +4230,10 @@ struct hdd_config {
 	/* parameter for indicating sifs burst duration to fw */
 	uint8_t sifs_burst_duration;
 	bool goptimize_chan_avoid_event;
+	bool enable_go_cts2self_for_sta;
+	uint32_t tx_aggregation_size;
+	uint32_t rx_aggregation_size;
+	bool sta_prefer_80MHz_over_160MHz;
 };
 
 #define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var))

+ 43 - 0
core/hdd/inc/wlan_hdd_driver_ops.h

@@ -37,8 +37,51 @@
 */
 int wlan_hdd_register_driver(void);
 void wlan_hdd_unregister_driver(void);
+
+/**
+ * wlan_hdd_bus_suspend() - suspend the wlan bus
+ *
+ * This function is called by the platform driver to suspend the
+ * wlan bus
+ *
+ * @state: state
+ *
+ * Return: QDF_STATUS
+ */
 int wlan_hdd_bus_suspend(pm_message_t state);
+
+/**
+ * wlan_hdd_bus_suspend_noirq() - handle .suspend_noirq callback
+ *
+ * This function is called by the platform driver to complete the
+ * bus suspend callback when device interrupts are disabled by kernel.
+ * Call HIF and WMA suspend_noirq callbacks to make sure there is no
+ * wake up pending from FW before allowing suspend.
+ *
+ * Return: 0 for success and -EBUSY if FW is requesting wake up
+ */
+int wlan_hdd_bus_suspend_noirq(void);
+
+/**
+ * wlan_hdd_bus_resume(): wake up the bus
+ *
+ * This function is called by the platform driver to resume wlan
+ * bus
+ *
+ * Return: void
+ */
 int wlan_hdd_bus_resume(void);
+
+/**
+ * wlan_hdd_bus_resume_noirq(): handle bus resume no irq
+ *
+ * This function is called by the platform driver to do bus
+ * resume no IRQ before calling resume callback. Call WMA and HIF
+ * layers to complete the resume_noirq.
+ *
+ * Return: 0 for success and negative error code for failure
+ */
+int wlan_hdd_bus_resume_noirq(void);
 void hdd_hif_close(void *hif_ctx);
 int hdd_hif_open(struct device *dev, void *bdev, const hif_bus_id *bid,
 		 enum qdf_bus_type bus_type, bool reinit);

+ 1 - 2
core/hdd/inc/wlan_hdd_includes.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -54,7 +54,6 @@
 #include <cds_api.h>
 #include <sme_api.h>
 #include "wlan_hdd_assoc.h"
-#include "wlan_hdd_mib.h"
 #include "wlan_hdd_wext.h"
 #include "wlan_hdd_main.h"
 #include "wlan_hdd_tx_rx.h"

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

@@ -54,9 +54,7 @@
 #include <linux/wakelock.h>
 #endif
 #include <wlan_hdd_ftm.h>
-#ifdef FEATURE_WLAN_TDLS
 #include "wlan_hdd_tdls.h"
-#endif
 #include "wlan_hdd_tsf.h"
 #include "wlan_hdd_cfg80211.h"
 #include <qdf_defer.h>
@@ -905,8 +903,6 @@ struct hdd_adapter_s {
 	hdd_stats_t hdd_stats;
 	/** linkspeed statistics */
 	tSirLinkSpeedInfo ls_stats;
-	/**Mib information*/
-	sHddMib_t hdd_mib;
 
 	uint8_t sessionId;
 
@@ -1239,8 +1235,25 @@ struct acs_dfs_policy {
 	uint8_t acs_channel;
 };
 
-/** Adapter structure definition */
+/**
+ * enum suspend_fail_reason: Reasons a WLAN suspend might fail
+ * SUSPEND_FAIL_IPA: IPA in progress
+ * SUSPEND_FAIL_RADAR: radar scan in progress
+ * SUSPEND_FAIL_ROAM: roaming in progress
+ * SUSPEND_FAIL_SCAN: scan in progress
+ * SUSPEND_FAIL_INITIAL_WAKEUP: received initial wakeup from firmware
+ * SUSPEND_FAIL_MAX_COUNT: the number of wakeup reasons, always at the end
+ */
+enum suspend_fail_reason {
+	SUSPEND_FAIL_IPA,
+	SUSPEND_FAIL_RADAR,
+	SUSPEND_FAIL_ROAM,
+	SUSPEND_FAIL_SCAN,
+	SUSPEND_FAIL_INITIAL_WAKEUP,
+	SUSPEND_FAIL_MAX_COUNT
+};
 
+/** Adapter structure definition */
 struct hdd_context_s {
 	/** Global CDS context  */
 	v_CONTEXT_t pcds_context;
@@ -1471,6 +1484,8 @@ struct hdd_context_s {
 	bool memdump_in_progress;
 	bool memdump_init_done;
 #endif /* WLAN_FEATURE_MEMDUMP */
+	uint16_t driver_dump_size;
+	uint8_t *driver_dump_mem;
 
 	bool connection_in_progress;
 	qdf_spinlock_t connection_status_lock;
@@ -1512,6 +1527,9 @@ struct hdd_context_s {
 	bool update_mac_addr_to_fw;
 	struct acs_dfs_policy acs_policy;
 	uint16_t wmi_max_len;
+
+	/* counters for failed suspend reasons */
+	uint32_t suspend_fail_stats[SUSPEND_FAIL_MAX_COUNT];
 };
 
 /*---------------------------------------------------------------------------

+ 18 - 0
core/hdd/inc/wlan_hdd_memdump.h

@@ -37,6 +37,10 @@
 
 #include "wlan_hdd_main.h"
 
+/* Assigned size of driver memory dump is 4096 bytes */
+#define DRIVER_MEM_DUMP_SIZE    4096
+
+
 #ifdef WLAN_FEATURE_MEMDUMP
 /**
  * enum qca_wlan_vendor_attr_memory_dump - values for memory dump attributes
@@ -72,6 +76,10 @@ int wlan_hdd_cfg80211_get_fw_mem_dump(struct wiphy *wiphy,
 				      struct wireless_dev *wdev,
 				      const void *data, int data_len);
 void wlan_hdd_cfg80211_fw_mem_dump_cb(void *ctx, struct fw_dump_rsp *dump_rsp);
+
+int hdd_driver_memdump_init(void);
+void hdd_driver_memdump_deinit(void);
+
 #else
 static inline int memdump_init(void)
 {
@@ -95,6 +103,16 @@ static inline void wlan_hdd_cfg80211_fw_mem_dump_cb(void *ctx,
 						    *dump_rsp)
 {
 }
+
+static inline int hdd_driver_memdump_init(void)
+{
+	return -ENOTSUPP;
+}
+
+static inline void hdd_driver_memdump_deinit(void)
+{
+}
+
 #endif
 
 #endif /* if !defined(WLAN_HDD_MEMDUMP_H)*/

+ 0 - 190
core/hdd/inc/wlan_hdd_mib.h

@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * This file was originally distributed by Qualcomm Atheros, Inc.
- * under proprietary terms before Copyright ownership was assigned
- * to the Linux Foundation.
- */
-
-#if !defined(WLAN_HDD_MIB_h__)
-#define WLAN_HDD_MIB_h__
-
-#include <qdf_types.h>
-
-typedef enum {
-	eMib_dot11DesiredBssType_infrastructure = 1,
-	eMib_dot11DesiredBssType_independent = 2,
-	eMib_dot11DesiredBssType_infra_ap = 3,
-	eMib_dot11DesiredBssType_any = 4
-} eMib_dot11DesiredBssType;
-
-/** This is the maximum number of BSSIDs supported in the
-      dot11DesiredBssidList.  All the code operates off of
-      this maximum BSSID list count.  */
-#define MIB_DOT11_DESIRED_BSSID_LIST_MAX_COUNT 1
-
-typedef struct {
-	uint32_t cEntries;
-
-	struct qdf_mac_addr BSSIDs[MIB_DOT11_DESIRED_BSSID_LIST_MAX_COUNT];
-
-} sMib_dot11DesiredBssidList;
-
-/** This is the maximum number of SSIDs supported in the
-     dot11DesiredSsidList.  All the code operates off of
-     this maximum SSID list count.  */
-
-#define MIB_DOT11_DESIRED_SSID_LIST_MAX_COUNT 1
-
-#define MIB_DOT11_SSID_MAX_LENGTH 32
-
-typedef struct {
-	uint32_t ssidLength;
-	uint8_t ssid[MIB_DOT11_SSID_MAX_LENGTH];
-
-} sDot11Ssid;
-
-typedef struct {
-	uint32_t cEntries;
-
-	sDot11Ssid SSIDs[MIB_DOT11_DESIRED_SSID_LIST_MAX_COUNT];
-
-} sMib_dot11DesiredSsidList;
-
-typedef enum {
-	/* these are bitmasks.... */
-	eMib_dot11AutoConfigEnabled_None = 0U,
-	eMib_dot11AutoConfigEnabled_Phy = 0x00000001U,
-	eMib_dot11AutoConfigEnabled_Mac = 0x00000002U
-} eMib_dot11AutoConfigEnabled;
-
-#define MIB_DOT11_SUPPORTED_PHY_TYPES_MAX_COUNT 3
-
-typedef enum tagMib_dot11PhyType {
-	eMib_dot11PhyType_11b,
-	eMib_dot11PhyType_11a,
-	eMib_dot11PhyType_11g,
-	eMib_dot11PhyType_all
-} eMib_dot11PhyType;
-
-typedef struct tagMib_dot11SupportedPhyTypes {
-	uint32_t cEntries;
-	eMib_dot11PhyType phyTypes[MIB_DOT11_SUPPORTED_PHY_TYPES_MAX_COUNT];
-} sMib_dot11SupportedPhyTypes;
-
-typedef enum {
-	eMib_DevicePowerState_D0,
-	eMib_DevicePowerState_D1,
-	eMib_DevicePowerState_D2,
-	eMib_DevicePowerState_D3
-} eMib_DevicePowerState;
-
-typedef enum {
-	eMib_dot11NICPowerState_OFF = false,
-	eMib_dot11NICPowerState_ON = true
-} eMib_dot11NICPowerState;
-
-typedef enum {
-	eMib_dot11HardwarePHYState_OFF = false,
-	eMib_dot11HardwarePHYState_ON = true
-} eMib_dot11HardwarePHYState;
-
-typedef enum {
-	eMib_dot11PowerSavingLevel_None,
-	eMib_dot11PowerSavingLevel_MaxPS,
-	eMib_dot11PowerSavingLevel_FastPS,
-	eMib_dot11PowerSavingLevel_MaximumLevel
-} eMib_dot11PowerSavingLevel;
-
-#define MIB_DOT11_MAC_EXCLUSION_LIST_MAX_COUNT 4
-typedef struct {
-	uint32_t cEntries;
-
-	struct qdf_mac_addr macAddrs[MIB_DOT11_MAC_EXCLUSION_LIST_MAX_COUNT];
-
-} sMib_dot11MacExcludeList;
-
-#define MIB_DOT11_PRIVACY_EXEMPT_LIST_MAX_COUNT 32
-
-typedef enum {
-	eMib_dot11ExemptionAction_Always,
-	eMib_dot11ExemptionAction_OnKeyMapUnavailable
-} eMib_dot11ExemptAction;
-
-typedef enum {
-	eMib_dot11ExemptPacket_Unicast,
-	eMib_dot11ExemptPacket_Multicast,
-	eMib_dot11ExemptPacket_Both
-} eMib_dot11ExemptPacket;
-
-typedef struct {
-	uint16_t uEtherType;
-	eMib_dot11ExemptAction exemptAction;
-	eMib_dot11ExemptPacket exemptPacket;
-
-} sMib_dot11PrivacyExemption;
-
-typedef struct {
-	uint32_t cEntries;
-
-	sMib_dot11PrivacyExemption
-		privacyExemptList[MIB_DOT11_PRIVACY_EXEMPT_LIST_MAX_COUNT];
-
-} sMib_dot11PrivacyExemptionList;
-
-typedef struct sHddMib_s {
-	eMib_dot11DesiredBssType mibDot11DesiredBssType;
-
-	sMib_dot11DesiredBssidList mibDot11DesiredBssidList;
-
-	sMib_dot11DesiredSsidList mibDot11DesiredSsidList;
-
-	eMib_dot11AutoConfigEnabled mibDot11AutoConfigEnabled;
-
-	/* the device power state for the device (the D-state... you know D0, D1, D2, etc. */
-	eMib_DevicePowerState mibDevicePowerState;
-
-	/* dot11NICPowerState is really the on/off state of the PHY.  This can be */
-	/* mamipulated through OIDs like a software control for radio on/off. */
-	eMib_dot11NICPowerState mibDot11NICPowerState;
-
-	/* Hardware PHY state is the on/off state of the hardware PHY. */
-	eMib_dot11HardwarePHYState mibDot11HardwarePHYState;
-
-	/* dot11 Power Saving level is the 802.11 power saving level/state for the 802.11 */
-	/* NIC.  Typically this is mapped to 802.11 BMPS in some fashion.  We are not going */
-	/* to disappoint; the Libra NIC maps these to different BMPS settings. */
-	eMib_dot11PowerSavingLevel mibDot11PowerSavingLevel;
-
-	sMib_dot11MacExcludeList mibDot11MacExcludeList;
-
-	sMib_dot11PrivacyExemptionList mibDot11PrivacyExemptionList;
-
-	sMib_dot11SupportedPhyTypes mibDot11SupportedPhyTypes;
-	eMib_dot11PhyType mibDot11CurrentPhyType;
-
-	bool dot11IbssJoinOnly;
-	bool HiddenNetworkEnabled;
-
-} sHddMib_t;
-
-#endif

+ 49 - 0
core/hdd/inc/wlan_hdd_power.h

@@ -199,5 +199,54 @@ static inline
 void hdd_wlan_suspend_resume_event(uint8_t state) {}
 #endif /* FEATURE_WLAN_DIAG_SUPPORT */
 
+/**
+ * wlan_hdd_inc_suspend_stats() - Prints, then increments, then prints suspend
+ *	failed statistics.
+ * @hdd_ctx:	The HDD context to operate on
+ * @reason:	The suspend failed reason to increment
+ *
+ * This function prints all of the suspend failed statistics, increments the
+ * specified suspend fail reason statistic, and prints the them all again. This
+ * is for easily keeping track of the most common reasons suspend fails.
+ *
+ * Return: none
+ */
+void wlan_hdd_inc_suspend_stats(hdd_context_t *hdd_ctx,
+				enum suspend_fail_reason reason);
+
+/*
+ * Unit-test suspend/resume is a testing feature that allows putting firmware
+ * into WoW suspend irrespective of Apps suspend status. It emulates the chain
+ * of events that occur durring normal system-level suspend/resume, such as
+ * initiating all of the suspend/resume stages in the correct order, and
+ * enabling/disabling appropriate copy engine irqs.
+ */
+#ifdef WLAN_SUSPEND_RESUME_TEST
+/**
+ * hdd_wlan_fake_apps_resume() - Resume from unit-test triggered suspend
+ * @wiphy: wiphy struct from a validated hdd context
+ *
+ * Return: Zero on success, calls QDF_BUG() on failure
+ */
+int hdd_wlan_fake_apps_resume(struct wiphy *wiphy);
+
+/**
+ * hdd_wlan_fake_apps_suspend() - Initiate a unit-test triggered suspend
+ * @wiphy: wiphy struct from a validated hdd context
+ *
+ * Return: Zero on success, suspend related non-zero error code on failure
+ */
+int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy);
+#else
+static inline int hdd_wlan_fake_apps_resume(struct wiphy *wiphy)
+{
+	return 0;
+}
+
+static inline int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy)
+{
+	return 0;
+}
+#endif /* WLAN_SUSPEND_RESUME_TEST */
 
 #endif /* __WLAN_HDD_POWER_H */

+ 34 - 10
core/hdd/inc/wlan_hdd_tdls.h

@@ -567,7 +567,7 @@ void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter);
 void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter,
 					    uint32_t statusCode);
 
-void wlan_hdd_tdls_tncrement_peer_count(hdd_adapter_t *pAdapter);
+void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter);
 
 void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter);
 
@@ -710,8 +710,33 @@ void hdd_tdls_context_destroy(hdd_context_t *hdd_ctx);
 int wlan_hdd_tdls_antenna_switch(hdd_context_t *hdd_ctx,
 				 hdd_adapter_t *adapter,
 				 uint32_t mode);
-hdd_adapter_t *wlan_hdd_tdls_check_and_enable(hdd_context_t *hdd_ctx);
+/**
+ * wlan_hdd_tdls_notify_connect() - Update tdls state for every
+ * connect event.
+ * @adapter: hdd adapter
+ * @csr_roam_info: csr information
+ *
+ * After every connect event in the system, check whether TDLS
+ * can be enabled in the system. If TDLS can be enabled, update the
+ * TDLS state as needed.
+ *
+ * Return: None
+ */
+void wlan_hdd_tdls_notify_connect(hdd_adapter_t *adapter,
+				  tCsrRoamInfo *csr_roam_info);
 
+/**
+ * wlan_hdd_tdls_notify_disconnect() - Update tdls state for every
+ * disconnect event.
+ * @adapter: hdd adapter
+ *
+ * After every disconnect event in the system, check whether TDLS
+ * can be disabled/enabled in the system and update the
+ * TDLS state as needed.
+ *
+ * Return: None
+ */
+void wlan_hdd_tdls_notify_disconnect(hdd_adapter_t *adapter);
 
 #else
 static inline void hdd_tdls_notify_mode_change(hdd_adapter_t *adapter,
@@ -742,19 +767,18 @@ static inline int wlan_hdd_tdls_antenna_switch(hdd_context_t *hdd_ctx,
 {
 	return 0;
 }
-
-static inline hdd_adapter_t *wlan_hdd_tdls_check_and_enable(
-						hdd_context_t *hdd_ctx)
-{
-	return NULL;
-}
-
 static inline void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter,
 						bool tdls_prohibited,
 						bool tdls_chan_swit_prohibited)
 {
 }
-
+static inline void wlan_hdd_tdls_notify_connect(hdd_adapter_t *adapter,
+				  tCsrRoamInfo *csr_roam_info)
+{
+}
+static inline void wlan_hdd_tdls_notify_disconnect(hdd_adapter_t *adapter)
+{
+}
 #endif /* End of FEATURE_WLAN_TDLS */
 
 #ifdef FEATURE_WLAN_DIAG_SUPPORT

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

@@ -61,6 +61,7 @@ enum hdd_tsf_capture_state {
 };
 
 #ifdef WLAN_FEATURE_TSF
+void wlan_hdd_tsf_init(struct hdd_context_s *hdd_ctx);
 int hdd_capture_tsf(struct hdd_adapter_s *adapter, uint32_t *buf, int len);
 int hdd_indicate_tsf(struct hdd_adapter_s *adapter, uint32_t *buf, int len);
 int wlan_hdd_cfg80211_handle_tsf_cmd(struct wiphy *wiphy,

Plik diff jest za duży
+ 150 - 259
core/hdd/src/wlan_hdd_assoc.c


+ 72 - 3
core/hdd/src/wlan_hdd_cfg.c

@@ -2029,6 +2029,13 @@ REG_TABLE_ENTRY g_registry_table[] = {
 		     CFG_VDEV_TYPE_NSS_2G_MIN,
 		     CFG_VDEV_TYPE_NSS_2G_MAX),
 
+	REG_VARIABLE(CFG_STA_PREFER_80MHZ_OVER_160MHZ, WLAN_PARAM_Integer,
+		     struct hdd_config, sta_prefer_80MHz_over_160MHz,
+		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_STA_PREFER_80MHZ_OVER_160MHZ_DEFAULT,
+		     CFG_STA_PREFER_80MHZ_OVER_160MHZ_MIN,
+		     CFG_STA_PREFER_80MHZ_OVER_160MHZ_MAX),
+
 	REG_VARIABLE(CFG_VDEV_TYPE_NSS_5G, WLAN_PARAM_Integer,
 		     struct hdd_config, vdev_type_nss_5g,
 		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -2468,6 +2475,14 @@ REG_TABLE_ENTRY g_registry_table[] = {
 		     CFG_ENABLE_VHT_FOR_24GHZ_MIN,
 		     CFG_ENABLE_VHT_FOR_24GHZ_MAX),
 
+
+	REG_VARIABLE(CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_NAME, WLAN_PARAM_Integer,
+		     struct hdd_config, enable_sap_vendor_vht,
+		     VAR_FLAGS_OPTIONAL,
+		     CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_DEFAULT,
+		     CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MIN,
+		     CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MAX),
+
 	REG_DYNAMIC_VARIABLE(CFG_ENABLE_FAST_ROAM_IN_CONCURRENCY,
 			     WLAN_PARAM_Integer,
 			     struct hdd_config, bFastRoamInConIniFeatureEnabled,
@@ -3044,6 +3059,13 @@ REG_TABLE_ENTRY g_registry_table[] = {
 		     CFG_ENABLE_FW_DEBUG_LOG_LEVEL_MIN,
 		     CFG_ENABLE_FW_DEBUG_LOG_LEVEL_MAX),
 
+	REG_VARIABLE(CFG_ENABLE_FW_RTS_PROFILE, WLAN_PARAM_Integer,
+		     struct hdd_config, rts_profile,
+		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_ENABLE_FW_RTS_PROFILE_DEFAULT,
+		     CFG_ENABLE_FW_RTS_PROFILE_MIN,
+		     CFG_ENABLE_FW_RTS_PROFILE_MAX),
+
 	REG_VARIABLE_STRING(CFG_ENABLE_FW_MODULE_LOG_LEVEL, WLAN_PARAM_String,
 			    struct hdd_config, enableFwModuleLogLevel,
 			    VAR_FLAGS_OPTIONAL,
@@ -3734,6 +3756,14 @@ REG_TABLE_ENTRY g_registry_table[] = {
 			CFG_ENABLE_EDCA_INI_MIN,
 			CFG_ENABLE_EDCA_INI_MAX),
 
+	REG_VARIABLE(CFG_ENABLE_GO_CTS2SELF_FOR_STA, WLAN_PARAM_Integer,
+			struct hdd_config, enable_go_cts2self_for_sta,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_ENABLE_GO_CTS2SELF_FOR_STA_DEFAULT,
+			CFG_ENABLE_GO_CTS2SELF_FOR_STA_MIN,
+			CFG_ENABLE_GO_CTS2SELF_FOR_STA_MAX),
+
 	REG_VARIABLE(CFG_EDCA_VO_CWMIN_VALUE_NAME, WLAN_PARAM_Integer,
 			struct hdd_config, edca_vo_cwmin,
 			VAR_FLAGS_OPTIONAL |
@@ -3949,6 +3979,14 @@ REG_TABLE_ENTRY g_registry_table[] = {
 		     CFG_INDOOR_CHANNEL_SUPPORT_MIN,
 		     CFG_INDOOR_CHANNEL_SUPPORT_MAX),
 
+	REG_VARIABLE(CFG_BUG_ON_REINIT_FAILURE_NAME, WLAN_PARAM_Integer,
+		     struct hdd_config, bug_on_reinit_failure,
+		     VAR_FLAGS_OPTIONAL |
+		     VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_BUG_ON_REINIT_FAILURE_DEFAULT,
+		     CFG_BUG_ON_REINIT_FAILURE_MIN,
+		     CFG_BUG_ON_REINIT_FAILURE_MAX),
+
 	REG_VARIABLE(CFG_INTERFACE_CHANGE_WAIT_NAME, WLAN_PARAM_Integer,
 			struct hdd_config, iface_change_wait_time,
 			VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK,
@@ -3977,6 +4015,20 @@ REG_TABLE_ENTRY g_registry_table[] = {
 			CFG_OPTIMIZE_CA_EVENT_DEFAULT,
 			CFG_OPTIMIZE_CA_EVENT_DISABLE,
 			CFG_OPTIMIZE_CA_EVENT_ENABLE),
+
+	REG_VARIABLE(CFG_TX_AGGREGATION_SIZE, WLAN_PARAM_Integer,
+		struct hdd_config, tx_aggregation_size,
+		VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		CFG_TX_AGGREGATION_SIZE_DEFAULT,
+		CFG_TX_AGGREGATION_SIZE_MIN,
+		CFG_TX_AGGREGATION_SIZE_MAX),
+
+	REG_VARIABLE(CFG_RX_AGGREGATION_SIZE, WLAN_PARAM_Integer,
+		struct hdd_config, rx_aggregation_size,
+		VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		CFG_RX_AGGREGATION_SIZE_DEFAULT,
+		CFG_RX_AGGREGATION_SIZE_MIN,
+		CFG_RX_AGGREGATION_SIZE_MAX),
 };
 
 /**
@@ -5545,6 +5597,9 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
 	hdd_info("Name = [%s] Value = [%u]",
 		CFG_IGNORE_PEER_HT_MODE_NAME,
 		pHddCtx->config->ignore_peer_ht_opmode);
+	hdd_info("Name = [%s] Value = [%u]",
+		 CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_NAME,
+		 pHddCtx->config->enable_sap_vendor_vht);
 	hdd_info("Name = [%s] Value = [%u]",
 		CFG_ENABLE_FATAL_EVENT_TRIGGER,
 		pHddCtx->config->enable_fatal_event);
@@ -5557,6 +5612,9 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
 	hdd_info("Name = [%s] Value = [%u]",
 		CFG_IDLE_TIME_NAME,
 		pHddCtx->config->idle_time_conc);
+	hdd_info("Name = [%s] Value = [%d]",
+		CFG_BUG_ON_REINIT_FAILURE_NAME,
+		pHddCtx->config->bug_on_reinit_failure);
 	hdd_info("Name = [%s] Value = [%u]",
 		CFG_INTERFACE_CHANGE_WAIT_NAME,
 		pHddCtx->config->iface_change_wait_time);
@@ -5646,6 +5704,9 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
 	hdd_info("Name = [%s] Value = [%d]",
 		CFG_FILTER_MULTICAST_REPLAY_NAME,
 		pHddCtx->config->multicast_replay_filter);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_ENABLE_GO_CTS2SELF_FOR_STA,
+		pHddCtx->config->enable_go_cts2self_for_sta);
 }
 
 
@@ -5821,7 +5882,7 @@ static void hdd_override_all_ps(hdd_context_t *hdd_ctx)
  *
  * Return: none
  */
-void hdd_set_rx_mode_value(hdd_context_t *hdd_ctx)
+static void hdd_set_rx_mode_value(hdd_context_t *hdd_ctx)
 {
 	if (hdd_ctx->config->rx_mode & CFG_ENABLE_RX_THREAD &&
 		 hdd_ctx->config->rx_mode & CFG_ENABLE_RPS) {
@@ -6089,8 +6150,9 @@ static QDF_STATUS hdd_convert_string_to_array(char *str, uint8_t *array,
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS hdd_hex_string_to_u8_array(char *str, uint8_t *hex_array,
-				      uint8_t *len, uint8_t array_max_len)
+static QDF_STATUS hdd_hex_string_to_u8_array(char *str, uint8_t *hex_array,
+					     uint8_t *len,
+					     uint8_t array_max_len)
 {
 	return hdd_convert_string_to_array(str, hex_array, len,
 					   array_max_len, true);
@@ -6893,6 +6955,8 @@ QDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
 		pConfig->enable_txbf_sap_mode;
 	smeConfig->csrConfig.enable2x2 = pConfig->enable2x2;
 	smeConfig->csrConfig.enableVhtFor24GHz = pConfig->enableVhtFor24GHzBand;
+	smeConfig->csrConfig.vendor_vht_sap =
+		pConfig->enable_sap_vendor_vht;
 	smeConfig->csrConfig.enableMuBformee = pConfig->enableMuBformee;
 	smeConfig->csrConfig.enableVhtpAid = pConfig->enableVhtpAid;
 	smeConfig->csrConfig.enableVhtGid = pConfig->enableVhtGid;
@@ -7143,6 +7207,11 @@ QDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
 		CSR_STA_ROAM_POLICY_DFS_ENABLED;
 	smeConfig->csrConfig.sta_roam_policy_params.skip_unsafe_channels = 0;
 
+	smeConfig->csrConfig.tx_aggregation_size =
+			pHddCtx->config->tx_aggregation_size;
+	smeConfig->csrConfig.rx_aggregation_size =
+			pHddCtx->config->rx_aggregation_size;
+
 	status = sme_update_config(pHddCtx->hHal, smeConfig);
 	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, "sme_update_config() return failure %d",

+ 64 - 17
core/hdd/src/wlan_hdd_cfg80211.c

@@ -2068,11 +2068,13 @@ static int __wlan_hdd_cfg80211_get_concurrency_matrix(struct wiphy *wiphy,
 	/* Fill feature combination matrix */
 	feature_sets = 0;
 	feature_set_matrix[feature_sets++] = WIFI_FEATURE_INFRA |
-		WIFI_FEATURE_P2P;
+						WIFI_FEATURE_P2P;
+	feature_set_matrix[feature_sets++] = WIFI_FEATURE_INFRA |
+						WIFI_FEATURE_NAN;
 	/* Add more feature combinations here */
 
 	feature_sets = QDF_MIN(feature_sets, max_feature_sets);
-	hdd_info("Number of feature sets:%d", feature_sets);
+	hdd_info("Number of feature sets: %d", feature_sets);
 	hdd_info("Feature set matrix");
 	for (i = 0; i < feature_sets; i++)
 		hdd_info("[%d] 0x%02X", i, feature_set_matrix[i]);
@@ -2135,7 +2137,8 @@ wlan_hdd_cfg80211_get_concurrency_matrix(struct wiphy *wiphy,
  * This is called to turn ON or SET the feature flag for the requested feature.
  **/
 #define NUM_BITS_IN_BYTE       8
-void wlan_hdd_cfg80211_set_feature(uint8_t *feature_flags, uint8_t feature)
+static void wlan_hdd_cfg80211_set_feature(uint8_t *feature_flags,
+					  uint8_t feature)
 {
 	uint32_t index;
 	uint8_t bit_mask;
@@ -3870,6 +3873,8 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX + 1] = {
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR] = {.type = NLA_U16 },
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME] = {.type = NLA_U32 },
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND] = {.type = NLA_U8 },
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] = {.type = NLA_U8 },
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION] = {.type = NLA_U8 },
 };
 
 /**
@@ -3930,7 +3935,7 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 	u32 guard_time;
 	uint8_t set_value;
 	u32 ftm_capab;
-	uint8_t qpower;
+	u8 qpower;
 	QDF_STATUS status;
 	int attr_len;
 	int access_policy = 0;
@@ -3938,6 +3943,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 	bool vendor_ie_present = false, access_policy_present = false;
 	uint16_t scan_ie_len = 0;
 	uint8_t *scan_ie;
+	struct sir_set_tx_rx_aggregation_size request;
+	QDF_STATUS qdf_status;
 
 	ENTER_DEV(dev);
 
@@ -4096,6 +4103,44 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 		} else
 			ret_val = -EPERM;
 	}
+
+	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] ||
+	    tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]) {
+		/* if one is specified, both must be specified */
+		if (!tb[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] ||
+		    !tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]) {
+			hdd_err("Both TX and RX MPDU Aggregation required");
+			return -EINVAL;
+		}
+
+		request.tx_aggregation_size = nla_get_u8(
+			tb[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION]);
+		request.rx_aggregation_size = nla_get_u8(
+			tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]);
+		request.vdev_id = adapter->sessionId;
+
+		if (request.tx_aggregation_size >=
+					CFG_TX_AGGREGATION_SIZE_MIN &&
+			request.tx_aggregation_size <=
+					CFG_TX_AGGREGATION_SIZE_MAX &&
+			request.rx_aggregation_size >=
+					CFG_RX_AGGREGATION_SIZE_MIN &&
+			request.rx_aggregation_size <=
+					CFG_RX_AGGREGATION_SIZE_MAX) {
+			qdf_status = wma_set_tx_rx_aggregation_size(&request);
+			if (qdf_status != QDF_STATUS_SUCCESS) {
+				hdd_err("failed to set aggr sizes err %d",
+					qdf_status);
+				ret_val = -EPERM;
+			}
+		} else {
+			hdd_err("TX %d RX %d MPDU aggr size not in range",
+				request.tx_aggregation_size,
+				request.rx_aggregation_size);
+			ret_val = -EINVAL;
+		}
+	}
+
 	return ret_val;
 }
 
@@ -6565,10 +6610,10 @@ static int wlan_hdd_sap_get_nol(hdd_adapter_t *ap_adapter, uint8_t *nol,
  *
  * Return: Zero on success and non zero value on error
  */
-int wlan_hdd_validate_and_get_pre_cac_ch(hdd_context_t *hdd_ctx,
-					hdd_adapter_t *ap_adapter,
-					uint8_t channel,
-					uint8_t *pre_cac_chan)
+static int wlan_hdd_validate_and_get_pre_cac_ch(hdd_context_t *hdd_ctx,
+						hdd_adapter_t *ap_adapter,
+						uint8_t channel,
+						uint8_t *pre_cac_chan)
 {
 	uint32_t i, j;
 	QDF_STATUS status;
@@ -10381,6 +10426,7 @@ static int wlan_hdd_cfg80211_set_default_key(struct wiphy *wiphy,
  * Return: bss found in kernel cache
  */
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && !defined(WITH_BACKPORTS)
+static
 struct cfg80211_bss *wlan_hdd_cfg80211_get_bss(struct wiphy *wiphy,
 	struct ieee80211_channel *channel, const u8 *bssid,
 	const u8 *ssid, size_t ssid_len)
@@ -10392,6 +10438,7 @@ struct cfg80211_bss *wlan_hdd_cfg80211_get_bss(struct wiphy *wiphy,
 			WLAN_CAPABILITY_ESS);
 }
 #else
+static
 struct cfg80211_bss *wlan_hdd_cfg80211_get_bss(struct wiphy *wiphy,
 	struct ieee80211_channel *channel, const u8 *bssid,
 	const u8 *ssid, size_t ssid_len)
@@ -11622,7 +11669,7 @@ static int wlan_hdd_add_assoc_ie(hdd_wext_state_t *wext_state,
  *
  * Return: 0 for success, non-zero for failure
  */
-int wlan_hdd_cfg80211_set_ie(hdd_adapter_t *pAdapter, const uint8_t *ie,
+static int wlan_hdd_cfg80211_set_ie(hdd_adapter_t *pAdapter, const uint8_t *ie,
 			     size_t ie_len)
 {
 	hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
@@ -11949,8 +11996,8 @@ static bool hdd_is_wpaie_present(const uint8_t *ie, uint8_t ie_len)
  *
  * Return: 0 for success, non-zero for failure
  */
-int wlan_hdd_cfg80211_set_privacy(hdd_adapter_t *pAdapter,
-				  struct cfg80211_connect_params *req)
+static int wlan_hdd_cfg80211_set_privacy(hdd_adapter_t *pAdapter,
+					 struct cfg80211_connect_params *req)
 {
 	int status = 0;
 	hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
@@ -12079,14 +12126,11 @@ static int wlan_hdd_try_disconnect(hdd_adapter_t *pAdapter)
 {
 	unsigned long rc;
 	hdd_station_ctx_t *pHddStaCtx;
-	eMib_dot11DesiredBssType connectedBssType;
 	int status, result = 0;
 
 	pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
-	hdd_conn_get_connected_bss_type(pHddStaCtx, &connectedBssType);
-
-	if ((eMib_dot11DesiredBssType_independent == connectedBssType) ||
+	if ((QDF_IBSS_MODE == pAdapter->device_mode) ||
 	  (eConnectionState_Associated == pHddStaCtx->conn_info.connState) ||
 	  (eConnectionState_Connecting == pHddStaCtx->conn_info.connState) ||
 	  (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState)) {
@@ -12325,7 +12369,7 @@ static int wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
  *
  * Return: 0 for success, non-zero for failure
  */
-int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason)
+static int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason)
 {
 	int status, result = 0;
 	unsigned long rc;
@@ -13890,6 +13934,7 @@ void wlan_hdd_cfg80211_update_replay_counter_callback(void *callbackContext,
  *
  * Return: 0 for success, non-zero for failure
  */
+static
 int __wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy,
 				       struct net_device *dev,
 				       struct cfg80211_gtk_rekey_data *data)
@@ -13978,6 +14023,7 @@ int __wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy,
  *
  * Return: 0 for success, non-zero for failure
  */
+static
 int wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy,
 				     struct net_device *dev,
 				     struct cfg80211_gtk_rekey_data *data)
@@ -14143,7 +14189,8 @@ wlan_hdd_cfg80211_set_mac_acl(struct wiphy *wiphy,
  *
  * Return: none
  */
-void wlan_hdd_cfg80211_lphb_ind_handler(void *pHddCtx, tSirLPHBInd *lphbInd)
+static void wlan_hdd_cfg80211_lphb_ind_handler(void *pHddCtx,
+					       tSirLPHBInd *lphbInd)
 {
 	struct sk_buff *skb;
 

+ 8 - 0
core/hdd/src/wlan_hdd_cfg80211.h

@@ -2319,6 +2319,10 @@ enum qca_access_policy {
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR: stats avg. factor
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME: guard time
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT: fine time measurement
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION:
+ *      Tx aggregation size (8-bit unsigned value)
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION:
+ *       Rx aggregation size (8-bit unsigned value)
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_DEFAULT_IES: Update the default scan IEs
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND:
  *                         Unsigned 32-bit value attribute for generic commands
@@ -2349,6 +2353,10 @@ enum qca_wlan_vendor_config {
 	QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_PENALIZE_AFTER_NCONS_BEACON_MISS,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND,
+
+	QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION,
+	QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION,
+
 	/* Attribute used to set scan default IEs to the driver.
 	*
 	* These IEs can be used by scan operations that will be initiated by

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

@@ -39,6 +39,7 @@
 #define HDD_DISALLOW_LEGACY_HDDLOG 1
 
 #include <wlan_hdd_includes.h>
+#include <wlan_hdd_debugfs.h>
 #include <wlan_hdd_wowl.h>
 #include <cds_sched.h>
 

+ 14 - 45
core/hdd/src/wlan_hdd_driver_ops.c

@@ -48,6 +48,7 @@
 #include "bmi.h"
 #include "cdp_txrx_bus.h"
 #include "pld_common.h"
+#include "wlan_hdd_driver_ops.h"
 
 #ifdef MODULE
 #define WLAN_MODULE_NAME  module_name(THIS_MODULE)
@@ -302,8 +303,9 @@ void hdd_hif_close(void *hif_ctx)
  *
  * Return: void
  */
-void hdd_init_qdf_ctx(struct device *dev, void *bdev,
-		      enum qdf_bus_type bus_type, const struct hif_bus_id *bid)
+static void hdd_init_qdf_ctx(struct device *dev, void *bdev,
+			     enum qdf_bus_type bus_type,
+			     const struct hif_bus_id *bid)
 {
 	qdf_device_t qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
 
@@ -470,7 +472,7 @@ static void wlan_hdd_shutdown(void)
  *
  * Return: void
  */
-void wlan_hdd_crash_shutdown(void)
+static void wlan_hdd_crash_shutdown(void)
 {
 	hif_crash_shutdown(cds_get_context(QDF_MODULE_ID_HIF));
 }
@@ -485,7 +487,7 @@ void wlan_hdd_crash_shutdown(void)
  *
  * Return: void
  */
-void wlan_hdd_notify_handler(int state)
+static void wlan_hdd_notify_handler(int state)
 {
 	if (!QDF_IS_EPPING_ENABLED(cds_get_conparam())) {
 		int ret = 0;
@@ -558,16 +560,6 @@ done:
 	return err;
 }
 
-/**
- * wlan_hdd_bus_suspend() - suspend the wlan bus
- *
- * This function is called by the platform driver to suspend the
- * wlan bus
- *
- * @state: state
- *
- * Return: QDF_STATUS
- */
 int wlan_hdd_bus_suspend(pm_message_t state)
 {
 	int ret;
@@ -589,7 +581,7 @@ int wlan_hdd_bus_suspend(pm_message_t state)
  *
  * Return: 0 for success and -EBUSY if FW is requesting wake up
  */
-int __wlan_hdd_bus_suspend_noirq(void)
+static int __wlan_hdd_bus_suspend_noirq(void)
 {
 	hdd_context_t *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
 	void *hif_ctx;
@@ -628,23 +620,17 @@ resume_hif_noirq:
 	status = hif_bus_resume_noirq(hif_ctx);
 	QDF_BUG(!status);
 done:
-	if (err == -EAGAIN)
+	if (err == -EAGAIN) {
 		hdd_err("Firmware attempting wakeup, try again");
-	else
+		wlan_hdd_inc_suspend_stats(hdd_ctx,
+					   SUSPEND_FAIL_INITIAL_WAKEUP);
+	} else {
 		hdd_err("suspend_noirq failed, status = %d", err);
+	}
+
 	return err;
 }
 
-/**
- * wlan_hdd_bus_suspend_noirq() - handle .suspend_noirq callback
- *
- * This function is called by the platform driver to complete the
- * bus suspend callback when device interrupts are disabled by kernel.
- * Call HIF and WMA suspend_noirq callbacks to make sure there is no
- * wake up pending from FW before allowing suspend.
- *
- * Return: 0 for success and -EBUSY if FW is requesting wake up
- */
 int wlan_hdd_bus_suspend_noirq(void)
 {
 	int ret;
@@ -700,14 +686,6 @@ static int __wlan_hdd_bus_resume(void)
 	return status;
 }
 
-/**
- * wlan_hdd_bus_resume(): wake up the bus
- *
- * This function is called by the platform driver to resume wlan
- * bus
- *
- * Return: void
- */
 int wlan_hdd_bus_resume(void)
 {
 	int ret;
@@ -728,7 +706,7 @@ int wlan_hdd_bus_resume(void)
  *
  * Return: 0 for success and negative error code for failure
  */
-int __wlan_hdd_bus_resume_noirq(void)
+static int __wlan_hdd_bus_resume_noirq(void)
 {
 	hdd_context_t *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
 	void *hif_ctx;
@@ -758,15 +736,6 @@ int __wlan_hdd_bus_resume_noirq(void)
 	return status;
 }
 
-/**
- * wlan_hdd_bus_resume_noirq(): handle bus resume no irq
- *
- * This function is called by the platform driver to do bus
- * resume no IRQ before calling resume callback. Call WMA and HIF
- * layers to complete the resume_noirq.
- *
- * Return: 0 for success and negative error code for failure
- */
 int wlan_hdd_bus_resume_noirq(void)
 {
 	int ret;

+ 6 - 6
core/hdd/src/wlan_hdd_ext_scan.c

@@ -2435,8 +2435,8 @@ int wlan_hdd_cfg80211_extscan_set_significant_change(struct wiphy *wiphy,
  *
  * Return: none
  */
-void hdd_remove_dsrc_channels(struct wiphy *wiphy, uint32_t *chan_list,
-				 uint8_t *num_channels)
+static void hdd_remove_dsrc_channels(struct wiphy *wiphy, uint32_t *chan_list,
+				     uint8_t *num_channels)
 {
 	uint8_t num_chan_temp = 0;
 	int i;
@@ -2460,8 +2460,8 @@ void hdd_remove_dsrc_channels(struct wiphy *wiphy, uint32_t *chan_list,
  * Return: none
  */
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
-void hdd_remove_indoor_channels(struct wiphy *wiphy, uint32_t *chan_list,
-				 uint8_t *num_channels)
+static void hdd_remove_indoor_channels(struct wiphy *wiphy, uint32_t *chan_list,
+				       uint8_t *num_channels)
 {
 	uint8_t num_chan_temp = 0;
 	int i, j, k;
@@ -2485,8 +2485,8 @@ void hdd_remove_indoor_channels(struct wiphy *wiphy, uint32_t *chan_list,
 	*num_channels = num_chan_temp;
 }
 #else
-void hdd_remove_indoor_channels(struct wiphy *wiphy, uint32_t *chan_list,
-				 uint8_t *num_channels)
+static void hdd_remove_indoor_channels(struct wiphy *wiphy, uint32_t *chan_list,
+				       uint8_t *num_channels)
 {
 	*num_channels = 0;
 }

+ 79 - 21
core/hdd/src/wlan_hdd_hostapd.c

@@ -133,8 +133,8 @@ int hdd_sap_context_init(hdd_context_t *hdd_ctx)
  *
  * Return: None
  */
-void hdd_hostapd_channel_allow_suspend(hdd_adapter_t *pAdapter,
-				       uint8_t channel)
+static void hdd_hostapd_channel_allow_suspend(hdd_adapter_t *pAdapter,
+					      uint8_t channel)
 {
 
 	hdd_context_t *pHddCtx = (hdd_context_t *) (pAdapter->pHddCtx);
@@ -169,8 +169,8 @@ void hdd_hostapd_channel_allow_suspend(hdd_adapter_t *pAdapter,
  *
  * Return - None
  */
-void hdd_hostapd_channel_prevent_suspend(hdd_adapter_t *pAdapter,
-					 uint8_t channel)
+static void hdd_hostapd_channel_prevent_suspend(hdd_adapter_t *pAdapter,
+						uint8_t channel)
 {
 	hdd_context_t *pHddCtx = (hdd_context_t *) (pAdapter->pHddCtx);
 	hdd_hostapd_state_t *pHostapdState =
@@ -473,9 +473,20 @@ static int hdd_hostapd_set_mac_address(struct net_device *dev, void *addr)
 	return ret;
 }
 
-void hdd_hostapd_inactivity_timer_cb(void *usrDataForCallback)
+/**
+ * hdd_hostapd_inactivity_timer_cb() - Inactivity timeout handler
+ * @context: Context registered with qdf_mc_timer_init()
+ *
+ * This is the callback function registered with qdf_mc_timer_init()
+ * to handle the AP inactivity timer. The @context registered is the
+ * struct net_device associated with the interface.  When this
+ * function is called it means the AP inactivity timer has fired, and
+ * this function in turn indicates the timeout to userspace.
+ */
+
+static void hdd_hostapd_inactivity_timer_cb(void *context)
 {
-	struct net_device *dev = (struct net_device *)usrDataForCallback;
+	struct net_device *dev = (struct net_device *)context;
 	uint8_t we_custom_event[64];
 	union iwreq_data wrqu;
 #ifdef DISABLE_CONCURRENCY_AUTOSAVE
@@ -533,8 +544,8 @@ void hdd_hostapd_inactivity_timer_cb(void *usrDataForCallback)
 	EXIT();
 }
 
-void hdd_clear_all_sta(hdd_adapter_t *pHostapdAdapter,
-		       void *usrDataForCallback)
+static void hdd_clear_all_sta(hdd_adapter_t *pHostapdAdapter,
+			      void *usrDataForCallback)
 {
 	uint8_t staId = 0;
 	struct net_device *dev;
@@ -729,10 +740,10 @@ QDF_STATUS hdd_chan_change_notify(hdd_adapter_t *adapter,
  * Return: Success on sending notifying userspace
  *
  */
-QDF_STATUS hdd_send_radar_event(hdd_context_t *hdd_context,
-		eSapHddEvent event,
-		struct wlan_dfs_info dfs_info,
-		struct wireless_dev *wdev)
+static QDF_STATUS hdd_send_radar_event(hdd_context_t *hdd_context,
+				       eSapHddEvent event,
+				       struct wlan_dfs_info dfs_info,
+				       struct wireless_dev *wdev)
 {
 
 	struct sk_buff *vendor_event;
@@ -6309,10 +6320,11 @@ static void wlan_hdd_add_extra_ie(hdd_adapter_t *pHostapdAdapter,
  *
  * Return: 0 for success non-zero for failure
  */
-int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
-				       beacon_data_t **ppBeacon,
-				       struct cfg80211_beacon_data *params,
-				       int dtim_period)
+static int
+wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
+				   beacon_data_t **ppBeacon,
+				   struct cfg80211_beacon_data *params,
+				   int dtim_period)
 {
 	int size;
 	beacon_data_t *beacon = NULL;
@@ -6761,7 +6773,7 @@ QDF_STATUS wlan_hdd_config_acs(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
  *
  * Return: 0 for Success or Negative error codes.
  */
-int wlan_hdd_setup_driver_overrides(hdd_adapter_t *ap_adapter)
+static int wlan_hdd_setup_driver_overrides(hdd_adapter_t *ap_adapter)
 {
 	tsap_Config_t *sap_cfg = &ap_adapter->sessionCtx.ap.sapConfig;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter);
@@ -6942,10 +6954,21 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
 
 	pConfig->enOverLapCh = iniConfig->gEnableOverLapCh;
 	pConfig->dtim_period = pBeacon->dtim_period;
-	if (pHddCtx->acs_policy.acs_channel)
-		pConfig->channel = pHddCtx->acs_policy.acs_channel;
-	mode = pHddCtx->acs_policy.acs_dfs_mode;
-	pConfig->acs_dfs_mode = wlan_hdd_get_dfs_mode(mode);
+	hdd_info("acs_mode %d", pConfig->acs_cfg.acs_mode);
+
+	if (pConfig->acs_cfg.acs_mode == true) {
+		hdd_info("acs_channel %d, acs_dfs_mode %d",
+			pHddCtx->acs_policy.acs_channel,
+			pHddCtx->acs_policy.acs_dfs_mode);
+
+		if (pHddCtx->acs_policy.acs_channel)
+			pConfig->channel = pHddCtx->acs_policy.acs_channel;
+		mode = pHddCtx->acs_policy.acs_dfs_mode;
+		pConfig->acs_dfs_mode = wlan_hdd_get_dfs_mode(mode);
+	}
+
+	hdd_info("pConfig->channel %d, pConfig->acs_dfs_mode %d",
+		pConfig->channel, pConfig->acs_dfs_mode);
 
 	hdd_info("****pConfig->dtim_period=%d***",
 		pConfig->dtim_period);
@@ -7250,6 +7273,40 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
 			acl_entry++;
 		}
 	}
+	if (!pHddCtx->config->force_sap_acs) {
+		pIe = wlan_hdd_cfg80211_get_ie_ptr(
+				&pMgmt_frame->u.beacon.variable[0],
+				pBeacon->head_len, WLAN_EID_SUPP_RATES);
+
+		if (pIe != NULL) {
+			pIe++;
+			pConfig->supported_rates.numRates = pIe[0];
+			pIe++;
+			for (i = 0;
+			     i < pConfig->supported_rates.numRates; i++) {
+				if (pIe[i]) {
+				     pConfig->supported_rates.rate[i] = pIe[i];
+				     hdd_info("Configured Supported rate is %2x",
+					pConfig->supported_rates.rate[i]);
+				}
+			}
+		}
+		pIe = wlan_hdd_cfg80211_get_ie_ptr(pBeacon->tail,
+				pBeacon->tail_len,
+				WLAN_EID_EXT_SUPP_RATES);
+		if (pIe != NULL) {
+			pIe++;
+			pConfig->extended_rates.numRates = pIe[0];
+			pIe++;
+			for (i = 0; i < pConfig->extended_rates.numRates; i++) {
+				if (pIe[i]) {
+				      pConfig->extended_rates.rate[i] = pIe[i];
+				      hdd_info("Configured ext Supported rate is %2x",
+					pConfig->extended_rates.rate[i]);
+				}
+			}
+		}
+	}
 
 	wlan_hdd_set_sap_hwmode(pHostapdAdapter);
 	qdf_mem_zero(&sme_config, sizeof(tSmeConfigParams));
@@ -7617,6 +7674,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
 		global_p2p_connection_status = P2P_NOT_ACTIVE;
 	}
 #endif
+	pAdapter->sessionId = HDD_SESSION_ID_INVALID;
 	EXIT();
 	return ret;
 }

+ 143 - 21
core/hdd/src/wlan_hdd_ioctl.c

@@ -2620,7 +2620,8 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 					tCsrEseBeaconReq *pEseBcnReq)
 {
 	uint8_t *inPtr = pValue;
-	int tempInt = 0;
+	uint8_t input = 0;
+	uint32_t tempInt = 0;
 	int j = 0, i = 0, v = 0;
 	char buf[32];
 
@@ -2642,19 +2643,19 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 	if ('\0' == *inPtr)
 		return -EINVAL;
 
-	/* get the first argument ie measurement token */
+	/* Getting the first argument ie Number of IE fields */
 	v = sscanf(inPtr, "%31s ", buf);
 	if (1 != v)
 		return -EINVAL;
 
-	v = kstrtos32(buf, 10, &tempInt);
+	v = kstrtou8(buf, 10, &input);
 	if (v < 0)
 		return -EINVAL;
 
-	pEseBcnReq->numBcnReqIe = tempInt;
+	input = QDF_MIN(input, SIR_ESE_MAX_MEAS_IE_REQS);
+	pEseBcnReq->numBcnReqIe = input;
 
-	hdd_info("Number of Bcn Req Ie fields(%d)",
-		  pEseBcnReq->numBcnReqIe);
+	hdd_info("Number of Bcn Req Ie fields: %d", pEseBcnReq->numBcnReqIe);
 
 	for (j = 0; j < (pEseBcnReq->numBcnReqIe); j++) {
 		for (i = 0; i < 4; i++) {
@@ -2683,14 +2684,14 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 			if (1 != v)
 				return -EINVAL;
 
-			v = kstrtos32(buf, 10, &tempInt);
+			v = kstrtou32(buf, 10, &tempInt);
 			if (v < 0)
 				return -EINVAL;
 
 			switch (i) {
 			case 0: /* Measurement token */
-				if (tempInt <= 0) {
-					hdd_err("Invalid Measurement Token(%d)",
+				if (!tempInt) {
+					hdd_err("Invalid Measurement Token: %u",
 						  tempInt);
 					return -EINVAL;
 				}
@@ -2699,10 +2700,10 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 				break;
 
 			case 1: /* Channel number */
-				if ((tempInt <= 0) ||
+				if (!tempInt ||
 				    (tempInt >
 				     WNI_CFG_CURRENT_CHANNEL_STAMAX)) {
-					hdd_err("Invalid Channel Number(%d)",
+					hdd_err("Invalid Channel Number: %u",
 						  tempInt);
 					return -EINVAL;
 				}
@@ -2712,7 +2713,7 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 			case 2: /* Scan mode */
 				if ((tempInt < eSIR_PASSIVE_SCAN)
 				    || (tempInt > eSIR_BEACON_TABLE)) {
-					hdd_err("Invalid Scan Mode(%d) Expected{0|1|2}",
+					hdd_err("Invalid Scan Mode: %u Expected{0|1|2}",
 						  tempInt);
 					return -EINVAL;
 				}
@@ -2720,13 +2721,12 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 				break;
 
 			case 3: /* Measurement duration */
-				if (((tempInt <= 0)
+				if ((!tempInt
 				     && (pEseBcnReq->bcnReq[j].scanMode !=
 					 eSIR_BEACON_TABLE)) ||
-				    ((tempInt < 0) &&
-				     (pEseBcnReq->bcnReq[j].scanMode ==
-						eSIR_BEACON_TABLE))) {
-					hdd_err("Invalid Measurement Duration(%d)",
+				    (pEseBcnReq->bcnReq[j].scanMode ==
+						eSIR_BEACON_TABLE)) {
+					hdd_err("Invalid Measurement Duration: %u",
 						  tempInt);
 					return -EINVAL;
 				}
@@ -2738,7 +2738,7 @@ static int hdd_parse_ese_beacon_req(uint8_t *pValue,
 	}
 
 	for (j = 0; j < pEseBcnReq->numBcnReqIe; j++) {
-		hdd_info("Index(%d) Measurement Token(%u) Channel(%u) Scan Mode(%u) Measurement Duration(%u)",
+		hdd_info("Index: %d Measurement Token: %u Channel: %u Scan Mode: %u Measurement Duration: %u",
 			  j,
 			  pEseBcnReq->bcnReq[j].measurementToken,
 			  pEseBcnReq->bcnReq[j].channel,
@@ -5548,6 +5548,127 @@ static int drv_cmd_ccx_beacon_req(hdd_adapter_t *adapter,
 		goto exit;
 	}
 
+exit:
+	return ret;
+}
+
+/**
+ * drv_cmd_ccx_plm_req() - Set ESE PLM request
+ * @adapter:     Pointer to the HDD adapter
+ * @hdd_ctx:     Pointer to the HDD context
+ * @command:     Driver command string
+ * @command_len: Driver command string length
+ * @priv_data:   Private data coming with the driver command. Unused here
+ *
+ * This function handles driver command that sets the ESE PLM request
+ *
+ * Return: 0 on success; negative errno otherwise
+ */
+static int drv_cmd_ccx_plm_req(hdd_adapter_t *adapter,
+			       hdd_context_t *hdd_ctx,
+			       uint8_t *command,
+			       uint8_t command_len,
+			       hdd_priv_data_t *priv_data)
+{
+	int ret = 0;
+	uint8_t *value = command;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	tpSirPlmReq pPlmRequest = NULL;
+
+	pPlmRequest = qdf_mem_malloc(sizeof(tSirPlmReq));
+	if (NULL == pPlmRequest) {
+		ret = -ENOMEM;
+		goto exit;
+	}
+
+	status = hdd_parse_plm_cmd(value, pPlmRequest);
+	if (QDF_STATUS_SUCCESS != status) {
+		qdf_mem_free(pPlmRequest);
+		pPlmRequest = NULL;
+		ret = -EINVAL;
+		goto exit;
+	}
+	pPlmRequest->sessionId = adapter->sessionId;
+
+	status = sme_set_plm_request(hdd_ctx->hHal, pPlmRequest);
+	if (QDF_STATUS_SUCCESS != status) {
+		qdf_mem_free(pPlmRequest);
+		pPlmRequest = NULL;
+		ret = -EINVAL;
+		goto exit;
+	}
+
+exit:
+	return ret;
+}
+
+/**
+ * drv_cmd_set_ccx_mode() - Set ESE mode
+ * @adapter:     Pointer to the HDD adapter
+ * @hdd_ctx:     Pointer to the HDD context
+ * @command:     Driver command string
+ * @command_len: Driver command string length
+ * @priv_data:   Private data coming with the driver command. Unused here
+ *
+ * This function handles driver command that sets ESE mode
+ *
+ * Return: 0 on success; negative errno otherwise
+ */
+static int drv_cmd_set_ccx_mode(hdd_adapter_t *adapter,
+				hdd_context_t *hdd_ctx,
+				uint8_t *command,
+				uint8_t command_len,
+				hdd_priv_data_t *priv_data)
+{
+	int ret = 0;
+	uint8_t *value = command;
+	uint8_t eseMode = CFG_ESE_FEATURE_ENABLED_DEFAULT;
+
+	/*
+	 * Check if the features OKC/ESE/11R are supported simultaneously,
+	 * then this operation is not permitted (return FAILURE)
+	 */
+	if (sme_get_is_ese_feature_enabled(hdd_ctx->hHal) &&
+	    hdd_is_okc_mode_enabled(hdd_ctx) &&
+	    sme_get_is_ft_feature_enabled(hdd_ctx->hHal)) {
+		hdd_warn("OKC/ESE/11R are supported simultaneously hence this operation is not permitted!");
+		ret = -EPERM;
+		goto exit;
+	}
+
+	/* Move pointer to ahead of SETCCXMODE<delimiter> */
+	value = value + command_len + 1;
+
+	/* Convert the value from ascii to integer */
+	ret = kstrtou8(value, 10, &eseMode);
+	if (ret < 0) {
+		/*
+		 * If the input value is greater than max value of datatype,
+		 * then also kstrtou8 fails
+		 */
+		hdd_err("kstrtou8 failed range [%d - %d]",
+			  CFG_ESE_FEATURE_ENABLED_MIN,
+			  CFG_ESE_FEATURE_ENABLED_MAX);
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if ((eseMode < CFG_ESE_FEATURE_ENABLED_MIN) ||
+	    (eseMode > CFG_ESE_FEATURE_ENABLED_MAX)) {
+		hdd_err("Ese mode value %d is out of range (Min: %d Max: %d)",
+			  eseMode,
+			  CFG_ESE_FEATURE_ENABLED_MIN,
+			  CFG_ESE_FEATURE_ENABLED_MAX);
+		ret = -EINVAL;
+		goto exit;
+	}
+	hdd_info("Received Command to change ese mode = %d", eseMode);
+
+	hdd_ctx->config->isEseIniFeatureEnabled = eseMode;
+	sme_update_is_ese_feature_enabled(hdd_ctx->hHal,
+					  adapter->sessionId,
+					  eseMode);
+
 exit:
 	return ret;
 }
@@ -6639,8 +6760,7 @@ static int drv_cmd_set_antenna_mode(hdd_adapter_t *adapter,
 
 	/* Check TDLS status and update antenna mode */
 	if ((QDF_STA_MODE == adapter->device_mode) &&
-	    cds_is_sta_active_connection_exists() &&
-	    (hdd_ctx->connected_peer_count > 0)) {
+	    cds_is_sta_active_connection_exists()) {
 		ret = wlan_hdd_tdls_antenna_switch(hdd_ctx, adapter,
 						   mode);
 		if (0 != ret)
@@ -7037,7 +7157,9 @@ static const hdd_drv_cmd_t hdd_drv_cmds[] = {
 	{"SETCCXROAMSCANCHANNELS",    drv_cmd_set_ccx_roam_scan_channels},
 	{"GETTSMSTATS",               drv_cmd_get_tsm_stats},
 	{"SETCCKMIE",                 drv_cmd_set_cckm_ie},
-	{"CCXBEACONREQ",  drv_cmd_ccx_beacon_req},
+	{"CCXBEACONREQ",	      drv_cmd_ccx_beacon_req},
+	{"CCXPLMREQ",                 drv_cmd_ccx_plm_req},
+	{"SETCCXMODE",                drv_cmd_set_ccx_mode},
 #endif /* FEATURE_WLAN_ESE */
 	{"SETMCRATE",                 drv_cmd_set_mc_rate},
 	{"MAXTXPOWER",                drv_cmd_max_tx_power},

+ 4 - 4
core/hdd/src/wlan_hdd_ipa.c

@@ -454,7 +454,7 @@ struct hdd_ipa_priv {
  *        is broken.
  * This should be OK and IPA is not enabled yet
  */
-void *wlan_hdd_stub_priv_to_addr(uint32_t priv)
+static void *wlan_hdd_stub_priv_to_addr(uint32_t priv)
 {
 	void    *vaddr;
 	uint32_t ipa_priv = priv;
@@ -464,7 +464,7 @@ void *wlan_hdd_stub_priv_to_addr(uint32_t priv)
 	return vaddr;
 }
 
-uint32_t wlan_hdd_stub_addr_to_priv(void *ptr)
+static uint32_t wlan_hdd_stub_addr_to_priv(void *ptr)
 {
 	uint32_t       ipa_priv = 0;
 
@@ -838,7 +838,7 @@ static void hdd_ipa_uc_rt_debug_handler(void *ctext)
  *
  * Return: none
  */
-void hdd_ipa_uc_rt_debug_destructor(struct sk_buff *skb)
+static void hdd_ipa_uc_rt_debug_destructor(struct sk_buff *skb)
 {
 	if (!ghdd_ipa) {
 		HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR,
@@ -4163,7 +4163,7 @@ fail_return:
  *
  * Return: none
  */
-void hdd_ipa_cleanup_pending_event(struct hdd_ipa_priv *hdd_ipa)
+static void hdd_ipa_cleanup_pending_event(struct hdd_ipa_priv *hdd_ipa)
 {
 	struct ipa_uc_pending_event *pending_event = NULL;
 

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

@@ -412,8 +412,9 @@ static void hdd_lro_desc_free(struct net_lro_desc *desc,
  *
  * Return: none
  */
-void hdd_lro_flush_pkt(struct net_lro_mgr *lro_mgr,
-	 struct iphdr *iph, struct tcphdr *tcph, hdd_adapter_t *adapter)
+static void hdd_lro_flush_pkt(struct net_lro_mgr *lro_mgr,
+			      struct iphdr *iph, struct tcphdr *tcph,
+			      hdd_adapter_t *adapter)
 {
 	struct net_lro_desc *lro_desc;
 
@@ -434,7 +435,7 @@ void hdd_lro_flush_pkt(struct net_lro_mgr *lro_mgr,
  *
  * Return: none
  */
-void hdd_lro_flush(void *data)
+static void hdd_lro_flush(void *data)
 {
 	hdd_adapter_t *adapter = (hdd_adapter_t *)data;
 	struct hdd_lro_s *hdd_lro;
@@ -461,7 +462,9 @@ void hdd_lro_flush(void *data)
 	while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) {
 		adapter = adapter_node->pAdapter;
 		hdd_lro = &adapter->lro_info;
-		if (adapter->dev->features & NETIF_F_LRO) {
+		if (adapter->dev == NULL) {
+			hdd_err("vdev interface going down");
+		} else if (adapter->dev->features & NETIF_F_LRO) {
 			qdf_spin_lock_bh(&hdd_lro->lro_mgr_arr_access_lock);
 			for (i = 0; i < hdd_lro->lro_mgr->max_desc; i++) {
 				if (hdd_lro->lro_mgr->lro_arr[i].active) {

+ 124 - 26
core/hdd/src/wlan_hdd_main.c

@@ -206,7 +206,7 @@ void wlan_hdd_auto_shutdown_cb(void);
  *
  * Return: none
  */
-void hdd_set_rps_cpu_mask(hdd_context_t *hdd_ctx)
+static void hdd_set_rps_cpu_mask(hdd_context_t *hdd_ctx)
 {
 	hdd_adapter_t *adapter;
 	hdd_adapter_list_node_t *adapter_node, *next;
@@ -1001,6 +1001,11 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
 		wiphy->bands[IEEE80211_BAND_5GHZ];
 	uint32_t temp = 0;
 
+	if (!band_5g) {
+		hdd_info("5GHz band disabled, skipping capability population");
+		return;
+	}
+
 	/* Get the current MPDU length */
 	status =
 		sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_MAX_MPDU_LENGTH,
@@ -1631,7 +1636,7 @@ static int __hdd_mon_open(struct net_device *dev)
  *
  * Return: 0 for success; non-zero for failure
  */
-int hdd_mon_open(struct net_device *dev)
+static int hdd_mon_open(struct net_device *dev)
 {
 	int ret;
 
@@ -1968,7 +1973,7 @@ static int __hdd_open(struct net_device *dev)
  *
  * Return: 0 for success; non-zero for failure
  */
-int hdd_open(struct net_device *dev)
+static int hdd_open(struct net_device *dev)
 {
 	int ret;
 
@@ -2075,7 +2080,7 @@ static int __hdd_stop(struct net_device *dev)
  *
  * Return: 0 for success and error number for failure
  */
-int hdd_stop(struct net_device *dev)
+static int hdd_stop(struct net_device *dev)
 {
 	int ret;
 
@@ -2524,13 +2529,10 @@ static hdd_adapter_t *hdd_alloc_station_adapter(hdd_context_t *hdd_ctx,
 	return adapter;
 }
 
-QDF_STATUS hdd_register_interface(hdd_adapter_t *adapter,
-				  bool rtnl_held)
+static QDF_STATUS hdd_register_interface(hdd_adapter_t *adapter,
+					 bool rtnl_held)
 {
 	struct net_device *pWlanDev = adapter->dev;
-	/* hdd_station_ctx_t *pHddStaCtx = &adapter->sessionCtx.station; */
-	/* hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX( adapter ); */
-	/* QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS; */
 
 	if (rtnl_held) {
 		if (strnchr(pWlanDev->name, strlen(pWlanDev->name), '%')) {
@@ -2780,14 +2782,16 @@ void hdd_cleanup_actionframe(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
  * hdd_station_adapter_deinit() - De-initialize the station adapter
  * @hdd_ctx: global hdd context
  * @adapter: HDD adapter
+ * @rtnl_held: Used to indicate whether or not the caller is holding
+ *             the kernel rtnl_mutex
  *
  * This function De-initializes the STA/P2P/OCB adapter.
  *
  * Return: None.
  */
-void hdd_station_adapter_deinit(hdd_context_t *hdd_ctx,
-				hdd_adapter_t *adapter,
-				bool rtnl_held)
+static void hdd_station_adapter_deinit(hdd_context_t *hdd_ctx,
+				       hdd_adapter_t *adapter,
+				       bool rtnl_held)
 {
 	ENTER_DEV(adapter->dev);
 
@@ -2826,8 +2830,9 @@ void hdd_station_adapter_deinit(hdd_context_t *hdd_ctx,
  *
  * Return: None.
  */
-void hdd_ap_adapter_deinit(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
-			   bool rtnl_held)
+static void hdd_ap_adapter_deinit(hdd_context_t *hdd_ctx,
+				  hdd_adapter_t *adapter,
+				  bool rtnl_held)
 {
 	ENTER_DEV(adapter->dev);
 
@@ -2872,8 +2877,8 @@ void hdd_deinit_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
 	EXIT();
 }
 
-void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
-			 bool rtnl_held)
+static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
+				bool rtnl_held)
 {
 	struct net_device *pWlanDev = NULL;
 
@@ -2915,8 +2920,8 @@ void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
 	}
 }
 
-QDF_STATUS hdd_check_for_existing_macaddr(hdd_context_t *hdd_ctx,
-					  tSirMacAddr macAddr)
+static QDF_STATUS hdd_check_for_existing_macaddr(hdd_context_t *hdd_ctx,
+						 tSirMacAddr macAddr)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *adapter;
@@ -3109,6 +3114,15 @@ int hdd_set_fw_params(hdd_adapter_t *adapter)
 
 	hdd_set_fw_log_params(hdd_ctx, adapter);
 
+	ret = wma_cli_set_command(adapter->sessionId,
+				  WMI_VDEV_PARAM_ENABLE_RTSCTS,
+				  hdd_ctx->config->rts_profile,
+				  VDEV_CMD);
+	if (ret) {
+		hdd_err("FAILED TO SET RTSCTS Profile ret:%d", ret);
+		goto error;
+	}
+
 	EXIT();
 	return 0;
 
@@ -3458,7 +3472,6 @@ static void hdd_wait_for_sme_close_sesion(hdd_context_t *hdd_ctx,
 			sme_close_session(hdd_ctx->hHal, adapter->sessionId,
 				hdd_sme_close_session_callback,
 				adapter)) {
-		adapter->sessionId = HDD_SESSION_ID_INVALID;
 		/*
 		 * Block on a completion variable. Can't wait
 		 * forever though.
@@ -3472,7 +3485,9 @@ static void hdd_wait_for_sme_close_sesion(hdd_context_t *hdd_ctx,
 			if (adapter->device_mode == QDF_NDI_MODE)
 				hdd_ndp_session_end_handler(adapter);
 			clear_bit(SME_SESSION_OPENED, &adapter->event_flags);
+			return;
 		}
+		adapter->sessionId = HDD_SESSION_ID_INVALID;
 	}
 }
 
@@ -3766,6 +3781,7 @@ static bool hdd_is_interface_up(hdd_adapter_t *adapter)
 #if defined CFG80211_CONNECT_BSS
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) \
 	&& !defined(WITH_BACKPORTS) && !defined(IEEE80211_PRIVACY)
+static
 struct cfg80211_bss *hdd_cfg80211_get_bss(struct wiphy *wiphy,
 					  struct ieee80211_channel *channel,
 					  const u8 *bssid, const u8 *ssid,
@@ -3777,6 +3793,7 @@ struct cfg80211_bss *hdd_cfg80211_get_bss(struct wiphy *wiphy,
 				WLAN_CAPABILITY_ESS);
 }
 #else
+static
 struct cfg80211_bss *hdd_cfg80211_get_bss(struct wiphy *wiphy,
 					  struct ieee80211_channel *channel,
 					  const u8 *bssid, const u8 *ssid,
@@ -4654,7 +4671,7 @@ static void hdd_context_destroy(hdd_context_t *hdd_ctx)
  *
  * Return: None
  */
-void hdd_wlan_exit(hdd_context_t *hdd_ctx)
+static void hdd_wlan_exit(hdd_context_t *hdd_ctx)
 {
 	v_CONTEXT_t p_cds_context = hdd_ctx->pcds_context;
 	QDF_STATUS qdf_status;
@@ -4795,6 +4812,7 @@ void __hdd_wlan_exit(void)
 	hdd_ipa_uc_force_pipe_shutdown(hdd_ctx);
 
 	memdump_deinit();
+	hdd_driver_memdump_deinit();
 
 	/* Do all the cleanup before deregistering the driver */
 	hdd_wlan_exit(hdd_ctx);
@@ -5133,8 +5151,9 @@ static int hdd_wiphy_init(hdd_context_t *hdd_ctx)
  * Returns: None
  */
 #ifdef MSM_PLATFORM
-void hdd_pld_request_bus_bandwidth(hdd_context_t *hdd_ctx,
-			const uint64_t tx_packets, const uint64_t rx_packets)
+static void hdd_pld_request_bus_bandwidth(hdd_context_t *hdd_ctx,
+					  const uint64_t tx_packets,
+					  const uint64_t rx_packets)
 {
 	uint64_t total = tx_packets + rx_packets;
 	uint64_t temp_rx = 0;
@@ -5767,7 +5786,7 @@ static uint8_t hdd_get_safe_channel_from_pcl_and_acs_range(
  *
  * Return: None
  */
-void hdd_restart_sap(hdd_adapter_t *adapter, uint8_t channel)
+static void hdd_restart_sap(hdd_adapter_t *adapter, uint8_t channel)
 {
 	hdd_ap_ctx_t *hdd_ap_ctx;
 	tHalHandle *hal_handle;
@@ -6338,7 +6357,7 @@ list_destroy:
  *
  * Return: HDD context on success and ERR_PTR on failure
  */
-hdd_context_t *hdd_context_create(struct device *dev)
+static hdd_context_t *hdd_context_create(struct device *dev)
 {
 	QDF_STATUS status;
 	int ret = 0;
@@ -6747,7 +6766,7 @@ inline void hdd_ra_populate_cds_config(struct cds_config_info *cds_cfg,
  *
  * Return: 0 for Success, errno on failure
  */
-int hdd_update_cds_config(hdd_context_t *hdd_ctx)
+static int hdd_update_cds_config(hdd_context_t *hdd_ctx)
 {
 	struct cds_config_info *cds_cfg;
 
@@ -7439,6 +7458,8 @@ static int hdd_features_init(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
 
 	/* FW capabilities received, Set the Dot11 mode */
 	sme_setdef_dot11mode(hdd_ctx->hHal);
+	sme_set_prefer_80MHz_over_160MHz(hdd_ctx->hHal,
+			hdd_ctx->config->sta_prefer_80MHz_over_160MHz);
 
 
 	if (hdd_ctx->config->fIsImpsEnabled)
@@ -7567,7 +7588,7 @@ out:
  *
  * Return: 0 on success and errno on failure.
  */
-int hdd_deconfigure_cds(hdd_context_t *hdd_ctx)
+static int hdd_deconfigure_cds(hdd_context_t *hdd_ctx)
 {
 	QDF_STATUS qdf_status;
 
@@ -7723,6 +7744,79 @@ static void hdd_iface_change_callback(void *priv)
 	EXIT();
 }
 
+/**
+ * hdd_state_info_dump() - prints state information of hdd layer
+ * @buf: buffer pointer
+ * @size: size of buffer to be filled
+ *
+ * This function is used to dump state information of hdd layer
+ *
+ * Return: None
+ */
+static void hdd_state_info_dump(char **buf_ptr, uint16_t *size)
+{
+	hdd_context_t *hdd_ctx;
+	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
+	QDF_STATUS status;
+	hdd_station_ctx_t *hdd_sta_ctx;
+	hdd_adapter_t *adapter;
+	uint16_t len = 0;
+	char *buf = *buf_ptr;
+
+	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	if (!hdd_ctx) {
+		hdd_err("Failed to get hdd context ");
+		return;
+	}
+
+	hdd_notice("size of buffer: %d", *size);
+
+	len += scnprintf(buf + len, *size - len,
+		"\n isWiphySuspended %d", hdd_ctx->isWiphySuspended);
+	len += scnprintf(buf + len, *size - len,
+		"\n isMcThreadSuspended %d",
+		hdd_ctx->isMcThreadSuspended);
+
+	status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
+
+	while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) {
+		adapter = adapter_node->pAdapter;
+		if (adapter->dev)
+			len += scnprintf(buf + len, *size - len,
+				"\n device name: %s", adapter->dev->name);
+			len += scnprintf(buf + len, *size - len,
+				"\n device_mode: %d", adapter->device_mode);
+		switch (adapter->device_mode) {
+		case QDF_STA_MODE:
+		case QDF_P2P_CLIENT_MODE:
+			hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+			len += scnprintf(buf + len, *size - len,
+				"\n connState: %d",
+				hdd_sta_ctx->conn_info.connState);
+			break;
+
+		default:
+			break;
+		}
+		status = hdd_get_next_adapter(hdd_ctx, adapter_node, &next);
+		adapter_node = next;
+	}
+
+	*size -= len;
+	*buf_ptr += len;
+}
+
+/**
+ * hdd_register_debug_callback() - registration function for hdd layer
+ * to print hdd state information
+ *
+ * Return: None
+ */
+static void hdd_register_debug_callback(void)
+{
+	qdf_register_debug_callback(QDF_MODULE_ID_HDD, &hdd_state_info_dump);
+}
+
 /**
  * hdd_wlan_startup() - HDD init function
  * @dev:	Pointer to the underlying device
@@ -7817,6 +7911,8 @@ int hdd_wlan_startup(struct device *dev)
 	hdd_release_rtnl_lock();
 	rtnl_held = false;
 
+	if (hdd_ctx->config->enable_go_cts2self_for_sta)
+		sme_set_cts2self_for_p2p_go(hdd_ctx->hHal);
 #ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
 	status = qdf_mc_timer_init(&hdd_ctx->skip_acs_scan_timer,
 				   QDF_TIMER_TYPE_SW,
@@ -7852,6 +7948,7 @@ int hdd_wlan_startup(struct device *dev)
 
 	memdump_init();
 	hdd_encrypt_decrypt_init(hdd_ctx);
+	hdd_driver_memdump_init();
 
 	if (hdd_ctx->config->fIsImpsEnabled)
 		hdd_set_idle_ps_config(hdd_ctx, true);
@@ -8802,6 +8899,7 @@ int hdd_init(void)
 	}
 
 	hdd_trace_init();
+	hdd_register_debug_callback();
 
 err_out:
 	return ret;

+ 234 - 0
core/hdd/src/wlan_hdd_memdump.c

@@ -630,3 +630,237 @@ void memdump_deinit(void)
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 		hdd_err("Failed to deallocate timer");
 }
+
+#ifdef MULTI_IF_NAME
+#define PROCFS_DRIVER_DUMP_DIR "debugdriver" MULTI_IF_NAME
+#else
+#define PROCFS_DRIVER_DUMP_DIR "debugdriver"
+#endif
+#define PROCFS_DRIVER_DUMP_NAME "driverdump"
+#define PROCFS_DRIVER_DUMP_PERM 0444
+
+static struct proc_dir_entry *proc_file_driver, *proc_dir_driver;
+
+/**
+ * hdd_driver_mem_cleanup() - Frees memory allocated for
+ * driver dump
+ *
+ * This function unallocates driver dump memory.
+ *
+ * Return: None
+ */
+static void hdd_driver_mem_cleanup(void)
+{
+	hdd_context_t *hdd_ctx;
+
+	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	if (!hdd_ctx) {
+		hdd_err("Invalid HDD context");
+		return;
+	}
+
+	if (hdd_ctx->driver_dump_mem) {
+		qdf_mem_free(hdd_ctx->driver_dump_mem);
+		hdd_ctx->driver_dump_mem = NULL;
+	}
+}
+
+
+/**
+ * hdd_driver_memdump_read() - perform read operation in driver
+ * memory dump proc file
+ * @file  - handle for the proc file.
+ * @buf   - pointer to user space buffer.
+ * @count - number of bytes to be read.
+ * @pos   - offset in the from buffer.
+ *
+ * This function performs read operation for the driver memory dump proc file.
+ *
+ * Return: number of bytes read on success, error code otherwise.
+ */
+static ssize_t hdd_driver_memdump_read(struct file *file, char __user *buf,
+					size_t count, loff_t *pos)
+{
+	int status;
+	QDF_STATUS qdf_status;
+	hdd_context_t *hdd_ctx;
+	size_t no_of_bytes_read = 0;
+
+	hdd_ctx = memdump_get_file_data(file);
+
+	hdd_notice("Read req for size:%zu pos:%llu", count, *pos);
+	status = wlan_hdd_validate_context(hdd_ctx);
+	if (status != 0)
+		return -EINVAL;
+
+	if (*pos < 0) {
+		hdd_err("Invalid start offset for memdump read");
+		return -EINVAL;
+	} else if (!count || (hdd_ctx->driver_dump_size &&
+				(*pos >= hdd_ctx->driver_dump_size))) {
+		hdd_err("No more data to copy");
+		return 0;
+	} else if ((*pos == 0) || (hdd_ctx->driver_dump_mem == NULL)) {
+		/*
+		 * Allocate memory for Driver memory dump.
+		 */
+		if (!hdd_ctx->driver_dump_mem) {
+			hdd_ctx->driver_dump_mem =
+				qdf_mem_malloc(DRIVER_MEM_DUMP_SIZE);
+			if (!hdd_ctx->driver_dump_mem) {
+				hdd_err("qdf_mem_malloc failed");
+				return -ENOMEM;
+			}
+		}
+
+		qdf_status = qdf_state_info_dump_all(hdd_ctx->driver_dump_mem,
+						DRIVER_MEM_DUMP_SIZE,
+						&hdd_ctx->driver_dump_size);
+		/*
+		 * If qdf_status is QDF_STATUS_E_NOMEM, then memory allocated is
+		 * insufficient to dump driver information. This print can give
+		 * information to allocate more memory if more information from
+		 * each layer is added in future.
+		 */
+		if (qdf_status != QDF_STATUS_SUCCESS)
+			hdd_err("Error in dump driver information, status %d",
+				qdf_status);
+		hdd_notice("driver_dump_size: %d",
+					hdd_ctx->driver_dump_size);
+	}
+
+	if (count > hdd_ctx->driver_dump_size - *pos)
+		no_of_bytes_read = hdd_ctx->driver_dump_size - *pos;
+	else
+		no_of_bytes_read = count;
+
+	if (copy_to_user(buf, hdd_ctx->driver_dump_mem + *pos,
+					no_of_bytes_read)) {
+		hdd_err("copy to user space failed");
+		return -EFAULT;
+	}
+
+	/* offset(pos) should be updated here based on the copy done */
+	*pos += no_of_bytes_read;
+
+	/* Entire driver memory dump copy completed */
+	if (*pos >= hdd_ctx->driver_dump_size)
+		hdd_driver_mem_cleanup();
+
+	return no_of_bytes_read;
+}
+
+
+/**
+ * struct driver_dump_fops - file operations for driver dump feature
+ * @read - read function for driver dump operation.
+ *
+ * This structure initialize the file operation handle for memory
+ * dump feature
+ */
+static const struct file_operations driver_dump_fops = {
+read: hdd_driver_memdump_read
+};
+
+/**
+ * hdd_driver_memdump_procfs_init() - Initialize procfs for driver memory dump
+ *
+ * This function create file under proc file system to be used later for
+ * processing driver memory dump
+ *
+ * Return:   0 on success, error code otherwise.
+ */
+static int hdd_driver_memdump_procfs_init(void)
+{
+	hdd_context_t *hdd_ctx;
+
+	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	if (!hdd_ctx) {
+		hdd_err("Invalid HDD context");
+		return -EINVAL;
+	}
+
+	proc_dir_driver = proc_mkdir(PROCFS_DRIVER_DUMP_DIR, NULL);
+	if (proc_dir_driver == NULL) {
+		pr_debug("Error: Could not initialize /proc/%s\n",
+			 PROCFS_DRIVER_DUMP_DIR);
+		return -ENOMEM;
+	}
+
+	proc_file_driver = proc_create_data(PROCFS_DRIVER_DUMP_NAME,
+				     PROCFS_DRIVER_DUMP_PERM, proc_dir_driver,
+				     &driver_dump_fops, hdd_ctx);
+	if (proc_file_driver == NULL) {
+		remove_proc_entry(PROCFS_DRIVER_DUMP_NAME, proc_dir_driver);
+		pr_debug("Error: Could not initialize /proc/%s\n",
+			  PROCFS_DRIVER_DUMP_NAME);
+		return -ENOMEM;
+	}
+
+	pr_debug("/proc/%s/%s created\n", PROCFS_DRIVER_DUMP_DIR,
+		 PROCFS_DRIVER_DUMP_NAME);
+	return 0;
+}
+
+/**
+ * hdd_driver_memdump_procfs_remove() - Remove file/dir under procfs
+ * for driver memory dump
+ *
+ * This function removes file/dir under proc file system that was
+ * processing driver memory dump
+ *
+ * Return:  None
+ */
+static void hdd_driver_memdump_procfs_remove(void)
+{
+	remove_proc_entry(PROCFS_DRIVER_DUMP_NAME, proc_dir_driver);
+	pr_debug("/proc/%s/%s removed\n", PROCFS_DRIVER_DUMP_DIR,
+					  PROCFS_DRIVER_DUMP_NAME);
+	remove_proc_entry(PROCFS_DRIVER_DUMP_DIR, NULL);
+	pr_debug("/proc/%s removed\n", PROCFS_DRIVER_DUMP_DIR);
+}
+
+/**
+ * hdd_driver_memdump_init() - Intialization function for driver
+ * memory dump feature
+ *
+ * This function creates proc file for driver memdump feature
+ *
+ * Return - 0 on success, error otherwise
+ */
+int hdd_driver_memdump_init(void)
+{
+	int status;
+
+	if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
+		hdd_err("Not initializing memdump in FTM mode");
+		return -EINVAL;
+	}
+
+	status = hdd_driver_memdump_procfs_init();
+	if (status) {
+		hdd_err("Failed to create proc file");
+		return status;
+	}
+
+	return 0;
+}
+
+/**
+ * hdd_driver_memdump_deinit() - De initialize driver memdump feature
+ *
+ * This function removes proc file created for driver memdump feature.
+ *
+ * Return: None
+ */
+void hdd_driver_memdump_deinit(void)
+{
+	if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
+		hdd_err("Not deinitializing memdump in FTM mode");
+		return;
+	}
+
+	hdd_driver_memdump_procfs_remove();
+
+	hdd_driver_mem_cleanup();
+}

+ 28 - 19
core/hdd/src/wlan_hdd_p2p.c

@@ -55,6 +55,7 @@
 
 /* Ms to Time Unit Micro Sec */
 #define MS_TO_TU_MUS(x)   ((x) * 1024)
+#define MAX_MUS_VAL       (INT_MAX / 1024)
 
 static uint8_t *hdd_get_action_string(uint16_t MsgType)
 {
@@ -374,7 +375,7 @@ int wlan_hdd_check_remain_on_channel(hdd_adapter_t *pAdapter)
  *
  * Return: None
  */
-void wlan_hdd_cancel_pending_roc(hdd_adapter_t *adapter)
+static void wlan_hdd_cancel_pending_roc(hdd_adapter_t *adapter)
 {
 	hdd_remain_on_chan_ctx_t *roc_ctx;
 	unsigned long rc;
@@ -462,7 +463,7 @@ void wlan_hdd_cleanup_remain_on_channel_ctx(hdd_adapter_t *pAdapter)
 
 }
 
-void wlan_hdd_remain_on_chan_timeout(void *data)
+static void wlan_hdd_remain_on_chan_timeout(void *data)
 {
 	hdd_adapter_t *pAdapter = (hdd_adapter_t *) data;
 	hdd_remain_on_chan_ctx_t *pRemainChanCtx;
@@ -706,8 +707,8 @@ static int wlan_hdd_roc_request_enqueue(hdd_adapter_t *adapter,
  *
  * Return: None
  */
-void wlan_hdd_indicate_roc_drop(hdd_adapter_t *adapter,
-				hdd_remain_on_chan_ctx_t *ctx)
+static void wlan_hdd_indicate_roc_drop(hdd_adapter_t *adapter,
+				       hdd_remain_on_chan_ctx_t *ctx)
 {
 	hdd_debug("indicate roc drop to userspace");
 	cfg80211_ready_on_channel(
@@ -885,10 +886,11 @@ static int wlan_hdd_request_remain_on_channel(struct wiphy *wiphy,
 	return 0;
 }
 
-int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
-					  struct wireless_dev *wdev,
-					  struct ieee80211_channel *chan,
-					  unsigned int duration, u64 *cookie)
+static int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
+						 struct wireless_dev *wdev,
+						 struct ieee80211_channel *chan,
+						 unsigned int duration,
+						 u64 *cookie)
 {
 	struct net_device *dev = wdev->netdev;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -1026,9 +1028,10 @@ void hdd_remain_chan_ready_handler(hdd_adapter_t *pAdapter,
 	return;
 }
 
-int __wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
-						 struct wireless_dev *wdev,
-						 u64 cookie)
+static int
+__wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
+					     struct wireless_dev *wdev,
+					     u64 cookie)
 {
 	struct net_device *dev = wdev->netdev;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -1171,11 +1174,11 @@ int wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
 	return ret;
 }
 
-int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
-		       struct ieee80211_channel *chan, bool offchan,
-		       unsigned int wait,
-		       const u8 *buf, size_t len, bool no_cck,
-		       bool dont_wait_for_ack, u64 *cookie)
+static int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
+			      struct ieee80211_channel *chan, bool offchan,
+			      unsigned int wait,
+			      const u8 *buf, size_t len, bool no_cck,
+			      bool dont_wait_for_ack, u64 *cookie)
 {
 	struct net_device *dev = wdev->netdev;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -1601,9 +1604,9 @@ int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 	return ret;
 }
 
-int __wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
-					    struct wireless_dev *wdev,
-					    u64 cookie)
+static int __wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
+						   struct wireless_dev *wdev,
+						   u64 cookie)
 {
 	return wlan_hdd_cfg80211_cancel_remain_on_channel(wiphy, wdev, cookie);
 }
@@ -1741,6 +1744,11 @@ int hdd_set_p2p_noa(struct net_device *dev, uint8_t *command)
 			ret);
 		return -EINVAL;
 	}
+	if (count < 0 || interval < 0 || duration < 0 ||
+	    interval > MAX_MUS_VAL || duration > MAX_MUS_VAL) {
+		hdd_err("Invalid NOA parameters");
+		return -EINVAL;
+	}
 	hdd_info("P2P_SET GO NoA: count=%d interval=%d duration=%d",
 		count, interval, duration);
 	duration = MS_TO_TU_MUS(duration);
@@ -1936,6 +1944,7 @@ static uint8_t wlan_hdd_get_session_type(enum nl80211_iftype type)
  *
  * Return: the pointer of wireless dev, otherwise ERR_PTR.
  */
+static
 struct wireless_dev *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
 						 const char *name,
 						 unsigned char name_assign_type,

+ 174 - 23
core/hdd/src/wlan_hdd_power.c

@@ -52,6 +52,7 @@
 #include <wlan_nlink_srv.h>
 #include <wlan_hdd_misc.h>
 #include <wlan_hdd_power.h>
+#include <wlan_hdd_host_offload.h>
 #include <dbglog_host.h>
 #include <wlan_hdd_trace.h>
 #include <wlan_hdd_p2p.h>
@@ -74,6 +75,7 @@
 #include "cds_concurrency.h"
 #include "cdp_txrx_flow_ctrl_v2.h"
 #include "pld_common.h"
+#include "wlan_hdd_driver_ops.h"
 
 /* Preprocessor definitions and constants */
 #define HDD_SSR_BRING_UP_TIME 30000
@@ -543,7 +545,7 @@ void hdd_conf_ns_offload(hdd_adapter_t *adapter, bool fenable)
  *
  * Return: None
  */
-void __hdd_ipv6_notifier_work_queue(struct work_struct *work)
+static void __hdd_ipv6_notifier_work_queue(struct work_struct *work)
 {
 	hdd_adapter_t *pAdapter =
 		container_of(work, hdd_adapter_t, ipv6NotifierWorkQueue);
@@ -662,7 +664,7 @@ void hdd_conf_hostoffload(hdd_adapter_t *pAdapter, bool fenable)
  *
  * Return: None
  */
-void __hdd_ipv4_notifier_work_queue(struct work_struct *work)
+static void __hdd_ipv4_notifier_work_queue(struct work_struct *work)
 {
 	hdd_adapter_t *pAdapter =
 		container_of(work, hdd_adapter_t, ipv4NotifierWorkQueue);
@@ -1494,6 +1496,7 @@ QDF_STATUS hdd_wlan_re_init(void)
 	hdd_adapter_t *pAdapter;
 	QDF_STATUS qdf_status;
 	int ret;
+	bool bug_on_reinit_failure = CFG_BUG_ON_REINIT_FAILURE_DEFAULT;
 
 	hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_REINIT);
 
@@ -1510,6 +1513,7 @@ QDF_STATUS hdd_wlan_re_init(void)
 		hdd_alert("HDD context is Null");
 		goto err_re_init;
 	}
+	bug_on_reinit_failure = pHddCtx->config->bug_on_reinit_failure;
 
 	/* The driver should always be initialized in STA mode after SSR */
 	hdd_set_conparam(0);
@@ -1590,7 +1594,8 @@ err_wiphy_unregister:
 err_re_init:
 	/* Allow the phone to go to sleep */
 	hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_REINIT);
-	QDF_BUG(0);
+	if (bug_on_reinit_failure)
+		QDF_BUG(0);
 	return -EPERM;
 
 success:
@@ -1663,6 +1668,24 @@ static int wlan_hdd_set_powersave(hdd_adapter_t *adapter,
 	return 0;
 }
 
+static void wlan_hdd_print_suspend_fail_stats(hdd_context_t *hdd_ctx)
+{
+	hdd_err("ipa:%d, radar:%d, roam:%d, scan:%d, initial_wakeup:%d",
+		hdd_ctx->suspend_fail_stats[SUSPEND_FAIL_IPA],
+		hdd_ctx->suspend_fail_stats[SUSPEND_FAIL_RADAR],
+		hdd_ctx->suspend_fail_stats[SUSPEND_FAIL_ROAM],
+		hdd_ctx->suspend_fail_stats[SUSPEND_FAIL_SCAN],
+		hdd_ctx->suspend_fail_stats[SUSPEND_FAIL_INITIAL_WAKEUP]);
+}
+
+void wlan_hdd_inc_suspend_stats(hdd_context_t *hdd_ctx,
+				enum suspend_fail_reason reason)
+{
+	wlan_hdd_print_suspend_fail_stats(hdd_ctx);
+	hdd_ctx->suspend_fail_stats[reason]++;
+	wlan_hdd_print_suspend_fail_stats(hdd_ctx);
+}
+
 /**
  * __wlan_hdd_cfg80211_resume_wlan() - cfg80211 resume callback
  * @wiphy: Pointer to wiphy
@@ -1855,6 +1878,8 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
 			    WLAN_HDD_GET_AP_CTX_PTR(pAdapter)->
 			    dfs_cac_block_tx) {
 				hdd_err("RADAR detection in progress, do not allow suspend");
+				wlan_hdd_inc_suspend_stats(pHddCtx,
+							   SUSPEND_FAIL_RADAR);
 				return -EAGAIN;
 			} else if (!pHddCtx->config->enableSapSuspend) {
 				/* return -EOPNOTSUPP if SAP does not support
@@ -1887,6 +1912,8 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
 		if (sme_sta_in_middle_of_roaming
 			    (pHddCtx->hHal, pAdapter->sessionId)) {
 			hdd_err("Roaming in progress, do not allow suspend");
+			wlan_hdd_inc_suspend_stats(pHddCtx,
+						   SUSPEND_FAIL_ROAM);
 			return -EAGAIN;
 		}
 
@@ -1901,6 +1928,8 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
 				    msecs_to_jiffies(WLAN_WAIT_TIME_ABORTSCAN));
 			if (!status) {
 				hdd_err("Timeout occurred while waiting for abort scan");
+				wlan_hdd_inc_suspend_stats(pHddCtx,
+							   SUSPEND_FAIL_SCAN);
 				return -ETIME;
 			}
 		}
@@ -1914,6 +1943,7 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
 	 */
 	if (hdd_ipa_suspend(pHddCtx)) {
 		hdd_err("IPA not ready to suspend!");
+		wlan_hdd_inc_suspend_stats(pHddCtx, SUSPEND_FAIL_IPA);
 		return -EAGAIN;
 	}
 
@@ -2313,39 +2343,160 @@ int wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
  * Return: 0 on success; Errno on failure
  */
 int hdd_set_qpower_config(hdd_context_t *hddctx, hdd_adapter_t *adapter,
-				 uint8_t qpower)
+			  u8 qpower)
 {
-	QDF_STATUS qdf_status;
-	int status;
-	bool is_timer_running;
+	QDF_STATUS status;
 
 	if (!hddctx->config->enablePowersaveOffload) {
 		hdd_err("qpower is disabled in configuration");
 		return -EINVAL;
 	}
+
 	if (qpower > PS_DUTY_CYCLING_QPOWER ||
 	    qpower < PS_LEGACY_NODEEPSLEEP) {
-		hdd_err("invalid qpower value=%d", qpower);
+		hdd_err("invalid qpower value: %d", qpower);
 		return -EINVAL;
 	}
-	hdd_info("updating qpower value=%d to wma", qpower);
-	qdf_status = wma_set_powersave_config(qpower);
-	if (qdf_status != QDF_STATUS_SUCCESS) {
-		hdd_err("failed to update qpower %d",
-			qdf_status);
+
+	status = wma_set_qpower_config(adapter->sessionId, qpower);
+	if (status != QDF_STATUS_SUCCESS) {
+		hdd_err("failed to configure qpower: %d", status);
 		return -EINVAL;
 	}
-	is_timer_running = sme_is_auto_ps_timer_running(
-						WLAN_HDD_GET_HAL_CTX(adapter),
-						adapter->sessionId);
-	if (!is_timer_running) {
-		status =  wlan_hdd_set_powersave(adapter, true, 0);
 
-		if (status != 0) {
-			hdd_err("failed to put device in power save mode %d",
-				status);
-			return -EINVAL;
-		}
+	return 0;
+}
+
+#ifdef WLAN_SUSPEND_RESUME_TEST
+/*
+ * On iHelium there are 12 CE irqs and #2 is the wake irq. This may not be
+ * a valid assumption on future platforms.
+ */
+#define CE_IRQ_COUNT 12
+#define CE_WAKE_IRQ 2
+static struct wiphy *g_wiphy;
+
+#define HDD_FA_SUSPENDED_BIT (0)
+static unsigned long fake_apps_state;
+
+/**
+ * __hdd_wlan_fake_apps_resume() - The core logic for
+ *	hdd_wlan_fake_apps_resume() skipping the call to hif_fake_apps_resume(),
+ *	which is only need for non-irq resume
+ * @wiphy: wiphy struct from a validated hdd context
+ *
+ * Return: Zero on success, calls QDF_BUG() on failure
+ */
+static void __hdd_wlan_fake_apps_resume(struct wiphy *wiphy)
+{
+	qdf_device_t qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
+	int i, resume_err;
+
+	hdd_info("Unit-test resume WLAN");
+	if (!test_and_clear_bit(HDD_FA_SUSPENDED_BIT, &fake_apps_state)) {
+		hdd_info("Not unit-test suspended; Nothing to do");
+		return;
+	}
+
+	/* disable wake irq */
+	pld_disable_irq(qdf_dev->dev, CE_WAKE_IRQ);
+
+	resume_err = wlan_hdd_bus_resume_noirq();
+	QDF_BUG(resume_err == 0);
+
+	/* simulate kernel enable irqs */
+	for (i = 0; i < CE_IRQ_COUNT; i++)
+		pld_enable_irq(qdf_dev->dev, i);
+
+	resume_err = wlan_hdd_bus_resume();
+	QDF_BUG(resume_err == 0);
+
+	resume_err = wlan_hdd_cfg80211_resume_wlan(wiphy);
+	QDF_BUG(resume_err == 0);
+}
+
+/**
+ * hdd_wlan_fake_apps_resume_irq_callback() - Irq callback function for resuming
+ *	from unit-test initiated suspend from irq wakeup signal
+ * @val: interrupt val
+ *
+ * Resume wlan after getting very 1st CE interrupt from target
+ *
+ * Return: none
+ */
+static void hdd_wlan_fake_apps_resume_irq_callback(uint32_t val)
+{
+	hdd_info("Trigger unit-test resume WLAN; val: 0x%x", val);
+
+	QDF_BUG(g_wiphy);
+	__hdd_wlan_fake_apps_resume(g_wiphy);
+	g_wiphy = NULL;
+}
+
+int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy)
+{
+	qdf_device_t qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
+	struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
+	pm_message_t state;
+	int i, resume_err, suspend_err;
+
+	hdd_info("Unit-test suspend WLAN");
+	if (test_and_set_bit(HDD_FA_SUSPENDED_BIT, &fake_apps_state)) {
+		hdd_info("Already unit-test suspended; Nothing to do");
+		return 0;
 	}
+
+	suspend_err = wlan_hdd_cfg80211_suspend_wlan(wiphy, NULL);
+	if (suspend_err)
+		goto resume_done;
+
+	state.event = PM_EVENT_SUSPEND;
+	suspend_err = wlan_hdd_bus_suspend(state);
+	if (suspend_err)
+		goto cfg80211_resume;
+
+	/* simulate kernel disabling irqs */
+	for (i = 0; i < CE_IRQ_COUNT; i++)
+		pld_disable_irq(qdf_dev->dev, i);
+
+	suspend_err = wlan_hdd_bus_suspend_noirq();
+	if (suspend_err)
+		goto enable_irqs_and_bus_resume;
+
+	/* re-enable wake irq */
+	pld_enable_irq(qdf_dev->dev, CE_WAKE_IRQ);
+
+	/* pass wiphy to callback via global variable */
+	g_wiphy = wiphy;
+	hif_fake_apps_suspend(hif_ctx, hdd_wlan_fake_apps_resume_irq_callback);
+
+	return 0;
+
+enable_irqs_and_bus_resume:
+	/* re-enable irqs */
+	for (i = 0; i < CE_IRQ_COUNT; i++)
+		pld_enable_irq(qdf_dev->dev, i);
+
+	resume_err = wlan_hdd_bus_resume();
+	QDF_BUG(resume_err == 0);
+
+cfg80211_resume:
+	resume_err = wlan_hdd_cfg80211_resume_wlan(wiphy);
+	QDF_BUG(resume_err == 0);
+
+resume_done:
+	clear_bit(HDD_FA_SUSPENDED_BIT, &fake_apps_state);
+	hdd_err("Unit-test suspend failed: %d", suspend_err);
+	return suspend_err;
+}
+
+int hdd_wlan_fake_apps_resume(struct wiphy *wiphy)
+{
+	struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
+
+	hif_fake_apps_resume(hif_ctx);
+	__hdd_wlan_fake_apps_resume(wiphy);
+
 	return 0;
 }
+#endif

+ 7 - 7
core/hdd/src/wlan_hdd_regulatory.c

@@ -173,7 +173,7 @@ struct regulatory *reg)
  *
  * Return: bool
  */
-bool hdd_is_world_regdomain(uint32_t reg_domain)
+static bool hdd_is_world_regdomain(uint32_t reg_domain)
 {
 	uint32_t temp_regd = reg_domain & ~WORLDWIDE_ROAMING_FLAG;
 
@@ -488,18 +488,18 @@ int hdd_regulatory_init(hdd_context_t *hdd_ctx, struct wiphy *wiphy)
 
 	reg_info = &hdd_ctx->reg;
 
-	hdd_regulatory_wiphy_init(hdd_ctx, reg_info, wiphy);
-
-	hdd_process_regulatory_data(hdd_ctx, wiphy, true);
-
-	reg_info->cc_src = SOURCE_DRIVER;
-
 	ret_val = cds_fill_some_regulatory_info(reg_info);
 	if (ret_val) {
 		hdd_err("incorrect BDF regulatory data");
 		return ret_val;
 	}
 
+	hdd_regulatory_wiphy_init(hdd_ctx, reg_info, wiphy);
+
+	hdd_process_regulatory_data(hdd_ctx, wiphy, true);
+
+	reg_info->cc_src = SOURCE_DRIVER;
+
 	cds_put_default_country(reg_info->alpha2);
 
 	init_completion(&hdd_ctx->reg_init);

+ 1 - 1
core/hdd/src/wlan_hdd_scan.c

@@ -598,7 +598,7 @@ static int wlan_hdd_scan_request_enqueue(hdd_adapter_t *adapter,
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS wlan_hdd_scan_request_dequeue(hdd_context_t *hdd_ctx,
+static QDF_STATUS wlan_hdd_scan_request_dequeue(hdd_context_t *hdd_ctx,
 	uint32_t scan_id, struct cfg80211_scan_request **req, uint8_t *source,
 	uint32_t *timestamp)
 {

+ 2 - 1
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -211,7 +211,8 @@ void hdd_softap_tx_resume_cb(void *adapter_context, bool tx_resume)
  *
  * Return: Always returns NETDEV_TX_OK
  */
-int __hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static int __hdd_softap_hard_start_xmit(struct sk_buff *skb,
+					struct net_device *dev)
 {
 	sme_ac_enum_type ac = SME_AC_BE;
 	hdd_adapter_t *pAdapter = (hdd_adapter_t *) netdev_priv(dev);

+ 95 - 18
core/hdd/src/wlan_hdd_tdls.c

@@ -1621,8 +1621,8 @@ static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
  *
  * Return: Void
  */
-void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
-			    eTDLSSupportMode tdls_mode, bool bUpdateLast)
+static void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
+				   eTDLSSupportMode tdls_mode, bool bUpdateLast)
 {
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
 	QDF_STATUS status;
@@ -1768,16 +1768,15 @@ int wlan_hdd_tdls_set_params(struct net_device *dev,
 }
 
 /**
- * wlan_hdd_tdls_check_and_enable() - check system state and enable tdls
+ * wlan_hdd_tdls_get_adapter() - check system state and return hdd adapter
  * @hdd_ctx: hdd context
  *
- * After every disassociation in the system, check whether TDLS
- * can be enabled in the system. If TDLS possible return the
- * corresponding hdd adapter to enable TDLS.
+ * If TDLS possible, return the corresponding hdd adapter
+ * to enable TDLS in the system.
  *
  * Return: hdd adapter pointer or NULL.
  */
-hdd_adapter_t *wlan_hdd_tdls_check_and_enable(hdd_context_t *hdd_ctx)
+static hdd_adapter_t *wlan_hdd_tdls_get_adapter(hdd_context_t *hdd_ctx)
 {
 	if (cds_get_connection_count() > 1)
 		return NULL;
@@ -1951,6 +1950,74 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
 	return;
 }
 
+/**
+ * wlan_hdd_tdls_notify_connect() - Update tdls state for every
+ * connect event.
+ * @adapter: hdd adapter
+ * @csr_roam_info: csr information
+ *
+ * After every connect event in the system, check whether TDLS
+ * can be enabled in the system. If TDLS can be enabled, update the
+ * TDLS state as needed.
+ *
+ * Return: None
+ */
+void wlan_hdd_tdls_notify_connect(hdd_adapter_t *adapter,
+				  tCsrRoamInfo *csr_roam_info)
+{
+	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	hdd_info("Check and update TDLS state");
+
+	/* Association event */
+	if ((adapter->device_mode == QDF_STA_MODE ||
+	     adapter->device_mode == QDF_P2P_CLIENT_MODE) &&
+	     !hdd_ctx->concurrency_marked) {
+		wlan_hdd_update_tdls_info(adapter,
+					  csr_roam_info->tdls_prohibited,
+					  csr_roam_info->tdls_chan_swit_prohibited);
+	}
+}
+
+/**
+ * wlan_hdd_tdls_notify_disconnect() - Update tdls state for every
+ * disconnect event.
+ * @adapter: hdd adapter
+ *
+ * After every disconnect event in the system, check whether TDLS
+ * can be disabled/enabled in the system and update the
+ * TDLS state as needed.
+ *
+ * Return: None
+ */
+void wlan_hdd_tdls_notify_disconnect(hdd_adapter_t *adapter)
+{
+	hdd_adapter_t *temp_adapter;
+	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	hdd_info("Check and update TDLS state");
+
+	/* Disassociation event */
+	if ((adapter->device_mode == QDF_STA_MODE ||
+	     adapter->device_mode == QDF_P2P_CLIENT_MODE) &&
+	     !hdd_ctx->concurrency_marked) {
+		wlan_hdd_update_tdls_info(adapter, true, true);
+	}
+
+	/* If concurrency is not marked, then we have to
+	 * check, whether TDLS could be enabled in the
+	 * system after this disassoc event.
+	 */
+	if (!hdd_ctx->concurrency_marked) {
+		temp_adapter = wlan_hdd_tdls_get_adapter(
+					hdd_ctx);
+		if (NULL != temp_adapter)
+			wlan_hdd_update_tdls_info(temp_adapter,
+						  false,
+						  false);
+	}
+}
+
 /**
  * wlan_hdd_tdls_set_sta_id() - set station ID on a tdls peer
  * @pAdapter: HDD adapter
@@ -2483,7 +2550,7 @@ void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
 			hdd_err("TDLS set state is not cleared correctly !!!");
 			pHddCtx->concurrency_marked = false;
 		}
-		tdls_adapter = wlan_hdd_tdls_check_and_enable(pHddCtx);
+		tdls_adapter = wlan_hdd_tdls_get_adapter(pHddCtx);
 		if (tdls_adapter)
 			wlan_hdd_update_tdls_info(tdls_adapter, false, false);
 	}
@@ -3624,7 +3691,7 @@ int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
 	hddTdlsPeer_t *pTdlsPeer;
 	uint16_t numCurrTdlsPeers;
 	unsigned long rc;
-	long ret;
+	int ret;
 	int rate_idx;
 
 	ENTER();
@@ -3763,16 +3830,15 @@ int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
 						 (WAIT_TIME_TDLS_ADD_STA));
 
 	if (!rc) {
-		QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
-			  "%s: timeout waiting for tdls add station indication",
-			  __func__);
-		return -EPERM;
+		hdd_err("timeout waiting for tdls add station indication %ld  peer link status %u",
+			rc, pTdlsPeer->link_status);
+		goto error;
 	}
 
 	if (QDF_STATUS_SUCCESS != pAdapter->tdlsAddStaStatus) {
 		QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
 			  "%s: Add Station is unsuccessful", __func__);
-		return -EPERM;
+		goto error;
 	}
 
 	return 0;
@@ -5135,6 +5201,11 @@ void wlan_hdd_tdls_update_rx_pkt_cnt(hdd_adapter_t *adapter,
 	uint8_t valid_mac_entries;
 	struct qdf_mac_addr *mac_addr;
 
+	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	if (!hdd_ctx->enable_tdls_connection_tracker)
+		return;
+
 	mac_addr = (struct qdf_mac_addr *)(skb->data+QDF_MAC_ADDR_SIZE);
 	if (qdf_is_macaddr_group(mac_addr))
 		return;
@@ -5144,7 +5215,6 @@ void wlan_hdd_tdls_update_rx_pkt_cnt(hdd_adapter_t *adapter,
 			mac_addr, QDF_MAC_ADDR_SIZE) == 0)
 		return;
 
-	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	tdls_ctx = adapter->sessionCtx.station.pHddTdlsCtx;
 
 	qdf_spin_lock_bh(&hdd_ctx->tdls_ct_spinlock);
@@ -5198,6 +5268,11 @@ void wlan_hdd_tdls_update_tx_pkt_cnt(hdd_adapter_t *adapter,
 	uint8_t valid_mac_entries;
 	struct qdf_mac_addr *mac_addr;
 
+	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	if (!hdd_ctx->enable_tdls_connection_tracker)
+		return;
+
 	mac_addr = (struct qdf_mac_addr *)skb->data;
 	if (qdf_is_macaddr_group(mac_addr))
 		return;
@@ -5207,7 +5282,6 @@ void wlan_hdd_tdls_update_tx_pkt_cnt(hdd_adapter_t *adapter,
 	    QDF_MAC_ADDR_SIZE) == 0)
 		return;
 
-	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	tdls_ctx = adapter->sessionCtx.station.pHddTdlsCtx;
 
 	qdf_spin_lock_bh(&hdd_ctx->tdls_ct_spinlock);
@@ -5817,9 +5891,12 @@ int wlan_hdd_tdls_antenna_switch(hdd_context_t *hdd_ctx,
 {
 	uint8_t tdls_peer_cnt;
 	uint32_t vdev_nss;
-	hdd_station_ctx_t *sta_ctx =
-		WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+	hdd_station_ctx_t *sta_ctx;
+
+	if (hdd_ctx->connected_peer_count == 0)
+		return 0;
 
+	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	/* Check whether TDLS antenna switch is in progress */
 	if (hdd_ctx->tdls_nss_switch_in_progress) {
 		if (hdd_ctx->tdls_nss_teardown_complete == false) {

+ 3 - 2
core/hdd/src/wlan_hdd_tsf.c

@@ -30,6 +30,7 @@
  */
 
 #include "wlan_hdd_main.h"
+#include "wlan_hdd_tsf.h"
 #include "wma_api.h"
 
 static struct completion tsf_sync_get_completion_evt;
@@ -110,13 +111,13 @@ int hdd_capture_tsf(struct hdd_adapter_s *adapter, uint32_t *buf, int len)
  * Return: TSF_RETURN on Success, TSF_RESET_GPIO_FAIL on failure
  */
 #ifdef QCA_WIFI_3_0
-int hdd_tsf_reset_gpio(struct hdd_adapter_s *adapter)
+static int hdd_tsf_reset_gpio(struct hdd_adapter_s *adapter)
 {
 	/* No GPIO Host timer sync for integrated WIFI Device */
 	return TSF_RETURN;
 }
 #else
-int hdd_tsf_reset_gpio(struct hdd_adapter_s *adapter)
+static int hdd_tsf_reset_gpio(struct hdd_adapter_s *adapter)
 {
 	int ret;
 	ret = wma_cli_set_command((int)adapter->sessionId,

+ 5 - 13
core/hdd/src/wlan_hdd_tx_rx.c

@@ -47,18 +47,12 @@
 #include <net/ieee80211_radiotap.h>
 #include "sap_api.h"
 #include "wlan_hdd_wmm.h"
-
-#ifdef FEATURE_WLAN_TDLS
 #include "wlan_hdd_tdls.h"
-#endif
 #include <wlan_hdd_ipa.h>
-
 #include "wlan_hdd_ocb.h"
 #include "wlan_hdd_lro.h"
-
 #include "cdp_txrx_peer_ops.h"
 #include "ol_txrx.h"
-
 #include "wlan_hdd_nan_datapath.h"
 #include "pld_common.h"
 
@@ -408,7 +402,7 @@ static void hdd_get_transmit_sta_id(hdd_adapter_t *adapter,
  *
  * Return: Always returns NETDEV_TX_OK
  */
-int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	QDF_STATUS status;
 	sme_ac_enum_type ac;
@@ -419,8 +413,8 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station;
 #ifdef QCA_PKT_PROTO_TRACE
 	uint8_t proto_type = 0;
-#endif /* QCA_PKT_PROTO_TRACE */
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
+#endif /* QCA_PKT_PROTO_TRACE */
 
 #ifdef QCA_WIFI_FTM
 	if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
@@ -551,8 +545,7 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 	pAdapter->stats.tx_bytes += skb->len;
 
-	if (hdd_ctx->enable_tdls_connection_tracker)
-		wlan_hdd_tdls_update_tx_pkt_cnt(pAdapter, skb);
+	wlan_hdd_tdls_update_tx_pkt_cnt(pAdapter, skb);
 
 	++pAdapter->stats.tx_packets;
 
@@ -965,8 +958,7 @@ QDF_STATUS hdd_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf)
 		qdf_nbuf_data_addr(rxBuf),
 		sizeof(qdf_nbuf_data(rxBuf)), QDF_RX));
 
-	if (pHddCtx->enable_tdls_connection_tracker)
-		wlan_hdd_tdls_update_rx_pkt_cnt(pAdapter, skb);
+	wlan_hdd_tdls_update_rx_pkt_cnt(pAdapter, skb);
 
 	skb->dev = pAdapter->dev;
 	skb->protocol = eth_type_trans(skb, skb->dev);
@@ -1107,7 +1099,7 @@ static void wlan_hdd_update_queue_oper_stats(hdd_adapter_t *adapter,
  *
  * Return: none
  */
-void wlan_hdd_update_txq_timestamp(struct net_device *dev)
+static void wlan_hdd_update_txq_timestamp(struct net_device *dev)
 {
 	struct netdev_queue *txq;
 	int i;

+ 41 - 63
core/hdd/src/wlan_hdd_wext.c

@@ -92,6 +92,7 @@
 #ifdef WLAN_SUSPEND_RESUME_TEST
 #include "wlan_hdd_driver_ops.h"
 #include "hif.h"
+#include "pld_common.h"
 #endif
 
 #define HDD_FINISH_ULA_TIME_OUT         800
@@ -439,10 +440,9 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
 #define WE_ENABLE_FW_PROFILE    4
 #define WE_SET_FW_PROFILE_HIST_INTVL    5
 
-#ifdef WLAN_SUSPEND_RESUME_TEST
+/* Private sub-ioctl for initiating WoW suspend without Apps suspend */
 #define WE_SET_WLAN_SUSPEND    6
 #define WE_SET_WLAN_RESUME    7
-#endif
 
 /* (SIOCIWFIRSTPRIV + 29) is currently unused */
 
@@ -810,7 +810,8 @@ hdd_wlan_get_ibss_mac_addr_from_staid(hdd_adapter_t *pAdapter,
  * Return: QDF_STATUS_STATUS if the peer was found and displayed,
  * otherwise an appropriate QDF_STATUS_E_* failure code.
  */
-QDF_STATUS hdd_wlan_get_ibss_peer_info(hdd_adapter_t *pAdapter, uint8_t staIdx)
+static QDF_STATUS hdd_wlan_get_ibss_peer_info(hdd_adapter_t *pAdapter,
+					      uint8_t staIdx)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
@@ -859,7 +860,7 @@ QDF_STATUS hdd_wlan_get_ibss_peer_info(hdd_adapter_t *pAdapter, uint8_t staIdx)
  * Return: QDF_STATUS_STATUS if the peer information was retrieved and
  * displayed, otherwise an appropriate QDF_STATUS_E_* failure code.
  */
-QDF_STATUS hdd_wlan_get_ibss_peer_info_all(hdd_adapter_t *pAdapter)
+static QDF_STATUS hdd_wlan_get_ibss_peer_info_all(hdd_adapter_t *pAdapter)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
@@ -1558,7 +1559,7 @@ int wlan_hdd_get_link_speed(hdd_adapter_t *sta_adapter, uint32_t *link_speed)
  *
  * Return: None
  */
-void hdd_statistics_cb(void *pStats, void *pContext)
+static void hdd_statistics_cb(void *pStats, void *pContext)
 {
 	hdd_adapter_t *pAdapter = (hdd_adapter_t *) pContext;
 	hdd_stats_t *pStatsCache = NULL;
@@ -1956,7 +1957,7 @@ static int __iw_set_commit(struct net_device *dev, struct iw_request_info *info,
  *
  * Return: 0 on success, error number otherwise
  */
-int iw_set_commit(struct net_device *dev, struct iw_request_info *info,
+static int iw_set_commit(struct net_device *dev, struct iw_request_info *info,
 		  union iwreq_data *wrqu, char *extra)
 {
 	int ret;
@@ -2037,7 +2038,6 @@ static int __iw_set_mode(struct net_device *dev,
 	hdd_context_t *hdd_ctx;
 	tCsrRoamProfile *pRoamProfile;
 	eCsrRoamBssType LastBSSType;
-	eMib_dot11DesiredBssType connectedBssType;
 	struct hdd_config *pConfig;
 	struct wireless_dev *wdev;
 	int ret;
@@ -2085,8 +2085,8 @@ static int __iw_set_mode(struct net_device *dev,
 		/* the BSS mode changed.  We need to issue disconnect
 		 * if connected or in IBSS disconnect state
 		 */
-		if (hdd_conn_get_connected_bss_type
-			    (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter), &connectedBssType)
+		if (hdd_conn_is_connected
+			    (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))
 		    || (eCSR_BSS_TYPE_START_IBSS == LastBSSType)) {
 			QDF_STATUS qdf_status;
 			/* need to issue a disconnect to CSR. */
@@ -3309,8 +3309,8 @@ static int iw_set_frag_threshold(struct net_device *dev,
  * Return: 0 on success, non-zero on error
  */
 static int __iw_get_power_mode(struct net_device *dev,
-			     struct iw_request_info *info,
-			     union iwreq_data *wrqu, char *extra)
+			       struct iw_request_info *info,
+			       union iwreq_data *wrqu, char *extra)
 {
 	hdd_adapter_t *adapter;
 	hdd_context_t *hdd_ctx;
@@ -3336,9 +3336,9 @@ static int __iw_get_power_mode(struct net_device *dev,
  *
  * Return: 0 on success, error number otherwise
  */
-int iw_get_power_mode(struct net_device *dev,
-		      struct iw_request_info *info,
-		      union iwreq_data *wrqu, char *extra)
+static int iw_get_power_mode(struct net_device *dev,
+			     struct iw_request_info *info,
+			     union iwreq_data *wrqu, char *extra)
 {
 	int ret;
 
@@ -3359,8 +3359,8 @@ int iw_get_power_mode(struct net_device *dev,
  * Return: 0 on success, non-zero on error
  */
 static int __iw_set_power_mode(struct net_device *dev,
-			     struct iw_request_info *info,
-			     union iwreq_data *wrqu, char *extra)
+			       struct iw_request_info *info,
+			       union iwreq_data *wrqu, char *extra)
 {
 	hdd_adapter_t *adapter;
 	hdd_context_t *hdd_ctx;
@@ -3386,9 +3386,9 @@ static int __iw_set_power_mode(struct net_device *dev,
  *
  * Return: 0 on success, error number otherwise
  */
-int iw_set_power_mode(struct net_device *dev,
-		      struct iw_request_info *info,
-		      union iwreq_data *wrqu, char *extra)
+static int iw_set_power_mode(struct net_device *dev,
+			     struct iw_request_info *info,
+			     union iwreq_data *wrqu, char *extra)
 {
 	int ret;
 
@@ -8068,6 +8068,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
 					HW_MODE_SS_0x0, HW_MODE_BW_NONE,
 					HW_MODE_DBS_NONE,
 					HW_MODE_AGILE_DFS_NONE,
+					HW_MODE_SBS_NONE,
 					SIR_UPDATE_REASON_UT);
 		} else if (apps_args[0] == 1) {
 			hdd_err("set hw mode for dual mac");
@@ -8078,6 +8079,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
 					HW_MODE_SS_1x1, HW_MODE_40_MHZ,
 					HW_MODE_DBS,
 					HW_MODE_AGILE_DFS_NONE,
+					HW_MODE_SBS_NONE,
 					SIR_UPDATE_REASON_UT);
 		}
 	}
@@ -9290,8 +9292,8 @@ static int iw_get_statistics(struct net_device *dev,
 
 /*Max Len for PNO notification*/
 #define MAX_PNO_NOTIFY_LEN 100
-void found_pref_network_cb(void *callbackContext,
-			   tSirPrefNetworkFoundInd *pPrefNetworkFoundInd)
+static void found_pref_network_cb(void *callbackContext,
+				  tSirPrefNetworkFoundInd *pPrefNetworkFoundInd)
 {
 	hdd_adapter_t *pAdapter = (hdd_adapter_t *) callbackContext;
 	union iwreq_data wrqu;
@@ -9334,13 +9336,12 @@ void found_pref_network_cb(void *callbackContext,
  * for each network:
  *    <ssid_len> <ssid> <authentication> <encryption>
  *    <ch_num> <channel_list optional> <bcast_type> <rssi_threshold>
- * <number of scan timers>
- * for each timer:
- *    <scan_time> <scan_repeat>
+ * <scan_time (seconds)>
+ * <scan_repeat_count (0 means indefinite)>
  * <suspend mode>
  *
  * e.g:
- * 1 2 4 test 0 0 3 1 6 11 2 40 5 test2 4 4 6 1 2 3 4 5 6 1 0 2 5 2 300 0 1
+ * 1 2 4 test 0 0 3 1 6 11 2 40 5 test2 4 4 6 1 2 3 4 5 6 1 0 5 2 1
  *
  * this translates into:
  * -----------------------------
@@ -9356,10 +9357,8 @@ void found_pref_network_cb(void *callbackContext,
  *   search on 6 channels 1, 2, 3, 4, 5 and 6
  *   bcast type is non-bcast (directed probe will be sent)
  *   and must not meet any RSSI threshold
- * 2 scan timers:
  *   scan every 5 seconds 2 times
- *   then scan every 300 seconds until stopped
- * enable on suspend
+ *   enable on suspend
  */
 static int __iw_set_pno(struct net_device *dev,
 			struct iw_request_info *info,
@@ -9525,6 +9524,17 @@ static int __iw_set_pno(struct net_device *dev,
 		ptr += offset;
 	} /* For ucNetworkCount */
 
+	request.fast_scan_period = 0;
+	if (sscanf(ptr, "%u %n", &(request.fast_scan_period), &offset) > 0) {
+		request.fast_scan_period *= MSEC_PER_SEC;
+		ptr += offset;
+	}
+
+	request.fast_scan_max_cycles = 0;
+	if (sscanf(ptr, "%hhu %n", &(request.fast_scan_max_cycles),
+		   &offset) > 0)
+		ptr += offset;
+
 	params = sscanf(ptr, "%hhu %n", &(mode), &offset);
 
 	request.modePNO = mode;
@@ -9783,25 +9793,6 @@ static int wlan_hdd_set_mon_chan(hdd_adapter_t *adapter, uint32_t chan,
 	return qdf_status_to_os_return(status);
 }
 
-#ifdef WLAN_SUSPEND_RESUME_TEST
-static void *g_wiphy;
-
-/**
- * hdd_wlan_trigger_resume() - resume wlan
- * @val: interrupt val
- *
- * Resume wlan after getting very 1st CE interrupt from target
- *
- * Return: none
- */
-static void hdd_wlan_trigger_resume(uint32_t val)
-{
-	hdd_err("Resume WLAN val 0x%x", val);
-	wlan_hdd_bus_resume();
-	wlan_hdd_cfg80211_resume_wlan(g_wiphy);
-}
-#endif
-
 static int __iw_set_two_ints_getnone(struct net_device *dev,
 				     struct iw_request_info *info,
 				     union iwreq_data *wrqu, char *extra)
@@ -9811,10 +9802,6 @@ static int __iw_set_two_ints_getnone(struct net_device *dev,
 	int sub_cmd = value[0];
 	int ret;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
-#ifdef WLAN_SUSPEND_RESUME_TEST
-	pm_message_t state;
-#endif
-
 
 	ENTER_DEV(dev);
 
@@ -9878,21 +9865,12 @@ static int __iw_set_two_ints_getnone(struct net_device *dev,
 	case WE_SET_MON_MODE_CHAN:
 		ret = wlan_hdd_set_mon_chan(pAdapter, value[1], value[2]);
 		break;
-#ifdef WLAN_SUSPEND_RESUME_TEST
 	case WE_SET_WLAN_SUSPEND:
-		hdd_err("Suspend WLAN");
-		g_wiphy = hdd_ctx->wiphy;
-		state.event = PM_EVENT_SUSPEND;
-		ret = wlan_hdd_cfg80211_suspend_wlan(hdd_ctx->wiphy, NULL);
-		wlan_hdd_bus_suspend(state);
-		hif_fake_apps_suspend(hdd_wlan_trigger_resume);
+		ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy);
 		break;
 	case WE_SET_WLAN_RESUME:
-		hdd_err("Resume WLAN");
-		wlan_hdd_bus_resume();
-		ret = wlan_hdd_cfg80211_resume_wlan(hdd_ctx->wiphy);
+		ret = hdd_wlan_fake_apps_resume(hdd_ctx->wiphy);
 		break;
-#endif
 	default:
 		hdd_err("Invalid IOCTL command %d", sub_cmd);
 		break;
@@ -11169,7 +11147,7 @@ const struct iw_handler_def we_handler_def = {
  *
  * Returns: none
  */
-int hdd_set_wext(hdd_adapter_t *pAdapter)
+static int hdd_set_wext(hdd_adapter_t *pAdapter)
 {
 	hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);

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

@@ -978,6 +978,7 @@ typedef struct sAniSirGlobal {
 	int8_t first_scan_bucket_threshold;
 	enum auth_tx_ack_status auth_ack_status;
 	uint8_t user_configured_nss;
+	bool sta_prefer_80MHz_over_160MHz;
 } tAniSirGlobal;
 
 typedef enum {

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

@@ -41,9 +41,9 @@
 #define QWLAN_VERSION_MAJOR            5
 #define QWLAN_VERSION_MINOR            1
 #define QWLAN_VERSION_PATCH            0
-#define QWLAN_VERSION_EXTRA            "J"
-#define QWLAN_VERSION_BUILD            29
+#define QWLAN_VERSION_EXTRA            "P"
+#define QWLAN_VERSION_BUILD            30
 
-#define QWLAN_VERSIONSTR               "5.1.0.29J"
+#define QWLAN_VERSIONSTR               "5.1.0.30P"
 
 #endif /* QWLAN_VERSION_H */

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

@@ -695,6 +695,7 @@ typedef struct sSirSmeStartBssReq {
 	bool obssEnabled;
 	uint8_t sap_dot11mc;
 	uint8_t beacon_tx_rate;
+	bool vendor_vht_sap;
 
 } tSirSmeStartBssReq, *tpSirSmeStartBssReq;
 
@@ -3332,6 +3333,7 @@ struct sir_hw_mode_params {
 	uint8_t mac1_bw;
 	uint8_t dbs_cap;
 	uint8_t agile_dfs_cap;
+	uint8_t sbs_cap;
 };
 
 /**
@@ -6450,6 +6452,18 @@ struct sme_ndp_peer_ind {
 
 #endif /* WLAN_FEATURE_NAN_DATAPATH */
 
+/**
+ * struct sir_set_tx_rx_aggregation_size - sets tx rx aggregation size
+ * @vdev_id: vdev id of the session
+ * @tx_aggregation_size: Tx aggregation size
+ * @rx_aggregation_size: Rx aggregation size
+ */
+struct sir_set_tx_rx_aggregation_size {
+	uint8_t vdev_id;
+	uint32_t tx_aggregation_size;
+	uint32_t rx_aggregation_size;
+};
+
 /**
  * struct sir_p2p_lo_start - p2p listen offload start
  * @vdev_id: vdev identifier

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

@@ -108,11 +108,6 @@ enum eWniMsgTypes {
 	eWNI_SME_UPDATE_NOA,
 	eWNI_SME_CLEAR_DFS_CHANNEL_LIST,
 	eWNI_SME_GET_SNR_REQ,
-	/* General Power Save Messages */
-	eWNI_PMC_MSG_TYPES_BEGIN,
-
-	/* WOWL Messages */
-	eWNI_PMC_SMPS_STATE_IND,
 
 	eWNI_SME_RRM_MSG_TYPE_BEGIN,
 

+ 9 - 9
core/mac/src/cfg/cfgUtil/dot11f.frms

@@ -2894,7 +2894,7 @@ MULTIIE P2PDisAssoc ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
    MANDATORYTLV MinorReasonCode;
 }
 
-IE vendor2_ie (EID_VENDOR_SPECIFIC) OUI (0x00, 0x90, 0x4c)
+IE vendor_vht_ie (EID_VENDOR_SPECIFIC) OUI (0x00, 0x90, 0x4c)
 {
    type, 1;
    sub_type, 1;
@@ -2957,7 +2957,7 @@ FRAME Beacon                              // C.f. Sec. 7.2.3.1
     OPTIE  WiderBWChanSwitchAnn;
     OPTIE  OBSSScanParameters;
     OPTIE  Vendor1IE;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
     OPTIE  Vendor3IE;
     OPTIE  hs20vendor_ie;
     OPTIE  ChannelSwitchWrapper;
@@ -3046,7 +3046,7 @@ FRAME Beacon2
     OPTIE  WiderBWChanSwitchAnn;
     OPTIE  OBSSScanParameters;
     OPTIE  Vendor1IE;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
     OPTIE  Vendor3IE;
     OPTIE  hs20vendor_ie;
     OPTIE  ChannelSwitchWrapper;
@@ -3111,7 +3111,7 @@ FRAME BeaconIEs
     OPTIE  WiderBWChanSwitchAnn;
     OPTIE  OBSSScanParameters;
     OPTIE  Vendor1IE;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
     OPTIE  Vendor3IE;
     OPTIE  hs20vendor_ie;
     OPTIE  ChannelSwitchWrapper;
@@ -3153,7 +3153,7 @@ FRAME AssocRequest                        // 7.2.3.4
     OPTIE  ExtCap;
     OPTIE  OperatingMode;
     OPTIE  QosMapSet;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
     OPTIE  hs20vendor_ie;
 } // End frame AssocRequest.
 
@@ -3188,7 +3188,7 @@ FRAME AssocResponse                       // 7.2.3.5
     OPTIE  ExtCap;
     OPTIE  OBSSScanParameters;
     OPTIE  QosMapSet;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
 } // End frame AssocResponse.
 
 FRAME ReAssocRequest                      // 7.2.3.6
@@ -3225,7 +3225,7 @@ FRAME ReAssocRequest                      // 7.2.3.6
     OPTIE  ExtCap;
     OPTIE  OperatingMode;
     OPTIE  QosMapSet;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
     OPTIE  hs20vendor_ie;
 } // End frame ReAssocRequest.
 
@@ -3261,7 +3261,7 @@ FRAME ReAssocResponse                     // 7.2.3.7
     OPTIE  ExtCap;
     OPTIE  OBSSScanParameters;
     OPTIE  QosMapSet;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
 } // End frame ReAssocResponse.
 
 FRAME ProbeRequest                        // 7.2.3.8
@@ -3328,7 +3328,7 @@ FRAME ProbeResponse                       // 7.2.3.9
     OPTIE  ExtCap;
     OPTIE  OBSSScanParameters;
     OPTIE  Vendor1IE;
-    OPTIE  vendor2_ie;
+    OPTIE  vendor_vht_ie;
     OPTIE  Vendor3IE;
     OPTIE  hs20vendor_ie;
     OPTIE  ChannelSwitchWrapper;

+ 1 - 1
core/mac/src/cfg/cfg_api.c

@@ -71,7 +71,7 @@ uint32_t cfg_need_restart(tpAniSirGlobal pMac, uint16_t cfgId)
 	return !!(pMac->cfg.gCfgEntry[cfgId].control & CFG_CTL_RESTART);
 }
 
-void cfg_get_strindex(tpAniSirGlobal pMac, uint16_t cfgId)
+static void cfg_get_strindex(tpAniSirGlobal pMac, uint16_t cfgId)
 {
 	uint16_t i = 0;
 

+ 2 - 1
core/mac/src/dph/dph_hash_table.c

@@ -96,7 +96,8 @@ void dph_hash_table_class_init(tpAniSirGlobal pMac,
  * @return None
  */
 
-uint16_t hash_function(tpAniSirGlobal pMac, uint8_t staAddr[], uint16_t numSta)
+static uint16_t hash_function(tpAniSirGlobal pMac, uint8_t staAddr[],
+			      uint16_t numSta)
 {
 	int i;
 	uint16_t sum = 0;

+ 20 - 20
core/mac/src/include/dot11f.h

@@ -35,7 +35,7 @@
  *
  *
  * This file was automatically generated by 'framesc'
- * Mon Sep 19 14:42:34 2016 from the following file(s):
+ * Mon Oct  3 12:40:25 2016 from the following file(s):
  *
  * dot11f.frms
  *
@@ -7612,40 +7612,40 @@ uint32_t dot11f_get_packed_ie_sec_chan_offset_ele(
 #endif /* C++ */
 
 /* EID 221 (0xdd) {OUI 0x00, 0x90, 0x4c} */
-typedef struct sDot11fIEvendor2_ie {
+typedef struct sDot11fIEvendor_vht_ie {
 	uint8_t                      present;
 	uint8_t                      type;
 	uint8_t                      sub_type;
 	tDot11fIEVHTCaps             VHTCaps;
 	tDot11fIEVHTOperation        VHTOperation;
-} tDot11fIEvendor2_ie;
+} tDot11fIEvendor_vht_ie;
 
-#define DOT11F_EID_VENDOR2_IE (221)
+#define DOT11F_EID_VENDOR_VHT_IE (221)
 
 /* N.B. These #defines do *not* include the EID & length */
-#define DOT11F_IE_VENDOR2_IE_MIN_LEN (5)
+#define DOT11F_IE_VENDOR_VHT_IE_MIN_LEN (5)
 
-#define DOT11F_IE_VENDOR2_IE_MAX_LEN (26)
+#define DOT11F_IE_VENDOR_VHT_IE_MAX_LEN (26)
 
 #ifdef __cplusplus
 extern "C" {
 #endif /* C++ */
-uint32_t dot11f_unpack_ie_vendor2_ie(
+uint32_t dot11f_unpack_ie_vendor_vht_ie(
 	tpAniSirGlobal,
 	uint8_t *,
 	uint8_t,
-	tDot11fIEvendor2_ie*);
+	tDot11fIEvendor_vht_ie*);
 
-uint32_t dot11f_pack_ie_vendor2_ie(
+uint32_t dot11f_pack_ie_vendor_vht_ie(
 	tpAniSirGlobal,
-	tDot11fIEvendor2_ie *,
+	tDot11fIEvendor_vht_ie *,
 	uint8_t *,
 	uint32_t,
 	uint32_t*);
 
-uint32_t dot11f_get_packed_ie_vendor2_ie(
+uint32_t dot11f_get_packed_ie_vendor_vht_ie(
 	tpAniSirGlobal,
-	tDot11fIEvendor2_ie *,
+	tDot11fIEvendor_vht_ie *,
 	uint32_t*);
 
 #ifdef __cplusplus
@@ -7757,7 +7757,7 @@ typedef struct sDot11fAssocRequest{
 	tDot11fIEExtCap                ExtCap;
 	tDot11fIEOperatingMode         OperatingMode;
 	tDot11fIEQosMapSet             QosMapSet;
-	tDot11fIEvendor2_ie            vendor2_ie;
+	tDot11fIEvendor_vht_ie         vendor_vht_ie;
 	tDot11fIEhs20vendor_ie         hs20vendor_ie;
 } tDot11fAssocRequest;
 
@@ -7813,7 +7813,7 @@ typedef struct sDot11fAssocResponse{
 	tDot11fIEExtCap                    ExtCap;
 	tDot11fIEOBSSScanParameters        OBSSScanParameters;
 	tDot11fIEQosMapSet                 QosMapSet;
-	tDot11fIEvendor2_ie                vendor2_ie;
+	tDot11fIEvendor_vht_ie             vendor_vht_ie;
 } tDot11fAssocResponse;
 
 #define DOT11F_ASSOCRESPONSE (4)
@@ -7919,7 +7919,7 @@ typedef struct sDot11fBeacon{
 	tDot11fIEWiderBWChanSwitchAnn        WiderBWChanSwitchAnn;
 	tDot11fIEOBSSScanParameters          OBSSScanParameters;
 	tDot11fIEVendor1IE                   Vendor1IE;
-	tDot11fIEvendor2_ie                  vendor2_ie;
+	tDot11fIEvendor_vht_ie               vendor_vht_ie;
 	tDot11fIEVendor3IE                   Vendor3IE;
 	tDot11fIEhs20vendor_ie               hs20vendor_ie;
 	tDot11fIEChannelSwitchWrapper        ChannelSwitchWrapper;
@@ -8014,7 +8014,7 @@ typedef struct sDot11fBeacon2{
 	tDot11fIEWiderBWChanSwitchAnn        WiderBWChanSwitchAnn;
 	tDot11fIEOBSSScanParameters          OBSSScanParameters;
 	tDot11fIEVendor1IE                   Vendor1IE;
-	tDot11fIEvendor2_ie                  vendor2_ie;
+	tDot11fIEvendor_vht_ie               vendor_vht_ie;
 	tDot11fIEVendor3IE                   Vendor3IE;
 	tDot11fIEhs20vendor_ie               hs20vendor_ie;
 	tDot11fIEChannelSwitchWrapper        ChannelSwitchWrapper;
@@ -8090,7 +8090,7 @@ typedef struct sDot11fBeaconIEs{
 	tDot11fIEWiderBWChanSwitchAnn        WiderBWChanSwitchAnn;
 	tDot11fIEOBSSScanParameters          OBSSScanParameters;
 	tDot11fIEVendor1IE                   Vendor1IE;
-	tDot11fIEvendor2_ie                  vendor2_ie;
+	tDot11fIEvendor_vht_ie               vendor_vht_ie;
 	tDot11fIEVendor3IE                   Vendor3IE;
 	tDot11fIEhs20vendor_ie               hs20vendor_ie;
 	tDot11fIEChannelSwitchWrapper        ChannelSwitchWrapper;
@@ -8501,7 +8501,7 @@ typedef struct sDot11fProbeResponse{
 	tDot11fIEExtCap                      ExtCap;
 	tDot11fIEOBSSScanParameters          OBSSScanParameters;
 	tDot11fIEVendor1IE                   Vendor1IE;
-	tDot11fIEvendor2_ie                  vendor2_ie;
+	tDot11fIEvendor_vht_ie               vendor_vht_ie;
 	tDot11fIEVendor3IE                   Vendor3IE;
 	tDot11fIEhs20vendor_ie               hs20vendor_ie;
 	tDot11fIEChannelSwitchWrapper        ChannelSwitchWrapper;
@@ -8648,7 +8648,7 @@ typedef struct sDot11fReAssocRequest{
 	tDot11fIEExtCap                    ExtCap;
 	tDot11fIEOperatingMode             OperatingMode;
 	tDot11fIEQosMapSet                 QosMapSet;
-	tDot11fIEvendor2_ie                vendor2_ie;
+	tDot11fIEvendor_vht_ie             vendor_vht_ie;
 	tDot11fIEhs20vendor_ie             hs20vendor_ie;
 } tDot11fReAssocRequest;
 
@@ -8705,7 +8705,7 @@ typedef struct sDot11fReAssocResponse{
 	tDot11fIEExtCap                    ExtCap;
 	tDot11fIEOBSSScanParameters        OBSSScanParameters;
 	tDot11fIEQosMapSet                 QosMapSet;
-	tDot11fIEvendor2_ie                vendor2_ie;
+	tDot11fIEvendor_vht_ie             vendor_vht_ie;
 } tDot11fReAssocResponse;
 
 #define DOT11F_REASSOCRESPONSE (27)

+ 3 - 2
core/mac/src/include/parser_api.h

@@ -164,7 +164,7 @@ typedef struct sSirProbeRespBeacon {
 	uint8_t WiderBWChanSwitchAnnPresent;
 	tDot11fIEWiderBWChanSwitchAnn WiderBWChanSwitchAnn;
 	uint8_t Vendor1IEPresent;
-	tDot11fIEvendor2_ie vendor2_ie;
+	tDot11fIEvendor_vht_ie vendor_vht_ie;
 	uint8_t Vendor3IEPresent;
 	tDot11fIEhs20vendor_ie hs20vendor_ie;
 	tDot11fIEIBSSParams IBSSParams;
@@ -245,6 +245,7 @@ typedef struct sSirAssocReq {
 	tDot11fIEVHTCaps VHTCaps;
 	tDot11fIEOperatingMode operMode;
 	tDot11fIEExtCap ExtCap;
+	tDot11fIEvendor_vht_ie vendor_vht_ie;
 	tDot11fIEhs20vendor_ie hs20vendor_ie;
 } tSirAssocReq, *tpSirAssocReq;
 
@@ -294,7 +295,7 @@ typedef struct sSirAssocRsp {
 #ifdef WLAN_FEATURE_11W
 	tDot11fIETimeoutInterval TimeoutInterval;
 #endif
-	tDot11fIEvendor2_ie vendor2_ie;
+	tDot11fIEvendor_vht_ie vendor_vht_ie;
 	tDot11fIEOBSSScanParameters obss_scanparams;
 } tSirAssocRsp, *tpSirAssocRsp;
 

+ 2 - 0
core/mac/src/include/sir_params.h

@@ -606,6 +606,7 @@ typedef struct sSirMbMsgP2p {
 #define SIR_HAL_ADD_BCN_FILTER_CMDID        (SIR_HAL_ITC_MSG_TYPES_BEGIN + 339)
 #define SIR_HAL_REMOVE_BCN_FILTER_CMDID     (SIR_HAL_ITC_MSG_TYPES_BEGIN + 340)
 
+
 #define SIR_HAL_BPF_GET_CAPABILITIES_REQ    (SIR_HAL_ITC_MSG_TYPES_BEGIN + 341)
 #define SIR_HAL_BPF_SET_INSTRUCTIONS_REQ    (SIR_HAL_ITC_MSG_TYPES_BEGIN + 342)
 
@@ -634,6 +635,7 @@ typedef struct sSirMbMsgP2p {
 #define SIR_HAL_POWER_DBG_CMD               (SIR_HAL_ITC_MSG_TYPES_BEGIN + 362)
 #define SIR_HAL_SET_DTIM_PERIOD             (SIR_HAL_ITC_MSG_TYPES_BEGIN + 363)
 #define SIR_HAL_ENCRYPT_DECRYPT_MSG         (SIR_HAL_ITC_MSG_TYPES_BEGIN + 364)
+#define SIR_HAL_SET_CTS2SELF_FOR_STA        (SIR_HAL_ITC_MSG_TYPES_BEGIN + 368)
 
 #define SIR_HAL_MSG_TYPES_END                (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
 

+ 17 - 1
core/mac/src/pe/include/lim_api.h

@@ -136,7 +136,6 @@ uint32_t lim_post_msg_high_priority(tpAniSirGlobal mac, tSirMsgQ *msg);
  * and dispatch to various sub modules within LIM module.
  */
 extern void lim_message_processor(tpAniSirGlobal, tpSirMsgQ);
-extern void lim_process_messages(tpAniSirGlobal, tpSirMsgQ);      /* DT test alt deferred 2 */
 /**
  * Function to check the LIM state if system is in Scan/Learn state.
  */
@@ -165,6 +164,23 @@ extern void lim_trigger_sta_deletion(tpAniSirGlobal pMac, tpDphHashNode pStaDs,
 extern void lim_send_sme_tdls_del_sta_ind(tpAniSirGlobal pMac, tpDphHashNode pStaDs,
 					  tpPESession psessionEntry,
 					  uint16_t reasonCode);
+/**
+ * lim_set_tdls_flags() - update tdls flags based on newer STA connection
+ * information
+ * @roam_sync_ind_ptr: pointer to roam offload structure
+ * @ft_session_ptr: pointer to PE session
+ *
+ * Set TDLS flags as per new STA connection capabilities.
+ *
+ * Return: None
+ */
+void lim_set_tdls_flags(roam_offload_synch_ind *roam_sync_ind_ptr,
+		   tpPESession ft_session_ptr);
+#else
+static inline void lim_set_tdls_flags(roam_offload_synch_ind *roam_sync_ind_ptr,
+		   tpPESession ft_session_ptr)
+{
+}
 #endif
 
 /* / Function that checks for change in AP's capabilties on STA */

+ 5 - 0
core/mac/src/pe/include/lim_session.h

@@ -344,6 +344,10 @@ typedef struct sPESession       /* Added to Support BT-AMP */
 	uint8_t freePeerIdxTail;
 	uint16_t gLimNumOfCurrentSTAs;
 #ifdef FEATURE_WLAN_TDLS
+	 /* TDLS parameters to check whether TDLS
+	  * and TDLS channel switch is allowed in the
+	  * AP network
+	  */
 	uint32_t peerAIDBitmap[2];
 	bool tdls_prohibited;
 	bool tdls_chan_swit_prohibited;
@@ -464,6 +468,7 @@ typedef struct sPESession       /* Added to Support BT-AMP */
 	bool is_vendor_specific_vhtcaps;
 	uint8_t vendor_specific_vht_ie_type;
 	uint8_t vendor_specific_vht_ie_sub_type;
+	bool vendor_vht_sap;
 	/* HS 2.0 Indication */
 	tDot11fIEhs20vendor_ie hs20vendor_ie;
 	/* flag to indicate country code in beacon */

+ 6 - 4
core/mac/src/pe/lim/lim_admit_control.c

@@ -43,6 +43,7 @@
 #include "lim_trace.h"
 #include "lim_send_sme_rsp_messages.h"
 #include "lim_types.h"
+#include "lim_admit_control.h"
 
 #define ADMIT_CONTROL_LOGLEVEL        LOG1
 #define ADMIT_CONTROL_POLICY_LOGLEVEL LOG1
@@ -348,8 +349,9 @@ lim_admit_policy_oversubscription(tpAniSirGlobal mac_ctx,
    \return eSirRetStatus - status
    -------------------------------------------------------------*/
 
-tSirRetStatus lim_admit_policy(tpAniSirGlobal pMac,
-			       tSirMacTspecIE *pTspec, tpPESession psessionEntry)
+static tSirRetStatus lim_admit_policy(tpAniSirGlobal pMac,
+				      tSirMacTspecIE *pTspec,
+				      tpPESession psessionEntry)
 {
 	tSirRetStatus retval = eSIR_FAILURE;
 	tpLimAdmitPolicyInfo pAdmitPolicy = &pMac->lim.admitPolicyInfo;
@@ -395,7 +397,7 @@ tSirRetStatus lim_admit_policy(tpAniSirGlobal pMac,
 
 /* ----------------------------------------------------------------------------- */
 /* delete the specified tspec */
-void lim_tspec_delete(tpAniSirGlobal pMac, tpLimTspecInfo pInfo)
+static void lim_tspec_delete(tpAniSirGlobal pMac, tpLimTspecInfo pInfo)
 {
 	if (pInfo == NULL)
 		return;
@@ -500,7 +502,7 @@ lim_tspec_find_by_assoc_id(tpAniSirGlobal pMac,
    \return eSirRetStatus - status of the comparison
    -------------------------------------------------------------*/
 
-tSirRetStatus
+static tSirRetStatus
 lim_find_tspec(tpAniSirGlobal pMac,
 	       uint16_t assocId,
 	       tSirMacTSInfo *pTsInfo,

+ 60 - 4
core/mac/src/pe/lim/lim_api.c

@@ -681,6 +681,63 @@ void lim_cleanup(tpAniSirGlobal pMac)
 
 } /*** end lim_cleanup() ***/
 
+/**
+ * lim_state_info_dump() - print state information of lim layer
+ * @buf: buffer pointer
+ * @size: size of buffer to be filled
+ *
+ * This function is used to print state information of lim layer
+ *
+ * Return: None
+ */
+static void lim_state_info_dump(char **buf_ptr, uint16_t *size)
+{
+	tHalHandle hal;
+	tpAniSirGlobal mac;
+	uint16_t len = 0;
+	char *buf = *buf_ptr;
+
+	hal = cds_get_context(QDF_MODULE_ID_PE);
+	if (hal == NULL) {
+		QDF_ASSERT(0);
+		return;
+	}
+
+	mac = PMAC_STRUCT(hal);
+
+	lim_log(mac, LOG1, FL("size of buffer: %d"), *size);
+
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n SmeState: %d", mac->lim.gLimSmeState);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n PrevSmeState: %d", mac->lim.gLimPrevSmeState);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n MlmState: %d", mac->lim.gLimMlmState);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n PrevMlmState: %d", mac->lim.gLimPrevMlmState);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n SystemInScanLearnMode: %d",
+		mac->lim.gLimSystemInScanLearnMode);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n ProcessDefdMsgs: %d", mac->lim.gLimProcessDefdMsgs);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n gLimHalScanState: %d", mac->lim.gLimHalScanState);
+
+	*size -= len;
+	*buf_ptr += len;
+}
+
+/**
+ * lim_register_debug_callback() - registration function for lim layer
+ * to print lim state information
+ *
+ * Return: None
+ */
+static void lim_register_debug_callback(void)
+{
+	qdf_register_debug_callback(QDF_MODULE_ID_PE, &lim_state_info_dump);
+}
+
 /** -------------------------------------------------------------
    \fn pe_open
    \brief will be called in Open sequence from mac_open
@@ -746,6 +803,8 @@ tSirRetStatus pe_open(tpAniSirGlobal pMac, struct cds_config_info *cds_cfg)
 #ifdef LIM_TRACE_RECORD
 	MTRACE(lim_trace_init(pMac));
 #endif
+	lim_register_debug_callback();
+
 	return status; /* status here will be eSIR_SUCCESS */
 
 pe_open_lock_fail:
@@ -2011,10 +2070,7 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx,
 	roam_sync_ind_ptr->join_rsp->nss = curr_sta_ds->nss;
 	roam_sync_ind_ptr->join_rsp->max_rate_flags =
 		lim_get_max_rate_flags(mac_ctx, curr_sta_ds);
-	roam_sync_ind_ptr->join_rsp->tdls_prohibited =
-		ft_session_ptr->tdls_prohibited;
-	roam_sync_ind_ptr->join_rsp->tdls_chan_swit_prohibited =
-		ft_session_ptr->tdls_chan_swit_prohibited;
+	lim_set_tdls_flags(roam_sync_ind_ptr, ft_session_ptr);
 	roam_sync_ind_ptr->join_rsp->aid = ft_session_ptr->limAID;
 	lim_fill_join_rsp_ht_caps(ft_session_ptr, roam_sync_ind_ptr->join_rsp);
 	ft_session_ptr->limPrevSmeState = ft_session_ptr->limSmeState;

+ 32 - 30
core/mac/src/pe/lim/lim_assoc_utils.c

@@ -1214,10 +1214,10 @@ lim_decide_ap_protection_on_delete(tpAniSirGlobal mac_ctx,
  *
  * Return: None
  */
-void lim_decide_short_preamble(tpAniSirGlobal mac_ctx,
-			       tpDphHashNode sta_ds,
-			       tpUpdateBeaconParams beacon_params,
-			       tpPESession session_entry)
+static void lim_decide_short_preamble(tpAniSirGlobal mac_ctx,
+				      tpDphHashNode sta_ds,
+				      tpUpdateBeaconParams beacon_params,
+				      tpPESession session_entry)
 {
 	uint32_t i;
 
@@ -1270,7 +1270,7 @@ void lim_decide_short_preamble(tpAniSirGlobal mac_ctx,
  *        the BSS.
  * Return: None
  */
-void
+static void
 lim_decide_short_slot(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds,
 		      tpUpdateBeaconParams beacon_params,
 		      tpPESession session_entry)
@@ -3224,12 +3224,12 @@ lim_check_and_announce_join_success(tpAniSirGlobal mac_ctx,
 	wlan_cfg_get_int(mac_ctx, WNI_CFG_DOT11_MODE, &selfStaDot11Mode);
 
 	if ((IS_DOT11_MODE_VHT(selfStaDot11Mode)) &&
-		beacon_probe_rsp->vendor2_ie.VHTCaps.present) {
+		beacon_probe_rsp->vendor_vht_ie.VHTCaps.present) {
 		session_entry->is_vendor_specific_vhtcaps = true;
 		session_entry->vendor_specific_vht_ie_type =
-			beacon_probe_rsp->vendor2_ie.type;
+			beacon_probe_rsp->vendor_vht_ie.type;
 		session_entry->vendor_specific_vht_ie_sub_type =
-			beacon_probe_rsp->vendor2_ie.sub_type;
+			beacon_probe_rsp->vendor_vht_ie.sub_type;
 		lim_log(mac_ctx, LOG1, FL(
 			"VHT caps are present in vendor specific IE"));
 	}
@@ -3403,7 +3403,7 @@ lim_del_bss(tpAniSirGlobal pMac, tpDphHashNode pStaDs, uint16_t bssIdx,
  *
  * Return : void
  */
-void lim_update_vhtcaps_assoc_resp(tpAniSirGlobal mac_ctx,
+static void lim_update_vhtcaps_assoc_resp(tpAniSirGlobal mac_ctx,
 		tpAddBssParams pAddBssParams,
 		tDot11fIEVHTCaps *vht_caps, tpPESession psessionEntry)
 {
@@ -3466,7 +3466,7 @@ void lim_update_vhtcaps_assoc_resp(tpAniSirGlobal mac_ctx,
  *
  * Return : void
  */
-void lim_update_vht_oper_assoc_resp(tpAniSirGlobal mac_ctx,
+static void lim_update_vht_oper_assoc_resp(tpAniSirGlobal mac_ctx,
 		tpAddBssParams pAddBssParams,
 		tDot11fIEVHTOperation *vht_oper, tpPESession psessionEntry)
 {
@@ -3678,13 +3678,13 @@ tSirRetStatus lim_sta_send_add_bss(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
 		vht_caps =  &pAssocRsp->VHTCaps;
 		vht_oper = &pAssocRsp->VHTOperation;
 	} else if (psessionEntry->vhtCapability &&
-			pAssocRsp->vendor2_ie.VHTCaps.present){
+			pAssocRsp->vendor_vht_ie.VHTCaps.present){
 		pAddBssParams->vhtCapable =
-			pAssocRsp->vendor2_ie.VHTCaps.present;
+			pAssocRsp->vendor_vht_ie.VHTCaps.present;
 		lim_log(pMac, LOG1,
 			FL("VHT Caps and Operation are present in vendor Specfic IE"));
-		vht_caps = &pAssocRsp->vendor2_ie.VHTCaps;
-		vht_oper = &pAssocRsp->vendor2_ie.VHTOperation;
+		vht_caps = &pAssocRsp->vendor_vht_ie.VHTCaps;
+		vht_oper = &pAssocRsp->vendor_vht_ie.VHTOperation;
 	} else {
 		pAddBssParams->vhtCapable = 0;
 	}
@@ -3757,15 +3757,15 @@ tSirRetStatus lim_sta_send_add_bss(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
 				pAddBssParams->staContext.lsigTxopProtection);
 		if (psessionEntry->vhtCapability &&
 				(IS_BSS_VHT_CAPABLE(pBeaconStruct->VHTCaps) ||
-				 IS_BSS_VHT_CAPABLE(
-					 pBeaconStruct->vendor2_ie.VHTCaps))) {
+				 IS_BSS_VHT_CAPABLE(pBeaconStruct->
+						    vendor_vht_ie.VHTCaps))) {
 			pAddBssParams->staContext.vhtCapable = 1;
 			pAddBssParams->staContext.vhtSupportedRxNss =
 				pStaDs->vhtSupportedRxNss;
 			if (pAssocRsp->VHTCaps.present)
 				vht_caps = &pAssocRsp->VHTCaps;
-			else if (pAssocRsp->vendor2_ie.VHTCaps.present) {
-				vht_caps = &pAssocRsp->vendor2_ie.VHTCaps;
+			else if (pAssocRsp->vendor_vht_ie.VHTCaps.present) {
+				vht_caps = &pAssocRsp->vendor_vht_ie.VHTCaps;
 				lim_log(pMac, LOG1, FL(
 					"VHT Caps are in vendor Specfic IE"));
 			}
@@ -3790,8 +3790,9 @@ tSirRetStatus lim_sta_send_add_bss(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
 				pAssocRsp->HTInfo.recommendedTxWidthSet;
 			if (pAssocRsp->VHTCaps.present)
 				vht_oper = &pAssocRsp->VHTOperation;
-			else if (pAssocRsp->vendor2_ie.VHTCaps.present) {
-				vht_oper = &pAssocRsp->vendor2_ie.VHTOperation;
+			else if (pAssocRsp->vendor_vht_ie.VHTCaps.present) {
+				vht_oper = &pAssocRsp->
+						vendor_vht_ie.VHTOperation;
 				lim_log(pMac, LOG1, FL(
 					"VHT Op IE is in vendor Specfic IE"));
 			}
@@ -3874,8 +3875,8 @@ tSirRetStatus lim_sta_send_add_bss(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
 
 			if (pAssocRsp->VHTCaps.present)
 				vht_caps = &pAssocRsp->VHTCaps;
-			else if (pAssocRsp->vendor2_ie.VHTCaps.present) {
-				vht_caps = &pAssocRsp->vendor2_ie.VHTCaps;
+			else if (pAssocRsp->vendor_vht_ie.VHTCaps.present) {
+				vht_caps = &pAssocRsp->vendor_vht_ie.VHTCaps;
 				lim_log(pMac, LOG1, FL(
 					"VHT Caps is in vendor Specfic IE"));
 			}
@@ -4218,13 +4219,13 @@ tSirRetStatus lim_sta_send_add_bss_pre_assoc(tpAniSirGlobal pMac, uint8_t update
 		pAddBssParams->currentOperChannel);
 	if (psessionEntry->vhtCapability &&
 		(IS_BSS_VHT_CAPABLE(pBeaconStruct->VHTCaps) ||
-		 IS_BSS_VHT_CAPABLE(pBeaconStruct->vendor2_ie.VHTCaps))) {
+		 IS_BSS_VHT_CAPABLE(pBeaconStruct->vendor_vht_ie.VHTCaps))) {
 
 		pAddBssParams->vhtCapable = 1;
 		if (pBeaconStruct->VHTOperation.present)
 			vht_oper = &pBeaconStruct->VHTOperation;
-		else if (pBeaconStruct->vendor2_ie.VHTOperation.present) {
-			vht_oper = &pBeaconStruct->vendor2_ie.VHTOperation;
+		else if (pBeaconStruct->vendor_vht_ie.VHTOperation.present) {
+			vht_oper = &pBeaconStruct->vendor_vht_ie.VHTOperation;
 			lim_log(pMac, LOG1,
 					FL("VHT Operation is present in vendor Specfic IE"));
 		}
@@ -4301,12 +4302,13 @@ tSirRetStatus lim_sta_send_add_bss_pre_assoc(tpAniSirGlobal pMac, uint8_t update
 		if (psessionEntry->vhtCapability &&
 			(IS_BSS_VHT_CAPABLE(pBeaconStruct->VHTCaps) ||
 			 IS_BSS_VHT_CAPABLE(
-				 pBeaconStruct->vendor2_ie.VHTCaps))) {
+				 pBeaconStruct->vendor_vht_ie.VHTCaps))) {
 			pAddBssParams->staContext.vhtCapable = 1;
 			if (pBeaconStruct->VHTCaps.present)
 				vht_caps = &pBeaconStruct->VHTCaps;
-			else if (pBeaconStruct->vendor2_ie.VHTCaps.present)
-				vht_caps = &pBeaconStruct->vendor2_ie.VHTCaps;
+			else if (pBeaconStruct->vendor_vht_ie.VHTCaps.present)
+				vht_caps = &pBeaconStruct->
+						vendor_vht_ie.VHTCaps;
 
 			if ((vht_caps != NULL) && (vht_caps->suBeamFormerCap ||
 				vht_caps->muBeamformerCap) &&
@@ -4389,9 +4391,9 @@ tSirRetStatus lim_sta_send_add_bss_pre_assoc(tpAniSirGlobal pMac, uint8_t update
 
 			if (pBeaconStruct->VHTCaps.present)
 				vht_caps = &pBeaconStruct->VHTCaps;
-			else if (pBeaconStruct->vendor2_ie.VHTCaps.present) {
+			else if (pBeaconStruct->vendor_vht_ie.VHTCaps.present) {
 				vht_caps =
-					&pBeaconStruct->vendor2_ie.VHTCaps;
+					&pBeaconStruct->vendor_vht_ie.VHTCaps;
 				lim_log(pMac, LOG1, FL(
 					"VHT Caps are in vendor Specfic IE"));
 			}

+ 6 - 0
core/mac/src/pe/lim/lim_assoc_utils.h

@@ -219,4 +219,10 @@ static inline void lim_send_sme_tsm_ie_ind(tpAniSirGlobal pMac,
 {}
 #endif /* FEATURE_WLAN_ESE */
 
+tSirRetStatus lim_populate_vht_mcs_set(tpAniSirGlobal pMac,
+				       tpSirSupportedRates pRates,
+				       tDot11fIEVHTCaps *pPeerVHTCaps,
+				       tpPESession psessionEntry,
+				       uint8_t nss);
+
 #endif /* __LIM_ASSOC_UTILS_H */

+ 2 - 1
core/mac/src/pe/lim/lim_ibss_peer_mgmt.c

@@ -668,7 +668,8 @@ void lim_ibss_init(tpAniSirGlobal pMac)
  * @return None
  */
 
-void lim_ibss_delete_all_peers(tpAniSirGlobal pMac, tpPESession psessionEntry)
+static void lim_ibss_delete_all_peers(tpAniSirGlobal pMac,
+				      tpPESession psessionEntry)
 {
 	tLimIbssPeerNode *pCurrNode, *pTempNode;
 	tpDphHashNode pStaDs;

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

@@ -468,6 +468,7 @@ static void lim_tx_action_frame(tpAniSirGlobal mac_ctx,
 	 * need to go at OFDM rates. And BD rate2 we configured at 6Mbps.
 	 */
 	tx_flag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+	mac_ctx->lim.mgmtFrameSessionId = sme_session_id;
 
 	if ((SIR_MAC_MGMT_PROBE_RSP == fc->subType) ||
 		(mb_msg->noack)) {
@@ -483,7 +484,6 @@ static void lim_tx_action_frame(tpAniSirGlobal mac_ctx,
 				true : false);
 		mac_ctx->lim.mgmtFrameSessionId = 0xff;
 	} else {
-		mac_ctx->lim.mgmtFrameSessionId = mb_msg->sessionId;
 		qdf_status =
 			wma_tx_frameWithTxComplete(mac_ctx, packet,
 				(uint16_t) msg_len,
@@ -550,7 +550,9 @@ void lim_send_p2p_action_frame(tpAniSirGlobal mac_ctx,
 	if ((!mac_ctx->lim.gpLimRemainOnChanReq) && (0 != mb_msg->wait)) {
 		lim_log(mac_ctx, LOGE,
 			FL("RemainOnChannel is not running"));
+		mac_ctx->lim.mgmtFrameSessionId = mb_msg->sessionId;
 		lim_p2p_action_cnf(mac_ctx, false);
+		mac_ctx->lim.mgmtFrameSessionId = 0xff;
 		return;
 	}
 	sme_session_id = mb_msg->sessionId;

+ 31 - 8
core/mac/src/pe/lim/lim_process_assoc_req_frame.c

@@ -504,9 +504,19 @@ static bool lim_chk_11ac_only(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 			      tpPESession session, tpSirAssocReq assoc_req,
 			      uint8_t sub_type)
 {
+	tDot11fIEVHTCaps *vht_caps;
+
+	if (assoc_req->VHTCaps.present)
+		vht_caps = &assoc_req->VHTCaps;
+	else if (assoc_req->vendor_vht_ie.VHTCaps.present &&
+		 session->vendor_vht_sap)
+		vht_caps = &assoc_req->vendor_vht_ie.VHTCaps;
+	else
+		vht_caps = NULL;
+
 	if (LIM_IS_AP_ROLE(session) &&
 		(session->dot11mode == WNI_CFG_DOT11_MODE_11AC_ONLY) &&
-		(!assoc_req->VHTCaps.present)) {
+		((vht_caps != NULL) && (!vht_caps->present))) {
 		lim_send_assoc_rsp_mgmt_frame(mac_ctx,
 			eSIR_MAC_CAPABILITIES_NOT_SUPPORTED_STATUS,
 			1, hdr->sa, sub_type, 0, session);
@@ -1231,6 +1241,16 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 	tPmfSaQueryTimerId timer_id;
 	uint32_t retry_interval;
 #endif
+	tDot11fIEVHTCaps *vht_caps;
+
+	if (assoc_req->VHTCaps.present)
+		vht_caps = &assoc_req->VHTCaps;
+	else if (assoc_req->vendor_vht_ie.VHTCaps.present &&
+		 session->vendor_vht_sap)
+		vht_caps = &assoc_req->vendor_vht_ie.VHTCaps;
+	else
+		vht_caps = NULL;
+
 	/*
 	 * check here if the parsedAssocReq already pointing to the assoc_req
 	 * and free it before assigning this new assoc_req
@@ -1252,7 +1272,10 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 	}
 
 	sta_ds->mlmStaContext.htCapability = assoc_req->HTCaps.present;
-	sta_ds->mlmStaContext.vhtCapability = assoc_req->VHTCaps.present;
+	if ((vht_caps != NULL) && vht_caps->present)
+		sta_ds->mlmStaContext.vhtCapability = vht_caps->present;
+	else
+		sta_ds->mlmStaContext.vhtCapability = false;
 	sta_ds->qos.addtsPresent =
 		(assoc_req->addtsPresent == 0) ? false : true;
 	sta_ds->qos.addts = assoc_req->addtsReq;
@@ -1348,7 +1371,7 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 				(uint8_t) (assoc_req->operMode.chanWidth ?
 				eHT_CHANNEL_WIDTH_40MHZ :
 				eHT_CHANNEL_WIDTH_20MHZ);
-		} else if (assoc_req->VHTCaps.present) {
+		} else if ((vht_caps != NULL) && vht_caps->present) {
 			/*
 			 * Check if STA has enabled it's channel bonding mode.
 			 * If channel bonding mode is enabled, we decide based
@@ -1360,7 +1383,7 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 					WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ :
 					session->ch_width - 1);
 			sta_ds->htMaxRxAMpduFactor =
-				assoc_req->VHTCaps.maxAMPDULenExp;
+				vht_caps->maxAMPDULenExp;
 		}
 		/* Lesser among the AP and STA bandwidth of operation. */
 		sta_ds->htSupportedChannelWidthSet =
@@ -1373,9 +1396,10 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 			(uint8_t) assoc_req->HTCaps.advCodingCap;
 	}
 
-	if (assoc_req->VHTCaps.present && assoc_req->wmeInfoPresent) {
+	if ((vht_caps != NULL) && vht_caps->present &&
+	    assoc_req->wmeInfoPresent) {
 		sta_ds->vhtLdpcCapable =
-			(uint8_t) assoc_req->VHTCaps.ldpcCodingCap;
+			(uint8_t) vht_caps->ldpcCodingCap;
 	}
 
 	if (!assoc_req->wmeInfoPresent) {
@@ -1398,8 +1422,7 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
 			&(assoc_req->supportedRates),
 			&(assoc_req->extendedRates),
 			assoc_req->HTCaps.supportedMCSSet,
-			session, &assoc_req->VHTCaps) != eSIR_SUCCESS)
-	{
+			session, vht_caps) != eSIR_SUCCESS) {
 		/* Could not update hash table entry at DPH with rateset */
 		lim_log(mac_ctx, LOGE,
 			FL("Couldn't update hash entry for aid=%d, MacAddr: "

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

@@ -172,8 +172,8 @@ void lim_update_assoc_sta_datas(tpAniSirGlobal mac_ctx,
 
 	if (assoc_rsp->VHTCaps.present)
 		vht_caps = &assoc_rsp->VHTCaps;
-	else if (assoc_rsp->vendor2_ie.VHTCaps.present)
-		vht_caps = &assoc_rsp->vendor2_ie.VHTCaps;
+	else if (assoc_rsp->vendor_vht_ie.VHTCaps.present)
+		vht_caps = &assoc_rsp->vendor_vht_ie.VHTCaps;
 
 	if (IS_DOT11_MODE_VHT(session_entry->dot11mode)) {
 		if ((vht_caps != NULL) && vht_caps->present) {
@@ -473,7 +473,7 @@ static void lim_update_stads_ext_cap(tpAniSirGlobal mac_ctx,
  *
  *  Return: None
  */
-void lim_stop_reassoc_retry_timer(tpAniSirGlobal mac_ctx)
+static void lim_stop_reassoc_retry_timer(tpAniSirGlobal mac_ctx)
 {
 	mac_ctx->lim.reAssocRetryAttempt = 0;
 	if ((NULL != mac_ctx->lim.pSessionEntry)

+ 33 - 50
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -1256,34 +1256,6 @@ void lim_process_abort_scan_ind(tpAniSirGlobal mac_ctx,
 	return;
 }
 
-/**
- * lim_message_processor() - Process messages from LIM.
- *
- * @mac_ctx:          Pointer to the Global Mac Context.
- * @msg:              Received LIM message.
- *
- * Wrapper function for lim_process_messages when handling messages received by
- * LIM.Could either defer messages or process them.
- *
- * Return:  None.
- */
-void lim_message_processor(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
-{
-	if (eLIM_MLM_OFFLINE_STATE == mac_ctx->lim.gLimMlmState) {
-		pe_free_msg(mac_ctx, msg);
-		return;
-	}
-
-	if (!def_msg_decision(mac_ctx, msg)) {
-		lim_process_messages(mac_ctx, msg);
-		/* process deferred message queue if allowed */
-		if ((!(mac_ctx->lim.gLimAddtsSent)) &&
-			(!(lim_is_system_in_scan_state(mac_ctx))) &&
-			(true == GET_LIM_PROCESS_DEFD_MESGS(mac_ctx)))
-			lim_process_deferred_message_queue(mac_ctx);
-	}
-}
-
 static void lim_process_sme_obss_scan_ind(tpAniSirGlobal mac_ctx,
 							struct sSirMsgQ *msg)
 {
@@ -1319,12 +1291,12 @@ static void lim_process_sme_obss_scan_ind(tpAniSirGlobal mac_ctx,
 /**
  * lim_process_messages() - Process messages from upper layers.
  *
- * @mac_ctx:          Pointer to the Global Mac Context.
- * @msg:              Received message.
+ * @mac_ctx: Pointer to the Global Mac Context.
+ * @msg: Received message.
  *
  * Return:  None.
  */
-void lim_process_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
+static void lim_process_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
 {
 #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
 	uint8_t vdev_id = 0;
@@ -1552,13 +1524,6 @@ void lim_process_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
 		/* These messages are from HDD.No need to respond to HDD */
 		lim_process_normal_hdd_msg(mac_ctx, msg, false);
 		break;
-
-	case eWNI_PMC_SMPS_STATE_IND:
-		if (msg->bodyptr) {
-			qdf_mem_free(msg->bodyptr);
-			msg->bodyptr = NULL;
-		}
-		break;
 	case eWNI_SME_SEND_ACTION_FRAME_IND:
 		lim_send_p2p_action_frame(mac_ctx, msg);
 		qdf_mem_free(msg->bodyptr);
@@ -2043,26 +2008,17 @@ void lim_process_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
 } /*** end lim_process_messages() ***/
 
 /**
- * lim_process_deferred_message_queue
+ * lim_process_deferred_message_queue()
  *
- ***FUNCTION:
  * This function is called by LIM while exiting from Learn
  * mode. This function fetches messages posted to the LIM
  * deferred message queue limDeferredMsgQ.
  *
- ***LOGIC:
- *
- ***ASSUMPTIONS:
- * NA
- *
- ***NOTE:
- * NA
- *
- * @param  pMac - Pointer to Global MAC structure
+ * @pMac: Pointer to Global MAC structure
  * @return None
  */
 
-void lim_process_deferred_message_queue(tpAniSirGlobal pMac)
+static void lim_process_deferred_message_queue(tpAniSirGlobal pMac)
 {
 	tSirMsgQ limMsg = { 0, 0, 0 };
 
@@ -2089,6 +2045,33 @@ void lim_process_deferred_message_queue(tpAniSirGlobal pMac)
 	}
 } /*** end lim_process_deferred_message_queue() ***/
 
+/**
+ * lim_message_processor() - Process messages from LIM.
+ * @mac_ctx: Pointer to the Global Mac Context.
+ * @msg: Received LIM message.
+ *
+ * Wrapper function for lim_process_messages when handling messages received by
+ * LIM. Could either defer messages or process them.
+ *
+ * Return:  None.
+ */
+void lim_message_processor(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
+{
+	if (eLIM_MLM_OFFLINE_STATE == mac_ctx->lim.gLimMlmState) {
+		pe_free_msg(mac_ctx, msg);
+		return;
+	}
+
+	if (!def_msg_decision(mac_ctx, msg)) {
+		lim_process_messages(mac_ctx, msg);
+		/* process deferred message queue if allowed */
+		if ((!(mac_ctx->lim.gLimAddtsSent)) &&
+		    (!(lim_is_system_in_scan_state(mac_ctx))) &&
+		    (true == GET_LIM_PROCESS_DEFD_MESGS(mac_ctx)))
+			lim_process_deferred_message_queue(mac_ctx);
+	}
+}
+
 /**
  * lim_process_normal_hdd_msg() - Process the message and defer if needed
  * @mac_ctx :     Pointer to Global MAC structure

+ 4 - 0
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -595,6 +595,10 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx,
 	if (QDF_IBSS_MODE == addbss_param->halPersona) {
 		addbss_param->nss_2g = mac_ctx->vdev_type_nss_2g.ibss;
 		addbss_param->nss_5g = mac_ctx->vdev_type_nss_5g.ibss;
+		addbss_param->tx_aggregation_size =
+			mac_ctx->roam.configParam.tx_aggregation_size;
+		addbss_param->rx_aggregation_size =
+			mac_ctx->roam.configParam.rx_aggregation_size;
 	}
 	lim_log(mac_ctx, LOG2, FL("dot11_mode:%d nss value:%d"),
 			addbss_param->dot11_mode, addbss_param->nss);

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

@@ -610,6 +610,8 @@ lim_configure_ap_start_bss_session(tpAniSirGlobal mac_ctx, tpPESession session,
 	session->ssidHidden = sme_start_bss_req->ssidHidden;
 	session->wps_state = sme_start_bss_req->wps_state;
 	session->sap_dot11mc = sme_start_bss_req->sap_dot11mc;
+	session->vendor_vht_sap =
+			sme_start_bss_req->vendor_vht_sap;
 	lim_get_short_slot_from_phy_mode(mac_ctx, session, session->gLimPhyMode,
 		&session->shortSlotTimeSupported);
 	session->isCoalesingInIBSSAllowed =

+ 23 - 10
core/mac/src/pe/lim/lim_process_tdls.c

@@ -520,14 +520,16 @@ tSirRetStatus lim_send_tdls_dis_req_frame(tpAniSirGlobal pMac,
 		MAC_ADDR_ARRAY(peer_mac.bytes));
 
 	pMac->lim.tdls_frm_session_id = psessionEntry->peSessionId;
-	qdf_status = wma_tx_frameWithTxComplete(pMac, pPacket, (uint16_t) nBytes,
-					      TXRX_FRM_802_11_DATA,
-					      ANI_TXDIR_TODS,
-					      TID_AC_VI,
-					      lim_tx_complete, pFrame,
-					      lim_mgmt_tdls_tx_complete,
-					      HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME,
-					      smeSessionId, false, 0);
+	qdf_status = wma_tx_frameWithTxComplete(pMac, pPacket,
+					(uint16_t) nBytes,
+					TXRX_FRM_802_11_DATA,
+					ANI_TXDIR_TODS,
+					TID_AC_VI,
+					lim_tx_complete, pFrame,
+					lim_mgmt_tdls_tx_complete,
+					HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME |
+					HAL_USE_PEER_STA_REQUESTED_MASK,
+					smeSessionId, false, 0);
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		pMac->lim.tdls_frm_session_id = NO_SESSION;
 		lim_log(pMac, LOGE,
@@ -935,7 +937,8 @@ wma_tx_frame_with_tx_complete_send(tpAniSirGlobal pMac, void *pPacket,
 					  tid,
 					  lim_tx_complete, pFrame,
 					  lim_mgmt_tdls_tx_complete,
-					  HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME,
+					  HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME
+					  | HAL_USE_PEER_STA_REQUESTED_MASK,
 					  smeSessionId, flag, 0);
 }
 #else
@@ -954,11 +957,21 @@ wma_tx_frame_with_tx_complete_send(tpAniSirGlobal pMac, void *pPacket,
 					  tid,
 					  lim_tx_complete, pFrame,
 					  lim_mgmt_tdls_tx_complete,
-					  HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME,
+					  HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME
+					  | HAL_USE_PEER_STA_REQUESTED_MASK,
 					  smeSessionId, false, 0);
 }
 #endif
 
+void lim_set_tdls_flags(roam_offload_synch_ind *roam_sync_ind_ptr,
+		   tpPESession ft_session_ptr)
+{
+	roam_sync_ind_ptr->join_rsp->tdls_prohibited =
+		ft_session_ptr->tdls_prohibited;
+	roam_sync_ind_ptr->join_rsp->tdls_chan_swit_prohibited =
+		ft_session_ptr->tdls_chan_swit_prohibited;
+}
+
 /*
  * TDLS setup Request frame on AP link
  */

+ 3 - 2
core/mac/src/pe/lim/lim_prop_exts_utils.c

@@ -167,7 +167,7 @@ lim_extract_ap_capability(tpAniSirGlobal mac_ctx, uint8_t *p_ie,
 			session->vhtCapability) {
 		session->vhtCapabilityPresentInBeacon = 1;
 		if (((beacon_struct->Vendor1IEPresent &&
-		      beacon_struct->vendor2_ie.present &&
+		      beacon_struct->vendor_vht_ie.present &&
 		      beacon_struct->Vendor3IEPresent)) &&
 		      (((beacon_struct->VHTCaps.txMCSMap & VHT_MCS_3x3_MASK) ==
 			VHT_MCS_3x3_MASK) &&
@@ -224,7 +224,8 @@ lim_extract_ap_capability(tpAniSirGlobal mac_ctx, uint8_t *p_ie,
 		 * AP supports Nss > 1 in 160MHz mode then connect the STA
 		 * in 2x2 80MHz mode instead of connecting in 160MHz mode.
 		 */
-		if (vht_ch_wd > WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) {
+		if ((vht_ch_wd > WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) &&
+				mac_ctx->sta_prefer_80MHz_over_160MHz) {
 			if (!(IS_VHT_NSS_1x1(beacon_struct->VHTCaps.txMCSMap))
 					&&
 			   (!IS_VHT_NSS_1x1(beacon_struct->VHTCaps.rxMCSMap)))

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

@@ -304,14 +304,14 @@ void lim_send_reassoc_req_with_ft_ies_mgmt_frame(tpAniSirGlobal mac_ctx,
 			pe_session->is_vendor_specific_vhtcaps) {
 		lim_log(mac_ctx, LOG1,
 			FL("Populate Vendor VHT IEs in Re-Assoc Request"));
-		frm.vendor2_ie.present = 1;
-		frm.vendor2_ie.type =
+		frm.vendor_vht_ie.present = 1;
+		frm.vendor_vht_ie.type =
 			pe_session->vendor_specific_vht_ie_type;
-		frm.vendor2_ie.sub_type =
+		frm.vendor_vht_ie.sub_type =
 			pe_session->vendor_specific_vht_ie_sub_type;
-		frm.vendor2_ie.VHTCaps.present = 1;
+		frm.vendor_vht_ie.VHTCaps.present = 1;
 		populate_dot11f_vht_caps(mac_ctx, pe_session,
-				&frm.vendor2_ie.VHTCaps);
+				&frm.vendor_vht_ie.VHTCaps);
 		vht_enabled = true;
 	}
 	status = dot11f_get_packed_re_assoc_request_size(mac_ctx, &frm,

+ 23 - 6
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -1243,7 +1243,24 @@ lim_send_assoc_rsp_mgmt_frame(tpAniSirGlobal mac_ctx,
 			populate_dot11f_vht_caps(mac_ctx, pe_session,
 				&frm.VHTCaps);
 			populate_dot11f_vht_operation(mac_ctx, pe_session,
-				&frm.VHTOperation);
+					&frm.VHTOperation);
+			is_vht = true;
+		}
+		if (pe_session->vhtCapability &&
+		    pe_session->vendor_vht_sap &&
+		    (assoc_req != NULL) &&
+		    assoc_req->vendor_vht_ie.VHTCaps.present) {
+			lim_log(mac_ctx, LOG1,
+				FL("Populate Vendor VHT IEs in Assoc Rsponse"));
+			frm.vendor_vht_ie.present = 1;
+			frm.vendor_vht_ie.type =
+				pe_session->vendor_specific_vht_ie_type;
+			frm.vendor_vht_ie.sub_type =
+				pe_session->vendor_specific_vht_ie_sub_type;
+
+			frm.vendor_vht_ie.VHTCaps.present = 1;
+			populate_dot11f_vht_caps(mac_ctx, pe_session,
+				&frm.vendor_vht_ie.VHTCaps);
 			is_vht = true;
 		}
 		populate_dot11f_ext_cap(mac_ctx, is_vht, &frm.ExtCap,
@@ -1812,15 +1829,15 @@ lim_send_assoc_req_mgmt_frame(tpAniSirGlobal mac_ctx,
 			pe_session->is_vendor_specific_vhtcaps) {
 		lim_log(mac_ctx, LOG1,
 			FL("Populate Vendor VHT IEs in Assoc Request"));
-		frm->vendor2_ie.present = 1;
-		frm->vendor2_ie.type =
+		frm->vendor_vht_ie.present = 1;
+		frm->vendor_vht_ie.type =
 			pe_session->vendor_specific_vht_ie_type;
-		frm->vendor2_ie.sub_type =
+		frm->vendor_vht_ie.sub_type =
 			pe_session->vendor_specific_vht_ie_sub_type;
 
-		frm->vendor2_ie.VHTCaps.present = 1;
+		frm->vendor_vht_ie.VHTCaps.present = 1;
 		populate_dot11f_vht_caps(mac_ctx, pe_session,
-				&frm->vendor2_ie.VHTCaps);
+				&frm->vendor_vht_ie.VHTCaps);
 		vht_enabled = true;
 	}
 	if (pe_session->is_ext_caps_present)

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

@@ -1030,7 +1030,7 @@ lim_send_sme_disassoc_ind(tpAniSirGlobal pMac, tpDphHashNode pStaDs,
 
 	pSirSmeDisassocInd->sessionId = psessionEntry->smeSessionId;
 	pSirSmeDisassocInd->transactionId = psessionEntry->transactionId;
-	pSirSmeDisassocInd->statusCode = pStaDs->mlmStaContext.disassocReason;
+	pSirSmeDisassocInd->statusCode = eSIR_SME_DEAUTH_STATUS;
 	pSirSmeDisassocInd->reasonCode = pStaDs->mlmStaContext.disassocReason;
 
 	qdf_mem_copy(pSirSmeDisassocInd->bssid.bytes, psessionEntry->bssId,

+ 5 - 3
core/mac/src/pe/lim/lim_types.h

@@ -538,6 +538,11 @@ static inline tSirRetStatus lim_delete_tdls_peers(tpAniSirGlobal mac_ctx,
 						tpPESession session_entry)
 {
 	return eSIR_SUCCESS;
+}
+static inline void lim_init_tdls_data(tpAniSirGlobal pMac,
+					tpPESession pSessionEntry)
+{
+
 }
 #endif
 
@@ -551,9 +556,6 @@ void lim_tear_down_link_with_ap(tpAniSirGlobal, uint8_t, tSirMacReasonCodes);
 /* / Function that processes Max retries interrupt from TFP */
 void limHandleMaxRetriesInterrupt(uint32_t);
 
-/* / Function that processes messages deferred during Learn mode */
-void lim_process_deferred_message_queue(tpAniSirGlobal);
-
 /* / Function that defers the messages received */
 uint32_t lim_defer_msg(tpAniSirGlobal, tSirMsgQ *);
 

+ 70 - 67
core/mac/src/sys/legacy/src/utils/src/dot11f.c

@@ -33,7 +33,7 @@
  *
  *
  * This file was automatically generated by 'framesc'
- * Mon Sep 19 14:42:34 2016 from the following file(s):
+ * Mon Oct  3 12:40:25 2016 from the following file(s):
  *
  * dot11f.frms
  *
@@ -5949,25 +5949,25 @@ uint32_t dot11f_unpack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx,
 #define SigIesec_chan_offset_ele (0x007f)
 
 
-static const tFFDefn FFS_vendor2_ie[] = {
+static const tFFDefn FFS_vendor_vht_ie[] = {
 	{ NULL, 0, 0, 0,},
 };
 
-static const tIEDefn IES_vendor2_ie[] = {
-	{ offsetof(tDot11fIEvendor2_ie, VHTCaps), offsetof(tDot11fIEVHTCaps,
+static const tIEDefn IES_vendor_vht_ie[] = {
+	{ offsetof(tDot11fIEvendor_vht_ie, VHTCaps), offsetof(tDot11fIEVHTCaps,
 	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_VHTCAPS, 0, },
-	{ offsetof(tDot11fIEvendor2_ie, VHTOperation),
+	{ offsetof(tDot11fIEvendor_vht_ie, VHTOperation),
 	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
 	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_VHTOPERATION, 0, },
 	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
 };
 
-uint32_t dot11f_unpack_ie_vendor2_ie(tpAniSirGlobal pCtx,
-				     uint8_t *pBuf,
-				     uint8_t ielen,
-				     tDot11fIEvendor2_ie *pDst)
+uint32_t dot11f_unpack_ie_vendor_vht_ie(tpAniSirGlobal pCtx,
+					 uint8_t *pBuf,
+					 uint8_t ielen,
+					 tDot11fIEvendor_vht_ie *pDst)
 {
 	uint32_t status = DOT11F_PARSE_SUCCESS;
 	(void) pBuf; (void)ielen; /* Shutup the compiler */
@@ -5984,14 +5984,14 @@ uint32_t dot11f_unpack_ie_vendor2_ie(tpAniSirGlobal pCtx,
 	status |= unpack_core(pCtx,
 				pBuf,
 				ielen,
-				FFS_vendor2_ie,
-				IES_vendor2_ie,
+				FFS_vendor_vht_ie,
+				IES_vendor_vht_ie,
 				(uint8_t *)pDst,
 				sizeof(*pDst));
 	return status;
-} /* End dot11f_unpack_ie_vendor2_ie. */
+} /* End dot11f_unpack_ie_vendor_vht_ie. */
 
-#define SigIevendor2_ie (0x0080)
+#define SigIevendor_vht_ie (0x0080)
 
 
 static const tFFDefn FFS_AddTSRequest[] = {
@@ -6208,10 +6208,10 @@ static const tIEDefn IES_AssocRequest[] = {
 	{ offsetof(tDot11fAssocRequest, QosMapSet), offsetof(tDot11fIEQosMapSet,
 	present), 0, "QosMapSet", 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_QOSMAPSET, 0, },
-	{ offsetof(tDot11fAssocRequest, vendor2_ie),
-	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
-	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fAssocRequest, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{ offsetof(tDot11fAssocRequest, hs20vendor_ie),
 	offsetof(tDot11fIEhs20vendor_ie, present), 0, "hs20vendor_ie",
 	0, 7, 9, SigIehs20vendor_ie, {80, 111, 154, 16, 0},
@@ -6336,10 +6336,10 @@ static const tIEDefn IES_AssocResponse[] = {
 	{ offsetof(tDot11fAssocResponse, QosMapSet), offsetof(tDot11fIEQosMapSet,
 	present), 0, "QosMapSet", 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_QOSMAPSET, 0, },
-	{ offsetof(tDot11fAssocResponse, vendor2_ie),
-	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
-	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fAssocResponse, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};
 
 uint32_t dot11f_unpack_assoc_response(tpAniSirGlobal pCtx,
@@ -6567,9 +6567,10 @@ static const tIEDefn IES_Beacon[] = {
 	{ offsetof(tDot11fBeacon, Vendor1IE), offsetof(tDot11fIEVendor1IE,
 	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
 	3, DOT11F_EID_VENDOR1IE, 0, },
-	{ offsetof(tDot11fBeacon, vendor2_ie), offsetof(tDot11fIEvendor2_ie,
-	present), 0, "vendor2_ie", 0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fBeacon, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{ offsetof(tDot11fBeacon, Vendor3IE), offsetof(tDot11fIEVendor3IE,
 	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
 	3, DOT11F_EID_VENDOR3IE, 0, },
@@ -6768,9 +6769,10 @@ static const tIEDefn IES_Beacon2[] = {
 	{ offsetof(tDot11fBeacon2, Vendor1IE), offsetof(tDot11fIEVendor1IE,
 	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
 	3, DOT11F_EID_VENDOR1IE, 0, },
-	{ offsetof(tDot11fBeacon2, vendor2_ie), offsetof(tDot11fIEvendor2_ie,
-	present), 0, "vendor2_ie", 0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fBeacon2, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{ offsetof(tDot11fBeacon2, Vendor3IE), offsetof(tDot11fIEVendor3IE,
 	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
 	3, DOT11F_EID_VENDOR3IE, 0, },
@@ -6965,9 +6967,10 @@ static const tIEDefn IES_BeaconIEs[] = {
 	{ offsetof(tDot11fBeaconIEs, Vendor1IE), offsetof(tDot11fIEVendor1IE,
 	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
 	3, DOT11F_EID_VENDOR1IE, 0, },
-	{ offsetof(tDot11fBeaconIEs, vendor2_ie), offsetof(tDot11fIEvendor2_ie,
-	present), 0, "vendor2_ie", 0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fBeaconIEs, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{ offsetof(tDot11fBeaconIEs, Vendor3IE), offsetof(tDot11fIEVendor3IE,
 	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
 	3, DOT11F_EID_VENDOR3IE, 0, },
@@ -7573,10 +7576,10 @@ static const tIEDefn IES_ProbeResponse[] = {
 	{ offsetof(tDot11fProbeResponse, Vendor1IE), offsetof(tDot11fIEVendor1IE,
 	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
 	3, DOT11F_EID_VENDOR1IE, 0, },
-	{ offsetof(tDot11fProbeResponse, vendor2_ie),
-	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
-	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fProbeResponse, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{ offsetof(tDot11fProbeResponse, Vendor3IE), offsetof(tDot11fIEVendor3IE,
 	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
 	3, DOT11F_EID_VENDOR3IE, 0, },
@@ -7831,10 +7834,10 @@ static const tIEDefn IES_ReAssocRequest[] = {
 	{ offsetof(tDot11fReAssocRequest, QosMapSet),
 	offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet",
 	0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, },
-	{ offsetof(tDot11fReAssocRequest, vendor2_ie),
-	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
-	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fReAssocRequest, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{ offsetof(tDot11fReAssocRequest, hs20vendor_ie),
 	offsetof(tDot11fIEhs20vendor_ie, present), 0, "hs20vendor_ie",
 	0, 7, 9, SigIehs20vendor_ie, {80, 111, 154, 16, 0},
@@ -7965,10 +7968,10 @@ static const tIEDefn IES_ReAssocResponse[] = {
 	{ offsetof(tDot11fReAssocResponse, QosMapSet),
 	offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet",
 	0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, },
-	{ offsetof(tDot11fReAssocResponse, vendor2_ie),
-	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
-	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
-	3, DOT11F_EID_VENDOR2_IE, 0, },
+	{ offsetof(tDot11fReAssocResponse, vendor_vht_ie),
+	offsetof(tDot11fIEvendor_vht_ie, present), 0, "vendor_vht_ie",
+	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 0, 0},
+	3, DOT11F_EID_VENDOR_VHT_IE, 0, },
 	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};
 
 uint32_t dot11f_unpack_re_assoc_response(tpAniSirGlobal pCtx,
@@ -10274,13 +10277,13 @@ static uint32_t unpack_core(tpAniSirGlobal pCtx,
 						    sizeof(tDot11fIEsec_chan_offset_ele) *
 						    countOffset));
 					break;
-				case SigIevendor2_ie:
+				case SigIevendor_vht_ie:
 					status |=
-						dot11f_unpack_ie_vendor2_ie(
+						dot11f_unpack_ie_vendor_vht_ie(
 						    pCtx, pBufRemaining, len,
-						    (tDot11fIEvendor2_ie *)
+						    (tDot11fIEvendor_vht_ie *)
 						    (pFrm + pIe->offset +
-						    sizeof(tDot11fIEvendor2_ie) *
+						    sizeof(tDot11fIEvendor_vht_ie) *
 						    countOffset));
 					break;
 				default:
@@ -11453,8 +11456,8 @@ uint32_t dot11f_get_packed_ie_hs20vendor_ie(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_get_packed_ie_hs20vendor_ie. */
 
-uint32_t dot11f_get_packed_ie_vendor2_ie(tpAniSirGlobal pCtx,
-	tDot11fIEvendor2_ie *pIe, uint32_t *pnNeeded)
+uint32_t dot11f_get_packed_ie_vendor_vht_ie(tpAniSirGlobal pCtx,
+	tDot11fIEvendor_vht_ie *pIe, uint32_t *pnNeeded)
 {
 	uint32_t status = DOT11F_PARSE_SUCCESS;
 	(void)pCtx;
@@ -11462,11 +11465,11 @@ uint32_t dot11f_get_packed_ie_vendor2_ie(tpAniSirGlobal pCtx,
 		*pnNeeded += 1;
 		*pnNeeded += 1;
 		status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded,
-				IES_vendor2_ie);
+				IES_vendor_vht_ie);
 		break;
 	}
 	return status;
-} /* End dot11f_get_packed_ie_vendor2_ie. */
+} /* End dot11f_get_packed_ie_vendor_vht_ie. */
 
 uint32_t dot11f_get_packed_add_ts_request_size(tpAniSirGlobal pCtx,
 	tDot11fAddTSRequest *pFrm, uint32_t *pnNeeded)
@@ -12949,11 +12952,11 @@ static uint32_t get_packed_size_core(tpAniSirGlobal pCtx,
 					  (pFrm + pIe->offset + offset * i))->
 					  present;
 					break;
-				case SigIevendor2_ie:
-					offset = sizeof(tDot11fIEvendor2_ie);
+				case SigIevendor_vht_ie:
+					offset = sizeof(tDot11fIEvendor_vht_ie);
 					status |=
-						dot11f_get_packed_ie_vendor2_ie(
-						pCtx, (tDot11fIEvendor2_ie *)
+						dot11f_get_packed_ie_vendor_vht_ie(
+						pCtx, (tDot11fIEvendor_vht_ie *)
 						(pFrm + pIe->offset + offset * i),
 						pnNeeded);
 					break;
@@ -20413,17 +20416,17 @@ uint32_t dot11f_pack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx,
 	return DOT11F_PARSE_SUCCESS;
 } /* End dot11f_pack_ie_sec_chan_offset_ele. */
 
-uint32_t dot11f_pack_ie_vendor2_ie(tpAniSirGlobal pCtx,
-				   tDot11fIEvendor2_ie *pSrc,
-				   uint8_t *pBuf,
-				   uint32_t nBuf,
-				   uint32_t *pnConsumed)
+uint32_t dot11f_pack_ie_vendor_vht_ie(tpAniSirGlobal pCtx,
+				      tDot11fIEvendor_vht_ie *pSrc,
+				      uint8_t *pBuf,
+				      uint32_t nBuf,
+				      uint32_t *pnConsumed)
 {
 	uint8_t *pIeLen = 0;
 	uint32_t nConsumedOnEntry = *pnConsumed;
 	uint32_t nNeeded = 0U;
 	uint32_t status = DOT11F_PARSE_SUCCESS;
-	status = dot11f_get_packed_ie_vendor2_ie(pCtx, pSrc, &nNeeded);
+	status = dot11f_get_packed_ie_vendor_vht_ie(pCtx, pSrc, &nNeeded);
 	if (!DOT11F_SUCCEEDED(status))
 		return status;
 	while (pSrc->present) {
@@ -20450,8 +20453,8 @@ uint32_t dot11f_pack_ie_vendor2_ie(tpAniSirGlobal pCtx,
 				pBuf,
 				nBuf,
 				pnConsumed,
-				FFS_vendor2_ie,
-				IES_vendor2_ie);
+				FFS_vendor_vht_ie,
+				IES_vendor_vht_ie);
 		break;
 	}
 	(void)pCtx;
@@ -20459,7 +20462,7 @@ uint32_t dot11f_pack_ie_vendor2_ie(tpAniSirGlobal pCtx,
 		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
 	}
 	return status;
-} /* End dot11f_pack_ie_vendor2_ie. */
+} /* End dot11f_pack_ie_vendor_vht_ie. */
 
 uint32_t dot11f_pack_add_ts_request(tpAniSirGlobal pCtx,
 	tDot11fAddTSRequest *pFrm,
@@ -22402,12 +22405,12 @@ static uint32_t pack_core(tpAniSirGlobal pCtx,
 				sizeof(tDot11fIEsec_chan_offset_ele) * i),
 				pBufRemaining, nBufRemaining, &len);
 			break;
-			case SigIevendor2_ie:
+			case SigIevendor_vht_ie:
 			status |=
-				dot11f_pack_ie_vendor2_ie(
-				pCtx, (tDot11fIEvendor2_ie *)
+				dot11f_pack_ie_vendor_vht_ie(
+				pCtx, (tDot11fIEvendor_vht_ie *)
 				(pSrc + pIe->offset +
-				sizeof(tDot11fIEvendor2_ie) * i),
+				sizeof(tDot11fIEvendor_vht_ie) * i),
 				pBufRemaining, nBufRemaining, &len);
 			break;
 			default:

+ 0 - 4
core/mac/src/sys/legacy/src/utils/src/mac_trace.c

@@ -286,10 +286,6 @@ uint8_t *mac_trace_get_sme_msg_string(uint16_t sme_msg)
 		CASE_RETURN_STRING(eWNI_SME_CLEAR_DFS_CHANNEL_LIST);
 		CASE_RETURN_STRING(eWNI_SME_GET_SNR_REQ);
 		CASE_RETURN_STRING(eWNI_SME_LINK_STATUS_IND);
-
-		CASE_RETURN_STRING(eWNI_PMC_MSG_TYPES_BEGIN);
-
-		CASE_RETURN_STRING(eWNI_PMC_SMPS_STATE_IND);
 		CASE_RETURN_STRING(eWNI_SME_RRM_MSG_TYPE_BEGIN);
 		CASE_RETURN_STRING(eWNI_SME_NEIGHBOR_REPORT_REQ_IND);
 		CASE_RETURN_STRING(eWNI_SME_NEIGHBOR_REPORT_IND);

+ 61 - 44
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -2561,19 +2561,19 @@ tSirRetStatus sir_convert_probe_frame2_struct(tpAniSirGlobal pMac,
 	pProbeResp->Vendor1IEPresent = pr->Vendor1IE.present;
 	pProbeResp->Vendor3IEPresent = pr->Vendor3IE.present;
 
-	pProbeResp->vendor2_ie.present = pr->vendor2_ie.present;
-	if (pr->vendor2_ie.present) {
-		pProbeResp->vendor2_ie.type = pr->vendor2_ie.type;
-		pProbeResp->vendor2_ie.sub_type = pr->vendor2_ie.sub_type;
-	}
-	if (pr->vendor2_ie.VHTCaps.present) {
-		qdf_mem_copy(&pProbeResp->vendor2_ie.VHTCaps,
-				&pr->vendor2_ie.VHTCaps,
+	pProbeResp->vendor_vht_ie.present = pr->vendor_vht_ie.present;
+	if (pr->vendor_vht_ie.present) {
+		pProbeResp->vendor_vht_ie.type = pr->vendor_vht_ie.type;
+		pProbeResp->vendor_vht_ie.sub_type = pr->vendor_vht_ie.sub_type;
+	}
+	if (pr->vendor_vht_ie.VHTCaps.present) {
+		qdf_mem_copy(&pProbeResp->vendor_vht_ie.VHTCaps,
+				&pr->vendor_vht_ie.VHTCaps,
 				sizeof(tDot11fIEVHTCaps));
 	}
-	if (pr->vendor2_ie.VHTOperation.present) {
-		qdf_mem_copy(&pProbeResp->vendor2_ie.VHTOperation,
-				&pr->vendor2_ie.VHTOperation,
+	if (pr->vendor_vht_ie.VHTOperation.present) {
+		qdf_mem_copy(&pProbeResp->vendor_vht_ie.VHTOperation,
+				&pr->vendor_vht_ie.VHTOperation,
 				sizeof(tDot11fIEVHTOperation));
 	}
 	/* Update HS 2.0 Information Element */
@@ -2798,6 +2798,22 @@ sir_convert_assoc_req_frame2_struct(tpAniSirGlobal pMac,
 			ext_cap->timing_meas, ext_cap->fine_time_meas_initiator,
 			ext_cap->fine_time_meas_responder);
 	}
+
+	pAssocReq->vendor_vht_ie.present = ar->vendor_vht_ie.present;
+	if (ar->vendor_vht_ie.present) {
+		pAssocReq->vendor_vht_ie.type = ar->vendor_vht_ie.type;
+		pAssocReq->vendor_vht_ie.sub_type = ar->vendor_vht_ie.sub_type;
+
+		if (ar->vendor_vht_ie.VHTCaps.present) {
+			qdf_mem_copy(&pAssocReq->vendor_vht_ie.VHTCaps,
+				     &ar->vendor_vht_ie.VHTCaps,
+				     sizeof(tDot11fIEVHTCaps));
+			lim_log(pMac, LOG1,
+				FL("Received Assoc Request with Vendor specific VHT Cap"));
+			lim_log_vht_cap(pMac, &pAssocReq->VHTCaps);
+		}
+	}
+
 	qdf_mem_free(ar);
 	return eSIR_SUCCESS;
 
@@ -2998,27 +3014,27 @@ sir_convert_assoc_resp_frame2_struct(tpAniSirGlobal pMac,
 		lim_log_qos_map_set(pMac, &pAssocRsp->QosMapSet);
 	}
 
-	pAssocRsp->vendor2_ie.present = ar.vendor2_ie.present;
-	if (ar.vendor2_ie.present) {
-		pAssocRsp->vendor2_ie.type = ar.vendor2_ie.type;
-		pAssocRsp->vendor2_ie.sub_type = ar.vendor2_ie.sub_type;
+	pAssocRsp->vendor_vht_ie.present = ar.vendor_vht_ie.present;
+	if (ar.vendor_vht_ie.present) {
+		pAssocRsp->vendor_vht_ie.type = ar.vendor_vht_ie.type;
+		pAssocRsp->vendor_vht_ie.sub_type = ar.vendor_vht_ie.sub_type;
 	}
 	if (ar.OBSSScanParameters.present) {
 		qdf_mem_copy(&pAssocRsp->obss_scanparams,
 			&ar.OBSSScanParameters,
 			sizeof(struct sDot11fIEOBSSScanParameters));
 	}
-	if (ar.vendor2_ie.VHTCaps.present) {
-		qdf_mem_copy(&pAssocRsp->vendor2_ie.VHTCaps,
-				&ar.vendor2_ie.VHTCaps,
+	if (ar.vendor_vht_ie.VHTCaps.present) {
+		qdf_mem_copy(&pAssocRsp->vendor_vht_ie.VHTCaps,
+				&ar.vendor_vht_ie.VHTCaps,
 				sizeof(tDot11fIEVHTCaps));
 		lim_log(pMac, LOG1,
 		FL("Received Assoc Response with Vendor specific VHT Cap"));
 		lim_log_vht_cap(pMac, &pAssocRsp->VHTCaps);
 	}
-	if (ar.vendor2_ie.VHTOperation.present) {
-		qdf_mem_copy(&pAssocRsp->vendor2_ie.VHTOperation,
-				&ar.vendor2_ie.VHTOperation,
+	if (ar.vendor_vht_ie.VHTOperation.present) {
+		qdf_mem_copy(&pAssocRsp->vendor_vht_ie.VHTOperation,
+				&ar.vendor_vht_ie.VHTOperation,
 				sizeof(tDot11fIEVHTOperation));
 		lim_log(pMac, LOG1,
 		FL("Received Assoc Response with Vendor specific VHT Oper"));
@@ -3733,22 +3749,23 @@ sir_parse_beacon_ie(tpAniSirGlobal pMac,
 
 	pBeaconStruct->Vendor1IEPresent = pBies->Vendor1IE.present;
 	pBeaconStruct->Vendor3IEPresent = pBies->Vendor3IE.present;
-	pBeaconStruct->vendor2_ie.present = pBies->vendor2_ie.present;
-	if (pBies->vendor2_ie.present) {
-		pBeaconStruct->vendor2_ie.type = pBies->vendor2_ie.type;
-		pBeaconStruct->vendor2_ie.sub_type = pBies->vendor2_ie.sub_type;
+	pBeaconStruct->vendor_vht_ie.present = pBies->vendor_vht_ie.present;
+	if (pBies->vendor_vht_ie.present) {
+		pBeaconStruct->vendor_vht_ie.type = pBies->vendor_vht_ie.type;
+		pBeaconStruct->vendor_vht_ie.sub_type =
+						pBies->vendor_vht_ie.sub_type;
 	}
 
-	if (pBies->vendor2_ie.VHTCaps.present) {
-		pBeaconStruct->vendor2_ie.VHTCaps.present = 1;
-		qdf_mem_copy(&pBeaconStruct->vendor2_ie.VHTCaps,
-				&pBies->vendor2_ie.VHTCaps,
+	if (pBies->vendor_vht_ie.VHTCaps.present) {
+		pBeaconStruct->vendor_vht_ie.VHTCaps.present = 1;
+		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTCaps,
+				&pBies->vendor_vht_ie.VHTCaps,
 				sizeof(tDot11fIEVHTCaps));
 	}
-	if (pBies->vendor2_ie.VHTOperation.present) {
-		pBeaconStruct->vendor2_ie.VHTOperation.present = 1;
-		qdf_mem_copy(&pBeaconStruct->vendor2_ie.VHTOperation,
-				&pBies->vendor2_ie.VHTOperation,
+	if (pBies->vendor_vht_ie.VHTOperation.present) {
+		pBeaconStruct->vendor_vht_ie.VHTOperation.present = 1;
+		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTOperation,
+				&pBies->vendor_vht_ie.VHTOperation,
 				sizeof(tDot11fIEVHTOperation));
 	}
 	if (pBies->ExtCap.present) {
@@ -4090,24 +4107,24 @@ sir_convert_beacon_frame2_struct(tpAniSirGlobal pMac,
 	pBeaconStruct->Vendor1IEPresent = pBeacon->Vendor1IE.present;
 	pBeaconStruct->Vendor3IEPresent = pBeacon->Vendor3IE.present;
 
-	pBeaconStruct->vendor2_ie.present = pBeacon->vendor2_ie.present;
-	if (pBeacon->vendor2_ie.present) {
-		pBeaconStruct->vendor2_ie.type = pBeacon->vendor2_ie.type;
-		pBeaconStruct->vendor2_ie.sub_type =
-			pBeacon->vendor2_ie.sub_type;
+	pBeaconStruct->vendor_vht_ie.present = pBeacon->vendor_vht_ie.present;
+	if (pBeacon->vendor_vht_ie.present) {
+		pBeaconStruct->vendor_vht_ie.type = pBeacon->vendor_vht_ie.type;
+		pBeaconStruct->vendor_vht_ie.sub_type =
+			pBeacon->vendor_vht_ie.sub_type;
 	}
-	if (pBeacon->vendor2_ie.present) {
+	if (pBeacon->vendor_vht_ie.present) {
 		PELOG1(lim_log(pMac, LOG1,
 		FL("Vendor Specific VHT caps present in Beacon Frame!"));
 		      )
 	}
-	if (pBeacon->vendor2_ie.VHTCaps.present) {
-		qdf_mem_copy(&pBeaconStruct->vendor2_ie.VHTCaps,
-				&pBeacon->vendor2_ie.VHTCaps,
+	if (pBeacon->vendor_vht_ie.VHTCaps.present) {
+		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTCaps,
+				&pBeacon->vendor_vht_ie.VHTCaps,
 				sizeof(tDot11fIEVHTCaps));
 	}
-	if (pBeacon->vendor2_ie.VHTOperation.present) {
-		qdf_mem_copy(&pBeaconStruct->vendor2_ie.VHTOperation,
+	if (pBeacon->vendor_vht_ie.VHTOperation.present) {
+		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTOperation,
 				&pBeacon->VHTOperation,
 				sizeof(tDot11fIEVHTOperation));
 	}

+ 2 - 2
core/sap/inc/sap_api.h

@@ -589,8 +589,8 @@ typedef struct sap_Config {
 	uint8_t short_retry_limit;
 	uint8_t long_retry_limit;
 	uint8_t ampdu_size;
-	tSirMacRateSet supp_rate_set;
-	tSirMacRateSet extended_rate_set;
+	tSirMacRateSet supported_rates;
+	tSirMacRateSet extended_rates;
 	enum sap_acs_dfs_mode acs_dfs_mode;
 } tsap_Config_t;
 

+ 16 - 0
core/sap/src/sap_fsm.c

@@ -4199,6 +4199,22 @@ sapconvert_to_csr_profile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType
 	}
 	profile->sap_dot11mc = pconfig_params->sap_dot11mc;
 
+	if (pconfig_params->supported_rates.numRates) {
+		qdf_mem_copy(profile->supported_rates.rate,
+				pconfig_params->supported_rates.rate,
+				pconfig_params->supported_rates.numRates);
+		profile->supported_rates.numRates =
+			pconfig_params->supported_rates.numRates;
+	}
+
+	if (pconfig_params->extended_rates.numRates) {
+		qdf_mem_copy(profile->extended_rates.rate,
+				pconfig_params->extended_rates.rate,
+				pconfig_params->extended_rates.numRates);
+		profile->extended_rates.numRates =
+			pconfig_params->extended_rates.numRates;
+	}
+
 	return eSAP_STATUS_SUCCESS;     /* Success. */
 }
 

+ 20 - 9
core/sme/inc/csr_api.h

@@ -476,10 +476,12 @@ typedef enum {
 	eCSR_ROAM_PREAUTH_STATUS_SUCCESS,
 	eCSR_ROAM_PREAUTH_STATUS_FAILURE,
 	eCSR_ROAM_HANDOVER_SUCCESS,
-#ifdef FEATURE_WLAN_TDLS
+	/*
+	 * TDLS callback events
+	 */
 	eCSR_ROAM_TDLS_STATUS_UPDATE,
 	eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND,
-#endif
+
 	/* Disaconnect all the clients */
 	eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS,
 	/* Stopbss triggered from SME due to different */
@@ -587,7 +589,7 @@ typedef enum {
 	eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED,
 	/* Assoc rejected due to concurrent session running on a diff channel */
 	eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL,
-#ifdef FEATURE_WLAN_TDLS
+	/* TDLS events */
 	eCSR_ROAM_RESULT_ADD_TDLS_PEER,
 	eCSR_ROAM_RESULT_UPDATE_TDLS_PEER,
 	eCSR_ROAM_RESULT_DELETE_TDLS_PEER,
@@ -598,7 +600,6 @@ typedef enum {
 	eCSR_ROAM_RESULT_TDLS_SHOULD_TEARDOWN,
 	eCSR_ROAM_RESULT_TDLS_SHOULD_PEER_DISCONNECTED,
 	eCSR_ROAM_RESULT_TDLS_CONNECTION_TRACKER_NOTIFICATION,
-#endif
 
 	eCSR_ROAM_RESULT_IBSS_PEER_INFO_SUCCESS,
 	eCSR_ROAM_RESULT_IBSS_PEER_INFO_FAILED,
@@ -965,9 +966,10 @@ typedef struct tagCsrRoamProfile {
 	tSirAddIeParams addIeParams;
 	uint8_t sap_dot11mc;
 	uint8_t beacon_tx_rate;
-	tSirMacRateSet supp_rate_set;
-	tSirMacRateSet extended_rate_set;
+	tSirMacRateSet  supported_rates;
+	tSirMacRateSet  extended_rates;
 	bool do_not_roam;
+
 } tCsrRoamProfile;
 
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
@@ -1215,6 +1217,7 @@ typedef struct tagCsrConfigParam {
 	uint8_t enable_txbf_sap_mode;
 	uint8_t enable2x2;
 	bool enableVhtFor24GHz;
+	bool vendor_vht_sap;
 	uint8_t enableMuBformee;
 	uint8_t enableVhtpAid;
 	uint8_t enableVhtGid;
@@ -1304,6 +1307,8 @@ typedef struct tagCsrConfigParam {
 	enum wmi_dwelltime_adaptive_mode scan_adaptive_dwell_mode;
 	enum wmi_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode;
 	struct csr_sta_roam_policy_params sta_roam_policy_params;
+	uint32_t tx_aggregation_size;
+	uint32_t rx_aggregation_size;
 } tCsrConfigParam;
 
 /* Tush */
@@ -1382,6 +1387,11 @@ typedef struct tagCsrRoamInfo {
 	uint32_t roc_scan_id;
 	uint32_t rxChan;
 #ifdef FEATURE_WLAN_TDLS
+	/*
+	 * TDLS parameters to check whether TDLS
+	 * and TDLS channel switch is allowed in the
+	 * AP network
+	 */
 	uint8_t staType;
 	bool tdls_prohibited;           /* per ExtCap in Assoc/Reassoc resp */
 	bool tdls_chan_swit_prohibited; /* per ExtCap in Assoc/Reassoc resp */
@@ -1736,10 +1746,11 @@ QDF_STATUS csr_roam_issue_ft_roam_offload_synch(tHalHandle hHal,
 #endif
 typedef void (*tCsrLinkStatusCallback)(uint8_t status, void *pContext);
 #ifdef FEATURE_WLAN_TDLS
-void csr_roam_fill_tdls_info(tCsrRoamInfo *roam_info, tpSirSmeJoinRsp join_rsp);
+void csr_roam_fill_tdls_info(tpAniSirGlobal mac_ctx, tCsrRoamInfo *roam_info,
+				tpSirSmeJoinRsp join_rsp);
 #else
-static inline void csr_roam_fill_tdls_info(tCsrRoamInfo *roam_info,
-		tpSirSmeJoinRsp join_rsp)
+static inline void csr_roam_fill_tdls_info(tpAniSirGlobal mac_ctx, tCsrRoamInfo *roam_info,
+				tpSirSmeJoinRsp join_rsp)
 {}
 #endif
 

+ 3 - 0
core/sme/inc/csr_internal.h

@@ -663,9 +663,12 @@ typedef struct tagCsrConfig {
 	uint32_t edca_bk_aifs;
 	uint32_t edca_be_aifs;
 	bool enable_fatal_event;
+	bool vendor_vht_sap;
 	enum wmi_dwelltime_adaptive_mode scan_adaptive_dwell_mode;
 	enum wmi_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode;
 	struct csr_sta_roam_policy_params sta_roam_policy;
+	uint32_t tx_aggregation_size;
+	uint32_t rx_aggregation_size;
 } tCsrConfig;
 
 typedef struct tagCsrChannelPowerInfo {

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

@@ -1316,4 +1316,13 @@ QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal);
 QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal,
 	struct encrypt_decrypt_req_params *encrypt_decrypt_params);
 
+/**
+ * sme_set_cts2self_for_p2p_go() - sme function to set ini parms to FW.
+ * @hal:                    reference to the HAL
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal);
+void sme_set_prefer_80MHz_over_160MHz(tHalHandle hal,
+		bool sta_prefer_80MHz_over_160MHz);
 #endif /* #if !defined( __SME_API_H ) */

+ 136 - 2
core/sme/src/common/sme_api.c

@@ -1073,6 +1073,104 @@ bool sme_command_pending(tpAniSirGlobal pMac)
 					 LL_ACCESS_NOLOCK);
 }
 
+/**
+ * sme_get_sessionid_from_activelist() - gets session id
+ * @mac: mac context
+ *
+ * This function is used to get session id from sme command
+ * active list
+ *
+ * Return: returns session id
+ */
+uint32_t sme_get_sessionid_from_activelist(tpAniSirGlobal mac)
+{
+	tListElem *entry;
+	tSmeCmd *command;
+	uint32_t session_id = CSR_SESSION_ID_INVALID;
+
+	entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
+	if (entry) {
+		command = GET_BASE_ADDR(entry, tSmeCmd, Link);
+		session_id = command->sessionId;
+	}
+
+	return session_id;
+}
+
+/**
+ * sme_state_info_dump() - prints state information of sme layer
+ * @buf: buffer pointer
+ * @size: size of buffer to be filled
+ *
+ * This function is used to dump state information of sme layer
+ *
+ * Return: None
+ */
+static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
+{
+	uint32_t session_id, active_session_id;
+	tHalHandle hal;
+	tpAniSirGlobal mac;
+	uint16_t len = 0;
+	char *buf = *buf_ptr;
+	eCsrConnectState connect_state;
+
+	hal = cds_get_context(QDF_MODULE_ID_SME);
+	if (hal == NULL) {
+		QDF_ASSERT(0);
+		return;
+	}
+
+	mac = PMAC_STRUCT(hal);
+	sms_log(mac, LOG1, FL("size of buffer: %d"), *size);
+
+	active_session_id = sme_get_sessionid_from_activelist(mac);
+	if (active_session_id != CSR_SESSION_ID_INVALID) {
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n active command sessionid %d", active_session_id);
+	}
+
+	for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
+		if (CSR_IS_SESSION_VALID(mac, session_id)) {
+			connect_state =
+				mac->roam.roamSession[session_id].connectState;
+			if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
+			     connect_state)
+			    || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
+				connect_state)) {
+				len += qdf_scnprintf(buf + len, *size - len,
+					"\n NeighborRoamState: %d",
+					mac->roam.neighborRoamInfo[session_id].
+						neighborRoamState);
+				len += qdf_scnprintf(buf + len, *size - len,
+					"\n RoamState: %d", mac->roam.
+						curState[session_id]);
+				len += qdf_scnprintf(buf + len, *size - len,
+					"\n RoamSubState: %d", mac->roam.
+						curSubState[session_id]);
+				len += qdf_scnprintf(buf + len, *size - len,
+					"\n ConnectState: %d",
+					connect_state);
+			}
+		}
+	}
+
+	*size -= len;
+	*buf_ptr += len;
+}
+
+/**
+ * sme_register_debug_callback() - registration function sme layer
+ * to print sme state information
+ *
+ * Return: None
+ */
+static void sme_register_debug_callback(void)
+{
+	qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
+}
+
+
 /* Global APIs */
 
 /**
@@ -1134,6 +1232,7 @@ QDF_STATUS sme_open(tHalHandle hHal)
 	}
 	sme_p2p_open(pMac);
 	sme_trace_init(pMac);
+	sme_register_debug_callback();
 	return status;
 }
 
@@ -2495,8 +2594,6 @@ QDF_STATUS sme_process_msg(tHalHandle hHal, cds_msg_t *pMsg)
 		qdf_mem_free(pMsg->bodyptr);
 		break;
 #endif
-	case eWNI_PMC_SMPS_STATE_IND:
-		break;
 	case WNI_CFG_SET_CNF:
 	case WNI_CFG_DNLD_CNF:
 	case WNI_CFG_GET_RSP:
@@ -11115,6 +11212,18 @@ void sme_get_command_q_status(tHalHandle hHal)
 
 	return;
 }
+/**
+ * sme_set_prefer_80MHz_over_160MHz() - API to set sta_prefer_80MHz_over_160MHz
+ * @hal:           The handle returned by macOpen
+ * @sta_prefer_80MHz_over_160MHz: sta_prefer_80MHz_over_160MHz config param
+ */
+void sme_set_prefer_80MHz_over_160MHz(tHalHandle hal,
+		bool sta_prefer_80MHz_over_160MHz)
+{
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+	mac_ctx->sta_prefer_80MHz_over_160MHz = sta_prefer_80MHz_over_160MHz;
+}
+
 #ifdef WLAN_FEATURE_DSRC
 /**
  * sme_set_dot11p_config() - API to set the 802.11p config
@@ -16715,3 +16824,28 @@ QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal)
 	}
 	return status;
 }
+
+QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle)
+{
+	cds_msg_t message;
+	void *wma_handle;
+
+	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma_handle) {
+		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
+				"wma_handle is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	message.bodyptr = NULL;
+	message.type = WMA_SET_CTS2SELF_FOR_STA;
+
+	if (QDF_STATUS_SUCCESS !=
+		wma_set_cts2self_for_p2p_go(wma_handle, true)) {
+		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
+			"%s: Failed to set cts2self for p2p GO to firmware",
+			__func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+	return QDF_STATUS_SUCCESS;
+}

+ 245 - 137
core/sme/src/csr/csr_api_roam.c

@@ -2427,6 +2427,8 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
 			pParam->isRoamOffloadEnabled;
 #endif
 		pMac->roam.configParam.obssEnabled = pParam->obssEnabled;
+		pMac->roam.configParam.vendor_vht_sap =
+			pParam->vendor_vht_sap;
 		pMac->roam.configParam.conc_custom_rule1 =
 			pParam->conc_custom_rule1;
 		pMac->roam.configParam.conc_custom_rule2 =
@@ -2518,6 +2520,11 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
 		pMac->roam.configParam.sta_roam_policy.skip_unsafe_channels =
 			pParam->sta_roam_policy_params.skip_unsafe_channels;
 
+		pMac->roam.configParam.tx_aggregation_size =
+			pParam->tx_aggregation_size;
+		pMac->roam.configParam.rx_aggregation_size =
+			pParam->rx_aggregation_size;
+
 	}
 	return status;
 }
@@ -2648,8 +2655,10 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
 	pParam->enable_dot11p = pMac->enable_dot11p;
 	csr_set_channels(pMac, pParam);
 	pParam->obssEnabled = cfg_params->obssEnabled;
+	pParam->vendor_vht_sap =
+		pMac->roam.configParam.vendor_vht_sap;
 	pParam->roam_dense_rssi_thresh_offset =
-			cfg_params->roam_params.dense_rssi_thresh_offset;
+		cfg_params->roam_params.dense_rssi_thresh_offset;
 	pParam->roam_dense_min_aps =
 			cfg_params->roam_params.dense_min_aps_cnt;
 	pParam->roam_dense_traffic_thresh =
@@ -2726,6 +2735,10 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
 		pMac->roam.configParam.sta_roam_policy.dfs_mode;
 	pParam->sta_roam_policy_params.skip_unsafe_channels =
 		pMac->roam.configParam.sta_roam_policy.skip_unsafe_channels;
+	pParam->tx_aggregation_size =
+		pMac->roam.configParam.tx_aggregation_size;
+	pParam->rx_aggregation_size =
+		pMac->roam.configParam.rx_aggregation_size;
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -7315,6 +7328,20 @@ QDF_STATUS csr_roam_copy_profile(tpAniSirGlobal pMac,
 	}
 	qdf_mem_copy(&pDstProfile->addIeParams, &pSrcProfile->addIeParams,
 			sizeof(tSirAddIeParams));
+	if (pSrcProfile->supported_rates.numRates) {
+		qdf_mem_copy(pDstProfile->supported_rates.rate,
+				pSrcProfile->supported_rates.rate,
+				pSrcProfile->supported_rates.numRates);
+		pDstProfile->supported_rates.numRates =
+			pSrcProfile->supported_rates.numRates;
+	}
+	if (pSrcProfile->extended_rates.numRates) {
+		qdf_mem_copy(pDstProfile->extended_rates.rate,
+				pSrcProfile->extended_rates.rate,
+				pSrcProfile->extended_rates.numRates);
+		pDstProfile->extended_rates.numRates =
+			pSrcProfile->extended_rates.numRates;
+	}
 end:
 	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		csr_release_profile(pMac, pDstProfile);
@@ -12517,12 +12544,11 @@ uint8_t csr_roam_get_ibss_start_channel_number24(tpAniSirGlobal pMac)
 
 	return channel;
 }
-
 /**
  * csr_populate_basic_rates() - populates OFDM or CCK rates
  * @rates:         rate struct to populate
- * @type:          true: ofdm rates, false: cck rates
- * @masked:        indicates if rates are to be masked with
+ * @is_ofdm_rates:          true: ofdm rates, false: cck rates
+ * @is_basic_rates:        indicates if rates are to be masked with
  *                 CSR_DOT11_BASIC_RATE_MASK
  *
  * This function will populate OFDM or CCK rates
@@ -12530,8 +12556,10 @@ uint8_t csr_roam_get_ibss_start_channel_number24(tpAniSirGlobal pMac)
  * Return: void
  */
 static void
-csr_populate_basic_rates(tSirMacRateSet *rate_set, bool type, bool masked)
+csr_populate_basic_rates(tSirMacRateSet *rate_set, bool is_ofdm_rates,
+		bool is_basic_rates)
 {
+	int i = 0;
 	uint8_t ofdm_rates[8] = {
 		SIR_MAC_RATE_6,
 		SIR_MAC_RATE_9,
@@ -12549,23 +12577,30 @@ csr_populate_basic_rates(tSirMacRateSet *rate_set, bool type, bool masked)
 		SIR_MAC_RATE_11
 	};
 
-	if (type == true) {
+	if (is_ofdm_rates == true) {
 		rate_set->numRates = 8;
 		qdf_mem_copy(rate_set->rate, ofdm_rates, sizeof(ofdm_rates));
-		if (masked) {
+		if (is_basic_rates) {
 			rate_set->rate[0] |= CSR_DOT11_BASIC_RATE_MASK;
 			rate_set->rate[2] |= CSR_DOT11_BASIC_RATE_MASK;
 			rate_set->rate[4] |= CSR_DOT11_BASIC_RATE_MASK;
 		}
+		for (i = 0; i < rate_set->numRates; i++)
+			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
+			FL("Default OFDM rate is %2x"), rate_set->rate[i]);
 	} else {
 		rate_set->numRates = 4;
 		qdf_mem_copy(rate_set->rate, cck_rates, sizeof(cck_rates));
-		if (masked) {
+		if (is_basic_rates) {
 			rate_set->rate[0] |= CSR_DOT11_BASIC_RATE_MASK;
 			rate_set->rate[1] |= CSR_DOT11_BASIC_RATE_MASK;
 			rate_set->rate[2] |= CSR_DOT11_BASIC_RATE_MASK;
 			rate_set->rate[3] |= CSR_DOT11_BASIC_RATE_MASK;
 		}
+		for (i = 0; i < rate_set->numRates; i++)
+			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
+			FL("Default CCK rate is %2x"), rate_set->rate[i]);
+
 	}
 }
 
@@ -12600,6 +12635,41 @@ csr_convert_mode_to_nw_type(eCsrCfgDot11Mode dot11_mode, eCsrBand band)
 	return eSIR_DONOT_USE_NW_TYPE;
 }
 
+/**
+ * csr_populate_supported_rates_from_hostapd() - populates operational
+ * and extended rates.
+ * from hostapd.conf file
+ * @opr_rates:         rate struct to populate operational rates
+ * @ext_rates:         rate struct to populate extended rates
+ * @profile:       bss profile
+ *
+ * Return: void
+ */
+static void csr_populate_supported_rates_from_hostapd(tSirMacRateSet *opr_rates,
+		tSirMacRateSet *ext_rates,
+		tCsrRoamProfile *pProfile)
+{
+	int i = 0;
+	if (pProfile->supported_rates.numRates) {
+		opr_rates->numRates = pProfile->supported_rates.numRates;
+		qdf_mem_copy(opr_rates->rate,
+				pProfile->supported_rates.rate,
+				pProfile->supported_rates.numRates);
+		for (i = 0; i < opr_rates->numRates; i++)
+			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
+			FL("Supported Rate is %2x"), opr_rates->rate[i]);
+	}
+	if (pProfile->extended_rates.numRates) {
+		ext_rates->numRates =
+			pProfile->extended_rates.numRates;
+		qdf_mem_copy(ext_rates->rate,
+				pProfile->extended_rates.rate,
+				pProfile->extended_rates.numRates);
+		for (i = 0; i < ext_rates->numRates; i++)
+			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
+			FL("Extended Rate is %2x"), ext_rates->rate[i]);
+	}
+}
 /**
  * csr_roam_get_bss_start_parms() - get bss start param from profile
  * @pMac:          mac global context
@@ -12642,58 +12712,77 @@ csr_roam_get_bss_start_parms(tpAniSirGlobal pMac,
 
 	nw_type = csr_convert_mode_to_nw_type(pParam->uCfgDot11Mode, band);
 	ext_rates->numRates = 0;
-
-	switch (nw_type) {
-	default:
-		sms_log(pMac, LOGE, FL("sees an unknown pSirNwType (%d)"),
-			nw_type);
-	case eSIR_11A_NW_TYPE:
-		csr_populate_basic_rates(opr_rates, true, true);
-		if (eCSR_OPERATING_CHANNEL_ANY != tmp_opr_ch) {
-			opr_ch = tmp_opr_ch;
-			break;
-		}
-		opr_ch = csr_roam_get_ibss_start_channel_number50(pMac);
-		if (0 == opr_ch &&
-		    CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
-		    CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)) {
-			/*
-			 * We could not find a 5G channel by auto pick, let's
-			 * try 2.4G channels. We only do this here because
-			 * csr_roam_get_phy_mode_band_for_bss always picks 11a
-			 * for AUTO
-			 */
-			nw_type = eSIR_11B_NW_TYPE;
-			opr_ch = csr_roam_get_ibss_start_channel_number24(pMac);
-			csr_populate_basic_rates(opr_rates, false, true);
-		}
-		break;
-	case eSIR_11B_NW_TYPE:
-		csr_populate_basic_rates(opr_rates, false, true);
-		if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch)
-			opr_ch = csr_roam_get_ibss_start_channel_number24(pMac);
-		else
-			opr_ch = tmp_opr_ch;
-		break;
-	case eSIR_11G_NW_TYPE:
-		/* For P2P Client and P2P GO, disable 11b rates */
-		if ((pProfile->csrPersona == QDF_P2P_CLIENT_MODE)
-		    || (pProfile->csrPersona == QDF_P2P_GO_MODE)
-		    || (eCSR_CFG_DOT11_MODE_11G_ONLY ==
-					pParam->uCfgDot11Mode)) {
+	/*
+	 * hostapd.conf will populate its basic and extended rates
+	 * as per hw_mode but if acs in ini is enabled, driver should
+	 * ignore basic and extended rates from hostapd.conf and should
+	 * populate default rates.
+	 */
+	if (pProfile->supported_rates.numRates ||
+			pProfile->extended_rates.numRates) {
+		csr_populate_supported_rates_from_hostapd(opr_rates,
+				ext_rates, pProfile);
+		pParam->operationChn = tmp_opr_ch;
+	} else {
+		switch (nw_type) {
+		default:
+			sms_log(pMac, LOGE,
+					FL("sees an unknown pSirNwType (%d)"),
+					nw_type);
+		case eSIR_11A_NW_TYPE:
 			csr_populate_basic_rates(opr_rates, true, true);
-		} else {
+			if (eCSR_OPERATING_CHANNEL_ANY != tmp_opr_ch) {
+				opr_ch = tmp_opr_ch;
+				break;
+			}
+			opr_ch = csr_roam_get_ibss_start_channel_number50(pMac);
+			if (0 == opr_ch &&
+			    CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
+			    CSR_IS_PHY_MODE_DUAL_BAND(
+				    pMac->roam.configParam.phyMode)) {
+				/*
+				 * We could not find a 5G channel by auto pick,
+				 * let's try 2.4G channels. We only do this here
+				 * because csr_roam_get_phy_mode_band_for_bss
+				 * always picks 11a  for AUTO
+				 */
+				nw_type = eSIR_11B_NW_TYPE;
+				opr_ch =
+				csr_roam_get_ibss_start_channel_number24(pMac);
+				csr_populate_basic_rates(opr_rates, false,
+						true);
+			}
+			break;
+		case eSIR_11B_NW_TYPE:
 			csr_populate_basic_rates(opr_rates, false, true);
-			csr_populate_basic_rates(ext_rates, true, false);
+			if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch)
+				opr_ch =
+				csr_roam_get_ibss_start_channel_number24(pMac);
+			else
+				opr_ch = tmp_opr_ch;
+			break;
+		case eSIR_11G_NW_TYPE:
+			/* For P2P Client and P2P GO, disable 11b rates */
+			if ((pProfile->csrPersona == QDF_P2P_CLIENT_MODE) ||
+			    (pProfile->csrPersona == QDF_P2P_GO_MODE) ||
+			    (eCSR_CFG_DOT11_MODE_11G_ONLY ==
+						pParam->uCfgDot11Mode)) {
+				csr_populate_basic_rates(opr_rates, true, true);
+			} else {
+				csr_populate_basic_rates(opr_rates, false,
+						true);
+				csr_populate_basic_rates(ext_rates, true,
+						false);
+			}
+			if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch)
+				opr_ch =
+				csr_roam_get_ibss_start_channel_number24(pMac);
+			else
+				opr_ch = tmp_opr_ch;
+			break;
 		}
-
-		if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch)
-			opr_ch = csr_roam_get_ibss_start_channel_number24(pMac);
-		else
-			opr_ch = tmp_opr_ch;
-		break;
+		pParam->operationChn = opr_ch;
 	}
-	pParam->operationChn = opr_ch;
 	pParam->sirNwType = nw_type;
 	pParam->ch_params.ch_width = pProfile->ch_params.ch_width;
 	pParam->ch_params.center_freq_seg0 =
@@ -14197,10 +14286,11 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId,
 					pIes->VHTCaps.numSoundingDim)
 				txBFCsnValue = QDF_MIN(txBFCsnValue,
 						pIes->VHTCaps.numSoundingDim);
-			else if (IS_BSS_VHT_CAPABLE(pIes->vendor2_ie.VHTCaps)
-				&& pIes->vendor2_ie.VHTCaps.numSoundingDim)
+			else if (IS_BSS_VHT_CAPABLE(pIes->vendor_vht_ie.VHTCaps)
+				&& pIes->vendor_vht_ie.VHTCaps.numSoundingDim)
 				txBFCsnValue = QDF_MIN(txBFCsnValue,
-					pIes->vendor2_ie.VHTCaps.numSoundingDim);
+					pIes->vendor_vht_ie.
+					VHTCaps.numSoundingDim);
 		}
 		csr_join_req->vht_config.csnof_beamformer_antSup = txBFCsnValue;
 
@@ -14989,6 +15079,8 @@ QDF_STATUS csr_send_mb_start_bss_req_msg(tpAniSirGlobal pMac, uint32_t sessionId
 		     sizeof(pParam->addIeParams));
 	pMsg->obssEnabled = pMac->roam.configParam.obssEnabled;
 	pMsg->sap_dot11mc = pParam->sap_dot11mc;
+	pMsg->vendor_vht_sap =
+			pMac->roam.configParam.vendor_vht_sap;
 
 	return cds_send_mb_message_to_mac(pMsg);
 }
@@ -15224,6 +15316,10 @@ QDF_STATUS csr_process_add_sta_session_command(tpAniSirGlobal pMac,
 	add_sta_self_req->sub_type = pAddStaReq->subType;
 	add_sta_self_req->nss_2g = nss_2g;
 	add_sta_self_req->nss_5g = nss_5g;
+	add_sta_self_req->tx_aggregation_size =
+			pMac->roam.configParam.tx_aggregation_size;
+	add_sta_self_req->rx_aggregation_size =
+			pMac->roam.configParam.rx_aggregation_size;
 
 	msg.type = WMA_ADD_STA_SELF_REQ;
 	msg.reserved = 0;
@@ -15244,59 +15340,67 @@ QDF_STATUS csr_process_add_sta_session_command(tpAniSirGlobal pMac,
 	return status;
 }
 
-QDF_STATUS csr_roam_open_session(tpAniSirGlobal pMac,
+QDF_STATUS csr_roam_open_session(tpAniSirGlobal mac_ctx,
 				 csr_roam_completeCallback callback,
 				 void *pContext,
 				 uint8_t *pSelfMacAddr, uint8_t *pbSessionId,
 				 uint32_t type, uint32_t subType)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	uint32_t i, value = 0;
+	uint32_t i, value = 0, session_id;
 	union {
 		uint16_t nCfgValue16;
 		tSirMacHTCapabilityInfo htCapInfo;
 	} uHTCapabilityInfo;
 	uint32_t nCfgValue = 0;
-	tCsrRoamSession *pSession;
+	tCsrRoamSession *session;
 	*pbSessionId = CSR_SESSION_ID_INVALID;
 
-	for (i = 0; i < pMac->sme.max_intf_count; i++) {
-		sms_log(pMac, LOG1, FL("session:%d active:%d"), i,
-			pMac->roam.roamSession[i].sessionActive);
-		if (!CSR_IS_SESSION_VALID(pMac, i)) {
-			pSession = CSR_GET_SESSION(pMac, i);
-			if (!pSession) {
-				sms_log(pMac, LOGE,
-					FL
-						("Session does not exist for interface %d"),
+	if (QDF_STATUS_SUCCESS == csr_roam_get_session_id_from_bssid(mac_ctx,
+				(struct qdf_mac_addr *)pSelfMacAddr,
+				&session_id)) {
+		sms_log(mac_ctx, LOGE,
+			FL("Session %d exists with mac address"
+			MAC_ADDRESS_STR),
+			session_id, MAC_ADDR_ARRAY(pSelfMacAddr));
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	for (i = 0; i < mac_ctx->sme.max_intf_count; i++) {
+		sms_log(mac_ctx, LOG1, FL("session:%d active:%d"), i,
+			mac_ctx->roam.roamSession[i].sessionActive);
+		if (!CSR_IS_SESSION_VALID(mac_ctx, i)) {
+			session = CSR_GET_SESSION(mac_ctx, i);
+			if (!session) {
+				sms_log(mac_ctx, LOGE,
+					FL("Session does not exist for interface %d"),
 					i);
 				break;
 			}
 			status = QDF_STATUS_SUCCESS;
-			pSession->sessionActive = true;
-			pSession->sessionId = (uint8_t) i;
+			session->sessionActive = true;
+			session->sessionId = (uint8_t) i;
 
 			/* Initialize FT related data structures only in STA mode */
-			sme_ft_open(pMac, pSession->sessionId);
+			sme_ft_open(mac_ctx, session->sessionId);
 
-			pSession->callback = callback;
-			pSession->pContext = pContext;
-			qdf_mem_copy(&pSession->selfMacAddr, pSelfMacAddr,
+			session->callback = callback;
+			session->pContext = pContext;
+			qdf_mem_copy(&session->selfMacAddr, pSelfMacAddr,
 				     sizeof(struct qdf_mac_addr));
 			*pbSessionId = (uint8_t) i;
 			status =
-				qdf_mc_timer_init(&pSession->hTimerRoaming,
+				qdf_mc_timer_init(&session->hTimerRoaming,
 						  QDF_TIMER_TYPE_SW,
 						  csr_roam_roaming_timer_handler,
-						  &pSession->roamingTimerInfo);
+						  &session->roamingTimerInfo);
 			if (!QDF_IS_STATUS_SUCCESS(status)) {
-				sms_log(pMac, LOGE,
-					FL
-						("cannot allocate memory for Roaming timer"));
+				sms_log(mac_ctx, LOGE,
+					FL("cannot allocate memory for Roaming timer"));
 				break;
 			}
 			/* get the HT capability info */
-			if (wlan_cfg_get_int(pMac, WNI_CFG_HT_CAP_INFO, &value)
+			if (wlan_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value)
 					!= eSIR_SUCCESS) {
 				QDF_TRACE(QDF_MODULE_ID_QDF,
 					  QDF_TRACE_LEVEL_ERROR,
@@ -15305,134 +15409,137 @@ QDF_STATUS csr_roam_open_session(tpAniSirGlobal pMac,
 				break;
 			}
 #ifdef FEATURE_WLAN_BTAMP_UT_RF
-			status = qdf_mc_timer_init(&pSession->hTimerJoinRetry,
+			status = qdf_mc_timer_init(&session->hTimerJoinRetry,
 						   QDF_TIMER_TYPE_SW,
 						   csr_roam_join_retry_timer_handler,
-						   &pSession->
+						   &session->
 						   joinRetryTimerInfo);
 			if (!QDF_IS_STATUS_SUCCESS(status)) {
-				sms_log(pMac, LOGE,
+				sms_log(mac_ctx, LOGE,
 					FL
 						("cannot allocate memory for join retry timer"));
 				break;
 			}
 #endif
 			uHTCapabilityInfo.nCfgValue16 = 0xFFFF & value;
-			pSession->htConfig.ht_rx_ldpc =
+			session->htConfig.ht_rx_ldpc =
 				uHTCapabilityInfo.htCapInfo.advCodingCap;
-			pSession->htConfig.ht_tx_stbc =
+			session->htConfig.ht_tx_stbc =
 				uHTCapabilityInfo.htCapInfo.txSTBC;
-			pSession->htConfig.ht_rx_stbc =
+			session->htConfig.ht_rx_stbc =
 				uHTCapabilityInfo.htCapInfo.rxSTBC;
-			pSession->htConfig.ht_sgi20 =
+			session->htConfig.ht_sgi20 =
 				uHTCapabilityInfo.htCapInfo.shortGI20MHz;
-			pSession->htConfig.ht_sgi40 =
+			session->htConfig.ht_sgi40 =
 				uHTCapabilityInfo.htCapInfo.shortGI40MHz;
 
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_MAX_MPDU_LENGTH,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_MAX_MPDU_LENGTH,
 					 &nCfgValue);
-			pSession->vht_config.max_mpdu_len = nCfgValue;
+			session->vht_config.max_mpdu_len = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac,
+			wlan_cfg_get_int(mac_ctx,
 					 WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
 					 &nCfgValue);
-			pSession->vht_config.supported_channel_widthset =
+			session->vht_config.supported_channel_widthset =
 								nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_LDPC_CODING_CAP,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_LDPC_CODING_CAP,
 					 &nCfgValue);
-			pSession->vht_config.ldpc_coding = nCfgValue;
+			session->vht_config.ldpc_coding = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_SHORT_GI_80MHZ,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_SHORT_GI_80MHZ,
 					 &nCfgValue);
-			pSession->vht_config.shortgi80 = nCfgValue;
+			session->vht_config.shortgi80 = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac,
+			wlan_cfg_get_int(mac_ctx,
 				WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ,
 				&nCfgValue);
-			pSession->vht_config.shortgi160and80plus80 = nCfgValue;
+			session->vht_config.shortgi160and80plus80 = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_TXSTBC, &nCfgValue);
-			pSession->vht_config.tx_stbc = nCfgValue;
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_TXSTBC,
+					&nCfgValue);
+			session->vht_config.tx_stbc = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_RXSTBC, &nCfgValue);
-			pSession->vht_config.rx_stbc = nCfgValue;
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_RXSTBC,
+					&nCfgValue);
+			session->vht_config.rx_stbc = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_SU_BEAMFORMER_CAP,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_SU_BEAMFORMER_CAP,
 						&nCfgValue);
-			pSession->vht_config.su_beam_former = nCfgValue;
+			session->vht_config.su_beam_former = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
 						&nCfgValue);
-			pSession->vht_config.su_beam_formee = nCfgValue;
+			session->vht_config.su_beam_formee = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac,
+			wlan_cfg_get_int(mac_ctx,
 				WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED,
 				&nCfgValue);
-			pSession->vht_config.csnof_beamformer_antSup =
+			session->vht_config.csnof_beamformer_antSup =
 								nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac,
+			wlan_cfg_get_int(mac_ctx,
 					WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS,
 					&nCfgValue);
-			pSession->vht_config.num_soundingdim = nCfgValue;
+			session->vht_config.num_soundingdim = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_MU_BEAMFORMER_CAP,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_MU_BEAMFORMER_CAP,
 						&nCfgValue);
-			pSession->vht_config.mu_beam_former = nCfgValue;
+			session->vht_config.mu_beam_former = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_MU_BEAMFORMEE_CAP,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_MU_BEAMFORMEE_CAP,
 						&nCfgValue);
-			pSession->vht_config.mu_beam_formee = nCfgValue;
+			session->vht_config.mu_beam_formee = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_TXOP_PS,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_TXOP_PS,
 					 &nCfgValue);
-			pSession->vht_config.vht_txops = nCfgValue;
+			session->vht_config.vht_txops = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_HTC_VHTC_CAP,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_HTC_VHTC_CAP,
 					 &nCfgValue);
-			pSession->vht_config.htc_vhtcap = nCfgValue;
+			session->vht_config.htc_vhtcap = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_RX_ANT_PATTERN,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_RX_ANT_PATTERN,
 					 &nCfgValue);
-			pSession->vht_config.rx_antpattern = nCfgValue;
+			session->vht_config.rx_antpattern = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_TX_ANT_PATTERN,
+			wlan_cfg_get_int(mac_ctx, WNI_CFG_VHT_TX_ANT_PATTERN,
 					 &nCfgValue);
-			pSession->vht_config.tx_antpattern = nCfgValue;
+			session->vht_config.tx_antpattern = nCfgValue;
 
 			nCfgValue = 0;
-			wlan_cfg_get_int(pMac, WNI_CFG_VHT_AMPDU_LEN_EXPONENT,
+			wlan_cfg_get_int(mac_ctx,
+					 WNI_CFG_VHT_AMPDU_LEN_EXPONENT,
 					 &nCfgValue);
-			pSession->vht_config.max_ampdu_lenexp = nCfgValue;
+			session->vht_config.max_ampdu_lenexp = nCfgValue;
 
-			status = csr_issue_add_sta_for_session_req(pMac, i,
+			status = csr_issue_add_sta_for_session_req(mac_ctx, i,
 								pSelfMacAddr,
 								type, subType);
 			break;
 		}
 	}
-	if (pMac->sme.max_intf_count == i) {
+	if (mac_ctx->sme.max_intf_count == i) {
 		/* No session is available */
-		sms_log(pMac, LOGE,
+		sms_log(mac_ctx, LOGE,
 			"%s: Reached max interfaces: %d! Session creation will fail",
-			__func__, pMac->sme.max_intf_count);
+			__func__, mac_ctx->sme.max_intf_count);
 		status = QDF_STATUS_E_RESOURCES;
 	}
 	return status;
@@ -19361,11 +19468,16 @@ fail:
  *
  * Return: None
  */
-void csr_roam_fill_tdls_info(tCsrRoamInfo *roam_info, tpSirSmeJoinRsp join_rsp)
+void csr_roam_fill_tdls_info(tpAniSirGlobal mac_ctx, tCsrRoamInfo *roam_info,
+				tpSirSmeJoinRsp join_rsp)
 {
 	roam_info->tdls_prohibited = join_rsp->tdls_prohibited;
 	roam_info->tdls_chan_swit_prohibited =
 		join_rsp->tdls_chan_swit_prohibited;
+	sms_log(mac_ctx, LOG1,
+		FL("tdls:prohibit: %d, chan_swit_prohibit: %d"),
+		roam_info->tdls_prohibited,
+		roam_info->tdls_chan_swit_prohibited);
 }
 #endif
 
@@ -19610,11 +19722,7 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx,
 	roam_info->chan_info.nss = roam_synch_data->join_rsp->nss;
 	roam_info->chan_info.rate_flags =
 		roam_synch_data->join_rsp->max_rate_flags;
-	csr_roam_fill_tdls_info(roam_info, roam_synch_data->join_rsp);
-	sms_log(mac_ctx, LOG1,
-		FL("tdls:prohibit: %d, chan_swit_prohibit: %d"),
-		roam_info->tdls_prohibited,
-		roam_info->tdls_chan_swit_prohibited);
+	csr_roam_fill_tdls_info(mac_ctx, roam_info, roam_synch_data->join_rsp);
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
 	src_profile = &roam_synch_data->join_rsp->HTProfile;
 	dst_profile = &conn_profile->HTProfile;

+ 1 - 1
core/sme/src/csr/csr_util.c

@@ -1467,7 +1467,7 @@ QDF_STATUS csr_get_phy_mode_from_bss(tpAniSirGlobal pMac,
 		if (pIes->HTCaps.present) {
 			phyMode = eCSR_DOT11_MODE_11n;
 			if (IS_BSS_VHT_CAPABLE(pIes->VHTCaps) ||
-				IS_BSS_VHT_CAPABLE(pIes->vendor2_ie.VHTCaps))
+				IS_BSS_VHT_CAPABLE(pIes->vendor_vht_ie.VHTCaps))
 				phyMode = eCSR_DOT11_MODE_11ac;
 		}
 		*pPhyMode = phyMode;

+ 71 - 19
core/utils/pktlog/pktlog_internal.c

@@ -220,6 +220,7 @@ char *pktlog_getbuf(struct ol_pktlog_dev_t *pl_dev,
 
 static struct txctl_frm_hdr frm_hdr;
 
+#ifndef HELIUMPLUS
 static void process_ieee_hdr(void *data)
 {
 	uint8_t dir;
@@ -367,7 +368,9 @@ fill_ieee80211_hdr_data(struct ol_txrx_pdev_t *txrx_pdev,
 	}
 
 }
+#endif
 
+#ifdef HELIUMPLUS
 A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
 {
 	/*
@@ -398,25 +401,86 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
 	pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
 			     ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
 			    ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
-#ifdef HELIUMPLUS
 	pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
 		   ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
 		  ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
 	pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
 		   ATH_PKTLOG_HDR_MAC_ID_MASK) >>
 		  ATH_PKTLOG_HDR_MAC_ID_SHIFT;
+	pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
+		       ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
+	pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
+	pl_hdr.type_specific_data =
+		*(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
+	pl_info = pl_dev->pl_info;
+
+	if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
+		size_t log_size = sizeof(frm_hdr) + pl_hdr.size;
+		void *txdesc_hdr_ctl = (void *)
+		pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
+		qdf_assert(txdesc_hdr_ctl);
+		qdf_assert(pl_hdr.size < (370 * sizeof(u_int32_t)));
+
+		qdf_mem_copy(txdesc_hdr_ctl, &frm_hdr, sizeof(frm_hdr));
+		qdf_mem_copy((char *)txdesc_hdr_ctl + sizeof(frm_hdr),
+					((void *)data +
+					 sizeof(struct ath_pktlog_hdr)),
+					 pl_hdr.size);
+	}
+
+	if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
+		struct ath_pktlog_tx_status txstat_log;
+		size_t log_size = pl_hdr.size;
+
+		txstat_log.ds_status = (void *)
+				       pktlog_getbuf(pl_dev, pl_info,
+						     log_size, &pl_hdr);
+		qdf_assert(txstat_log.ds_status);
+		qdf_mem_copy(txstat_log.ds_status,
+			     ((void *)data + sizeof(struct ath_pktlog_hdr)),
+			     pl_hdr.size);
+	}
+	return A_OK;
+}
+
 #else
+A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
+{
+	/*
+	 * Must include to process different types
+	 * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
+	 */
+	struct ol_pktlog_dev_t *pl_dev;
+	struct ath_pktlog_hdr pl_hdr;
+	struct ath_pktlog_info *pl_info;
+	uint32_t *pl_tgt_hdr;
+
+	if (!txrx_pdev) {
+		qdf_print("Invalid pdev in %s\n", __func__);
+		return A_ERROR;
+	}
+	qdf_assert(txrx_pdev->pl_dev);
+	qdf_assert(data);
+	pl_dev = txrx_pdev->pl_dev;
+
+	pl_tgt_hdr = (uint32_t *) data;
+	/*
+	 * Makes the short words (16 bits) portable b/w little endian
+	 * and big endian
+	 */
+	pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
+			ATH_PKTLOG_HDR_FLAGS_MASK) >>
+		       ATH_PKTLOG_HDR_FLAGS_SHIFT;
+	pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
+			     ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
+			    ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
 	pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
 			   ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
 			  ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
-#endif
 	pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
 		       ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
 	pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
-#ifdef HELIUMPLUS
-	pl_hdr.type_specific_data =
-		*(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
-#endif
+
 	pl_info = pl_dev->pl_info;
 
 	if (pl_hdr.log_type == PKTLOG_TYPE_TX_FRM_HDR) {
@@ -454,7 +518,6 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
 	}
 
 	if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
-#if !defined(HELIUMPLUS)
 		struct ath_pktlog_txctl txctl_log;
 		size_t log_size = sizeof(txctl_log.priv);
 
@@ -482,18 +545,6 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
 		qdf_mem_copy(txctl_log.txdesc_hdr_ctl, &txctl_log.priv,
 			     sizeof(txctl_log.priv));
 		/* Add Protocol information and HT specific information */
-#else
-		size_t log_size = sizeof(frm_hdr) + pl_hdr.size;
-		void *txdesc_hdr_ctl = (void *)
-		pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
-		qdf_assert(txdesc_hdr_ctl);
-		qdf_assert(pl_hdr.size < (370 * sizeof(u_int32_t)));
-
-		qdf_mem_copy(txdesc_hdr_ctl, &frm_hdr, sizeof(frm_hdr));
-		qdf_mem_copy((char *)txdesc_hdr_ctl + sizeof(frm_hdr),
-					((void *)data + sizeof(struct ath_pktlog_hdr)),
-					 pl_hdr.size);
-#endif /* !defined(HELIUMPLUS) */
 	}
 
 	if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
@@ -528,6 +579,7 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
 	}
 	return A_OK;
 }
+#endif
 
 A_STATUS process_rx_info_remote(void *pdev, void *data)
 {

+ 101 - 0
core/wma/inc/wma.h

@@ -389,6 +389,94 @@ enum ds_mode {
 
 #define WMA_DEFAULT_HW_MODE_INDEX 0xFFFF
 
+/**
+ * WMA hardware mode list bit-mask definitions.
+ * Bits 4:0, 31:29 are unused.
+ *
+ * The below definitions are added corresponding to WMI DBS HW mode
+ * list to make it independent of firmware changes for WMI definitions.
+ * Currently these definitions have dependency with BIT positions of
+ * the existing WMI macros. Thus, if the BIT positions are changed for
+ * WMI macros, then these macros' BIT definitions are also need to be
+ * changed.
+ */
+#define WMA_HW_MODE_MAC0_TX_STREAMS_BITPOS  (28)
+#define WMA_HW_MODE_MAC0_RX_STREAMS_BITPOS  (24)
+#define WMA_HW_MODE_MAC1_TX_STREAMS_BITPOS  (20)
+#define WMA_HW_MODE_MAC1_RX_STREAMS_BITPOS  (16)
+#define WMA_HW_MODE_MAC0_BANDWIDTH_BITPOS   (12)
+#define WMA_HW_MODE_MAC1_BANDWIDTH_BITPOS   (8)
+#define WMA_HW_MODE_DBS_MODE_BITPOS         (7)
+#define WMA_HW_MODE_AGILE_DFS_MODE_BITPOS   (6)
+#define WMA_HW_MODE_SBS_MODE_BITPOS         (5)
+
+#define WMA_HW_MODE_MAC0_TX_STREAMS_MASK    \
+			(0xf << WMA_HW_MODE_MAC0_TX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC0_RX_STREAMS_MASK    \
+			(0xf << WMA_HW_MODE_MAC0_RX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC1_TX_STREAMS_MASK    \
+			(0xf << WMA_HW_MODE_MAC1_TX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC1_RX_STREAMS_MASK    \
+			(0xf << WMA_HW_MODE_MAC1_RX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC0_BANDWIDTH_MASK     \
+			(0xf << WMA_HW_MODE_MAC0_BANDWIDTH_BITPOS)
+#define WMA_HW_MODE_MAC1_BANDWIDTH_MASK     \
+			(0xf << WMA_HW_MODE_MAC1_BANDWIDTH_BITPOS)
+#define WMA_HW_MODE_DBS_MODE_MASK           \
+			(0x1 << WMA_HW_MODE_DBS_MODE_BITPOS)
+#define WMA_HW_MODE_AGILE_DFS_MODE_MASK     \
+			(0x1 << WMA_HW_MODE_AGILE_DFS_MODE_BITPOS)
+#define WMA_HW_MODE_SBS_MODE_MASK           \
+			(0x1 << WMA_HW_MODE_SBS_MODE_BITPOS)
+
+#define WMA_HW_MODE_MAC0_TX_STREAMS_SET(hw_mode, value) \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_MAC0_TX_STREAMS_BITPOS, 4, value)
+#define WMA_HW_MODE_MAC0_RX_STREAMS_SET(hw_mode, value) \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_MAC0_RX_STREAMS_BITPOS, 4, value)
+#define WMA_HW_MODE_MAC1_TX_STREAMS_SET(hw_mode, value) \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_MAC1_TX_STREAMS_BITPOS, 4, value)
+#define WMA_HW_MODE_MAC1_RX_STREAMS_SET(hw_mode, value) \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_MAC1_RX_STREAMS_BITPOS, 4, value)
+#define WMA_HW_MODE_MAC0_BANDWIDTH_SET(hw_mode, value)  \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_MAC0_BANDWIDTH_BITPOS, 4, value)
+#define WMA_HW_MODE_MAC1_BANDWIDTH_SET(hw_mode, value)  \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_MAC1_BANDWIDTH_BITPOS, 4, value)
+#define WMA_HW_MODE_DBS_MODE_SET(hw_mode, value)        \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_DBS_MODE_BITPOS, 1, value)
+#define WMA_HW_MODE_AGILE_DFS_SET(hw_mode, value)       \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_AGILE_DFS_MODE_BITPOS, 1, value)
+#define WMA_HW_MODE_SBS_MODE_SET(hw_mode, value)        \
+	WMI_SET_BITS(hw_mode, WMA_HW_MODE_SBS_MODE_BITPOS, 1, value)
+
+#define WMA_HW_MODE_MAC0_TX_STREAMS_GET(hw_mode)                \
+	((hw_mode & WMA_HW_MODE_MAC0_TX_STREAMS_MASK) >>        \
+		WMA_HW_MODE_MAC0_TX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC0_RX_STREAMS_GET(hw_mode)                \
+	((hw_mode & WMA_HW_MODE_MAC0_RX_STREAMS_MASK) >>        \
+		WMA_HW_MODE_MAC0_RX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC1_TX_STREAMS_GET(hw_mode)                \
+	((hw_mode & WMA_HW_MODE_MAC1_TX_STREAMS_MASK) >>        \
+		WMA_HW_MODE_MAC1_TX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC1_RX_STREAMS_GET(hw_mode)                \
+	((hw_mode & WMA_HW_MODE_MAC1_RX_STREAMS_MASK) >>        \
+		WMA_HW_MODE_MAC1_RX_STREAMS_BITPOS)
+#define WMA_HW_MODE_MAC0_BANDWIDTH_GET(hw_mode)                 \
+	((hw_mode & WMA_HW_MODE_MAC0_BANDWIDTH_MASK) >>         \
+		WMA_HW_MODE_MAC0_BANDWIDTH_BITPOS)
+#define WMA_HW_MODE_MAC1_BANDWIDTH_GET(hw_mode)                 \
+	((hw_mode & WMA_HW_MODE_MAC1_BANDWIDTH_MASK) >>         \
+		WMA_HW_MODE_MAC1_BANDWIDTH_BITPOS)
+#define WMA_HW_MODE_DBS_MODE_GET(hw_mode)                       \
+	((hw_mode & WMA_HW_MODE_DBS_MODE_MASK) >>               \
+		WMA_HW_MODE_DBS_MODE_BITPOS)
+#define WMA_HW_MODE_AGILE_DFS_GET(hw_mode)                      \
+	((hw_mode & WMA_HW_MODE_AGILE_DFS_MODE_MASK) >>         \
+		WMA_HW_MODE_AGILE_DFS_MODE_BITPOS)
+#define WMA_HW_MODE_SBS_MODE_GET(hw_mode)                       \
+	((hw_mode & WMA_HW_MODE_SBS_MODE_MASK) >>               \
+		WMA_HW_MODE_SBS_MODE_BITPOS)
+
+
 /**
  * struct probeTime_dwellTime - probe time, dwell time map
  * @dwell_time: dwell time
@@ -991,6 +1079,7 @@ struct wma_txrx_node {
 	uint8_t wep_default_key_idx;
 	tSirHostOffloadReq arp_offload_req;
 	tSirHostOffloadReq ns_offload_req;
+	bool is_vdev_valid;
 };
 
 #if defined(QCA_WIFI_FTM)
@@ -1070,6 +1159,18 @@ struct dbs_hw_mode_info {
 	uint32_t *hw_mode_list;
 };
 
+/**
+ * struct mac_ss_bw_info - hw_mode_list PHY/MAC params for each MAC
+ * @mac_tx_stream: Max TX stream
+ * @mac_rx_stream: Max RX stream
+ * @mac_bw: Max bandwidth
+ */
+struct mac_ss_bw_info {
+	uint32_t mac_tx_stream;
+	uint32_t mac_rx_stream;
+	uint32_t mac_bw;
+};
+
 /* Current HTC credit is 2, pool size of 50 is sufficient */
 #define WMI_DESC_POOL_MAX 50
 

+ 26 - 4
core/wma/inc/wma_api.h

@@ -187,12 +187,12 @@ int8_t wma_get_hw_mode_idx_from_dbs_hw_list(enum hw_mode_ss_config mac0_ss,
 		enum hw_mode_ss_config mac1_ss,
 		enum hw_mode_bandwidth mac1_bw,
 		enum hw_mode_dbs_capab dbs,
-		enum hw_mode_agile_dfs_capab dfs);
+		enum hw_mode_agile_dfs_capab dfs,
+		enum hw_mode_sbs_capab sbs);
 QDF_STATUS wma_get_hw_mode_from_idx(uint32_t idx,
 		struct sir_hw_mode_params *hw_mode);
 int8_t wma_get_num_dbs_hw_modes(void);
 bool wma_is_hw_dbs_capable(void);
-bool wma_is_hw_agile_dfs_capable(void);
 int8_t wma_get_mac_id_of_vdev(uint32_t vdev_id);
 void wma_update_intf_hw_mode_params(uint32_t vdev_id, uint32_t mac_id,
 				uint32_t cfgd_hw_mode_index);
@@ -202,7 +202,6 @@ void wma_set_dbs_capability_ut(uint32_t dbs);
 QDF_STATUS wma_get_dbs_hw_modes(bool *one_by_one_dbs, bool *two_by_two_dbs);
 QDF_STATUS wma_get_current_hw_mode(struct sir_hw_mode_params *hw_mode);
 bool wma_is_dbs_enable(void);
-bool wma_is_agile_dfs_enable(void);
 QDF_STATUS wma_get_updated_scan_config(uint32_t *scan_config,
 		bool dbs_scan,
 		bool dbs_plus_agile_scan,
@@ -300,7 +299,30 @@ void wma_process_pdev_hw_mode_trans_ind(void *wma,
 	wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
 	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
 	struct sir_hw_mode_trans_ind *hw_mode_trans_ind);
-QDF_STATUS wma_set_powersave_config(uint8_t val);
 QDF_STATUS wma_encrypt_decrypt_msg(WMA_HANDLE wma,
 		struct encrypt_decrypt_req_params *encrypt_decrypt_params);
+
+/**
+ * wma_set_cts2self_for_p2p_go() - set CTS2SELF command for P2P GO.
+ * @wma_handle:                  pointer to wma handle.
+ * @cts2self_for_p2p_go:         value needs to set to firmware.
+ *
+ * At the time of driver startup, inform about ini parma to FW that
+ * if legacy client connects to P2P GO, stop using NOA for P2P GO.
+ *
+ * Return: QDF_STATUS.
+ */
+QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle,
+		uint32_t cts2self_for_p2p_go);
+QDF_STATUS wma_set_tx_rx_aggregation_size
+	(struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size);
+
+/**
+ * wma_set_qpower_config() - update qpower config in wma
+ * @vdev_id:	the Id of the vdev to configure
+ * @qpower:	new qpower value
+ *
+ * Return: QDF_STATUS_SUCCESS on success, error number otherwise
+ */
+QDF_STATUS wma_set_qpower_config(uint8_t vdev_id, uint8_t qpower);
 #endif

+ 4 - 0
core/wma/inc/wma_if.h

@@ -514,6 +514,8 @@ typedef struct {
 	uint8_t nss_2g;
 	uint8_t nss_5g;
 	uint8_t beacon_tx_rate;
+	uint32_t tx_aggregation_size;
+	uint32_t rx_aggregation_size;
 } tAddBssParams, *tpAddBssParams;
 
 /**
@@ -1151,6 +1153,8 @@ struct add_sta_self_params {
 	uint8_t nss_2g;
 	uint8_t nss_5g;
 	uint32_t status;
+	uint32_t tx_aggregation_size;
+	uint32_t rx_aggregation_size;
 };
 
 /**

+ 1 - 0
core/wma/inc/wma_types.h

@@ -467,6 +467,7 @@
 #define WMA_ADD_BCN_FILTER_CMDID             SIR_HAL_ADD_BCN_FILTER_CMDID
 #define WMA_REMOVE_BCN_FILTER_CMDID          SIR_HAL_REMOVE_BCN_FILTER_CMDID
 #define WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS  SIR_HAL_SET_ADAPT_DWELLTIME_PARAMS
+#define WMA_SET_CTS2SELF_FOR_STA             SIR_HAL_SET_CTS2SELF_FOR_STA
 
 #define WDA_BPF_GET_CAPABILITIES_REQ         SIR_HAL_BPF_GET_CAPABILITIES_REQ
 #define WDA_BPF_SET_INSTRUCTIONS_REQ         SIR_HAL_BPF_SET_INSTRUCTIONS_REQ

+ 27 - 3
core/wma/src/wma_dev_if.c

@@ -546,6 +546,8 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
 	if (!generate_rsp) {
 		WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
 		ol_txrx_vdev_detach(iface->handle, NULL, NULL);
+		iface->handle = NULL;
+		wma_handle->interfaces[vdev_id].is_vdev_valid = false;
 		goto out;
 	}
 
@@ -573,6 +575,8 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
 	}
 	WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
 	ol_txrx_vdev_detach(iface->handle, NULL, NULL);
+	iface->handle = NULL;
+	wma_handle->interfaces[vdev_id].is_vdev_valid = false;
 
 	/*
 	 * send the response immediately if WMI_SERVICE_SYNC_DELETE_CMDS
@@ -1075,9 +1079,13 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 			wma->interfaces[vdev_id].peer_count);
 		return;
 	}
-	if (peer)
-		ol_txrx_peer_detach(peer);
 
+	if (peer) {
+		if (roam_synch_in_progress)
+			ol_txrx_peer_detach_force_delete(peer);
+		else
+			ol_txrx_peer_detach(peer);
+	}
 	peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer);
 	if (peer_mac_addr == NULL) {
 		WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
@@ -1142,8 +1150,8 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev,
 		WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
 		goto err;
 	}
-	if (roam_synch_in_progress) {
 
+	if (roam_synch_in_progress) {
 		WMA_LOGE("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d,"
 			 "peer_count - %d",
 			 __func__, peer, peer_addr, vdev_id,
@@ -1525,6 +1533,8 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle,
 	tSirMacHTCapabilityInfo *phtCapInfo;
 	cds_msg_t sme_msg = { 0 };
 	struct vdev_create_params params = { 0 };
+	u_int8_t vdev_id;
+	struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
 
 	if (NULL == mac) {
 		WMA_LOGE("%s: Failed to get mac", __func__);
@@ -1547,6 +1557,8 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle,
 		goto end;
 	}
 
+	vdev_id = self_sta_req->session_id;
+
 	txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type);
 
 	if (wlan_op_mode_unknown == txrx_vdev_type) {
@@ -1602,6 +1614,17 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle,
 		     self_sta_req->self_mac_addr,
 		     sizeof(wma_handle->interfaces[self_sta_req->session_id].
 			    addr));
+
+	tx_rx_aggregation_size.tx_aggregation_size =
+				self_sta_req->tx_aggregation_size;
+	tx_rx_aggregation_size.rx_aggregation_size =
+				self_sta_req->rx_aggregation_size;
+	tx_rx_aggregation_size.vdev_id = self_sta_req->session_id;
+
+	status = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size);
+	if (status != QDF_STATUS_SUCCESS)
+		WMA_LOGE("failed to set aggregation sizes(err=%d)", status);
+
 	switch (self_sta_req->type) {
 	case WMI_VDEV_TYPE_STA:
 		if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD,
@@ -1652,6 +1675,7 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle,
 		}
 	}
 
+	wma_handle->interfaces[vdev_id].is_vdev_valid = true;
 	ret = wma_vdev_set_param(wma_handle->wmi_handle,
 				self_sta_req->session_id,
 				WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,

+ 65 - 0
core/wma/src/wma_features.c

@@ -7918,6 +7918,71 @@ QDF_STATUS wma_set_bpf_instructions(tp_wma_handle wma,
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * wma_set_tx_rx_aggregation_size() - sets tx rx aggregation sizes
+ * @tx_rx_aggregation_size: aggregation size parameters
+ *
+ * This function sets tx rx aggregation sizes
+ *
+ * Return: VOS_STATUS_SUCCESS on success, error number otherwise
+ */
+QDF_STATUS wma_set_tx_rx_aggregation_size(
+	struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
+{
+	tp_wma_handle wma_handle;
+	wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
+	int32_t len;
+	wmi_buf_t buf;
+	u_int8_t *buf_ptr;
+	int ret;
+
+	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
+
+	if (!tx_rx_aggregation_size) {
+		WMA_LOGE("%s: invalid pointer", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (!wma_handle) {
+		WMA_LOGE("%s: WMA context is invald!", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	len = sizeof(*cmd);
+	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
+
+	if (!buf) {
+		WMA_LOGE("%s: Failed allocate wmi buffer", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	buf_ptr = (u_int8_t *) wmi_buf_data(buf);
+	cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *) buf_ptr;
+
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+			wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
+
+	cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
+	cmd->tx_aggr_size = tx_rx_aggregation_size->tx_aggregation_size;
+	cmd->rx_aggr_size = tx_rx_aggregation_size->rx_aggregation_size;
+
+	WMA_LOGI("tx aggr: %d rx aggr: %d vdev: %d",
+		cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id);
+
+	ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
+				WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
+	if (ret) {
+		WMA_LOGE("%s: Failed to send aggregation size command",
+				__func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  *  wma_p2p_lo_start() - P2P listen offload start
  *  @params: p2p listen offload parameters

+ 372 - 11
core/wma/src/wma_main.c

@@ -121,8 +121,8 @@ static void wma_service_ready_ext_evt_timeout(void *data)
 	}
 
 end:
-	/* Panic so that we can debug why FW is not responding */
-	QDF_BUG(0);
+	/* Assert here. Panic is being called in insmod thread */
+	QDF_ASSERT(0);
 }
 
 /**
@@ -872,6 +872,11 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
 
 	switch (privcmd->param_vp_dev) {
 	case VDEV_CMD:
+		if (!wma->interfaces[privcmd->param_vdev_id].is_vdev_valid) {
+			WMA_LOGE("%s Vdev id is not valid", __func__);
+			return ;
+		}
+
 		WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
 			 privcmd->param_id, privcmd->param_value);
 		ret = wma_vdev_set_param(wma->wmi_handle,
@@ -1667,6 +1672,146 @@ static void wma_init_max_no_of_peers(tp_wma_handle wma_handle,
 
 struct wma_version_info g_wmi_version_info;
 
+/**
+ * wma_state_info_dump() - prints state information of wma layer
+ * @buf: buffer pointer
+ * @size: size of buffer to be filled
+ *
+ * This function is used to dump state information of wma layer
+ *
+ * Return: None
+ */
+static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
+{
+	tp_wma_handle wma_handle;
+	uint16_t len = 0;
+	char *buf = *buf_ptr;
+	struct wma_txrx_node *iface;
+	uint8_t vdev_id;
+
+	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma_handle) {
+		WMA_LOGE("%s: WMA context is invald!", __func__);
+		return;
+	}
+
+	WMA_LOGI("%s: size of buffer: %d", __func__, *size);
+
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_pno_match_wake_up_count %d",
+		wma_handle->wow_pno_match_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_pno_complete_wake_up_count %d",
+		wma_handle->wow_pno_complete_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_gscan_wake_up_count %d",
+		wma_handle->wow_gscan_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_low_rssi_wake_up_count %d",
+		wma_handle->wow_low_rssi_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_rssi_breach_wake_up_count %d",
+		wma_handle->wow_rssi_breach_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_ucast_wake_up_count %d",
+		wma_handle->wow_ucast_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_bcast_wake_up_count %d",
+		wma_handle->wow_bcast_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_ipv4_mcast_wake_up_count %d",
+		wma_handle->wow_ipv4_mcast_wake_up_count);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_ipv6_mcast_ra_stats %d",
+		wma_handle->wow_ipv6_mcast_ra_stats);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_ipv6_mcast_ns_stats %d",
+		wma_handle->wow_ipv6_mcast_ns_stats);
+	len += qdf_scnprintf(buf + len, *size - len,
+		"\n wow_ipv6_mcast_na_stats %d",
+		wma_handle->wow_ipv6_mcast_na_stats);
+
+	for (vdev_id = 0; vdev_id < wma_handle->max_bssid; vdev_id++) {
+		if (!wma_handle->interfaces[vdev_id].handle)
+			continue;
+
+		iface = &wma_handle->interfaces[vdev_id];
+
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n vdev_id %d",
+			vdev_id);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n conn_state %d",
+			iface->conn_state);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n dtimPeriod %d",
+			iface->dtimPeriod);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n chanmode %d",
+			iface->chanmode);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n vht_capable %d",
+			iface->vht_capable);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n ht_capable %d",
+			iface->ht_capable);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n chan_width %d",
+			iface->chan_width);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n vdev_active %d",
+			iface->vdev_active);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n vdev_up %d",
+			iface->vdev_up);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n aid %d",
+			iface->aid);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n rate_flags %d",
+			iface->rate_flags);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n nss %d",
+			iface->nss);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n tx_power %d",
+			iface->tx_power);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n max_tx_power %d",
+			iface->max_tx_power);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n nwType %d",
+			iface->nwType);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n tx_streams %d",
+			iface->tx_streams);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n rx_streams %d",
+			iface->rx_streams);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n chain_mask %d",
+			iface->chain_mask);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n nss_2g %d",
+			iface->nss_2g);
+		len += qdf_scnprintf(buf + len, *size - len,
+			"\n nss_5g %d",
+			iface->nss_5g);
+	}
+
+	*size -= len;
+	*buf_ptr += len;
+}
+
+/**
+ * wma_register_debug_callback() - registration function for wma layer
+ * to print wma state information
+ */
+static void wma_register_debug_callback(void)
+{
+	qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
+}
+
 /**
  * wma_open() - Allocate wma context and initialize it.
  * @cds_context:  cds context
@@ -2152,6 +2297,8 @@ QDF_STATUS wma_open(void *cds_context,
 				wma_encrypt_decrypt_msg_handler,
 				WMA_RX_SERIALIZER_CTX);
 	wma_ndp_register_all_event_handlers(wma_handle);
+	wma_register_debug_callback();
+
 	return QDF_STATUS_SUCCESS;
 
 err_dbglog_init:
@@ -4151,17 +4298,17 @@ void wma_dump_dbs_hw_mode(tp_wma_handle wma_handle)
 		param = wma_handle->hw_mode.hw_mode_list[i];
 		WMA_LOGA("%s:[%d]-MAC0: tx_ss:%d rx_ss:%d bw_idx:%d",
 			__func__, i,
-			WMI_DBS_HW_MODE_MAC0_TX_STREAMS_GET(param),
-			WMI_DBS_HW_MODE_MAC0_RX_STREAMS_GET(param),
-			WMI_DBS_HW_MODE_MAC0_BANDWIDTH_GET(param));
+			WMA_HW_MODE_MAC0_TX_STREAMS_GET(param),
+			WMA_HW_MODE_MAC0_RX_STREAMS_GET(param),
+			WMA_HW_MODE_MAC0_BANDWIDTH_GET(param));
 		WMA_LOGA("%s:[%d]-MAC1: tx_ss:%d rx_ss:%d bw_idx:%d",
 			__func__, i,
-			WMI_DBS_HW_MODE_MAC1_TX_STREAMS_GET(param),
-			WMI_DBS_HW_MODE_MAC1_RX_STREAMS_GET(param),
-			WMI_DBS_HW_MODE_MAC1_BANDWIDTH_GET(param));
-		WMA_LOGA("%s:[%d] DBS:%d Agile DFS:%d", __func__, i,
-			WMI_DBS_HW_MODE_DBS_MODE_GET(param),
-			WMI_DBS_HW_MODE_AGILE_DFS_GET(param));
+			WMA_HW_MODE_MAC1_TX_STREAMS_GET(param),
+			WMA_HW_MODE_MAC1_RX_STREAMS_GET(param),
+			WMA_HW_MODE_MAC1_BANDWIDTH_GET(param));
+		WMA_LOGA("%s:[%d] DBS:%d SBS:%d", __func__, i,
+			WMA_HW_MODE_DBS_MODE_GET(param),
+			WMA_HW_MODE_SBS_MODE_GET(param));
 	}
 }
 
@@ -4800,6 +4947,212 @@ static void wma_print_populate_soc_caps(t_wma_handle *wma_handle)
 	WMA_LOGI("%s: <====== HW mode cap printing ends ======>\n", __func__);
 }
 
+/**
+ * wma_map_wmi_channel_width_to_hw_mode_bw() - returns bandwidth
+ * in terms of hw_mode_bandwidth
+ * @width: bandwidth in terms of wmi_channel_width
+ *
+ * This function returns the bandwidth in terms of hw_mode_bandwidth.
+ *
+ * Return: BW in terms of hw_mode_bandwidth.
+ */
+enum hw_mode_bandwidth wma_map_wmi_channel_width_to_hw_mode_bw(
+			wmi_channel_width width)
+{
+	switch (width) {
+	case WMI_CHAN_WIDTH_20:
+		return HW_MODE_20_MHZ;
+	case WMI_CHAN_WIDTH_40:
+		return HW_MODE_40_MHZ;
+	case WMI_CHAN_WIDTH_80:
+		return HW_MODE_80_MHZ;
+	case WMI_CHAN_WIDTH_160:
+		return HW_MODE_160_MHZ;
+	case WMI_CHAN_WIDTH_80P80:
+		return HW_MODE_80_PLUS_80_MHZ;
+	case WMI_CHAN_WIDTH_5:
+		return HW_MODE_5_MHZ;
+	case WMI_CHAN_WIDTH_10:
+		return HW_MODE_10_MHZ;
+	default:
+		return HW_MODE_BW_NONE;
+	}
+
+	return HW_MODE_BW_NONE;
+}
+
+/**
+ * wma_get_hw_mode_params() - get TX-RX stream and bandwidth
+ * supported from the capabilities.
+ * @caps: PHY capability
+ * @info: param to store TX-RX stream and BW information
+ *
+ * This function will calculate TX-RX stream and bandwidth supported
+ * as per the PHY capability, and assign to mac_ss_bw_info.
+ *
+ * Return: none
+ */
+static void wma_get_hw_mode_params(WMI_MAC_PHY_CAPABILITIES *caps,
+			struct mac_ss_bw_info *info)
+{
+	if (!caps) {
+		WMA_LOGE("%s: Invalid capabilities", __func__);
+		return;
+	}
+
+	info->mac_tx_stream = wma_get_num_of_setbits_from_bitmask(
+				QDF_MAX(caps->tx_chain_mask_2G,
+					caps->tx_chain_mask_5G));
+	info->mac_rx_stream = wma_get_num_of_setbits_from_bitmask(
+				QDF_MAX(caps->rx_chain_mask_2G,
+					caps->rx_chain_mask_5G));
+	info->mac_bw = wma_map_wmi_channel_width_to_hw_mode_bw(
+				QDF_MAX(caps->max_bw_supported_2G,
+					caps->max_bw_supported_5G));
+}
+
+/**
+ * wma_set_hw_mode_params() - sets TX-RX stream, bandwidth and
+ * DBS in hw_mode_list
+ * @wma_handle: pointer to wma global structure
+ * @mac0_ss_bw_info: TX-RX streams, BW for MAC0
+ * @mac1_ss_bw_info: TX-RX streams, BW for MAC1
+ * @pos: refers to hw_mode_index
+ * @dbs_mode: dbs_mode for the dbs_hw_mode
+ * @sbs_mode: sbs_mode for the sbs_hw_mode
+ *
+ * This function sets TX-RX stream, bandwidth and DBS mode in
+ * hw_mode_list.
+ *
+ * Return: none
+ */
+static void wma_set_hw_mode_params(t_wma_handle *wma_handle,
+			struct mac_ss_bw_info mac0_ss_bw_info,
+			struct mac_ss_bw_info mac1_ss_bw_info,
+			uint32_t pos, uint32_t dbs_mode,
+			uint32_t sbs_mode)
+{
+	WMA_HW_MODE_MAC0_TX_STREAMS_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		mac0_ss_bw_info.mac_tx_stream);
+	WMA_HW_MODE_MAC0_RX_STREAMS_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		mac0_ss_bw_info.mac_rx_stream);
+	WMA_HW_MODE_MAC0_BANDWIDTH_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		mac0_ss_bw_info.mac_bw);
+	WMA_HW_MODE_MAC1_TX_STREAMS_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		mac1_ss_bw_info.mac_tx_stream);
+	WMA_HW_MODE_MAC1_RX_STREAMS_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		mac1_ss_bw_info.mac_rx_stream);
+	WMA_HW_MODE_MAC1_BANDWIDTH_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		mac1_ss_bw_info.mac_bw);
+	WMA_HW_MODE_DBS_MODE_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		dbs_mode);
+	WMA_HW_MODE_AGILE_DFS_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		HW_MODE_AGILE_DFS_NONE);
+	WMA_HW_MODE_SBS_MODE_SET(
+		wma_handle->hw_mode.hw_mode_list[pos],
+		sbs_mode);
+}
+
+/**
+ * wma_update_hw_mode_list() - updates hw_mode_list
+ * @wma_handle: pointer to wma global structure
+ *
+ * This function updates hw_mode_list with tx_streams, rx_streams,
+ * bandwidth, dbs and agile dfs for each hw_mode.
+ *
+ * Returns: 0 for success else failure.
+ */
+static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle)
+{
+	struct extended_caps *phy_caps;
+	WMI_MAC_PHY_CAPABILITIES *tmp;
+	uint32_t i, hw_config_type, j = 0;
+	uint32_t dbs_mode, sbs_mode;
+	struct mac_ss_bw_info mac0_ss_bw_info = {0};
+	struct mac_ss_bw_info mac1_ss_bw_info = {0};
+
+	if (!wma_handle) {
+		WMA_LOGE("%s: Invalid wma handle", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	phy_caps = &wma_handle->phy_caps;
+	if (!phy_caps) {
+		WMA_LOGE("%s: Invalid phy capabilities", __func__);
+		return QDF_STATUS_SUCCESS;
+	}
+
+	if (!phy_caps->num_hw_modes.num_hw_modes) {
+		WMA_LOGE("%s: Number of HW modes: %d",
+			 __func__, phy_caps->num_hw_modes.num_hw_modes);
+		return QDF_STATUS_SUCCESS;
+	}
+
+	/*
+	 * This list was updated as part of service ready event. Re-populate
+	 * HW mode list from the device capabilities.
+	 */
+	if (wma_handle->hw_mode.hw_mode_list) {
+		qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
+		wma_handle->hw_mode.hw_mode_list = NULL;
+		WMA_LOGI("%s: DBS list is freed", __func__);
+	}
+
+	wma_handle->num_dbs_hw_modes = phy_caps->num_hw_modes.num_hw_modes;
+	wma_handle->hw_mode.hw_mode_list =
+		qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
+			       wma_handle->num_dbs_hw_modes);
+	if (!wma_handle->hw_mode.hw_mode_list) {
+		WMA_LOGE("%s: Memory allocation failed for DBS", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	WMA_LOGA("%s: Updated HW mode list: Num modes:%d",
+		 __func__, wma_handle->num_dbs_hw_modes);
+
+	for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
+		/* Update for MAC0 */
+		tmp = &phy_caps->each_phy_cap_per_hwmode[j++];
+		wma_get_hw_mode_params(tmp, &mac0_ss_bw_info);
+		hw_config_type =
+			phy_caps->each_hw_mode_cap[i].hw_mode_config_type;
+		dbs_mode = HW_MODE_DBS_NONE;
+		sbs_mode = HW_MODE_SBS_NONE;
+		mac1_ss_bw_info.mac_tx_stream = 0;
+		mac1_ss_bw_info.mac_rx_stream = 0;
+		mac1_ss_bw_info.mac_bw = 0;
+
+		/* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
+		if ((hw_config_type == WMI_HW_MODE_DBS) ||
+		    (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
+		    (hw_config_type == WMI_HW_MODE_SBS)) {
+			/* Update for MAC1 */
+			tmp = &phy_caps->each_phy_cap_per_hwmode[j++];
+			wma_get_hw_mode_params(tmp, &mac1_ss_bw_info);
+			if (hw_config_type == WMI_HW_MODE_DBS)
+				dbs_mode = HW_MODE_DBS;
+			if ((hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
+			    (hw_config_type == WMI_HW_MODE_SBS))
+				sbs_mode = HW_MODE_SBS;
+		}
+
+		/* Updating HW mode list */
+		wma_set_hw_mode_params(wma_handle, mac0_ss_bw_info,
+				       mac1_ss_bw_info, i, dbs_mode,
+				       sbs_mode);
+	}
+	wma_dump_dbs_hw_mode(wma_handle);
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * wma_populate_soc_caps() - populate entire SOC's capabilities
  * @wma_handle: pointer to wma global structure
@@ -4988,6 +5341,12 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
 	}
 	wma_populate_soc_caps(wma_handle, param_buf);
 
+	ret = wma_update_hw_mode_list(wma_handle);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		WMA_LOGE("Failed to update hw mode list");
+		return -EINVAL;
+	}
+
 	WMA_LOGA("WMA --> WMI_INIT_CMDID");
 	status = wmi_unified_send_saved_init_cmd(wma_handle->wmi_handle);
 	if (status != EOK)
@@ -6280,6 +6639,8 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg)
 	case WDA_BPF_SET_INSTRUCTIONS_REQ:
 		wma_set_bpf_instructions(wma_handle, msg->bodyptr);
 		qdf_mem_free(msg->bodyptr);
+	case WMA_SET_CTS2SELF_FOR_STA:
+		wma_set_cts2self_for_p2p_go(wma_handle, true);
 		break;
 	case SIR_HAL_NDP_INITIATOR_REQ:
 		wma_handle_ndp_initiator_req(wma_handle, msg->bodyptr);

+ 28 - 0
core/wma/src/wma_mgmt.c

@@ -965,6 +965,8 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
 		cmd->peer_flags |= WMI_PEER_160MHZ;
 
 	cmd->peer_vht_caps = params->vht_caps;
+	if (params->p2pCapableSta)
+		cmd->peer_flags |= WMI_PEER_IS_P2P_CAPABLE;
 
 	if (params->rmfEnabled)
 		cmd->peer_flags |= WMI_PEER_PMF;
@@ -2655,6 +2657,32 @@ void wma_process_update_userpos(tp_wma_handle wma_handle,
 
 }
 
+QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle,
+				    uint32_t cts2self_for_p2p_go)
+{
+	int32_t ret;
+	tp_wma_handle wma = (tp_wma_handle)wma_handle;
+	struct pdev_params pdevparam;
+
+	pdevparam.param_id = WMI_PDEV_PARAM_CTS2SELF_FOR_P2P_GO_CONFIG;
+	pdevparam.param_value = cts2self_for_p2p_go;
+
+	ret = wmi_unified_pdev_param_send(wma->wmi_handle,
+			&pdevparam,
+			WMA_WILDCARD_PDEV_ID);
+	if (ret) {
+		WMA_LOGE("Fail to Set CTS2SELF for p2p GO %d",
+			cts2self_for_p2p_go);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	WMA_LOGD("Successfully Set CTS2SELF for p2p GO %d",
+		cts2self_for_p2p_go);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+
 /**
  * wma_set_htconfig() - set ht config parameters to target
  * @vdev_id: vdev id

+ 9 - 128
core/wma/src/wma_power.c

@@ -715,119 +715,6 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
 	return QDF_STATUS_SUCCESS;
 }
 
-/**
- * wma_set_qpower_force_sleep() - set qpower params in fw
- * @wma: wma handle
- * @vdev_id: vdev id
- * @enable: value
- *
- * Return: QDF_STATUS_SUCCESS for success or error code
- */
-QDF_STATUS wma_set_qpower_force_sleep(tp_wma_handle wma, uint32_t vdev_id,
-				   uint8_t enable)
-{
-	QDF_STATUS ret;
-	uint32_t cfg_data_val = 0;
-	/* get mac to acess CFG data base */
-	struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
-	uint32_t pspoll_count = WMA_DEFAULT_MAX_PSPOLL_BEFORE_WAKE;
-
-	WMA_LOGE("Set QPower Force(1)/Normal(0) Sleep vdevId %d val %d",
-		 vdev_id, enable);
-
-	if (NULL == mac) {
-		WMA_LOGE("%s: Unable to get PE context", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	/* Get Configured Ps Poll Count */
-	if (wlan_cfg_get_int(mac, WNI_CFG_MAX_PS_POLL,
-			     &cfg_data_val) != eSIR_SUCCESS) {
-		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-			  "Failed to get value for WNI_CFG_MAX_PS_POLL");
-	}
-	if (cfg_data_val) {
-		pspoll_count = (uint32_t) cfg_data_val;
-	}
-
-	/* Enable QPower */
-	ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-					   WMI_STA_PS_ENABLE_QPOWER, 1);
-
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMA_LOGE("Enable QPower Failed vdevId %d", vdev_id);
-		return ret;
-	}
-	WMA_LOGD("QPower Enabled vdevId %d", vdev_id);
-
-	/* Set the Wake Policy to WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD */
-	ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-					   WMI_STA_PS_PARAM_RX_WAKE_POLICY,
-					   WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD);
-
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMA_LOGE("Setting wake policy to pspoll/uapsd Failed vdevId %d",
-			 vdev_id);
-		return ret;
-	}
-	WMA_LOGD("Wake policy set to to pspoll/uapsd vdevId %d", vdev_id);
-
-	if (enable) {
-		/* Set the Tx Wake Threshold */
-		ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-						   WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD,
-						   WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER);
-
-		if (QDF_IS_STATUS_ERROR(ret)) {
-			WMA_LOGE("Setting TxWake Threshold vdevId %d", vdev_id);
-			return ret;
-		}
-		WMA_LOGD("TxWake Threshold set to TX_WAKE_THRESHOLD_NEVER %d",
-			 vdev_id);
-	}
-
-	/* Set the QPower Ps Poll Count */
-	ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-					   WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
-					   pspoll_count);
-
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMA_LOGE("Set QPower Ps Poll Count Failed vdevId %d ps poll cnt %d",
-			vdev_id, pspoll_count);
-		return ret;
-	}
-	WMA_LOGD("Set QPower Ps Poll Count vdevId %d ps poll cnt %d",
-		 vdev_id, pspoll_count);
-
-	/* Enable Sta Mode Power save */
-	ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true);
-
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMA_LOGE("Enable Sta Mode Ps Failed vdevId %d", vdev_id);
-		return ret;
-	}
-
-	/* Set Listen Interval */
-	if (wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
-			     &cfg_data_val) != eSIR_SUCCESS) {
-		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-			  "Failed to get value for WNI_CFG_LISTEN_INTERVAL");
-		cfg_data_val = POWERSAVE_DEFAULT_LISTEN_INTERVAL;
-	}
-
-	ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-					      WMI_VDEV_PARAM_LISTEN_INTERVAL,
-					      cfg_data_val);
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		/* Even it fails continue Fw will take default LI */
-		WMA_LOGE("Failed to Set Listen Interval vdevId %d", vdev_id);
-	}
-	WMA_LOGD("Set Listen Interval vdevId %d Listen Intv %d",
-		 vdev_id, cfg_data_val);
-
-	return QDF_STATUS_SUCCESS;
-}
-
 /**
  * wma_get_qpower_config() - get qpower configuration
  * @wma: WMA handle
@@ -969,27 +856,21 @@ void wma_disable_sta_ps_mode(tp_wma_handle wma, tpDisablePsParams ps_req)
 	}
 }
 
-/**
- * wma_set_powersave_config() - update power save config in wma
- * @val: new power save value
- *
- * This function update qpower value in wma layer
- *
- * Return: QDF_STATUS_SUCCESS on success, error number otherwise
- */
-QDF_STATUS wma_set_powersave_config(uint8_t val)
+QDF_STATUS wma_set_qpower_config(uint8_t vdev_id, uint8_t qpower)
 {
-	tp_wma_handle wma_handle;
+	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 
-	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
-
-	if (!wma_handle) {
+	if (!wma) {
 		WMA_LOGE("%s: WMA context is invald!", __func__);
 		return QDF_STATUS_E_INVAL;
 	}
-	wma_handle->powersave_mode = val;
 
-	return QDF_STATUS_SUCCESS;
+	WMA_LOGI("configuring qpower: %d", qpower);
+	wma->powersave_mode = qpower;
+	return wma_unified_set_sta_ps_param(wma->wmi_handle,
+					    vdev_id,
+					    WMI_STA_PS_ENABLE_QPOWER,
+					    wma_get_qpower_config(wma));
 }
 
 /**

+ 50 - 123
core/wma/src/wma_utils.c

@@ -2534,6 +2534,7 @@ void wma_get_tx_rx_ss_from_config(enum hw_mode_ss_config mac_ss,
  * @mac1_bw: Bandwidth of MAC1 of type 'hw_mode_bandwidth'
  * @dbs: DBS capability of type 'hw_mode_dbs_capab'
  * @dfs: Agile DFS capability of type 'hw_mode_agile_dfs_capab'
+ * @sbs: SBS capability of type 'hw_mode_sbs_capab'
  *
  * Fetches the HW mode index corresponding to the HW mode provided
  *
@@ -2546,12 +2547,13 @@ static int8_t wma_get_matching_hw_mode_index(tp_wma_handle wma,
 				uint32_t mac1_tx_ss, uint32_t mac1_rx_ss,
 				enum hw_mode_bandwidth mac1_bw,
 				enum hw_mode_dbs_capab dbs,
-				enum hw_mode_agile_dfs_capab dfs)
+				enum hw_mode_agile_dfs_capab dfs,
+				enum hw_mode_sbs_capab sbs)
 {
 	uint32_t i;
 	uint32_t t_mac0_tx_ss, t_mac0_rx_ss, t_mac0_bw;
 	uint32_t t_mac1_tx_ss, t_mac1_rx_ss, t_mac1_bw;
-	uint32_t dbs_mode, agile_dfs_mode;
+	uint32_t dbs_mode, agile_dfs_mode, sbs_mode;
 	int8_t found = -EINVAL;
 
 	if (!wma) {
@@ -2560,46 +2562,56 @@ static int8_t wma_get_matching_hw_mode_index(tp_wma_handle wma,
 	}
 
 	for (i = 0; i < wma->num_dbs_hw_modes; i++) {
-		t_mac0_tx_ss = WMI_DBS_HW_MODE_MAC0_TX_STREAMS_GET(
+		t_mac0_tx_ss = WMA_HW_MODE_MAC0_TX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
 		if (t_mac0_tx_ss != mac0_tx_ss)
 			continue;
 
-		t_mac0_rx_ss = WMI_DBS_HW_MODE_MAC0_RX_STREAMS_GET(
+		t_mac0_rx_ss = WMA_HW_MODE_MAC0_RX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
 		if (t_mac0_rx_ss != mac0_rx_ss)
 			continue;
 
-		t_mac0_bw = WMI_DBS_HW_MODE_MAC0_BANDWIDTH_GET(
+		t_mac0_bw = WMA_HW_MODE_MAC0_BANDWIDTH_GET(
 				wma->hw_mode.hw_mode_list[i]);
-		if (t_mac0_bw != mac0_bw)
+		/*
+		 * Firmware advertises max bw capability as CBW 80+80
+		 * for single MAC. Thus CBW 20/40/80 should also be
+		 * supported, if CBW 80+80 is supported.
+		 */
+		if (t_mac0_bw < mac0_bw)
 			continue;
 
-		t_mac1_tx_ss = WMI_DBS_HW_MODE_MAC1_TX_STREAMS_GET(
+		t_mac1_tx_ss = WMA_HW_MODE_MAC1_TX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
 		if (t_mac1_tx_ss != mac1_tx_ss)
 			continue;
 
-		t_mac1_rx_ss = WMI_DBS_HW_MODE_MAC1_RX_STREAMS_GET(
+		t_mac1_rx_ss = WMA_HW_MODE_MAC1_RX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
 		if (t_mac1_rx_ss != mac1_rx_ss)
 			continue;
 
-		t_mac1_bw = WMI_DBS_HW_MODE_MAC1_BANDWIDTH_GET(
+		t_mac1_bw = WMA_HW_MODE_MAC1_BANDWIDTH_GET(
 				wma->hw_mode.hw_mode_list[i]);
-		if (t_mac1_bw != mac1_bw)
+		if (t_mac1_bw < mac1_bw)
 			continue;
 
-		dbs_mode = WMI_DBS_HW_MODE_DBS_MODE_GET(
+		dbs_mode = WMA_HW_MODE_DBS_MODE_GET(
 				wma->hw_mode.hw_mode_list[i]);
 		if (dbs_mode != dbs)
 			continue;
 
-		agile_dfs_mode = WMI_DBS_HW_MODE_AGILE_DFS_GET(
+		agile_dfs_mode = WMA_HW_MODE_AGILE_DFS_GET(
 				wma->hw_mode.hw_mode_list[i]);
 		if (agile_dfs_mode != dfs)
 			continue;
 
+		sbs_mode = WMA_HW_MODE_SBS_MODE_GET(
+				wma->hw_mode.hw_mode_list[i]);
+		if (sbs_mode != sbs)
+			continue;
+
 		found = i;
 		WMA_LOGI("%s: hw_mode index %d found",
 				__func__, i);
@@ -2616,9 +2628,10 @@ static int8_t wma_get_matching_hw_mode_index(tp_wma_handle wma,
  * @mac1_bw: MAC1 bandwidth configuration
  * @dbs: HW DBS capability
  * @dfs: HW Agile DFS capability
+ * @sbs: HW SBS capability
  *
  * Get the HW mode index corresponding to the HW modes spatial stream,
- * bandwidth, DBS and Agile DFS capability
+ * bandwidth, DBS, Agile DFS and SBS capability
  *
  * Return: Index number if a match is found or -negative value if not found
  */
@@ -2627,7 +2640,8 @@ int8_t wma_get_hw_mode_idx_from_dbs_hw_list(enum hw_mode_ss_config mac0_ss,
 					    enum hw_mode_ss_config mac1_ss,
 					    enum hw_mode_bandwidth mac1_bw,
 					    enum hw_mode_dbs_capab dbs,
-					    enum hw_mode_agile_dfs_capab dfs)
+					    enum hw_mode_agile_dfs_capab dfs,
+					    enum hw_mode_sbs_capab sbs)
 {
 	tp_wma_handle wma;
 	uint32_t mac0_tx_ss, mac0_rx_ss;
@@ -2646,14 +2660,14 @@ int8_t wma_get_hw_mode_idx_from_dbs_hw_list(enum hw_mode_ss_config mac0_ss,
 		__func__, mac0_tx_ss, mac0_rx_ss, mac0_bw);
 	WMA_LOGI("%s: MAC1: TxSS=%d, RxSS=%d, BW=%d",
 		__func__, mac1_tx_ss, mac1_rx_ss, mac1_bw);
-	WMA_LOGI("%s: DBS capab=%d, Agile DFS capab=%d",
-		__func__, dbs, dfs);
+	WMA_LOGI("%s: DBS=%d, Agile DFS=%d, SBS=%d",
+		__func__, dbs, dfs, sbs);
 
 	return wma_get_matching_hw_mode_index(wma, mac0_tx_ss, mac0_rx_ss,
 						mac0_bw,
 						mac1_tx_ss, mac1_rx_ss,
 						mac1_bw,
-						dbs, dfs);
+						dbs, dfs, sbs);
 }
 
 /**
@@ -2689,14 +2703,15 @@ QDF_STATUS wma_get_hw_mode_from_idx(uint32_t idx,
 
 	param = wma->hw_mode.hw_mode_list[idx];
 
-	hw_mode->mac0_tx_ss = WMI_DBS_HW_MODE_MAC0_TX_STREAMS_GET(param);
-	hw_mode->mac0_rx_ss = WMI_DBS_HW_MODE_MAC0_RX_STREAMS_GET(param);
-	hw_mode->mac0_bw = WMI_DBS_HW_MODE_MAC0_BANDWIDTH_GET(param);
-	hw_mode->mac1_tx_ss = WMI_DBS_HW_MODE_MAC1_TX_STREAMS_GET(param);
-	hw_mode->mac1_rx_ss = WMI_DBS_HW_MODE_MAC1_RX_STREAMS_GET(param);
-	hw_mode->mac1_bw = WMI_DBS_HW_MODE_MAC1_BANDWIDTH_GET(param);
-	hw_mode->dbs_cap = WMI_DBS_HW_MODE_DBS_MODE_GET(param);
-	hw_mode->agile_dfs_cap = WMI_DBS_HW_MODE_AGILE_DFS_GET(param);
+	hw_mode->mac0_tx_ss = WMA_HW_MODE_MAC0_TX_STREAMS_GET(param);
+	hw_mode->mac0_rx_ss = WMA_HW_MODE_MAC0_RX_STREAMS_GET(param);
+	hw_mode->mac0_bw = WMA_HW_MODE_MAC0_BANDWIDTH_GET(param);
+	hw_mode->mac1_tx_ss = WMA_HW_MODE_MAC1_TX_STREAMS_GET(param);
+	hw_mode->mac1_rx_ss = WMA_HW_MODE_MAC1_RX_STREAMS_GET(param);
+	hw_mode->mac1_bw = WMA_HW_MODE_MAC1_BANDWIDTH_GET(param);
+	hw_mode->dbs_cap = WMA_HW_MODE_DBS_MODE_GET(param);
+	hw_mode->agile_dfs_cap = WMA_HW_MODE_AGILE_DFS_GET(param);
+	hw_mode->sbs_cap = WMA_HW_MODE_SBS_MODE_GET(param);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -2758,7 +2773,7 @@ bool wma_is_hw_dbs_capable(void)
 	for (i = 0; i < wma->num_dbs_hw_modes; i++) {
 		param = wma->hw_mode.hw_mode_list[i];
 		WMA_LOGI("%s: HW param: %x", __func__, param);
-		if (WMI_DBS_HW_MODE_DBS_MODE_GET(param)) {
+		if (WMA_HW_MODE_DBS_MODE_GET(param)) {
 			WMA_LOGI("%s: HW (%d) is DBS capable", __func__, i);
 			found = 1;
 			break;
@@ -2771,58 +2786,6 @@ bool wma_is_hw_dbs_capable(void)
 	return false;
 }
 
-/**
- * wma_is_hw_agile_dfs_capable() - Check if HW is agile DFS capable
- *
- * Checks if the HW is agile DFS capable
- *
- * Return: true if the HW is agile DFS capable
- */
-bool wma_is_hw_agile_dfs_capable(void)
-{
-	tp_wma_handle wma;
-	uint32_t param, i, found = 0;
-
-	wma = cds_get_context(QDF_MODULE_ID_WMA);
-	if (!wma) {
-		WMA_LOGE("%s: Invalid WMA handle", __func__);
-		return false;
-	}
-
-	if (!wma_is_agile_dfs_enable()) {
-		WMA_LOGI("%s: Agile DFS is disabled", __func__);
-		return false;
-	}
-
-	WMA_LOGI("%s: DBS service bit map: %d", __func__,
-		WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
-		WMI_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT));
-
-	/* The agreement with FW is that to know if the target is Agile DFS
-	 * capable, DBS needs to be supported in the service bit map and
-	 * Agile DFS needs to be supported in the HW mode list
-	 */
-	if (!(WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
-			WMI_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT)))
-		return false;
-
-	for (i = 0; i < wma->num_dbs_hw_modes; i++) {
-		param = wma->hw_mode.hw_mode_list[i];
-		WMA_LOGI("%s: HW param: %x", __func__, param);
-		if (WMI_DBS_HW_MODE_AGILE_DFS_GET(param)) {
-			WMA_LOGI("%s: HW %d is agile DFS capable",
-				__func__, i);
-			found = 1;
-			break;
-		}
-	}
-
-	if (found)
-		return true;
-
-	return false;
-}
-
 /**
  * wma_get_mac_id_of_vdev() - Get MAC id corresponding to a vdev
  * @vdev_id: VDEV whose MAC ID is required
@@ -2913,14 +2876,14 @@ void wma_update_intf_hw_mode_params(uint32_t vdev_id, uint32_t mac_id,
 	wma->interfaces[vdev_id].mac_id = mac_id;
 	if (mac_id == 0) {
 		wma->interfaces[vdev_id].tx_streams =
-			WMI_DBS_HW_MODE_MAC0_TX_STREAMS_GET(param);
+			WMA_HW_MODE_MAC0_TX_STREAMS_GET(param);
 		wma->interfaces[vdev_id].rx_streams =
-			WMI_DBS_HW_MODE_MAC0_RX_STREAMS_GET(param);
+			WMA_HW_MODE_MAC0_RX_STREAMS_GET(param);
 	} else {
 		wma->interfaces[vdev_id].tx_streams =
-			WMI_DBS_HW_MODE_MAC1_TX_STREAMS_GET(param);
+			WMA_HW_MODE_MAC1_TX_STREAMS_GET(param);
 		wma->interfaces[vdev_id].rx_streams =
-			WMI_DBS_HW_MODE_MAC1_RX_STREAMS_GET(param);
+			WMA_HW_MODE_MAC1_RX_STREAMS_GET(param);
 	}
 }
 
@@ -2976,15 +2939,15 @@ QDF_STATUS wma_get_dbs_hw_modes(bool *one_by_one_dbs, bool *two_by_two_dbs)
 		uint32_t t_conf1_tx_ss, t_conf1_rx_ss;
 		uint32_t dbs_mode;
 
-		t_conf0_tx_ss = WMI_DBS_HW_MODE_MAC0_TX_STREAMS_GET(
+		t_conf0_tx_ss = WMA_HW_MODE_MAC0_TX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
-		t_conf0_rx_ss = WMI_DBS_HW_MODE_MAC0_RX_STREAMS_GET(
+		t_conf0_rx_ss = WMA_HW_MODE_MAC0_RX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
-		t_conf1_tx_ss = WMI_DBS_HW_MODE_MAC1_TX_STREAMS_GET(
+		t_conf1_tx_ss = WMA_HW_MODE_MAC1_TX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
-		t_conf1_rx_ss = WMI_DBS_HW_MODE_MAC1_RX_STREAMS_GET(
+		t_conf1_rx_ss = WMA_HW_MODE_MAC1_RX_STREAMS_GET(
 				wma->hw_mode.hw_mode_list[i]);
-		dbs_mode = WMI_DBS_HW_MODE_DBS_MODE_GET(
+		dbs_mode = WMA_HW_MODE_DBS_MODE_GET(
 				wma->hw_mode.hw_mode_list[i]);
 
 		if (((((t_conf0_tx_ss == conf1_tx_ss) &&
@@ -3092,42 +3055,6 @@ bool wma_is_dbs_enable(void)
 	return false;
 }
 
-/**
- * wma_is_agile_dfs_enable() - Check if master Agile DFS control is enabled
- *
- * Checks if the master Agile DFS control is enabled. This will be used
- * to override any other Agile DFS capability
- *
- * Return: True if master Agile DFS control is enabled
- */
-bool wma_is_agile_dfs_enable(void)
-{
-	tp_wma_handle wma;
-
-	if (wma_is_dual_mac_disabled_in_ini())
-		return false;
-
-	wma = cds_get_context(QDF_MODULE_ID_WMA);
-	if (!wma) {
-		WMA_LOGE("%s: Invalid WMA handle", __func__);
-		return false;
-	}
-
-	WMA_LOGD("%s: DFS=%d Single mac with DFS=%d", __func__,
-			WMI_DBS_FW_MODE_CFG_AGILE_DFS_GET(
-				wma->dual_mac_cfg.cur_fw_mode_config),
-			WMI_DBS_CONC_SCAN_CFG_AGILE_DFS_SCAN_GET(
-				wma->dual_mac_cfg.cur_scan_config));
-
-	if ((WMI_DBS_FW_MODE_CFG_AGILE_DFS_GET(
-			wma->dual_mac_cfg.cur_fw_mode_config)) &&
-			(WMI_DBS_CONC_SCAN_CFG_AGILE_DFS_SCAN_GET(
-					    wma->dual_mac_cfg.cur_scan_config)))
-		return true;
-
-	return false;
-}
-
 /**
  * wma_get_updated_scan_config() - Get the updated scan configuration
  * @scan_config: Pointer containing the updated scan config

+ 1 - 1
core/wma/src/wma_utils_ut.c

@@ -73,7 +73,7 @@ void wma_set_dbs_capability_ut(uint32_t dbs)
 	}
 
 	for (i = 0; i < wma->num_dbs_hw_modes; i++) {
-		WMI_DBS_HW_MODE_DBS_MODE_SET(wma->hw_mode.hw_mode_list[i],
+		WMA_HW_MODE_DBS_MODE_SET(wma->hw_mode.hw_mode_list[i],
 				dbs);
 	}
 

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików