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

Merge "qcacmn: Rename cmd ring to cmd_credit ring"

Linux Build Service Account 5 жил өмнө
parent
commit
67ef957780

+ 30 - 0
dp/inc/cdp_txrx_cmn.h

@@ -1677,6 +1677,36 @@ static inline int cdp_set_pn_check(ol_txrx_soc_handle soc,
 	return 0;
 }
 
+/**
+ * cdp_set_key_sec_type(): function to set sec mode of key
+ * @soc: soc handle
+ * @vdev_id: id of virtual device
+ * @peer_mac: mac address of peer
+ * @sec_type: security type
+ * #is_unicast: ucast or mcast
+ */
+static inline int cdp_set_key_sec_type(ol_txrx_soc_handle soc,
+				       uint8_t vdev_id,
+				       uint8_t *peer_mac,
+				       enum cdp_sec_type sec_type,
+				       bool is_unicast)
+{
+	if (!soc || !soc->ops) {
+		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Invalid Instance:", __func__);
+		QDF_BUG(0);
+		return 0;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->set_key_sec_type)
+		return 0;
+
+	soc->ops->cmn_drv_ops->set_key_sec_type(soc, vdev_id,
+			peer_mac, sec_type, is_unicast);
+	return 0;
+}
+
 static inline QDF_STATUS
 cdp_set_key(ol_txrx_soc_handle soc,
 	    uint8_t vdev_id,

+ 1 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -1188,6 +1188,7 @@ enum cdp_tx_enh_capture_mode {
 	CDP_TX_ENH_CAPTURE_DISABLED = 0,
 	CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS,
 	CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER,
+	CDP_TX_ENH_CAPTURE_MAX,
 };
 
 /*

+ 2 - 3
dp/inc/cdp_txrx_ctrl.h

@@ -906,7 +906,7 @@ static inline QDF_STATUS
 cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc,
 				   uint8_t pdev_id,
 				   bool is_rx_pkt_cap_enable,
-				   bool is_tx_pkt_cap_enable,
+				   uint8_t is_tx_pkt_cap_enable,
 				   uint8_t *peer_mac)
 {
 	if (!soc || !soc->ops) {
@@ -921,8 +921,7 @@ cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc,
 
 	return soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params
 			(soc, pdev_id, is_rx_pkt_cap_enable,
-			 is_tx_pkt_cap_enable,
-			 peer_mac);
+			 is_tx_pkt_cap_enable, peer_mac);
 }
 #endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
 

+ 3 - 23
dp/inc/cdp_txrx_misc.h

@@ -780,27 +780,8 @@ cdp_txrx_ext_stats_request(ol_txrx_soc_handle soc, uint8_t pdev_id,
  *
  * return: none
  */
-static inline void
-cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
-{
-	if (!soc || !soc->ops || !soc->ops->misc_ops) {
-		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
-			  "%s: Invalid Instance:", __func__);
-		return;
-	}
-
-	if (soc->ops->misc_ops->request_rx_hw_stats)
-		soc->ops->misc_ops->request_rx_hw_stats(soc, vdev_id);
-}
-
-/**
- * cdp_wait_for_ext_rx_stats(): wait for reo command status for stats
- * @soc: soc handle
- *
- * return: status
- */
 static inline QDF_STATUS
-cdp_wait_for_ext_rx_stats(ol_txrx_soc_handle soc)
+cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
 {
 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
 		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
@@ -808,10 +789,9 @@ cdp_wait_for_ext_rx_stats(ol_txrx_soc_handle soc)
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (soc->ops->misc_ops->wait_for_ext_rx_stats)
-		return soc->ops->misc_ops->wait_for_ext_rx_stats(soc);
+	if (soc->ops->misc_ops->request_rx_hw_stats)
+		return soc->ops->misc_ops->request_rx_hw_stats(soc, vdev_id);
 
 	return QDF_STATUS_SUCCESS;
 }
-
 #endif /* _CDP_TXRX_MISC_H_ */

+ 9 - 3
dp/inc/cdp_txrx_ops.h

@@ -437,6 +437,12 @@ struct cdp_cmn_ops {
 				    uint8_t vdev_id, uint8_t *peermac,
 				    enum cdp_sec_type sec_type,
 				    uint32_t *rx_pn);
+
+	QDF_STATUS(*set_key_sec_type)(struct cdp_soc_t *soc_handle,
+				      uint8_t vdev_id, uint8_t *peermac,
+				      enum cdp_sec_type sec_type,
+				      bool is_unicast);
+
 	QDF_STATUS (*update_config_parameters)(struct cdp_soc *psoc,
 			struct cdp_config_params *params);
 
@@ -704,7 +710,7 @@ struct cdp_ctrl_ops {
 #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH)
 	QDF_STATUS (*txrx_update_peer_pkt_capture_params)(
 			ol_txrx_soc_handle soc, uint8_t pdev_id,
-			bool is_rx_pkt_cap_enable, bool is_tx_pkt_cap_enable,
+			bool is_rx_pkt_cap_enable, uint8_t is_tx_pkt_cap_enable,
 			uint8_t *peer_mac);
 #endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
 	QDF_STATUS
@@ -1209,8 +1215,8 @@ struct cdp_misc_ops {
 	QDF_STATUS (*txrx_ext_stats_request)(struct cdp_soc_t *soc_hdl,
 					     uint8_t pdev_id,
 					     struct cdp_txrx_ext_stats *req);
-	void (*request_rx_hw_stats)(struct cdp_soc_t *soc_hdl, uint8_t vdev_id);
-	QDF_STATUS (*wait_for_ext_rx_stats)(struct cdp_soc_t *soc_hdl);
+	QDF_STATUS (*request_rx_hw_stats)(struct cdp_soc_t *soc_hdl,
+					  uint8_t vdev_id);
 };
 
 /**

+ 18 - 0
dp/wifi3.0/dp_internal.h

@@ -1140,6 +1140,11 @@ dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
 		      uint8_t *peer_mac, enum cdp_sec_type sec_type,
 		      uint32_t *rx_pn);
 
+QDF_STATUS
+dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
+			  uint8_t *peer_mac, enum cdp_sec_type sec_type,
+			  bool is_unicast);
+
 void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
 
 QDF_STATUS
@@ -1802,6 +1807,19 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
 {
 }
 
+/*
+ * dp_peer_tx_capture_filter_check: check filter is enable for the filter
+ * and update tx_cap_enabled flag
+ * @pdev: DP PDEV handle
+ * @peer: DP PEER handle
+ *
+ * return: void
+ */
+static inline
+void dp_peer_tx_capture_filter_check(struct dp_pdev *pdev,
+				     struct dp_peer *peer)
+{
+}
 #endif
 
 #ifdef FEATURE_PERPKT_INFO

+ 91 - 84
dp/wifi3.0/dp_main.c

@@ -1050,7 +1050,8 @@ static int dp_srng_calculate_msi_group(struct dp_soc *soc,
 	break;
 
 	case TCL_DATA:
-	case TCL_CMD:
+	/* CMD_CREDIT_RING is used as command in 8074 and credit in 9000 */
+	case TCL_CMD_CREDIT:
 	case REO_CMD:
 	case SW2WBM_RELEASE:
 	case WBM_IDLE_LINK:
@@ -2996,12 +2997,11 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 		goto fail1;
 	}
 
-	entries = wlan_cfg_get_dp_soc_tcl_cmd_ring_size(soc_cfg_ctx);
-	/* TCL command and status rings */
-	if (dp_srng_setup(soc, &soc->tcl_cmd_ring, TCL_CMD, 0, 0,
+	entries = wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size(soc_cfg_ctx);
+	if (dp_srng_setup(soc, &soc->tcl_cmd_credit_ring, TCL_CMD_CREDIT, 0, 0,
 			  entries, 0)) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-			FL("dp_srng_setup failed for tcl_cmd_ring"));
+			FL("dp_srng_setup failed for tcl_cmd_credit_ring."));
 		goto fail2;
 	}
 
