From 57e2c01e5ea45276f49864562e323eedd0eeeef0 Mon Sep 17 00:00:00 2001 From: Rakesh Pillai Date: Tue, 22 Jun 2021 03:13:01 -0700 Subject: [PATCH] qcacmn: Peer id parsing changes for beryllium Take care of the MLO peer bit indication to be concatenated with peer_id to access the peer map object. Change-Id: Ia603a728101e83829a8906d1b847f42389e78ca6 CRs-Fixed: 3039326 --- dp/wifi3.0/be/dp_be.c | 2 ++ dp/wifi3.0/be/dp_be_rx.c | 6 +++--- dp/wifi3.0/be/dp_be_rx.h | 37 +++++++++++++++++++++++++++++++++++++ dp/wifi3.0/be/dp_be_tx.c | 38 ++++++++++++++++++++++++++++++++++++++ dp/wifi3.0/be/dp_be_tx.h | 6 ++++++ dp/wifi3.0/dp_internal.h | 14 ++++++++++++++ dp/wifi3.0/dp_main.c | 12 +++++++++--- dp/wifi3.0/dp_peer.c | 14 -------------- dp/wifi3.0/dp_rx.h | 27 +++++++-------------------- dp/wifi3.0/dp_rx_defrag.c | 4 ++-- dp/wifi3.0/dp_rx_err.c | 13 +++++++------ dp/wifi3.0/dp_tx.c | 2 -- dp/wifi3.0/dp_types.h | 5 +++++ dp/wifi3.0/li/dp_li.c | 2 ++ dp/wifi3.0/li/dp_li_rx.c | 6 +++--- dp/wifi3.0/li/dp_li_rx.h | 22 ++++++++++++++++++++++ dp/wifi3.0/li/dp_li_tx.c | 2 ++ 17 files changed, 159 insertions(+), 53 deletions(-) diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index ccd4ff108e..0c2fc9cf21 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -1037,6 +1037,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) arch_ops->txrx_vdev_attach = dp_vdev_attach_be; arch_ops->txrx_vdev_detach = dp_vdev_detach_be; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be; + arch_ops->dp_rx_peer_metadata_peer_id_get = + dp_rx_peer_metadata_peer_id_get_be; arch_ops->soc_cfg_attach = dp_soc_cfg_attach_be; arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_be; diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index f56d0ba9f7..f6017ab142 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -335,13 +335,13 @@ more_data: rx_bufs_reaped[rx_desc->pool_id]++; peer_mdata = mpdu_desc_info.peer_meta_data; QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) = - DP_PEER_METADATA_PEER_ID_GET(peer_mdata); + dp_rx_peer_metadata_peer_id_get_be(soc, peer_mdata); QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) = - DP_PEER_METADATA_VDEV_ID_GET(peer_mdata); + dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata); /* to indicate whether this msdu is rx offload */ pkt_capture_offload = - DP_PEER_METADATA_OFFLOAD_GET(peer_mdata); + DP_PEER_METADATA_OFFLOAD_GET_BE(peer_mdata); /* * save msdu flags first, last and continuation msdu in diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index 6996d21614..f977a1aabe 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -125,6 +125,43 @@ dp_rx_desc_sw_cc_check(struct dp_soc *soc, } #endif /* DP_FEATURE_HW_COOKIE_CONVERSION && DP_HW_COOKIE_CONVERT_EXCEPTION */ +#define DP_PEER_METADATA_OFFLOAD_GET_BE(_peer_metadata) (0) + +#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH +static inline uint16_t +dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata) +{ + struct htt_rx_peer_metadata_v1 *metadata = + (struct htt_rx_peer_metadata_v1 *)&peer_metadata; + uint16_t peer_id; + + peer_id = metadata->peer_id | + (metadata->ml_peer_valid << soc->peer_id_shift); + + return peer_id; +} +#else +/* Combine ml_peer_valid and peer_id field */ +#define DP_BE_PEER_METADATA_PEER_ID_MASK 0x00003fff +#define DP_BE_PEER_METADATA_PEER_ID_SHIFT 0 + +static inline uint16_t +dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata) +{ + return ((peer_metadata & DP_BE_PEER_METADATA_PEER_ID_MASK) >> + DP_BE_PEER_METADATA_PEER_ID_SHIFT); +} +#endif + +static inline uint16_t +dp_rx_peer_metadata_vdev_id_get_be(struct dp_soc *soc, uint32_t peer_metadata) +{ + struct htt_rx_peer_metadata_v1 *metadata = + (struct htt_rx_peer_metadata_v1 *)&peer_metadata; + + return metadata->vdev_id; +} + #ifdef WLAN_FEATURE_NEAR_FULL_IRQ /** * dp_rx_nf_process() - Near Full state handler for RX rings. diff --git a/dp/wifi3.0/be/dp_be_tx.c b/dp/wifi3.0/be/dp_be_tx.c index aef66a3268..cfb9d457c1 100644 --- a/dp/wifi3.0/be/dp_be_tx.c +++ b/dp/wifi3.0/be/dp_be_tx.c @@ -27,6 +27,32 @@ extern uint8_t sec_type_map[MAX_CDP_SEC_TYPE]; +#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH +static inline uint16_t dp_tx_comp_get_peer_id(struct dp_soc *soc, + void *tx_comp_hal_desc) +{ + uint16_t peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc); + struct dp_tx_comp_peer_id *tx_peer_id = + (struct dp_tx_comp_peer_id *)&peer_id; + + return (tx_peer_id->peer_id | + (tx_peer_id->ml_peer_valid << soc->peer_id_shift)); +} +#else +/* Combine ml_peer_valid and peer_id field */ +#define DP_BE_TX_COMP_PEER_ID_MASK 0x00003fff +#define DP_BE_TX_COMP_PEER_ID_SHIFT 0 + +static inline uint16_t dp_tx_comp_get_peer_id(struct dp_soc *soc, + void *tx_comp_hal_desc) +{ + uint16_t peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc); + + return ((peer_id & DP_BE_TX_COMP_PEER_ID_MASK) >> + DP_BE_TX_COMP_PEER_ID_SHIFT); +} +#endif + #ifdef DP_FEATURE_HW_COOKIE_CONVERSION #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc, @@ -46,6 +72,10 @@ void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc, *r_tx_desc = (struct dp_tx_desc_s *)dp_cc_desc_find(soc, tx_desc_id); } + + if (*r_tx_desc) + (*r_tx_desc)->peer_id = dp_tx_comp_get_peer_id(soc, + tx_comp_hal_desc); } #else void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc, @@ -54,6 +84,10 @@ void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc, { *r_tx_desc = (struct dp_tx_desc_s *) hal_tx_comp_get_desc_va(tx_comp_hal_desc); + + if (*r_tx_desc) + (*r_tx_desc)->peer_id = dp_tx_comp_get_peer_id(soc, + tx_comp_hal_desc); } #endif /* DP_HW_COOKIE_CONVERT_EXCEPTION */ #else @@ -68,6 +102,10 @@ void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc, tx_desc_id = hal_tx_comp_get_desc_id(tx_comp_hal_desc); *r_tx_desc = (struct dp_tx_desc_s *)dp_cc_desc_find(soc, tx_desc_id); + + if (*r_tx_desc) + (*r_tx_desc)->peer_id = dp_tx_comp_get_peer_id(soc, + tx_comp_hal_desc); } #endif /* DP_FEATURE_HW_COOKIE_CONVERSION */ diff --git a/dp/wifi3.0/be/dp_be_tx.h b/dp/wifi3.0/be/dp_be_tx.h index 59d78aed1f..afd48b663a 100644 --- a/dp/wifi3.0/be/dp_be_tx.h +++ b/dp/wifi3.0/be/dp_be_tx.h @@ -27,6 +27,12 @@ #include #include "dp_be.h" +struct __attribute__((__packed__)) dp_tx_comp_peer_id { + uint16_t peer_id:13, + ml_peer_valid:1, + reserved:2; +}; + /* Invalid TX Bank ID value */ #define DP_BE_INVALID_BANK_ID -1 diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 213aa24690..a9ebbc4744 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -869,6 +869,20 @@ void DP_PRINT_STATS(const char *fmt, ...); #define FRAME_MASK_IPV4_EAPOL 4 #define FRAME_MASK_IPV6_DHCP 8 +static inline int dp_log2_ceil(unsigned int value) +{ + unsigned int tmp = value; + int log2 = -1; + + while (tmp) { + log2++; + tmp >>= 1; + } + if (1 << log2 != value) + log2++; + return log2; +} + #ifdef QCA_SUPPORT_PEER_ISOLATION #define dp_get_peer_isolation(_peer) ((_peer)->isolation) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 6b4d220740..49c57e877b 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -10770,10 +10770,16 @@ static QDF_STATUS dp_peer_map_attach_wifi3(struct cdp_soc_t *soc_hdl, { struct dp_soc *soc = (struct dp_soc *)soc_hdl; - soc->max_peers = max_peers; + soc->peer_id_shift = dp_log2_ceil(max_peers); + soc->peer_id_mask = (1 << soc->peer_id_shift) - 1; + /* + * Double the peers since we use ML indication bit + * alongwith peer_id to find peers. + */ + soc->max_peers = 1 << (soc->peer_id_shift + 1); - qdf_print ("%s max_peers %u, max_ast_index: %u\n", - __func__, max_peers, max_ast_index); + dp_info("max_peers %u, calculated max_peers %u max_ast_index: %u\n", + max_peers, soc->max_peers, max_ast_index); wlan_cfg_set_max_ast_idx(soc->wlan_cfg_ctx, max_ast_index); if (dp_peer_find_attach(soc)) diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 67e1e86142..d5b9bd9830 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -208,20 +208,6 @@ static QDF_STATUS dp_peer_find_map_attach(struct dp_soc *soc) return QDF_STATUS_SUCCESS; /* success */ } -static int dp_log2_ceil(unsigned int value) -{ - unsigned int tmp = value; - int log2 = -1; - - while (tmp) { - log2++; - tmp >>= 1; - } - if (1 << log2 != value) - log2++; - return log2; -} - #define DP_PEER_HASH_LOAD_MULT 2 #define DP_PEER_HASH_LOAD_SHIFT 0 diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index b2086d8b67..4377db8258 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -43,28 +43,8 @@ #define RX_BUFFER_RESERVATION 0 -#define DP_PEER_METADATA_PEER_ID_MASK 0x0000ffff -#define DP_PEER_METADATA_PEER_ID_SHIFT 0 -#define DP_PEER_METADATA_VDEV_ID_MASK 0x003f0000 -#define DP_PEER_METADATA_VDEV_ID_SHIFT 16 -#define DP_PEER_METADATA_OFFLOAD_MASK 0x01000000 -#define DP_PEER_METADATA_OFFLOAD_SHIFT 24 - - #define DP_DEFAULT_NOISEFLOOR (-96) -#define DP_PEER_METADATA_PEER_ID_GET(_peer_metadata) \ - (((_peer_metadata) & DP_PEER_METADATA_PEER_ID_MASK) \ - >> DP_PEER_METADATA_PEER_ID_SHIFT) - -#define DP_PEER_METADATA_VDEV_ID_GET(_peer_metadata) \ - (((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \ - >> DP_PEER_METADATA_VDEV_ID_SHIFT) - -#define DP_PEER_METADATA_OFFLOAD_GET(_peer_metadata) \ - (((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK) \ - >> DP_PEER_METADATA_OFFLOAD_SHIFT) - #define DP_RX_DESC_MAGIC 0xdec0de #define dp_rx_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_RX, params) @@ -2079,6 +2059,13 @@ dp_rx_get_defrag_bm_id(struct dp_soc *soc) } #endif +static inline uint16_t +dp_rx_peer_metadata_peer_id_get(struct dp_soc *soc, uint32_t peer_metadata) +{ + return soc->arch_ops.dp_rx_peer_metadata_peer_id_get(soc, + peer_metadata); +} + /** * dp_rx_desc_pool_init_generic() - Generic Rx descriptors initialization * @soc: SOC handle diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index 28797f8136..6e870d0fa5 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -1711,8 +1711,8 @@ dp_rx_defrag_store_fragment(struct dp_soc *soc, qdf_nbuf_append_ext_list(frag, NULL, 0); /* Check if the packet is from a valid peer */ - peer_id = DP_PEER_METADATA_PEER_ID_GET( - mpdu_desc_info->peer_meta_data); + peer_id = dp_rx_peer_metadata_peer_id_get(soc, + mpdu_desc_info->peer_meta_data); peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR); if (!peer) { diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index c79d80e8e4..02ca08caa3 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -449,8 +449,8 @@ dp_rx_pn_error_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc, struct dp_peer *peer; bool peer_pn_policy = false; - peer_id = DP_PEER_METADATA_PEER_ID_GET( - mpdu_desc_info->peer_meta_data); + peer_id = dp_rx_peer_metadata_peer_id_get(soc, + mpdu_desc_info->peer_meta_data); peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR); @@ -627,7 +627,8 @@ _dp_rx_bar_frame_handle(struct dp_soc *soc, qdf_nbuf_t nbuf, uint16_t peer_id; struct dp_peer *peer; - peer_id = DP_PEER_METADATA_PEER_ID_GET(mpdu_desc_info->peer_meta_data); + peer_id = dp_rx_peer_metadata_peer_id_get(soc, + mpdu_desc_info->peer_meta_data); peer = dp_peer_get_tgt_peer_by_id(soc, peer_id, DP_MOD_ID_RX_ERR); if (!peer) return; @@ -703,8 +704,8 @@ dp_rx_reo_err_entry_process(struct dp_soc *soc, QDF_STATUS status; bool ret; - peer_id = DP_PEER_METADATA_PEER_ID_GET( - mpdu_desc_info->peer_meta_data); + peer_id = dp_rx_peer_metadata_peer_id_get(soc, + mpdu_desc_info->peer_meta_data); more_msdu_link_desc: hal_rx_msdu_list_get(soc->hal_soc, link_desc_va, &msdu_list, @@ -777,7 +778,7 @@ more_msdu_link_desc: hal_rx_tlv_populate_mpdu_desc_info(soc->hal_soc, qdf_nbuf_data(nbuf), mpdu_desc_info); - peer_id = DP_PEER_METADATA_PEER_ID_GET( + peer_id = dp_rx_peer_metadata_peer_id_get(soc, mpdu_desc_info->peer_meta_data); if (mpdu_desc_info->bar_frame) diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index a01ec6a4e2..2695b63bb6 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -4687,8 +4687,6 @@ more_data: dp_tx_process_htt_completion(soc, tx_desc, htt_tx_status, ring_id); } else { - tx_desc->peer_id = - hal_tx_comp_get_peer_id(tx_comp_hal_desc); tx_desc->tx_status = hal_tx_comp_get_tx_status(tx_comp_hal_desc); tx_desc->buffer_src = buffer_src; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 6550ce13f7..8bbe3ecbcf 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1660,6 +1660,8 @@ struct dp_arch_ops { uint32_t dp_budget); void (*tx_implicit_rbm_set)(struct dp_soc *soc, uint8_t tx_ring_id, uint8_t bm_id); + uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc, + uint32_t peer_metadata); /* Control Arch Ops */ QDF_STATUS (*txrx_set_vdev_param)(struct dp_soc *soc, @@ -1958,6 +1960,9 @@ struct dp_soc { /* maximum value for peer_id */ uint32_t max_peers; + uint32_t peer_id_shift; + uint32_t peer_id_mask; + /* SoC level data path statistics */ struct dp_soc_stats stats; #ifdef WLAN_SYSFS_DP_STATS diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index fe55bc5b37..ebaafd8772 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -374,6 +374,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->dp_rx_desc_cookie_2_va = dp_rx_desc_cookie_2_va_li; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li; + arch_ops->dp_rx_peer_metadata_peer_id_get = + dp_rx_peer_metadata_peer_id_get_li; arch_ops->soc_cfg_attach = dp_soc_cfg_attach_li; arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li; } diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index 32cf1b34cd..66465a19e2 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -340,13 +340,13 @@ more_data: rx_bufs_reaped[rx_desc->pool_id]++; peer_mdata = mpdu_desc_info.peer_meta_data; QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) = - DP_PEER_METADATA_PEER_ID_GET(peer_mdata); + dp_rx_peer_metadata_peer_id_get_li(soc, peer_mdata); QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) = - DP_PEER_METADATA_VDEV_ID_GET(peer_mdata); + DP_PEER_METADATA_VDEV_ID_GET_LI(peer_mdata); /* to indicate whether this msdu is rx offload */ pkt_capture_offload = - DP_PEER_METADATA_OFFLOAD_GET(peer_mdata); + DP_PEER_METADATA_OFFLOAD_GET_LI(peer_mdata); /* * save msdu flags first, last and continuation msdu in diff --git a/dp/wifi3.0/li/dp_li_rx.h b/dp/wifi3.0/li/dp_li_rx.h index e26cdc471a..bfef488c1d 100644 --- a/dp/wifi3.0/li/dp_li_rx.h +++ b/dp/wifi3.0/li/dp_li_rx.h @@ -78,4 +78,26 @@ struct dp_rx_desc *dp_rx_desc_cookie_2_va_li(struct dp_soc *soc, { return dp_rx_cookie_2_va_rxdma_buf(soc, cookie); } + +#define DP_PEER_METADATA_VDEV_ID_MASK 0x003f0000 +#define DP_PEER_METADATA_VDEV_ID_SHIFT 16 +#define DP_PEER_METADATA_OFFLOAD_MASK 0x01000000 +#define DP_PEER_METADATA_OFFLOAD_SHIFT 24 + +#define DP_PEER_METADATA_VDEV_ID_GET_LI(_peer_metadata) \ + (((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \ + >> DP_PEER_METADATA_VDEV_ID_SHIFT) + +#define DP_PEER_METADATA_OFFLOAD_GET_LI(_peer_metadata) \ + (((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK) \ + >> DP_PEER_METADATA_OFFLOAD_SHIFT) + +static inline uint16_t +dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata) +{ + struct htt_rx_peer_metadata_v0 *metadata = + (struct htt_rx_peer_metadata_v0 *)&peer_metadata; + + return metadata->peer_id; +} #endif diff --git a/dp/wifi3.0/li/dp_li_tx.c b/dp/wifi3.0/li/dp_li_tx.c index a7aaa25fc5..0923bed2ed 100644 --- a/dp/wifi3.0/li/dp_li_tx.c +++ b/dp/wifi3.0/li/dp_li_tx.c @@ -51,6 +51,8 @@ void dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc *soc, qdf_assert_always(0); } + + (*r_tx_desc)->peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc); } #ifdef QCA_OL_TX_MULTIQ_SUPPORT