diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 2d4fe727c2..0e20c4ae33 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -149,7 +149,7 @@ dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) * dp_rx_process_be() - Brain of the Rx processing functionality * Called from the bottom half (tasklet/NET_RX_SOFTIRQ) * @int_ctx: per interrupt context - * @hal_ring: opaque pointer to the HAL Rx Ring, which will be serviced + * @hal_ring_hdl: opaque pointer to the HAL Rx Ring, which will be serviced * @reo_ring_num: ring number (0, 1, 2 or 3) of the reo ring. * @quota: No. of units (packets) that can be serviced in one shot. * @@ -1329,13 +1329,6 @@ static inline bool dp_rx_intrabss_fwd_mlo_allow(struct dp_txrx_peer *ta_peer, struct dp_txrx_peer *da_peer) { - /* one of TA/DA peer should belong to MLO connection peer, - * only MLD peer type is as expected - */ - if (!IS_MLO_DP_MLD_TXRX_PEER(ta_peer) && - !IS_MLO_DP_MLD_TXRX_PEER(da_peer)) - return false; - /* TA peer and DA peer's vdev should be partner MLO vdevs */ if (dp_peer_find_mac_addr_cmp(&ta_peer->vdev->mld_mac_addr, &da_peer->vdev->mld_mac_addr)) @@ -1355,38 +1348,51 @@ dp_rx_intrabss_fwd_mlo_allow(struct dp_txrx_peer *ta_peer, #ifdef INTRA_BSS_FWD_OFFLOAD /** * dp_rx_intrabss_ucast_check_be() - Check if intrabss is allowed - for unicast frame - * @soc: SOC handle + * for unicast frame * @nbuf: RX packet buffer * @ta_peer: transmitter DP peer handle + * @rx_tlv_hdr: Rx TLV header * @msdu_metadata: MSDU meta data info - * @p_tx_vdev_id: get vdev id for Intra-BSS TX + * @params: params to be filled in * * Return: true - intrabss allowed - false - not allow + * false - not allow */ static bool dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, struct dp_txrx_peer *ta_peer, + uint8_t *rx_tlv_hdr, struct hal_rx_msdu_metadata *msdu_metadata, struct dp_be_intrabss_params *params) { - uint16_t da_peer_id; - struct dp_txrx_peer *da_peer; - dp_txrx_ref_handle txrx_ref_handle = NULL; + uint8_t dest_chip_id, dest_chip_pmac_id; + struct dp_vdev_be *be_vdev = + dp_get_be_vdev_from_dp_vdev(ta_peer->vdev); + struct dp_soc_be *be_soc = + dp_get_be_soc_from_dp_soc(params->dest_soc); if (!qdf_nbuf_is_intra_bss(nbuf)) return false; - da_peer_id = dp_rx_peer_metadata_peer_id_get_be( - params->dest_soc, - msdu_metadata->da_idx); - da_peer = dp_txrx_peer_get_ref_by_id(params->dest_soc, da_peer_id, - &txrx_ref_handle, DP_MOD_ID_RX); - if (!da_peer) + hal_rx_tlv_get_dest_chip_pmac_id(rx_tlv_hdr, + &dest_chip_id, + &dest_chip_pmac_id); + qdf_assert_always(dest_chip_id <= (DP_MLO_MAX_DEST_CHIP_ID - 1)); + + if (dest_chip_id == be_soc->mlo_chip_id) { + /* TODO: adding to self list is better */ + params->tx_vdev_id = ta_peer->vdev->vdev_id; + return true; + } + + params->dest_soc = + dp_mlo_get_soc_ref_by_chip_id(be_soc->ml_ctxt, + dest_chip_id); + if (!params->dest_soc) return false; - params->tx_vdev_id = da_peer->vdev->vdev_id; - dp_txrx_peer_unref_delete(txrx_ref_handle, DP_MOD_ID_RX); + + params->tx_vdev_id = + be_vdev->partner_vdev_list[dest_chip_id][dest_chip_pmac_id]; return true; } @@ -1395,6 +1401,7 @@ dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, static bool dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, struct dp_txrx_peer *ta_peer, + uint8_t *rx_tlv_hdr, struct hal_rx_msdu_metadata *msdu_metadata, struct dp_be_intrabss_params *params) { @@ -1492,6 +1499,7 @@ rel_da_peer: static bool dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, struct dp_txrx_peer *ta_peer, + uint8_t *rx_tlv_hdr, struct hal_rx_msdu_metadata *msdu_metadata, struct dp_be_intrabss_params *params) { @@ -1670,7 +1678,7 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, return true; params.dest_soc = soc; - if (dp_rx_intrabss_ucast_check_be(nbuf, ta_peer, + if (dp_rx_intrabss_ucast_check_be(nbuf, ta_peer, rx_tlv_hdr, &msdu_metadata, ¶ms)) { ret = dp_rx_intrabss_ucast_fwd(params.dest_soc, ta_peer, params.tx_vdev_id, diff --git a/hal/wifi3.0/be/hal_be_rx.h b/hal/wifi3.0/be/hal_be_rx.h index a601b376d2..0ecac63602 100644 --- a/hal/wifi3.0/be/hal_be_rx.h +++ b/hal/wifi3.0/be/hal_be_rx.h @@ -21,6 +21,7 @@ #define _HAL_BE_RX_H_ #include "hal_be_hw_headers.h" +#include "hal_be_rx_tlv.h" #include "hal_rx.h" #include @@ -224,20 +225,28 @@ #define HAL_RX_PEER_ID_GET(msdu_metadata) \ (((msdu_metadata)->da_idx) & HAL_RX_DA_IDX_PEER_ID_MASK) +#define HAL_RX_TLV_DEST_CHIP_ID_GET(_rx_pkt_tlv) \ + HAL_RX_MSDU_END(_rx_pkt_tlv).dest_chip_id + +#ifdef INTRA_BSS_FWD_OFFLOAD +#define HAL_RX_TLV_DEST_CHIP_PMAC_ID_GET(_rx_pkt_tlv) \ + HAL_RX_MSDU_END(_rx_pkt_tlv).dest_chip_pmac_id +#endif + /** * enum hal_be_rx_wbm_error_source: Indicates which module initiated the * release of this buffer or descriptor * - * @ HAL_BE_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor - * @ HAL_BE_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor - * @ HAL_BE_RX_WBM_ERR_SRC_FW_RX: FW released this buffer or descriptor from the + * @HAL_BE_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor + * @HAL_BE_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor + * @HAL_BE_RX_WBM_ERR_SRC_FW_RX: FW released this buffer or descriptor from the * RX path - * @ HAL_BE_RX_WBM_ERR_SRC_SW_RX: SW released this buffer or descriptor from the + * @HAL_BE_RX_WBM_ERR_SRC_SW_RX: SW released this buffer or descriptor from the * RX path - * @ HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor - * @ HAL_BE_RX_WBM_ERR_SRC_FW_TX: FW released this buffer or descriptor from the + * @HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor + * @HAL_BE_RX_WBM_ERR_SRC_FW_TX: FW released this buffer or descriptor from the * RX path - * @ HAL_BE_RX_WBM_ERR_SRC_SW_TX: SW released this buffer or descriptor from the + * @HAL_BE_RX_WBM_ERR_SRC_SW_TX: SW released this buffer or descriptor from the * RX path */ enum hal_be_rx_wbm_error_source { @@ -509,4 +518,24 @@ static inline uint8_t hal_rx_sw_exception_get_be(void *reo_desc) { return HAL_RX_GET(reo_desc, REO_DESTINATION_RING, SW_EXCEPTION); } + +#ifdef INTRA_BSS_FWD_OFFLOAD +/** + * hal_rx_tlv_get_dest_chip_pmac_id() - Get destination chip and PMAC ID + * @buf: Rx TLV buffer + * @d_chip_id: chip id being filled in + * @d_chip_pmac_id: chip pmac id being filled in + * + * Return: void + */ +static inline void +hal_rx_tlv_get_dest_chip_pmac_id(uint8_t *buf, + uint8_t *d_chip_id, uint8_t *d_chip_pmac_id) +{ + struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; + + *d_chip_id = HAL_RX_TLV_DEST_CHIP_ID_GET(rx_pkt_tlvs); + *d_chip_pmac_id = HAL_RX_TLV_DEST_CHIP_PMAC_ID_GET(rx_pkt_tlvs); +} +#endif /* INTRA_BSS_FWD_OFFLOAD */ #endif /* _HAL_BE_RX_H_ */ diff --git a/hal/wifi3.0/be/hal_be_rx_tlv.h b/hal/wifi3.0/be/hal_be_rx_tlv.h index 0868a9f46c..58b28eeabc 100644 --- a/hal/wifi3.0/be/hal_be_rx_tlv.h +++ b/hal/wifi3.0/be/hal_be_rx_tlv.h @@ -85,7 +85,8 @@ struct rx_msdu_end_compact { wds_learning_event : 1, wds_roaming_event : 1, wds_keep_alive_event : 1, - reserved_9b : 9; + dest_chip_pmac_id : 1, + reserved_9b : 8; uint32_t msdu_length : 14, stbc : 1, ipsec_esp : 1, @@ -240,7 +241,8 @@ struct rx_msdu_end_compact { aggregation_count : 8; uint32_t reserved_8a : 24, key_id_octet : 8; - uint32_t reserved_9b : 9, + uint32_t reserved_9b : 8, + dest_chip_pmac_id : 1, wds_keep_alive_event : 1, wds_roaming_event : 1, wds_learning_event : 1,