diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 1bcd900ad3..dc2bedc45f 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -1606,77 +1606,6 @@ static void dp_tx_implicit_rbm_set_be(struct dp_soc *soc, } #endif -#ifdef WLAN_MLO_MULTI_CHIP -static void dp_peer_get_reo_hash_be(struct dp_vdev *vdev, - struct cdp_peer_setup_info *setup_info, - enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based, - uint8_t *lmac_peer_id_msb) -{ - struct dp_soc *soc = vdev->pdev->soc; - struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); - uint8_t default_rx_ring_id; - uint8_t chip_id; - - if (!be_soc->mlo_enabled) - return dp_vdev_get_default_reo_hash(vdev, reo_dest, - hash_based); - - chip_id = be_soc->mlo_chip_id; - default_rx_ring_id = - wlan_cfg_mlo_default_rx_ring_get_by_chip_id(soc->wlan_cfg_ctx, - chip_id); - *reo_dest = hal_reo_ring_remap_value_get_be(default_rx_ring_id); - *hash_based = wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx); - *lmac_peer_id_msb = - wlan_cfg_mlo_lmac_peer_id_msb_get_by_chip_id(soc->wlan_cfg_ctx, - chip_id); -} - -static bool dp_reo_remap_config_be(struct dp_soc *soc, - uint32_t *remap0, - uint32_t *remap1, - uint32_t *remap2) -{ - uint8_t rx_ring_mask; - struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); - - if (!be_soc->mlo_enabled) - return dp_reo_remap_config(soc, remap0, remap1, remap2); - - rx_ring_mask = - wlan_cfg_mlo_rx_ring_map_get_by_chip_id(soc->wlan_cfg_ctx, 0); - *remap0 = hal_reo_ix_remap_value_get_be(soc->hal_soc, rx_ring_mask); - - rx_ring_mask = - wlan_cfg_mlo_rx_ring_map_get_by_chip_id(soc->wlan_cfg_ctx, 1); - *remap1 = hal_reo_ix_remap_value_get_be(soc->hal_soc, rx_ring_mask); - - rx_ring_mask = - wlan_cfg_mlo_rx_ring_map_get_by_chip_id(soc->wlan_cfg_ctx, 2); - *remap2 = hal_reo_ix_remap_value_get_be(soc->hal_soc, rx_ring_mask); - - return true; -} -#else -static void dp_peer_get_reo_hash_be(struct dp_vdev *vdev, - struct cdp_peer_setup_info *setup_info, - enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based, - uint8_t *lmac_peer_id_msb) -{ - dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); -} - -static bool dp_reo_remap_config_be(struct dp_soc *soc, - uint32_t *remap0, - uint32_t *remap1, - uint32_t *remap2) -{ - return dp_reo_remap_config(soc, remap0, remap1, remap2); -} -#endif - QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc, struct dp_vdev *vdev, enum cdp_vdev_param_type param, @@ -1837,8 +1766,6 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) 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; - 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; dp_initialize_arch_ops_be_mlo(arch_ops); arch_ops->dp_peer_rx_reorder_queue_setup = diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index fe3eff8580..15fc0f2c91 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -147,8 +147,8 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx, struct dp_rx_desc *rx_desc = NULL; qdf_nbuf_t nbuf, next; bool near_full; - union dp_rx_desc_list_elem_t *head[MAX_PDEV_CNT]; - union dp_rx_desc_list_elem_t *tail[MAX_PDEV_CNT]; + union dp_rx_desc_list_elem_t *head[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT]; + union dp_rx_desc_list_elem_t *tail[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT]; uint32_t num_pending; uint32_t rx_bufs_used = 0, rx_buf_cookie; uint16_t msdu_len = 0; @@ -163,7 +163,7 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx, enum hal_reo_error_status error; uint32_t peer_mdata; uint8_t *rx_tlv_hdr; - uint32_t rx_bufs_reaped[MAX_PDEV_CNT]; + uint32_t rx_bufs_reaped[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT]; uint8_t mac_id = 0; struct dp_pdev *rx_pdev; bool enh_flag; @@ -192,6 +192,7 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx, struct dp_srng *rx_ring = &soc->reo_dest_ring[reo_ring_num]; int max_reap_limit, ring_near_full; struct dp_soc *replenish_soc; + uint8_t chip_id; DP_HIST_INIT(); @@ -279,9 +280,9 @@ more_data: dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, rx_desc->pool_id); dp_rx_add_to_free_desc_list( - &head[rx_desc->pool_id], - &tail[rx_desc->pool_id], - rx_desc); + &head[rx_desc->chip_id][rx_desc->pool_id], + &tail[rx_desc->chip_id][rx_desc->pool_id], + rx_desc); } hal_srng_dst_get_next(hal_soc, hal_ring_hdl); continue; @@ -377,7 +378,7 @@ more_data: /* Pop out the descriptor*/ hal_srng_dst_get_next(hal_soc, hal_ring_hdl); - rx_bufs_reaped[rx_desc->pool_id]++; + rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; peer_mdata = mpdu_desc_info.peer_meta_data; QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) = dp_rx_peer_metadata_peer_id_get_be(soc, peer_mdata); @@ -447,8 +448,9 @@ more_data: if (qdf_likely(!qdf_nbuf_is_rx_chfrag_cont(rx_desc->nbuf))) quota -= 1; - dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id], - &tail[rx_desc->pool_id], rx_desc); + dp_rx_add_to_free_desc_list + (&head[rx_desc->chip_id][rx_desc->pool_id], + &tail[rx_desc->chip_id][rx_desc->pool_id], rx_desc); num_rx_bufs_reaped++; /* * only if complete msdu is received for scatter case, @@ -462,25 +464,30 @@ more_data: done: dp_rx_srng_access_end(int_ctx, soc, hal_ring_hdl); - replenish_soc = dp_rx_replensih_soc_get(soc, reo_ring_num); - for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { - /* - * continue with next mac_id if no pkts were reaped - * from that pool - */ - if (!rx_bufs_reaped[mac_id]) - continue; + for (chip_id = 0; chip_id < WLAN_MAX_MLO_CHIPS; chip_id++) { + for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { + /* + * continue with next mac_id if no pkts were reaped + * from that pool + */ + if (!rx_bufs_reaped[chip_id][mac_id]) + continue; - dp_rxdma_srng = &replenish_soc->rx_refill_buf_ring[mac_id]; + replenish_soc = dp_rx_replensih_soc_get(soc, chip_id); - rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; + dp_rxdma_srng = + &replenish_soc->rx_refill_buf_ring[mac_id]; - dp_rx_buffers_replenish(replenish_soc, mac_id, dp_rxdma_srng, - rx_desc_pool, rx_bufs_reaped[mac_id], - &head[mac_id], &tail[mac_id]); + rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; + + dp_rx_buffers_replenish(replenish_soc, mac_id, + dp_rxdma_srng, rx_desc_pool, + rx_bufs_reaped[chip_id][mac_id], + &head[chip_id][mac_id], + &tail[chip_id][mac_id]); + } } - dp_verbose_debug("replenished %u\n", rx_bufs_reaped[0]); /* Peer can be NULL is case of LFR */ if (qdf_likely(txrx_peer)) vdev = NULL; @@ -919,6 +926,7 @@ dp_rx_desc_pool_init_be_cc(struct dp_soc *soc, rx_desc_elem->rx_desc.cookie = dp_cc_desc_id_generate(page_desc->ppt_index, avail_entry_index); + rx_desc_elem->rx_desc.chip_id = dp_mlo_get_chip_id(soc); rx_desc_elem->rx_desc.pool_id = pool_id; rx_desc_elem->rx_desc.in_use = 0; rx_desc_elem = rx_desc_elem->next; @@ -977,6 +985,8 @@ dp_rx_desc_pool_init_be_cc(struct dp_soc *soc, avail_entry_index); rx_desc_pool->array[i].rx_desc.pool_id = pool_id; rx_desc_pool->array[i].rx_desc.in_use = 0; + rx_desc_pool->array[i].rx_desc.chip_id = + dp_mlo_get_chip_id(soc); avail_entry_index = (avail_entry_index + 1) & DP_CC_SPT_PAGE_MAX_ENTRIES_MASK; diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index a8329da1df..9e14b50d5f 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -216,10 +216,10 @@ uint32_t dp_rx_nf_process(struct dp_intr *int_ctx, #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) struct dp_soc * -dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t reo_ring_num); +dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t chip_id); #else static inline struct dp_soc * -dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t reo_ring_num) +dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t chip_id) { return soc; } diff --git a/dp/wifi3.0/be/mlo/dp_mlo.c b/dp/wifi3.0/be/mlo/dp_mlo.c index 6d1115617b..fd868d1963 100644 --- a/dp/wifi3.0/be/mlo/dp_mlo.c +++ b/dp/wifi3.0/be/mlo/dp_mlo.c @@ -543,26 +543,22 @@ void dp_mlo_get_rx_hash_key(struct dp_soc *soc, } struct dp_soc * -dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t reo_ring_num) +dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t chip_id) { struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); struct dp_mlo_ctxt *mlo_ctxt = be_soc->ml_ctxt; - uint8_t chip_id; - uint8_t rx_ring_mask; + struct dp_soc *replenish_soc; if (!be_soc->mlo_enabled || !mlo_ctxt) return soc; - for (chip_id = 0; chip_id < WLAN_MAX_MLO_CHIPS; chip_id++) { - rx_ring_mask = - wlan_cfg_mlo_rx_ring_map_get_by_chip_id - (soc->wlan_cfg_ctx, chip_id); - - if (rx_ring_mask & (1 << reo_ring_num)) - return dp_mlo_get_soc_ref_by_chip_id(mlo_ctxt, chip_id); + replenish_soc = dp_mlo_get_soc_ref_by_chip_id(mlo_ctxt, chip_id); + if (qdf_unlikely(!replenish_soc)) { + dp_alert("replenish SOC is NULL"); + qdf_assert_always(0); } - return soc; + return replenish_soc; } #ifdef WLAN_MCAST_MLO diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 1c64640444..af13f0f87c 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -7554,10 +7554,8 @@ static inline bool dp_is_vdev_subtype_p2p(struct dp_vdev *vdev) * Return: None */ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, - struct cdp_peer_setup_info *setup_info, enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based, - uint8_t *lmac_peer_id_msb) + bool *hash_based) { struct dp_soc *soc; struct dp_pdev *pdev; @@ -7605,15 +7603,10 @@ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, * Return: None */ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, - struct cdp_peer_setup_info *setup_info, enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based, - uint8_t *lmac_peer_id_msb) + bool *hash_based) { - struct dp_soc *soc = vdev->pdev->soc; - - soc->arch_ops.peer_get_reo_hash(vdev, setup_info, reo_dest, hash_based, - lmac_peer_id_msb); + dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); } #endif /* IPA_OFFLOAD */ @@ -7656,9 +7649,7 @@ dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, /* save vdev related member in case vdev freed */ vdev_opmode = vdev->opmode; pdev = vdev->pdev; - dp_peer_setup_get_reo_hash(vdev, setup_info, - &reo_dest, &hash_based, - &lmac_peer_id_msb); + dp_peer_setup_get_reo_hash(vdev, &reo_dest, &hash_based); dp_info("pdev: %d vdev :%d opmode:%u hash-based-steering:%d default-reo_dest:%u", pdev->pdev_id, vdev->vdev_id, @@ -14035,9 +14026,10 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, * Reo ring remap is not required if both radios * are offloaded to NSS */ - if (soc->arch_ops.reo_remap_config(soc, &reo_params.remap0, - &reo_params.remap1, - &reo_params.remap2)) + + if (dp_reo_remap_config(soc, &reo_params.remap0, + &reo_params.remap1, + &reo_params.remap2)) reo_params.rx_hash_enabled = true; else reo_params.rx_hash_enabled = false; diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index baad136ee9..e2c2a8ef00 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -115,6 +115,8 @@ struct dp_rx_desc_dbg_info { * @pool_id : pool Id for which this allocated. * Can only be used if there is no flow * steering + * @chip_id : chip_id indicating MLO chip_id + * valid or used only in case of multi-chip MLO * @in_use rx_desc is in use * @unmapped used to mark rx_desc an unmapped if the corresponding * nbuf is already unmapped @@ -127,6 +129,7 @@ struct dp_rx_desc { qdf_dma_addr_t paddr_buf_start; uint32_t cookie; uint8_t pool_id; + uint8_t chip_id; #ifdef RX_DESC_DEBUG_CHECK uint32_t magic; uint8_t *nbuf_data_addr; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 2ef13aa365..da06c525d1 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1716,13 +1716,6 @@ struct dp_arch_ops { 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, - struct cdp_peer_setup_info *setup_info, - enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based, - uint8_t *lmac_peer_id_msb); - bool (*reo_remap_config)(struct dp_soc *soc, uint32_t *remap0, - uint32_t *remap1, uint32_t *remap2); /* TX RX Arch Ops */ QDF_STATUS (*tx_hw_enqueue)(struct dp_soc *soc, struct dp_vdev *vdev, diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 48c62eeeaf..bca978a29d 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -508,23 +508,6 @@ static void dp_tx_implicit_rbm_set_li(struct dp_soc *soc, { } -static void dp_peer_get_reo_hash_li(struct dp_vdev *vdev, - struct cdp_peer_setup_info *setup_info, - enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based, - uint8_t *lmac_peer_id_msb) -{ - dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); -} - -static bool dp_reo_remap_config_li(struct dp_soc *soc, - uint32_t *remap0, - uint32_t *remap1, - uint32_t *remap2) -{ - 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, @@ -619,8 +602,6 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) 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; - 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; arch_ops->txrx_print_peer_stats = dp_print_peer_txrx_stats_li; arch_ops->dp_peer_rx_reorder_queue_setup =