@@ -4379,8 +4379,9 @@ static void dp_soc_deinit(void *txrx_soc)
 			dp_tx_deinit_pair_by_index(soc, IPA_TCL_DATA_RING_IDX);
 	}
 
-	/* TCL command and status rings */
-	dp_srng_deinit(soc, &soc->tcl_cmd_ring, TCL_CMD, 0);
+	/* TCL command/credit ring */
+	dp_srng_deinit(soc, &soc->tcl_cmd_credit_ring, TCL_CMD_CREDIT, 0);
+	/* TCL status ring */
 	dp_srng_deinit(soc, &soc->tcl_status_ring, TCL_STATUS, 0);
 
 	/* Rx data rings */
@@ -4493,8 +4494,9 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc)
 		}
 	}
 
-	/* TCL command and status rings */
-	dp_srng_cleanup(soc, &soc->tcl_cmd_ring, TCL_CMD, 0);
+	/* TCL command/credit ring */
+	dp_srng_cleanup(soc, &soc->tcl_cmd_credit_ring, TCL_CMD_CREDIT, 0);
+	/* TCL status rings */
 	dp_srng_cleanup(soc, &soc->tcl_status_ring, TCL_STATUS, 0);
 
 	/* Rx data rings */
@@ -5522,26 +5524,6 @@ static inline void dp_peer_rx_bufq_resources_init(struct dp_peer *peer)
 }
 #endif
 
