From 45be95484aa8fb8d7dcdbf50f2674e0cc3051f75 Mon Sep 17 00:00:00 2001 From: Sai Rupesh Chevuru Date: Wed, 10 Nov 2021 19:34:12 +0530 Subject: [PATCH] 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 --- dp/inc/cdp_txrx_cmn_struct.h | 4 ++++ dp/wifi3.0/be/dp_be.c | 27 +++++++++++++++++++++++++++ dp/wifi3.0/be/dp_be.h | 17 ++++++++++++++++- dp/wifi3.0/be/dp_be_tx.c | 12 ++++++------ dp/wifi3.0/dp_main.c | 7 +++++++ dp/wifi3.0/li/dp_li.c | 9 +++++++++ 6 files changed, 69 insertions(+), 7 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 805a5e04b9..f947ed9d35 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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 }; /* diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 33886165e6..f9e0491b94 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/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); } diff --git a/dp/wifi3.0/be/dp_be.h b/dp/wifi3.0/be/dp_be.h index a3183c0ce0..f74dbef4fc 100644 --- a/dp/wifi3.0/be/dp_be.h +++ b/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 diff --git a/dp/wifi3.0/be/dp_be_tx.c b/dp/wifi3.0/be/dp_be_tx.c index 67a328dbb8..84e88fb1bd 100644 --- a/dp/wifi3.0/be/dp_be_tx.c +++ b/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, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 19caefe5be..ad1d59882e 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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 |= diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 119c4d1b18..df13eb00fd 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/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; }