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:

committed by
Madan Koyyalamudi

parent
b2d135c7fd
commit
97a1c8bff1
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
if (!QDF_IS_STATUS_SUCCESS(status)) {
|
||||||
|
dp_err("failure in allocating peer tables");
|
||||||
return QDF_STATUS_E_FAILURE;
|
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_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,
|
||||||
|
@@ -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);
|
||||||
|
@@ -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 ||
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user