-#ifdef WLAN_FEATURE_STATS_EXT
-/*
- * dp_set_ignore_reo_status_cb() - set ignore reo status cb flag
- * @soc: dp soc handle
- * @flag: flag to set or reset
- *
- * Return: None
- */
-static inline void dp_set_ignore_reo_status_cb(struct dp_soc *soc,
-					       bool flag)
-{
-	soc->ignore_reo_status_cb = flag;
-}
-#else
-static inline void dp_set_ignore_reo_status_cb(struct dp_soc *soc,
-					       bool flag)
-{
-}
-#endif
-
 /*
  * dp_peer_create_wifi3() - attach txrx peer
  * @soc_hdl: Datapath soc handle
@@ -5612,6 +5594,12 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		DP_STATS_INIT(peer);
 		DP_STATS_UPD(peer, rx.avg_rssi, INVALID_RSSI);
 
+		/*
+		 * In tx_monitor mode, filter may be set for unassociated peer
+		 * when unassociated peer get associated peer need to
+		 * update tx_cap_enabled flag to support peer filter.
+		 */
+		dp_peer_tx_capture_filter_check(pdev, peer);
 		return QDF_STATUS_SUCCESS;
 	} else {
 		/*
@@ -5702,12 +5690,6 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		vdev->vap_self_peer = peer;
 	}
 
-	if (wlan_op_mode_sta == vdev->opmode &&
-	    qdf_mem_cmp(peer->mac_addr.raw, vdev->mac_addr.raw,
-			QDF_MAC_ADDR_SIZE) != 0) {
-		dp_set_ignore_reo_status_cb(soc, false);
-	}
-
 	for (i = 0; i < DP_MAX_TIDS; i++)
 		qdf_spinlock_create(&peer->rx_tid[i].tid_lock);
 
@@ -5735,6 +5717,14 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 						peer_cookie.ctx;
 		}
 	}
+
+	/*
+	 * In tx_monitor mode, filter may be set for unassociated peer
+	 * when unassociated peer get associated peer need to
+	 * update tx_cap_enabled flag to support peer filter.
+	 */
+	dp_peer_tx_capture_filter_check(pdev, peer);
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -6279,8 +6269,11 @@ static void dp_vdev_reset_peer(struct dp_vdev *vdev,
 	if (!vdev) {
 		dp_err("vdev is NULL");
 	} else {
-		if (vdev->vap_bss_peer == peer)
-		    vdev->vap_bss_peer = NULL;
+		if (vdev->vap_bss_peer == peer) {
+			vdev->vap_bss_peer = NULL;
+			qdf_mem_zero(vdev->vap_bss_peer_mac_addr,
+				     QDF_MAC_ADDR_SIZE);
+		}
 
 		if (vdev && vdev->vap_bss_peer) {
 		    bss_peer = vdev->vap_bss_peer;
@@ -6543,12 +6536,6 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
 	qdf_spinlock_destroy(&peer->peer_info_lock);
 	dp_peer_multipass_list_remove(peer);
 
-	if (wlan_op_mode_sta == peer->vdev->opmode &&
-	    qdf_mem_cmp(peer->mac_addr.raw, peer->vdev->mac_addr.raw,
-			QDF_MAC_ADDR_SIZE) != 0) {
-		dp_set_ignore_reo_status_cb(peer->vdev->pdev->soc, true);
-	}
-
 	/*
 	 * Remove the reference added during peer_attach.
 	 * The peer will still be left allocated until the
@@ -7374,8 +7361,8 @@ char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type)
 		return "wbm2sw_release";
 	case TCL_DATA:
 		return "tcl_data";
-	case TCL_CMD:
-		return "tcl_cmd";
+	case TCL_CMD_CREDIT:
+		return "tcl_cmd_credit";
 	case TCL_STATUS:
 		return "tcl_status";
 	case SW2WBM_RELEASE:
@@ -8426,7 +8413,8 @@ static QDF_STATUS dp_get_psoc_param(struct cdp_soc_t *cdp_soc,
  * @soc: DP_SOC handle
  * @pdev_id: id of DP_PDEV handle
  * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode
- * @is_tx_pkt_cap_enable: enable/disable Tx packet capture in monitor mode
+ * @is_tx_pkt_cap_enable: enable/disable/delete/print
+ * Tx packet capture in monitor mode
  * @peer_mac: MAC address for which the above need to be enabled/disabled
  *
  * Return: Success if Rx & Tx capture is enabled for peer, false otherwise
@@ -8435,28 +8423,30 @@ QDF_STATUS
 dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc,
 				  uint8_t pdev_id,
 				  bool is_rx_pkt_cap_enable,
-				  bool is_tx_pkt_cap_enable,
+				  uint8_t is_tx_pkt_cap_enable,
 				  uint8_t *peer_mac)
 {
+	QDF_STATUS status;
 	struct dp_peer *peer;
 	struct dp_pdev *pdev =
 		dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc,
 						   pdev_id);
-
 	if (!pdev)
 		return QDF_STATUS_E_FAILURE;
 
 	peer = (struct dp_peer *)dp_find_peer_by_addr((struct cdp_pdev *)pdev,
 						      peer_mac);
-	if (!peer) {
-		dp_err("Invalid Peer");
-		return QDF_STATUS_E_FAILURE;
-	}
 
-	dp_peer_set_rx_capture_enabled(peer, is_rx_pkt_cap_enable);
-	dp_peer_set_tx_capture_enabled(peer, is_tx_pkt_cap_enable);
+	/* we need to set tx pkt capture for non associated peer */
+	status = dp_peer_set_tx_capture_enabled(pdev, peer,
+						is_tx_pkt_cap_enable,
+						peer_mac);
 
-	return QDF_STATUS_SUCCESS;
+	status = dp_peer_set_rx_capture_enabled(pdev, peer,
+						is_rx_pkt_cap_enable,
+						peer_mac);
+
+	return status;
 }
 
 /*
@@ -10003,6 +9993,7 @@ static struct cdp_cmn_ops dp_ops_cmn = {
 	.txrx_intr_attach = dp_soc_interrupt_attach_wrapper,
 	.txrx_intr_detach = dp_soc_interrupt_detach,
 	.set_pn_check = dp_set_pn_check_wifi3,
+	.set_key_sec_type = dp_set_key_sec_type_wifi3,
 	.update_config_parameters = dp_update_config_parameters,
 	/* TODO: Add other functions */
 	.txrx_data_tx_cb_set = dp_txrx_data_tx_cb_set,
@@ -10377,6 +10368,39 @@ dp_txrx_post_data_stall_event(struct cdp_soc_t *soc_hdl,
 }
 #endif /* WLAN_SUPPORT_DATA_STALL */
 
+#ifdef DP_PEER_EXTENDED_API
+/**
+ * dp_peer_get_ref_find_by_addr - get peer with addr by ref count inc
+ * @dev: physical device instance
+ * @peer_mac_addr: peer mac address
+ * @debug_id: to track enum peer access
+ *
+ * Return: peer instance pointer
+ */
+static void *
+dp_peer_get_ref_find_by_addr(struct cdp_pdev *dev, uint8_t *peer_mac_addr,
+			     enum peer_debug_id_type debug_id)
+{
+	struct dp_pdev *pdev = (struct dp_pdev *)dev;
+	struct dp_peer *peer;
+
+	peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0, DP_VDEV_ALL);
+
+	if (!peer)
+		return NULL;
+
+	if (peer->delete_in_progress) {
+		dp_err("Peer deletion in progress");
+		dp_peer_unref_delete(peer);
+		return NULL;
+	}
+
+	dp_info_rl("peer %pK mac: %pM", peer, peer->mac_addr.raw);
+
+	return peer;
+}
+#endif /* DP_PEER_EXTENDED_API */
+
 #ifdef WLAN_FEATURE_STATS_EXT
 /* rx hw stats event wait timeout in ms */
 #define DP_REO_STATUS_STATS_TIMEOUT 1000
@@ -10427,11 +10451,6 @@ static void dp_rx_hw_stats_cb(struct dp_soc *soc, void *cb_ctxt,
 	struct dp_rx_tid *rx_tid = (struct dp_rx_tid *)cb_ctxt;
 	struct hal_reo_queue_status *queue_status = &reo_status->queue_status;
 
-	if (soc->ignore_reo_status_cb) {
-		qdf_event_set(&soc->rx_hw_stats_event);
-		return;
-	}
-
 	if (queue_status->header.status != HAL_REO_CMD_SUCCESS) {
 		dp_info("REO stats failure %d for TID %d",
 			queue_status->header.status, rx_tid->tid);
@@ -10452,46 +10471,35 @@ static void dp_rx_hw_stats_cb(struct dp_soc *soc, void *cb_ctxt,
  *
  * Return: None
  */
-static void
+static QDF_STATUS
 dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 {
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
 	struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
 	struct dp_peer *peer;
+	QDF_STATUS status;
 
 	if (!vdev) {
-		dp_err("vdev is null");
-		qdf_event_set(&soc->rx_hw_stats_event);
-		return;
+		dp_err("vdev is null for vdev_id: %u", vdev_id);
+		return QDF_STATUS_E_INVAL;
 	}
 
-	peer = vdev->vap_bss_peer;
+	peer = dp_peer_get_ref_find_by_addr((struct cdp_pdev *)vdev->pdev,
+					    vdev->vap_bss_peer_mac_addr, 0);
 
-	if (!peer || peer->delete_in_progress) {
-		dp_err("Peer deletion in progress");
-		qdf_event_set(&soc->rx_hw_stats_event);
-		return;
+	if (!peer) {
+		dp_err("Peer is NULL");
+		return QDF_STATUS_E_INVAL;
 	}
 
 	qdf_event_reset(&soc->rx_hw_stats_event);
 	dp_peer_rxtid_stats(peer, dp_rx_hw_stats_cb, NULL);
-}
-
-/**
- * dp_wait_for_ext_rx_stats - wait for rx reo status for rx stats
- * @soc_hdl: cdp opaque soc handle
- *
- * Return: status
- */
-static QDF_STATUS
-dp_wait_for_ext_rx_stats(struct cdp_soc_t *soc_hdl)
-{
-	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
-	QDF_STATUS status;
 
 	status = qdf_wait_single_event(&soc->rx_hw_stats_event,
 				       DP_REO_STATUS_STATS_TIMEOUT);
 
+	dp_peer_unref_delete(peer);
+
 	return status;
 }
 #endif /* WLAN_FEATURE_STATS_EXT */
@@ -10519,8 +10527,7 @@ static struct cdp_misc_ops dp_ops_misc = {
 #ifdef WLAN_FEATURE_STATS_EXT
 	.txrx_ext_stats_request = dp_txrx_ext_stats_request,
 	.request_rx_hw_stats = dp_request_rx_hw_stats,
-	.wait_for_ext_rx_stats = dp_wait_for_ext_rx_stats,
-#endif
+#endif /* WLAN_FEATURE_STATS_EXT */
 };
 #endif
 

+ 49 - 0
dp/wifi3.0/dp_peer.c

@@ -1606,6 +1606,9 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
 				dp_info("STA vdev bss_peer!!!!");
 				peer->bss_peer = 1;
 				peer->vdev->vap_bss_peer = peer;
+				qdf_mem_copy(peer->vdev->vap_bss_peer_mac_addr,
+					     peer->mac_addr.raw,
+					     QDF_MAC_ADDR_SIZE);
 			}
 
 			if (peer->vdev->opmode == wlan_op_mode_sta) {
@@ -3117,6 +3120,52 @@ fail:
 }
 
 
+/**
+ * dp_set_key_sec_type_wifi3() - set security mode of key
+ * @soc: Datapath soc handle
+ * @peer_mac: Datapath peer mac address
+ * @vdev_id: id of atapath vdev
+ * @vdev: Datapath vdev
+ * @pdev - data path device instance
+ * @sec_type - security type
+ * #is_unicast - key type
+ *
+ */
+
+QDF_STATUS
+dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
+			  uint8_t *peer_mac, enum cdp_sec_type sec_type,
+			  bool is_unicast)
+{
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc,
+				peer_mac, 0, vdev_id);
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	int sec_index;
+
+	if (!peer || peer->delete_in_progress) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Peer is NULL!\n", __func__);
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
+	}
+
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+		  "key sec spec for peer %pK %pM: %s key of type %d",
+		  peer,
+		  peer->mac_addr.raw,
+		  is_unicast ? "ucast" : "mcast",
+		  sec_type);
+
+	sec_index = is_unicast ? dp_sec_ucast : dp_sec_mcast;
+	peer->security[sec_index].sec_type = sec_type;
+
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return status;
+}
+
 void
 dp_rx_sec_ind_handler(struct dp_soc *soc, uint16_t peer_id,
 		      enum cdp_sec_type sec_type, int is_unicast,

+ 4 - 2
dp/wifi3.0/dp_peer.h

@@ -286,7 +286,9 @@ void dp_peer_ast_index_flow_queue_map_create(void *soc_hdl,
  * @soc: DP SOC handle
  * @pdev_id: id of DP pdev handle
  * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode
- * @is_tx_pkt_cap_enable: enable/disable Tx packet capture in monitor mode
+ * @is_tx_pkt_cap_enable: enable/disable/delete/print
+ * Tx packet capture in monitor mode
+ * Tx packet capture in monitor mode
  * @peer_mac: MAC address for which the above need to be enabled/disabled
  *
  * Return: Success if Rx & Tx capture is enabled for peer, false otherwise
@@ -295,7 +297,7 @@ QDF_STATUS
 dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc,
 				  uint8_t pdev_id,
 				  bool is_rx_pkt_cap_enable,
-				  bool is_tx_pkt_cap_enable,
+				  uint8_t is_tx_pkt_cap_enable,
 				  uint8_t *peer_mac);
 
 /*

+ 4 - 1
dp/wifi3.0/dp_rx.h

@@ -1103,8 +1103,11 @@ bool dp_rx_multipass_process(struct dp_peer *peer, qdf_nbuf_t nbuf,
 
 #ifndef WLAN_RX_PKT_CAPTURE_ENH
 static inline
-void dp_peer_set_rx_capture_enabled(struct dp_peer *peer_handle, bool value)
+QDF_STATUS dp_peer_set_rx_capture_enabled(struct dp_pdev *pdev,
+					  struct dp_peer *peer_handle,
+					  bool value, uint8_t *mac_addr)
 {
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 

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

@@ -4689,8 +4689,8 @@ void dp_print_soc_cfg_params(struct dp_soc *soc)
 		       soc_cfg_ctx->rx_defrag_min_timeout);
 	DP_PRINT_STATS("WBM release ring: %u ",
 		       soc_cfg_ctx->wbm_release_ring);
-	DP_PRINT_STATS("TCL CMD ring: %u ",
-		       soc_cfg_ctx->tcl_cmd_ring);
+	DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ",
+		       soc_cfg_ctx->tcl_cmd_credit_ring);
 	DP_PRINT_STATS("TCL Status ring: %u ",
 		       soc_cfg_ctx->tcl_status_ring);
 	DP_PRINT_STATS("REO Reinject ring: %u ",
@@ -4903,8 +4903,8 @@ dp_print_ring_stats(struct dp_pdev *pdev)
 				    &pdev->soc->rx_rel_ring,
 				    WBM2SW_RELEASE);
 	dp_print_ring_stat_from_hal(pdev->soc,
-				    &pdev->soc->tcl_cmd_ring,
-				    TCL_CMD);
+				    &pdev->soc->tcl_cmd_credit_ring,
+				    TCL_CMD_CREDIT);
 	dp_print_ring_stat_from_hal(pdev->soc,
 				    &pdev->soc->tcl_status_ring,
 				    TCL_STATUS);

+ 4 - 1
dp/wifi3.0/dp_tx.h

@@ -371,8 +371,11 @@ static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
 
 #ifndef WLAN_TX_PKT_CAPTURE_ENH
 static inline
-void dp_peer_set_tx_capture_enabled(struct dp_peer *peer_handle, bool value)
+QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev,
+					  struct dp_peer *peer_handle,
+					  uint8_t value, uint8_t *peer_mac)
 {
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 #endif

+ 7 - 6
dp/wifi3.0/dp_types.h

@@ -1014,8 +1014,9 @@ struct dp_soc {
 	/* Number of TCL data rings */
 	uint8_t num_tcl_data_rings;
 
-	/* TCL command ring */
-	struct dp_srng tcl_cmd_ring;
+	/* TCL CMD_CREDIT ring */
+	/* It is used as credit based ring on QCN9000 else command ring */
+	struct dp_srng tcl_cmd_credit_ring;
 
 	/* TCL command status ring */
 	struct dp_srng tcl_status_ring;
@@ -1209,10 +1210,7 @@ struct dp_soc {
 		uint32_t rx_mpdu_missed;
 	} ext_stats;
 	qdf_event_t rx_hw_stats_event;
-
-	/* Ignore reo command queue status during peer delete */
-	bool ignore_reo_status_cb;
-#endif
+#endif /* WLAN_FEATURE_STATS_EXT */
 
 	/* Smart monitor capability for HKv2 */
 	uint8_t hw_nac_monitor_support;
@@ -1993,6 +1991,9 @@ struct dp_vdev {
 	bool peer_protocol_count_track;
 	int peer_protocol_count_dropmask;
 #endif
+
+	/* vap bss peer mac addr */
+	uint8_t vap_bss_peer_mac_addr[QDF_MAC_ADDR_SIZE];
 };
 
 

+ 1 - 1
hal/wifi3.0/hal_api.h

@@ -552,7 +552,7 @@ enum hal_ring_type {
 	REO_CMD = 3,
 	REO_STATUS = 4,
 	TCL_DATA = 5,
-	TCL_CMD = 6,
+	TCL_CMD_CREDIT = 6,
 	TCL_STATUS = 7,
 	CE_SRC = 8,
 	CE_DST = 9,

+ 24 - 24
hal/wifi3.0/qca6750/hal_6750.c

@@ -1566,18 +1566,18 @@ struct hal_hw_srng_config hw_srng_table_6750[] = {
 		.lmac_ring = FALSE,
 		.ring_dir = HAL_SRNG_SRC_RING,
 		.reg_start = {
-		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
-		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR,
+		HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR,
 		},
 		.reg_size = {
-		HWIO_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR -
-		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
-		HWIO_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR -
-		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR -
+		HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR -
+		HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
 		},
 		.max_size =
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT
 	},
 	{ /* CE_DST */
 		.start_ring_id = HAL_SRNG_CE_0_DST,
@@ -1590,18 +1590,18 @@ struct hal_hw_srng_config hw_srng_table_6750[] = {
 		.lmac_ring = FALSE,
 		.ring_dir = HAL_SRNG_SRC_RING,
 		.reg_start = {
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR,
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR,
 		},
 		.reg_size = {
-		HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
-		HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR
+		HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR
 		},
 		.max_size =
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT
 	},
 	{ /* CE_DST_STATUS */
 		.start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
@@ -1610,19 +1610,19 @@ struct hal_hw_srng_config hw_srng_table_6750[] = {
 		.lmac_ring = FALSE,
 		.ring_dir = HAL_SRNG_DST_RING,
 		.reg_start = {
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR,
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR,
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR,
 		},
 		/* TODO: check destination status ring registers */
 		.reg_size = {
-		HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
-		HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR
+		HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
+		HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR -
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR
 		},
 		.max_size =
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
-		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
+		HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
 	},
 	{ /* WBM_IDLE_LINK */
 		.start_ring_id = HAL_SRNG_WBM_IDLE_LINK,

+ 1 - 1
hif/src/ce/ce_assignment.h

@@ -124,7 +124,7 @@ static struct CE_pipe_config target_ce_config_wlan_qcn7605[] = {
 	/* NB: 50% of src nentries, since tx has 2 frags */
 #ifdef IPA_OFFLOAD
 	/* ipa_uc->target */
-	{ /* CE5 */ 5, PIPEDIR_OUT, 512,   64,
+	{ /* CE5 */ 5, PIPEDIR_OUT, 128,   64,
 		(CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,},
 #else
 	/* unused */

+ 1 - 2
hif/src/hif_io32.h

@@ -23,8 +23,7 @@
 #include "hif.h"
 #include "hif_main.h"
 
-#if defined(HIF_REG_WINDOW_SUPPORT) && (defined(HIF_PCI) || \
-    defined(HIF_IPCI))
+#if defined(HIF_REG_WINDOW_SUPPORT) && defined(HIF_PCI)
 
 static inline
 void hif_write32_mb_reg_window(void *sc,

+ 3 - 53
hif/src/ipcie/if_ipci.c

@@ -401,25 +401,12 @@ static int hif_ce_msi_configure_irq(struct hif_softc *scn)
 	struct HIF_CE_state *ce_sc = HIF_GET_CE_STATE(scn);
 	struct hif_ipci_softc *ipci_sc = HIF_GET_IPCI_SOFTC(scn);
 
-	/* do wake irq assignment */
-	ret = pld_get_user_msi_assignment(scn->qdf_dev->dev, "WAKE",
-					  &msi_data_count, &msi_data_start,
-					  &msi_irq_start);
-	if (ret)
-		return ret;
-
-	scn->wake_irq = pld_get_msi_irq(scn->qdf_dev->dev, msi_irq_start);
-	ret = request_irq(scn->wake_irq, hif_wake_interrupt_handler,
-			  IRQF_NO_SUSPEND, "wlan_wake_irq", scn);
-	if (ret)
-		return ret;
-
 	/* do ce irq assignments */
 	ret = pld_get_user_msi_assignment(scn->qdf_dev->dev, "CE",
 					  &msi_data_count, &msi_data_start,
 					  &msi_irq_start);
 	if (ret)
-		goto free_wake_irq;
+		return ret;
 
 	scn->bus_ops.hif_irq_disable = &hif_ce_srng_msi_irq_disable;
 	scn->bus_ops.hif_irq_enable = &hif_ce_srng_msi_irq_enable;
@@ -462,10 +449,6 @@ free_irq:
 		free_irq(irq, &ce_sc->tasklets[ce_id]);
 	}
 
-free_wake_irq:
-	free_irq(scn->wake_irq, scn->qdf_dev->dev);
-	scn->wake_irq = 0;
-
 	return ret;
 }
 
@@ -685,7 +668,7 @@ bool hif_ipci_needs_bmi(struct hif_softc *scn)
 #ifdef FORCE_WAKE
 int hif_force_wake_request(struct hif_opaque_softc *hif_handle)
 {
-	uint32_t timeout = 0, value;
+	uint32_t timeout = 0;
 	struct hif_softc *scn = (struct hif_softc *)hif_handle;
 	struct hif_ipci_softc *ipci_scn = HIF_GET_IPCI_SOFTC(scn);
 
@@ -707,36 +690,6 @@ int hif_force_wake_request(struct hif_opaque_softc *hif_handle)
 		return -EINVAL;
 	}
 	HIF_STATS_INC(ipci_scn, mhi_force_wake_success, 1);
-	hif_write32_mb(scn,
-		       scn->mem +
-		       PCIE_SOC_PCIE_REG_PCIE_SCRATCH_0_SOC_PCIE_REG,
-		       0);
-	hif_write32_mb(scn,
-		       scn->mem +
-		       PCIE_PCIE_LOCAL_REG_PCIE_SOC_WAKE_PCIE_LOCAL_REG,
-		       1);
-
-	HIF_STATS_INC(ipci_scn, soc_force_wake_register_write_success, 1);
-	/*
-	 * do not reset the timeout
-	 * total_wake_time = MHI_WAKE_TIME + PCI_WAKE_TIME < 50 ms
-	 */
-	do {
-		value =
-		hif_read32_mb(scn,
-			      scn->mem +
-			      PCIE_SOC_PCIE_REG_PCIE_SCRATCH_0_SOC_PCIE_REG);
-		if (value)
-			break;
-		qdf_mdelay(FORCE_WAKE_DELAY_MS);
-		timeout += FORCE_WAKE_DELAY_MS;
-	} while (timeout <= FORCE_WAKE_DELAY_TIMEOUT_MS);
-
-	if (!value) {
-		hif_err("failed handshake mechanism");
-		HIF_STATS_INC(ipci_scn, soc_force_wake_failure, 1);
-		return -ETIMEDOUT;
-	}
 
 	HIF_STATS_INC(ipci_scn, soc_force_wake_success, 1);
 
@@ -757,10 +710,7 @@ int hif_force_wake_release(struct hif_opaque_softc *hif_handle)
 	}
 
 	HIF_STATS_INC(ipci_scn, mhi_force_wake_release_success, 1);
-	hif_write32_mb(scn,
-		       scn->mem +
-		       PCIE_PCIE_LOCAL_REG_PCIE_SOC_WAKE_PCIE_LOCAL_REG,
-		       0);
+
 	HIF_STATS_INC(ipci_scn, soc_force_wake_release_success, 1);
 	return 0;
 }

+ 2 - 2
hif/src/qca6750def.c

@@ -150,8 +150,8 @@
 #define CE_DDR_ADDRESS_FOR_RRI_LOW MISSING
 #define CE_DDR_ADDRESS_FOR_RRI_HIGH MISSING
 
-#define HOST_IE_ADDRESS HWIO_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_0_ADDR
-#define HOST_IE_ADDRESS_2 HWIO_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_1_ADDR
+#define HOST_IE_ADDRESS HWIO_HOST_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_0_ADDR
+#define HOST_IE_ADDRESS_2 HWIO_HOST_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_1_ADDR
 
 #define HOST_IE_COPY_COMPLETE_MASK MISSING
 #define SR_BA_ADDRESS MISSING

+ 2 - 2
qdf/linux/src/i_qdf_ipa_wdi3.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -57,7 +57,7 @@ typedef struct ipa_wdi_init_out_params __qdf_ipa_wdi_init_out_params_t;
 	(((struct ipa_wdi_init_out_params *)(out_params))->is_uC_ready)
 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_SMMU_ENABLED(out_params)	\
 	(((struct ipa_wdi_init_out_params *)(out_params))->is_smmu_enabled)
-#ifdef IPA_WDI3_GSI
+#if (defined(IPA_WDI3_GSI)) || (defined(IPA_WDI2_GSI))
 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params)	\
 	(((struct ipa_wdi_init_out_params *)(out_params))->is_over_gsi)
 #else

+ 0 - 3
qdf/linux/src/qdf_lock.c

@@ -837,9 +837,6 @@ void qdf_lock_stats_cookie_create(struct lock_stats *stats,
 		qdf_atomic_inc(&lock_cookie_get_failures);
 		count = qdf_atomic_inc_return(&lock_cookie_untracked_num);
 		stats->cookie = (void *) DUMMY_LOCK_COOKIE;
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
-			  "%s: cookie allocation failure, using dummy (%s:%d) count %d",
-			  __func__, func, line, count);
 		return;
 	}
 

+ 9 - 15
qdf/linux/src/qdf_mc_timer.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -718,16 +718,16 @@ QDF_STATUS qdf_mc_timer_stop(qdf_mc_timer_t *timer)
 {
 	/* check for invalid pointer */
 	if (!timer) {
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
-			  "%s Null timer pointer being passed", __func__);
+		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF,
+				   "%s Null timer pointer", __func__);
 		QDF_ASSERT(0);
 		return QDF_STATUS_E_INVAL;
 	}
 
 	/* check if timer refers to an uninitialized object */
 	if (LINUX_TIMER_COOKIE != timer->platform_info.cookie) {
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Cannot stop uninitialized timer", __func__);
+		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF,
+				   "%s: Cannot stop uninit timer", __func__);
 		QDF_ASSERT(0);
 
 		return QDF_STATUS_E_INVAL;
@@ -738,9 +738,6 @@ QDF_STATUS qdf_mc_timer_stop(qdf_mc_timer_t *timer)
 
 	if (QDF_TIMER_STATE_RUNNING != timer->state) {
 		qdf_spin_unlock_irqrestore(&timer->platform_info.spinlock);
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH,
-			  "%s: Cannot stop timer in state = %d",
-			  __func__, timer->state);
 		return QDF_STATUS_SUCCESS;
 	}
 
@@ -760,16 +757,16 @@ QDF_STATUS qdf_mc_timer_stop_sync(qdf_mc_timer_t *timer)
 {
 	/* check for invalid pointer */
 	if (!timer) {
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
-			  "%s Null timer pointer being passed", __func__);
+		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF,
+				   "%s Null timer pointer", __func__);
 		QDF_ASSERT(0);
 		return QDF_STATUS_E_INVAL;
 	}
 
 	/* check if timer refers to an uninitialized object */
 	if (LINUX_TIMER_COOKIE != timer->platform_info.cookie) {
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Cannot stop uninitialized timer", __func__);
+		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF,
+				   "%s: Cannot stop uninit timer", __func__);
 		QDF_ASSERT(0);
 
 		return QDF_STATUS_E_INVAL;
