Browse Source

qcacmn: Updating the bank config in RAW mode

In the case of RAW mode, VAP parameters encap type, dscp_to_tid map id
and cipher are not updating in bank register.
Added a API to update vdev param.

Change-Id: I702bee563e7451f403fa32292bf20680cd66e213
CRs-Fixed: 3078687
Sai Rupesh Chevuru 3 years ago
parent
commit
45be95484a

+ 4 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -1235,6 +1235,7 @@ enum cdp_pdev_param_type {
  * @cdp_vdev_param_peer_authorize: set peer authorize
  * @cdp_vdev_param_peer_tid_latency_enable: set peer tid latency enable flag
  * @cdp_vdev_param_mesh_tid: config tatency tid on vdev
+ * @cdp_vdev_param_dscp_tid_map_id: set dscp to tid map id
  *
  * @cdp_pdev_param_dbg_snf: Enable debug sniffer feature
  * @cdp_pdev_param_bpr_enable: Enable bcast probe feature
@@ -1304,6 +1305,7 @@ typedef union cdp_config_param_t {
 	uint8_t cdp_vdev_param_peer_authorize;
 	uint8_t cdp_vdev_param_peer_tid_latency_enable;
 	uint8_t cdp_vdev_param_mesh_tid;
+	uint8_t cdp_vdev_param_dscp_tid_map_id;
 
 	/* pdev params */
 	bool cdp_pdev_param_cptr_latcy;
@@ -1421,6 +1423,7 @@ enum cdp_pdev_bpr_param {
  * @CDP_ENABLE_PEER_AUTHORIZE: enable peer authorize flag
  * @CDP_ENABLE_PEER_TID_LATENCY: set peer tid latency enable flag
  * @CDP_SET_VAP_MESH_TID : Set latency tid in vap
+ * @CDP_UPDATE_DSCP_TO_TID_MAP: Set DSCP to TID map id
  */
 enum cdp_vdev_param_type {
 	CDP_ENABLE_NAWDS,
@@ -1458,6 +1461,7 @@ enum cdp_vdev_param_type {
 #ifdef WLAN_VENDOR_SPECIFIC_BAR_UPDATE
 	CDP_SKIP_BAR_UPDATE_AP,
 #endif
+	CDP_UPDATE_DSCP_TO_TID_MAP
 };
 
 /*

+ 27 - 0
dp/wifi3.0/be/dp_be.c

@@ -1314,6 +1314,31 @@ static bool dp_reo_remap_config_be(struct dp_soc *soc,
 }
 #endif
 
+QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc,
+				     struct dp_vdev *vdev,
+				     enum cdp_vdev_param_type param,
+				     cdp_config_param_type val)
+{
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
+
+	switch (param) {
+	case CDP_TX_ENCAP_TYPE:
+	case CDP_UPDATE_DSCP_TO_TID_MAP:
+		dp_tx_update_bank_profile(be_soc, be_vdev);
+		break;
+	case CDP_ENABLE_CIPHER:
+		if (vdev->tx_encap_type == htt_cmn_pkt_type_raw)
+			dp_tx_update_bank_profile(be_soc, be_vdev);
+		break;
+	default:
+		dp_warn("invalid param %d", param);
+		break;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 {
 #ifndef QCA_HOST_MODE_WIFI_DISABLED
@@ -1351,6 +1376,7 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_be;
 	arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_be;
 	arch_ops->reo_remap_config = dp_reo_remap_config_be;
+	arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_be;
 
 #ifdef WLAN_FEATURE_11BE_MLO
 	arch_ops->mlo_peer_find_hash_detach =
@@ -1361,5 +1387,6 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	arch_ops->mlo_peer_find_hash_remove = dp_mlo_peer_find_hash_remove_be;
 	arch_ops->mlo_peer_find_hash_find = dp_mlo_peer_find_hash_find_be;
 #endif
+
 	dp_init_near_full_arch_ops_be(arch_ops);
 }

+ 16 - 1
dp/wifi3.0/be/dp_be.h

@@ -187,7 +187,7 @@ struct dp_tx_bank_profile {
 struct dp_soc_be {
 	struct dp_soc soc;
 	uint8_t num_bank_profiles;
-	qdf_mutex_t tx_bank_lock;
+	qdf_spinlock_t tx_bank_lock;
 	struct dp_tx_bank_profile *bank_profiles;
 	struct dp_spt_page_desc *page_desc_base;
 	uint32_t cc_cmem_base;
@@ -617,4 +617,19 @@ void dp_pdev_mlo_fill_params(struct dp_pdev *pdev,
 {
 }
 #endif
+
+/*
+ * dp_txrx_set_vdev_param_be: target specific ops while setting vdev params
+ * @soc : DP soc handle
+ * @vdev: pointer to vdev structure
+ * @param: parameter type to get value
+ * @val: value
+ *
+ * return: QDF_STATUS
+ */
+QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc,
+				     struct dp_vdev *vdev,
+				     enum cdp_vdev_param_type param,
+				     cdp_config_param_type val);
+
 #endif

+ 6 - 6
dp/wifi3.0/be/dp_be_tx.c

@@ -286,7 +286,7 @@ QDF_STATUS dp_tx_init_bank_profiles(struct dp_soc_be *be_soc)
 		return QDF_STATUS_E_NOMEM;
 	}
 
-	qdf_mutex_create(&be_soc->tx_bank_lock);
+	qdf_spinlock_create(&be_soc->tx_bank_lock);
 
 	for (i = 0; i < num_tcl_banks; i++) {
 		be_soc->bank_profiles[i].is_configured = false;
@@ -299,7 +299,7 @@ QDF_STATUS dp_tx_init_bank_profiles(struct dp_soc_be *be_soc)
 void dp_tx_deinit_bank_profiles(struct dp_soc_be *be_soc)
 {
 	qdf_mem_free(be_soc->bank_profiles);
-	qdf_mutex_destroy(&be_soc->tx_bank_lock);
+	qdf_spinlock_destroy(&be_soc->tx_bank_lock);
 }
 
 static
@@ -364,7 +364,7 @@ int dp_tx_get_bank_profile(struct dp_soc_be *be_soc,
 	/* convert vdev params into hal_tx_bank_config */
 	dp_tx_get_vdev_bank_config(be_vdev, &vdev_config);
 
-	qdf_mutex_acquire(&be_soc->tx_bank_lock);
+	qdf_spin_lock_bh(&be_soc->tx_bank_lock);
 	/* go over all banks and find a matching/unconfigured/unsed bank */
 	for (i = 0; i < be_soc->num_bank_profiles; i++) {
 		if (be_soc->bank_profiles[i].is_configured &&
@@ -410,7 +410,7 @@ configure_and_return:
 				      bank_id);
 inc_ref_and_return:
 	qdf_atomic_inc(&be_soc->bank_profiles[bank_id].ref_count);
-	qdf_mutex_release(&be_soc->tx_bank_lock);
+	qdf_spin_unlock_bh(&be_soc->tx_bank_lock);
 
 	dp_info("found %s slot at index %d, input:0x%x match:0x%x ref_count %u",
 		temp_str, bank_id, vdev_config.val,
@@ -436,9 +436,9 @@ inc_ref_and_return:
 void dp_tx_put_bank_profile(struct dp_soc_be *be_soc,
 			    struct dp_vdev_be *be_vdev)
 {
-	qdf_mutex_acquire(&be_soc->tx_bank_lock);
+	qdf_spin_lock_bh(&be_soc->tx_bank_lock);
 	qdf_atomic_dec(&be_soc->bank_profiles[be_vdev->bank_id].ref_count);
-	qdf_mutex_release(&be_soc->tx_bank_lock);
+	qdf_spin_unlock_bh(&be_soc->tx_bank_lock);
 }
 
 void dp_tx_update_bank_profile(struct dp_soc_be *be_soc,

+ 7 - 0
dp/wifi3.0/dp_main.c

@@ -9287,6 +9287,7 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 		break;
 	}
 
+	dsoc->arch_ops.txrx_set_vdev_param(dsoc, vdev, param, val);
 	dp_tx_vdev_update_search_flags((struct dp_vdev *)vdev);
 	dp_vdev_unref_delete(dsoc, vdev, DP_MOD_ID_CDP);
 
@@ -9396,11 +9397,17 @@ static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle cdp_soc,
 						 uint8_t vdev_id,
 						 uint8_t map_id)
 {
+	cdp_config_param_type val;
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc);
 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
 						     DP_MOD_ID_CDP);
 	if (vdev) {
 		vdev->dscp_tid_map_id = map_id;
+		val.cdp_vdev_param_dscp_tid_map_id = map_id;
+		soc->arch_ops.txrx_set_vdev_param(soc,
+						  vdev,
+						  CDP_UPDATE_DSCP_TO_TID_MAP,
+						  val);
 		/* Updatr flag for transmit tid classification */
 		if (vdev->dscp_tid_map_id < soc->num_hw_dscp_tid_map)
 			vdev->skip_sw_tid_classification |=

+ 9 - 0
dp/wifi3.0/li/dp_li.c

@@ -358,6 +358,14 @@ static bool dp_reo_remap_config_li(struct dp_soc *soc,
 	return dp_reo_remap_config(soc, remap0, remap1, remap2);
 }
 
+static QDF_STATUS dp_txrx_set_vdev_param_li(struct dp_soc *soc,
+					    struct dp_vdev *vdev,
+					    enum cdp_vdev_param_type param,
+					    cdp_config_param_type val)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 {
 #ifndef QCA_HOST_MODE_WIFI_DISABLED
@@ -401,5 +409,6 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 	arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li;
 	arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_li;
 	arch_ops->reo_remap_config = dp_reo_remap_config_li;
+	arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li;
 }