qcacmn: Changes to caluclate soc max peer id

Changes to caluclate max peer id in case
of MLO

Change-Id: Ib52cfb4f92eafb88689774e8e6c406751d30372a
This commit is contained in:
Chaithanya Garrepalli
2021-11-30 10:57:16 +05:30
committed by Madan Koyyalamudi
parent b2d135c7fd
commit 97a1c8bff1
7 changed files with 95 additions and 38 deletions

View File

@@ -1339,6 +1339,46 @@ QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc,
return QDF_STATUS_SUCCESS; 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) void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
{ {
#ifndef QCA_HOST_MODE_WIFI_DISABLED #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_pdev_detach = dp_pdev_detach_be;
arch_ops->txrx_vdev_attach = dp_vdev_attach_be; arch_ops->txrx_vdev_attach = dp_vdev_attach_be;
arch_ops->txrx_vdev_detach = dp_vdev_detach_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_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be;
arch_ops->dp_rx_peer_metadata_peer_id_get = arch_ops->dp_rx_peer_metadata_peer_id_get =
dp_rx_peer_metadata_peer_id_get_be; dp_rx_peer_metadata_peer_id_get_be;

View File

@@ -5524,9 +5524,8 @@ static void dp_soc_deinit(void *txrx_soc)
/* free peer tables & AST tables allocated during peer_map_attach */ /* free peer tables & AST tables allocated during peer_map_attach */
if (soc->peer_map_attach_success) { 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); dp_peer_find_detach(soc);
soc->arch_ops.txrx_peer_map_detach(soc);
soc->peer_map_attach_success = FALSE; 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_vdev_iterate_peer_lock_safe(vdev, dp_peer_delete, NULL,
DP_MOD_ID_CDP); 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); peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP);
if (!peer) 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; struct cdp_peer_ext_stats *pext_stats = NULL;
peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
if (peer_id > soc->max_peers) if (peer_id > soc->max_peer_id)
return; return;
peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_CDP); 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) uint8_t peer_map_unmap_versions)
{ {
struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_soc *soc = (struct dp_soc *)soc_hdl;
QDF_STATUS status;
soc->peer_id_shift = dp_log2_ceil(max_peers); soc->max_peers = 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);
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); 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);
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)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_peer_find_detach(soc); dp_err("failure in allocating peer tables");
return QDF_STATUS_E_FAILURE; 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_unmap_versions = peer_map_unmap_versions;
soc->peer_map_attach_success = TRUE; soc->peer_map_attach_success = TRUE;
return QDF_STATUS_SUCCESS; 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, static QDF_STATUS dp_soc_set_param(struct cdp_soc_t *soc_hdl,

View File

@@ -186,7 +186,7 @@ static QDF_STATUS dp_peer_find_map_attach(struct dp_soc *soc)
{ {
uint32_t max_peers, peer_map_size; 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 */ /* allocate the peer ID -> peer object map */
dp_peer_info("\n%pK:<=== cfg max peer id %d ====>", soc, max_peers); 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]); 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, struct dp_peer *peer,
uint16_t peer_id) 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); 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) uint16_t peer_id)
{ {
struct dp_peer *peer = NULL; 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); qdf_spin_lock_bh(&soc->peer_map_lock);
peer = soc->peer_id_to_obj_map[peer_id]; 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; 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 */ /* check if there's already a peer object with this MAC address */
peer = dp_peer_find_hash_find(soc, peer_mac_addr, peer = dp_peer_find_hash_find(soc, peer_mac_addr,
0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG); 0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG);

View File

@@ -114,7 +114,7 @@ __dp_peer_get_ref_by_id(struct dp_soc *soc,
struct dp_peer *peer; struct dp_peer *peer;
qdf_spin_lock_bh(&soc->peer_map_lock); 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]; soc->peer_id_to_obj_map[peer_id];
if (!peer || if (!peer ||
(dp_peer_get_ref(soc, peer, mod_id) != QDF_STATUS_SUCCESS)) { (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; struct dp_peer *peer;
qdf_spin_lock_bh(&soc->peer_map_lock); 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]; soc->peer_id_to_obj_map[peer_id];
if (!peer || peer->peer_state >= DP_PEER_STATE_LOGICAL_DELETE || if (!peer || peer->peer_state >= DP_PEER_STATE_LOGICAL_DELETE ||

View File

@@ -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; FRAME_MASK_IPV4_EAPOL | FRAME_MASK_IPV6_DHCP;
peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); 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; goto deliver_fail;
vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);

View File

@@ -1649,8 +1649,8 @@ struct dp_arch_ops {
struct dp_vdev *vdev); struct dp_vdev *vdev);
QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc, QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc,
struct dp_vdev *vdev); struct dp_vdev *vdev);
QDF_STATUS (*txrx_peer_attach)(struct dp_soc *soc); QDF_STATUS (*txrx_peer_map_attach)(struct dp_soc *soc);
void (*txrx_peer_detach)(struct dp_soc *soc); void (*txrx_peer_map_detach)(struct dp_soc *soc);
QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc); QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc);
void (*soc_cfg_attach)(struct dp_soc *soc); void (*soc_cfg_attach)(struct dp_soc *soc);
void (*peer_get_reo_hash)(struct dp_vdev *vdev, void (*peer_get_reo_hash)(struct dp_vdev *vdev,
@@ -2007,11 +2007,15 @@ struct dp_soc {
/* Protect peer_id_to_objmap */ /* Protect peer_id_to_objmap */
DP_MUTEX_TYPE peer_map_lock; DP_MUTEX_TYPE peer_map_lock;
/* maximum value for peer_id */ /* maximum number of suppoerted peers */
uint32_t max_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_shift;
uint32_t peer_id_mask; uint32_t peer_id_mask;
#endif
/* SoC level data path statistics */ /* SoC level data path statistics */
struct dp_soc_stats stats; struct dp_soc_stats stats;

View File

@@ -108,7 +108,7 @@ static QDF_STATUS dp_vdev_detach_li(struct dp_soc *soc, struct dp_vdev *vdev)
} }
#ifdef AST_OFFLOAD_ENABLE #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_soc_wds_detach(soc);
dp_peer_ast_table_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); 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; QDF_STATUS status;
soc->max_peer_id = soc->max_peers;
status = dp_peer_ast_table_attach(soc); status = dp_peer_ast_table_attach(soc);
if (!QDF_IS_STATUS_SUCCESS(status)) if (!QDF_IS_STATUS_SUCCESS(status))
return status; return status;
@@ -143,6 +145,17 @@ ast_table_detach:
return status; 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 #endif
qdf_size_t dp_get_soc_context_size_li(void) 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_pdev_detach = dp_pdev_detach_li;
arch_ops->txrx_vdev_attach = dp_vdev_attach_li; arch_ops->txrx_vdev_attach = dp_vdev_attach_li;
arch_ops->txrx_vdev_detach = dp_vdev_detach_li; arch_ops->txrx_vdev_detach = dp_vdev_detach_li;
#ifdef AST_OFFLOAD_ENABLE arch_ops->txrx_peer_map_attach = dp_peer_map_attach_li;
arch_ops->txrx_peer_attach = dp_peer_attach_li; arch_ops->txrx_peer_map_detach = dp_peer_map_detach_li;
arch_ops->txrx_peer_detach = dp_peer_detach_li;
#endif
arch_ops->dp_rx_desc_cookie_2_va = arch_ops->dp_rx_desc_cookie_2_va =
dp_rx_desc_cookie_2_va_li; dp_rx_desc_cookie_2_va_li;
arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li;