@@ -780,9 +777,6 @@ QDF_STATUS qdf_mc_timer_stop_sync(qdf_mc_timer_t *timer)
 
 	if (QDF_TIMER_STATE_RUNNING != timer->state) {
 		qdf_spin_unlock_irqrestore(&timer->platform_info.spinlock);
-		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH,
-			  "%s: Cannot stop timer in state = %d",
-			  __func__, timer->state);
 		return QDF_STATUS_SUCCESS;
 	}
 

+ 4 - 0
target_if/crypto/src/target_if_crypto.c

@@ -200,6 +200,10 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
 	qdf_mem_copy(&pn[0], &params.key_rsc_ctr, sizeof(pn));
 	cdp_set_pn_check(soc, vdev->vdev_objmgr.vdev_id, req->macaddr,
 			 sec_type, pn);
+
+	cdp_set_key_sec_type(soc, vdev->vdev_objmgr.vdev_id, req->macaddr,
+			     sec_type, pairwise);
+
 	cdp_set_key(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, pairwise,
 		    (uint32_t *)(req->keyval + WLAN_CRYPTO_IV_SIZE +
 		     WLAN_CRYPTO_MIC_LEN));

+ 2 - 1
target_if/init_deinit/src/init_event_handler.c

@@ -126,7 +126,8 @@ static int init_deinit_service_ready_event_handler(ol_scn_t scn_handle,
 	if (wmi_service_enabled(wmi_handle, wmi_service_dynamic_hw_mode))
 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_DYNAMIC_HW_MODE);
 
