From 97a1c8bff1cef37a6b3a2be68548afab569085b4 Mon Sep 17 00:00:00 2001 From: Chaithanya Garrepalli Date: Tue, 30 Nov 2021 10:57:16 +0530 Subject: [PATCH] qcacmn: Changes to caluclate soc max peer id Changes to caluclate max peer id in case of MLO Change-Id: Ib52cfb4f92eafb88689774e8e6c406751d30372a --- dp/wifi3.0/be/dp_be.c | 42 +++++++++++++++++++++++++++++++++++++++++ dp/wifi3.0/dp_main.c | 44 +++++++++++++++++++++---------------------- dp/wifi3.0/dp_peer.c | 8 ++++---- dp/wifi3.0/dp_peer.h | 4 ++-- dp/wifi3.0/dp_rx.c | 2 +- dp/wifi3.0/dp_types.h | 10 +++++++--- dp/wifi3.0/li/dp_li.c | 23 ++++++++++++++++------ 7 files changed, 95 insertions(+), 38 deletions(-) diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index f9e0491b94..2e44b38538 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -1339,6 +1339,46 @@ QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_FEATURE_11BE_MLO +#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH +static inline void +dp_soc_max_peer_id_set(struct dp_soc *soc) +{ + soc->peer_id_shift = dp_log2_ceil(soc->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_peer_id = 1 << (soc->peer_id_shift + 1); +} +#else +static inline void +dp_soc_max_peer_id_set(struct dp_soc *soc) +{ + soc->max_peer_id = + (1 << (HTT_RX_PEER_META_DATA_V1_ML_PEER_VALID_S + 1)) - 1; +} +#endif /* DP_USE_REDUCED_PEER_ID_FIELD_WIDTH */ +#else +static inline void +dp_soc_max_peer_id_set(struct dp_soc *soc) +{ + soc->max_peer_id = soc->max_peers; +} +#endif /* WLAN_FEATURE_11BE_MLO */ + +static void dp_peer_map_detach_be(struct dp_soc *soc) +{ +} + +static QDF_STATUS dp_peer_map_attach_be(struct dp_soc *soc) +{ + dp_soc_max_peer_id_set(soc); + + return QDF_STATUS_SUCCESS; +} + void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) { #ifndef QCA_HOST_MODE_WIFI_DISABLED @@ -1369,6 +1409,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) arch_ops->txrx_pdev_detach = dp_pdev_detach_be; arch_ops->txrx_vdev_attach = dp_vdev_attach_be; arch_ops->txrx_vdev_detach = dp_vdev_detach_be; + arch_ops->txrx_peer_map_attach = dp_peer_map_attach_be; + arch_ops->txrx_peer_map_detach = dp_peer_map_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; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index aece673371..322374dd24 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5524,9 +5524,8 @@ static void dp_soc_deinit(void *txrx_soc) /* free peer tables & AST tables allocated during peer_map_attach */ if (soc->peer_map_attach_success) { - if (soc->arch_ops.txrx_peer_detach) - soc->arch_ops.txrx_peer_detach(soc); dp_peer_find_detach(soc); + soc->arch_ops.txrx_peer_map_detach(soc); soc->peer_map_attach_success = FALSE; } @@ -6373,7 +6372,7 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only) dp_vdev_iterate_peer_lock_safe(vdev, dp_peer_delete, NULL, DP_MOD_ID_CDP); - for (i = 0; i < soc->max_peers ; i++) { + for (i = 0; i < soc->max_peer_id ; i++) { peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP); if (!peer) @@ -9221,7 +9220,7 @@ static void dp_rx_update_peer_delay_stats(struct dp_soc *soc, struct cdp_peer_ext_stats *pext_stats = NULL; peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); - if (peer_id > soc->max_peers) + if (peer_id > soc->max_peer_id) return; peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_CDP); @@ -11280,34 +11279,35 @@ static QDF_STATUS dp_peer_map_attach_wifi3(struct cdp_soc_t *soc_hdl, uint8_t peer_map_unmap_versions) { struct dp_soc *soc = (struct dp_soc *)soc_hdl; + QDF_STATUS status; - 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); + soc->max_peers = max_peers; - 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)) + status = soc->arch_ops.txrx_peer_map_attach(soc); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_err("failure in allocating peer tables"); return QDF_STATUS_E_FAILURE; - - if (soc->arch_ops.txrx_peer_attach) { - QDF_STATUS status; - status = soc->arch_ops.txrx_peer_attach(soc); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_peer_find_detach(soc); - return QDF_STATUS_E_FAILURE; - } } + + dp_info("max_peers %u, calculated max_peers %u max_ast_index: %u\n", + max_peers, soc->max_peer_id, max_ast_index); + + status = dp_peer_find_attach(soc); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_err("Peer find attach failure"); + goto fail; + } + soc->peer_map_unmap_versions = peer_map_unmap_versions; soc->peer_map_attach_success = TRUE; return QDF_STATUS_SUCCESS; +fail: + soc->arch_ops.txrx_peer_map_detach(soc); + + return status; } static QDF_STATUS dp_soc_set_param(struct cdp_soc_t *soc_hdl, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 5bc89d13d9..ed7b509cf7 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -186,7 +186,7 @@ static QDF_STATUS dp_peer_find_map_attach(struct dp_soc *soc) { uint32_t max_peers, peer_map_size; - max_peers = soc->max_peers; + max_peers = soc->max_peer_id; /* allocate the peer ID -> peer object map */ dp_peer_info("\n%pK:<=== cfg max peer id %d ====>", soc, max_peers); peer_map_size = max_peers * sizeof(soc->peer_id_to_obj_map[0]); @@ -714,7 +714,7 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc, struct dp_peer *peer, uint16_t peer_id) { - QDF_ASSERT(peer_id <= soc->max_peers); + QDF_ASSERT(peer_id <= soc->max_peer_id); qdf_spin_lock_bh(&soc->peer_map_lock); @@ -747,7 +747,7 @@ void dp_peer_find_id_to_obj_remove(struct dp_soc *soc, uint16_t peer_id) { struct dp_peer *peer = NULL; - QDF_ASSERT(peer_id <= soc->max_peers); + QDF_ASSERT(peer_id <= soc->max_peer_id); qdf_spin_lock_bh(&soc->peer_map_lock); peer = soc->peer_id_to_obj_map[peer_id]; @@ -2460,7 +2460,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc, { struct dp_peer *peer; - QDF_ASSERT(peer_id <= soc->max_peers); + QDF_ASSERT(peer_id <= soc->max_peer_id); /* check if there's already a peer object with this MAC address */ peer = dp_peer_find_hash_find(soc, peer_mac_addr, 0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG); diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 5cd2122daf..8990bb196d 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -114,7 +114,7 @@ __dp_peer_get_ref_by_id(struct dp_soc *soc, struct dp_peer *peer; qdf_spin_lock_bh(&soc->peer_map_lock); - peer = (peer_id >= soc->max_peers) ? NULL : + peer = (peer_id >= soc->max_peer_id) ? NULL : soc->peer_id_to_obj_map[peer_id]; if (!peer || (dp_peer_get_ref(soc, peer, mod_id) != QDF_STATUS_SUCCESS)) { @@ -144,7 +144,7 @@ struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc, struct dp_peer *peer; qdf_spin_lock_bh(&soc->peer_map_lock); - peer = (peer_id >= soc->max_peers) ? NULL : + peer = (peer_id >= soc->max_peer_id) ? NULL : soc->peer_id_to_obj_map[peer_id]; if (!peer || peer->peer_state >= DP_PEER_STATE_LOGICAL_DELETE || diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 1fee71d4ad..ec922e5fad 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1866,7 +1866,7 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf) FRAME_MASK_IPV4_EAPOL | FRAME_MASK_IPV6_DHCP; peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); - if (peer_id > soc->max_peers) + if (peer_id > soc->max_peer_id) goto deliver_fail; vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 541bfdb8b0..8b1a3440f0 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1649,8 +1649,8 @@ struct dp_arch_ops { struct dp_vdev *vdev); QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc, struct dp_vdev *vdev); - QDF_STATUS (*txrx_peer_attach)(struct dp_soc *soc); - void (*txrx_peer_detach)(struct dp_soc *soc); + QDF_STATUS (*txrx_peer_map_attach)(struct dp_soc *soc); + void (*txrx_peer_map_detach)(struct dp_soc *soc); QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc); void (*soc_cfg_attach)(struct dp_soc *soc); void (*peer_get_reo_hash)(struct dp_vdev *vdev, @@ -2007,11 +2007,15 @@ struct dp_soc { /* Protect peer_id_to_objmap */ DP_MUTEX_TYPE peer_map_lock; - /* maximum value for peer_id */ + /* maximum number of suppoerted peers */ uint32_t max_peers; + /* maximum value for peer_id */ + uint32_t max_peer_id; +#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH uint32_t peer_id_shift; uint32_t peer_id_mask; +#endif /* SoC level data path statistics */ struct dp_soc_stats stats; diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 708552fef3..9f00dcc544 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -108,7 +108,7 @@ static QDF_STATUS dp_vdev_detach_li(struct dp_soc *soc, struct dp_vdev *vdev) } #ifdef AST_OFFLOAD_ENABLE -static void dp_peer_detach_li(struct dp_soc *soc) +static void dp_peer_map_detach_li(struct dp_soc *soc) { dp_soc_wds_detach(soc); dp_peer_ast_table_detach(soc); @@ -116,10 +116,12 @@ static void dp_peer_detach_li(struct dp_soc *soc) dp_peer_mec_hash_detach(soc); } -static QDF_STATUS dp_peer_attach_li(struct dp_soc *soc) +static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc) { QDF_STATUS status; + soc->max_peer_id = soc->max_peers; + status = dp_peer_ast_table_attach(soc); if (!QDF_IS_STATUS_SUCCESS(status)) return status; @@ -143,6 +145,17 @@ ast_table_detach: return status; } +#else +static void dp_peer_map_detach_li(struct dp_soc *soc) +{ +} + +static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc) +{ + soc->max_peer_id = soc->max_peers; + + return QDF_STATUS_SUCCESS; +} #endif qdf_size_t dp_get_soc_context_size_li(void) @@ -399,10 +412,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->txrx_pdev_detach = dp_pdev_detach_li; arch_ops->txrx_vdev_attach = dp_vdev_attach_li; arch_ops->txrx_vdev_detach = dp_vdev_detach_li; -#ifdef AST_OFFLOAD_ENABLE - arch_ops->txrx_peer_attach = dp_peer_attach_li; - arch_ops->txrx_peer_detach = dp_peer_detach_li; -#endif + arch_ops->txrx_peer_map_attach = dp_peer_map_attach_li; + arch_ops->txrx_peer_map_detach = dp_peer_map_detach_li; 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;