-	if (wmi_service_enabled(wmi_handle, wmi_service_bw_165mhz_support))
+	if (wmi_service_enabled(wmi_handle,
+				wmi_service_bw_restricted_80p80_support))
 		wlan_psoc_nif_fw_ext_cap_set(psoc,
 					     WLAN_SOC_RESTRICTED_80P80_SUPPORT);
 

+ 2 - 2
umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -882,9 +882,9 @@ static void tgt_mc_cp_stats_extract_station_stats(
 	 * reset type_map bit for station stats .
 	 */
 	if (tgt_mc_cp_stats_is_last_event(ev, TYPE_STATION_STATS)) {
+		ucfg_mc_cp_stats_reset_pending_req(psoc, TYPE_STATION_STATS);
 		tgt_mc_cp_stats_prepare_n_send_raw_station_stats(psoc,
 								 &last_req);
-		ucfg_mc_cp_stats_reset_pending_req(psoc, TYPE_STATION_STATS);
 	}
 }
 

+ 21 - 1
umac/scan/dispatcher/inc/wlan_scan_api.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -28,6 +28,26 @@
 #include <wlan_objmgr_vdev_obj.h>
 #include "../../core/src/wlan_scan_main.h"
 
+/**
+ * wlan_scan_cfg_set_active_2g_dwelltime() - API to set scan active 2g dwelltime
+ * @psoc: pointer to psoc object
+ * @dwell_time: scan active dwell time
+ *
+ * Return: none
+ */
+void wlan_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
+					   uint32_t dwell_time);
+
+/**
+ * wlan_scan_cfg_get_active_2g_dwelltime() - API to get active 2g dwelltime
+ * @psoc: pointer to psoc object
+ * @dwell_time: scan active dwelltime
+ *
+ * Return: scan active dwell time
+ */
+void wlan_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
+					   uint32_t *dwell_time);
+
 /**
  * wlan_scan_cfg_set_active_dwelltime() - API to set scan active dwelltime
  * @psoc: pointer to psoc object

+ 29 - 1
umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -661,6 +661,20 @@ void ucfg_scan_cfg_set_active_dwelltime(struct wlan_objmgr_psoc *psoc,
 	return wlan_scan_cfg_set_active_dwelltime(psoc, dwell_time);
 }
 
+/**
+ * ucfg_scan_cfg_set_active_2g_dwelltime() - API to set scan active 2g dwelltime
+ * @psoc: pointer to psoc object
+ * @dwell_time: scan active dwell time
+ *
+ * Return: none
+ */
+static inline
+void ucfg_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
+					   uint32_t dwell_time)
+{
+	return wlan_scan_cfg_set_active_2g_dwelltime(psoc, dwell_time);
+}
+
 /**
  * ucfg_scan_cfg_get_active_dwelltime() - API to get active dwelltime
  * @psoc: pointer to psoc object
@@ -702,6 +716,20 @@ void ucfg_scan_cfg_get_passive_dwelltime(struct wlan_objmgr_psoc *psoc,
 	return wlan_scan_cfg_get_passive_dwelltime(psoc, dwell_time);
 }
 
+/**
+ * ucfg_scan_cfg_get_active_2g_dwelltime() - API to get active 2g dwelltime
+ * @psoc: pointer to psoc object
+ * @dwell_time: scan active 2g dwelltime
+ *
+ * Return: scan active 2g dwelltime
+ */
+static inline
+void ucfg_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
+					   uint32_t *dwell_time)
+{
+	return wlan_scan_cfg_get_active_2g_dwelltime(psoc, dwell_time);
+}
+
 /**
  * ucfg_scan_cfg_get_conc_active_dwelltime() - Get concurrent active dwelltime
  * @psoc: pointer to psoc object

+ 24 - 1
umac/scan/dispatcher/src/wlan_scan_api.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -67,6 +67,29 @@ void wlan_scan_cfg_set_active_dwelltime(struct wlan_objmgr_psoc *psoc,
 	scan_obj->scan_def.active_dwell = dwell_time;
 }
 
+void wlan_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
+					   uint32_t *dwell_time)
+{
+	struct wlan_scan_obj *scan_obj;
+
+	scan_obj = wlan_psoc_get_scan_obj(psoc);
+	if (!scan_obj)
+		return;
+
+	*dwell_time = scan_obj->scan_def.active_dwell_2g;
+}
+
+void wlan_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
+					   uint32_t dwell_time)
+{
+	struct wlan_scan_obj *scan_obj;
+
+	scan_obj = wlan_psoc_get_scan_obj(psoc);
+	if (!scan_obj)
+		return;
+	scan_obj->scan_def.active_dwell_2g = dwell_time;
+}
+
 void wlan_scan_cfg_get_conc_active_dwelltime(struct wlan_objmgr_psoc *psoc,
 					     uint32_t *dwell_time)
 {

+ 2 - 2
utils/logging/src/wlan_logging_sock_svc.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -287,7 +287,7 @@ static int wlan_add_user_log_time_stamp(char *tbuf, size_t tbuf_sz, uint64_t ts)
 
 	qdf_get_time_of_the_day_in_hr_min_sec_usec(time_buf, sizeof(time_buf));
 
-	return scnprintf(tbuf, tbuf_sz, "[%.16s][0x%llx]%s",
+	return scnprintf(tbuf, tbuf_sz, "[%.6s][0x%llx]%s",
 			 current_process_name(), ts, time_buf);
 }
 

+ 10 - 10
wlan_cfg/cfg_dp.h

@@ -188,9 +188,9 @@
 #define WLAN_CFG_WBM_RELEASE_RING_SIZE_MIN 64
 #define WLAN_CFG_WBM_RELEASE_RING_SIZE_MAX 64
 
-#define WLAN_CFG_TCL_CMD_RING_SIZE 32
-#define WLAN_CFG_TCL_CMD_RING_SIZE_MIN 32
-#define WLAN_CFG_TCL_CMD_RING_SIZE_MAX 32
+#define WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE 32
+#define WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MIN 32
+#define WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MAX 32
 
 #define WLAN_CFG_TCL_STATUS_RING_SIZE 32
 #define WLAN_CFG_TCL_STATUS_RING_SIZE_MIN 32
@@ -550,12 +550,12 @@
 		WLAN_CFG_WBM_RELEASE_RING_SIZE, \
 		CFG_VALUE_OR_DEFAULT, "DP WBM Release Ring")
 
-#define CFG_DP_TCL_CMD_RING \
-		CFG_INI_UINT("dp_tcl_cmd_ring", \
-		WLAN_CFG_TCL_CMD_RING_SIZE_MIN, \
-		WLAN_CFG_TCL_CMD_RING_SIZE_MAX, \
-		WLAN_CFG_TCL_CMD_RING_SIZE, \
-		CFG_VALUE_OR_DEFAULT, "DP TCL command ring")
+#define CFG_DP_TCL_CMD_CREDIT_RING \
+		CFG_INI_UINT("dp_tcl_cmd_credit_ring", \
+		WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MIN, \
+		WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MAX, \
+		WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE, \
+		CFG_VALUE_OR_DEFAULT, "DP TCL Cmd_Credit ring")
 
 #define CFG_DP_TCL_STATUS_RING \
 		CFG_INI_UINT("dp_tcl_status_ring",\
@@ -825,7 +825,7 @@
 		CFG(CFG_DP_TCP_UDP_CKSUM_OFFLOAD) \
 		CFG(CFG_DP_DEFRAG_TIMEOUT_CHECK) \
 		CFG(CFG_DP_WBM_RELEASE_RING) \
-		CFG(CFG_DP_TCL_CMD_RING) \
+		CFG(CFG_DP_TCL_CMD_CREDIT_RING) \
 		CFG(CFG_DP_TCL_STATUS_RING) \
 		CFG(CFG_DP_REO_REINJECT_RING) \
 		CFG(CFG_DP_RX_RELEASE_RING) \

+ 5 - 5
wlan_cfg/wlan_cfg.c

@@ -342,7 +342,7 @@ void wlan_set_srng_cfg(struct wlan_srng_cfg **wlan_cfg)
 	g_wlan_srng_cfg[REO_CMD] = wlan_srng_default_cfg;
 	g_wlan_srng_cfg[REO_STATUS] = wlan_srng_default_cfg;
 	g_wlan_srng_cfg[TCL_DATA] = wlan_srng_default_cfg;
-	g_wlan_srng_cfg[TCL_CMD] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[TCL_CMD_CREDIT] = wlan_srng_default_cfg;
 	g_wlan_srng_cfg[TCL_STATUS] = wlan_srng_default_cfg;
 	g_wlan_srng_cfg[WBM_IDLE_LINK] = wlan_srng_default_cfg;
 	g_wlan_srng_cfg[SW2WBM_RELEASE] = wlan_srng_default_cfg;
@@ -516,8 +516,8 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
 
 	wlan_cfg_ctx->wbm_release_ring = cfg_get(psoc,
 						 CFG_DP_WBM_RELEASE_RING);
-	wlan_cfg_ctx->tcl_cmd_ring = cfg_get(psoc,
-					     CFG_DP_TCL_CMD_RING);
+	wlan_cfg_ctx->tcl_cmd_credit_ring = cfg_get(psoc,
+					     CFG_DP_TCL_CMD_CREDIT_RING);
 	wlan_cfg_ctx->tcl_status_ring = cfg_get(psoc,
 						CFG_DP_TCL_STATUS_RING);
 	wlan_cfg_ctx->reo_reinject_ring = cfg_get(psoc,
@@ -1075,9 +1075,9 @@ wlan_cfg_get_dp_soc_wbm_release_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg)
 }
 
 int
-wlan_cfg_get_dp_soc_tcl_cmd_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg)
+wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg)
 {
-	return cfg->tcl_cmd_ring;
+	return cfg->tcl_cmd_credit_ring;
 }
 
 int

+ 5 - 5
wlan_cfg/wlan_cfg.h

@@ -143,7 +143,7 @@ struct wlan_srng_cfg {
  * @nss_cfg: nss configuration
  * @rx_defrag_min_timeout: rx defrag minimum timeout
  * @wbm_release_ring: wbm release ring size
- * @tcl_cmd_ring: tcl cmd ring size
+ * @tcl_cmd_credit_ring: tcl command/credit ring size
  * @tcl_status_ring: tcl status ring size
  * @reo_reinject_ring: reo reinject ring
  * @rx_release_ring: rx release ring size
@@ -241,7 +241,7 @@ struct wlan_cfg_dp_soc_ctxt {
 	int rx_defrag_min_timeout;
 	int reo_dst_ring_size;
 	int wbm_release_ring;
-	int tcl_cmd_ring;
+	int tcl_cmd_credit_ring;
 	int tcl_status_ring;
 	int reo_reinject_ring;
 	int rx_release_ring;
@@ -998,13 +998,13 @@ int
 wlan_cfg_get_dp_soc_wbm_release_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg);
 
 /*
- * wlan_cfg_get_dp_soc_tcl_cmd_ring_size - Get tcl_cmd_ring size
+ * wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size - Get command/credit ring size
  * @wlan_cfg_soc_ctx
  *
- * Return: tcl_cmd_ring size
+ * Return: tcl_cmd_credit_ring size
  */
 int
-wlan_cfg_get_dp_soc_tcl_cmd_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg);
+wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg);
 
 /*
  * wlan_cfg_get_dp_soc_tcl_status_ring_size - Get tcl_status_ring size

+ 3 - 0
wmi/inc/wmi_unified_param.h

@@ -4598,6 +4598,7 @@ typedef enum {
 	wmi_wlan_time_sync_ftm_start_stop_event_id,
 	wmi_wlan_time_sync_q_master_slave_offset_eventid,
 #endif
+	wmi_roam_scan_chan_list_id,
 	wmi_events_max,
 } wmi_conv_event_id;
 
@@ -5100,12 +5101,14 @@ typedef enum {
 	wmi_service_ext2_msg,
 	wmi_service_6ghz_support,
 	wmi_service_bw_165mhz_support,
+	wmi_service_bw_restricted_80p80_support,
 	wmi_service_packet_capture_support,
 	wmi_service_nan_vdev,
 	wmi_service_multiple_vdev_restart_ext,
 	wmi_service_peer_delete_no_peer_flush_tids_cmd,
 	wmi_service_time_sync_ftm,
 	wmi_service_nss_ratio_to_host_support,
+	wmi_roam_scan_chan_list_to_host_support,
 	wmi_services_max,
 } wmi_conv_service_ids;
 #define WMI_SERVICE_UNAVAILABLE 0xFFFF

+ 2 - 1
wmi/inc/wmi_unified_priv.h

@@ -2232,7 +2232,8 @@ QDF_STATUS (*extract_time_sync_ftm_offset_event)(
 					wmi_unified_t wmi_hdl, void *evt_buf,
 					struct ftm_time_sync_offset *param);
 #endif /* FEATURE_WLAN_TIME_SYNC_FTM */
-
+QDF_STATUS (*send_roam_scan_ch_list_req_cmd)(wmi_unified_t wmi_hdl,
+					     uint32_t vdev_id);
 };
 
 /* Forward declartion for psoc*/

+ 13 - 1
wmi/inc/wmi_unified_roam_api.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -379,6 +379,18 @@ QDF_STATUS wmi_unified_invoke_neighbor_report_cmd(
 			wmi_unified_t wmi_handle,
 			struct wmi_invoke_neighbor_report_params *params);
 
+/**
+ * wmi_unified_get_roam_scan_ch_list() - send roam scan channel list get cmd
+ * @wmi_handle: wmi handle
+ * @vdev_id: vdev id
+ *
+ * This function sends roam scan channel list get command to firmware.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_get_roam_scan_ch_list(wmi_unified_t wmi_handle,
+					     uint8_t vdev_id);
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /**
  * wmi_unified_set_roam_triggers() - send roam trigger bitmap

+ 11 - 1
wmi/src/wmi_unified_roam_api.c

@@ -1,6 +1,6 @@
 
 /*
- * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -317,6 +317,16 @@ QDF_STATUS wmi_unified_invoke_neighbor_report_cmd(
 	return QDF_STATUS_E_FAILURE;
 }
 
+QDF_STATUS wmi_unified_get_roam_scan_ch_list(wmi_unified_t wmi_handle,
+					     uint8_t vdev_id)
+{
+	if (wmi_handle->ops->send_roam_scan_ch_list_req_cmd)
+		return wmi_handle->ops->send_roam_scan_ch_list_req_cmd(
+				wmi_handle, vdev_id);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 QDF_STATUS wmi_unified_set_roam_triggers(wmi_unified_t wmi_handle,
 					 struct roam_triggers *triggers)

+ 47 - 0
wmi/src/wmi_unified_tlv.c

@@ -11841,6 +11841,46 @@ send_roam_scan_stats_cmd_tlv(wmi_unified_t wmi_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * send_roam_scan_ch_list_req_cmd_tlv() - send wmi cmd to get roam scan
+ * channel list from firmware
+ * @wmi_handle: wmi handler
+ * @vdev_id: vdev id
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS send_roam_scan_ch_list_req_cmd_tlv(wmi_unified_t wmi_handle,
+						     uint32_t vdev_id)
+{
+	wmi_buf_t buf;
+	wmi_roam_get_scan_channel_list_cmd_fixed_param *cmd;
+	uint16_t len = sizeof(*cmd);
+	int ret;
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf) {
+		WMI_LOGE("%s: Failed to allocate wmi buffer", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_roam_get_scan_channel_list_cmd_fixed_param *)
+					wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+	WMITLV_TAG_STRUC_wmi_roam_get_scan_channel_list_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+		wmi_roam_get_scan_channel_list_cmd_fixed_param));
+	cmd->vdev_id = vdev_id;
+	wmi_mtrace(WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID, vdev_id, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		WMI_LOGE("Failed to send get roam scan channels request = %d",
+			 ret);
+		wmi_buf_free(buf);
+	}
+	return ret;
+}
+
 /**
  * extract_roam_scan_stats_res_evt_tlv() - Extract roam scan stats event
  * @wmi_handle: wmi handle
@@ -13471,6 +13511,7 @@ struct wmi_ops tlv_ops =  {
 	.extract_time_sync_ftm_offset_event =
 					extract_time_sync_ftm_offset_event_tlv,
 #endif /* FEATURE_WLAN_TIME_SYNC_FTM */
+	.send_roam_scan_ch_list_req_cmd = send_roam_scan_ch_list_req_cmd_tlv,
 };
 
 /**
@@ -13835,6 +13876,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
 	event_ids[wmi_wlan_time_sync_q_master_slave_offset_eventid] =
 			WMI_VDEV_AUDIO_SYNC_Q_MASTER_SLAVE_OFFSET_EVENTID;
 #endif
+event_ids[wmi_roam_scan_chan_list_id] =
+			WMI_ROAM_SCAN_CHANNEL_LIST_EVENTID;
 }
 
 /**
@@ -14113,6 +14156,8 @@ static void populate_tlv_service(uint32_t *wmi_service)
 			WMI_SERVICE_6GHZ_SUPPORT;
 	wmi_service[wmi_service_bw_165mhz_support] =
 			WMI_SERVICE_BW_165MHZ_SUPPORT;
+	wmi_service[wmi_service_bw_restricted_80p80_support] =
+			WMI_SERVICE_BW_RESTRICTED_80P80_SUPPORT;
 	wmi_service[wmi_service_packet_capture_support] =
 			WMI_SERVICE_PACKET_CAPTURE_SUPPORT;
 	wmi_service[wmi_service_nan_vdev] = WMI_SERVICE_NAN_VDEV_SUPPORT;
@@ -14124,6 +14169,8 @@ static void populate_tlv_service(uint32_t *wmi_service)
 			WMI_SERVICE_AUDIO_SYNC_SUPPORT;
 	wmi_service[wmi_service_nss_ratio_to_host_support] =
 			WMI_SERVICE_NSS_RATIO_TO_HOST_SUPPORT;
+	wmi_service[wmi_roam_scan_chan_list_to_host_support] =
+			WMI_SERVICE_ROAM_SCAN_CHANNEL_LIST_TO_HOST_SUPPORT;
 }
 
 /**