qcacmn: Intra-BSS MLO changes for WKK v2

Use destination chip and pmac IDs from TLV.
Build flag for HW assist feature is not enabled yet,
so code is not exercised.

Change-Id: Ia9175d6597a7a2780f451d99a9f8ece7a16049e5
CRs-Fixed: 3262344
This commit is contained in:
Manoj Ekbote
2022-12-21 12:40:02 -08:00
committed by Madan Koyyalamudi
parent bbfcdad485
commit eddc343b43
3 changed files with 72 additions and 33 deletions

View File

@@ -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 * dp_rx_process_be() - Brain of the Rx processing functionality
* Called from the bottom half (tasklet/NET_RX_SOFTIRQ) * Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
* @int_ctx: per interrupt context * @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. * @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. * @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, dp_rx_intrabss_fwd_mlo_allow(struct dp_txrx_peer *ta_peer,
struct dp_txrx_peer *da_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 */ /* 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, if (dp_peer_find_mac_addr_cmp(&ta_peer->vdev->mld_mac_addr,
&da_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 #ifdef INTRA_BSS_FWD_OFFLOAD
/** /**
* dp_rx_intrabss_ucast_check_be() - Check if intrabss is allowed * dp_rx_intrabss_ucast_check_be() - Check if intrabss is allowed
for unicast frame * for unicast frame
* @soc: SOC handle
* @nbuf: RX packet buffer * @nbuf: RX packet buffer
* @ta_peer: transmitter DP peer handle * @ta_peer: transmitter DP peer handle
* @rx_tlv_hdr: Rx TLV header
* @msdu_metadata: MSDU meta data info * @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 * Return: true - intrabss allowed
false - not allow * false - not allow
*/ */
static bool static bool
dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
struct dp_txrx_peer *ta_peer, struct dp_txrx_peer *ta_peer,
uint8_t *rx_tlv_hdr,
struct hal_rx_msdu_metadata *msdu_metadata, struct hal_rx_msdu_metadata *msdu_metadata,
struct dp_be_intrabss_params *params) struct dp_be_intrabss_params *params)
{ {
uint16_t da_peer_id; uint8_t dest_chip_id, dest_chip_pmac_id;
struct dp_txrx_peer *da_peer; struct dp_vdev_be *be_vdev =
dp_txrx_ref_handle txrx_ref_handle = NULL; 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)) if (!qdf_nbuf_is_intra_bss(nbuf))
return false; return false;
da_peer_id = dp_rx_peer_metadata_peer_id_get_be( hal_rx_tlv_get_dest_chip_pmac_id(rx_tlv_hdr,
params->dest_soc, &dest_chip_id,
msdu_metadata->da_idx); &dest_chip_pmac_id);
da_peer = dp_txrx_peer_get_ref_by_id(params->dest_soc, da_peer_id, qdf_assert_always(dest_chip_id <= (DP_MLO_MAX_DEST_CHIP_ID - 1));
&txrx_ref_handle, DP_MOD_ID_RX);
if (!da_peer) 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; 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; return true;
} }
@@ -1395,6 +1401,7 @@ dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
static bool static bool
dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
struct dp_txrx_peer *ta_peer, struct dp_txrx_peer *ta_peer,
uint8_t *rx_tlv_hdr,
struct hal_rx_msdu_metadata *msdu_metadata, struct hal_rx_msdu_metadata *msdu_metadata,
struct dp_be_intrabss_params *params) struct dp_be_intrabss_params *params)
{ {
@@ -1492,6 +1499,7 @@ rel_da_peer:
static bool static bool
dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf, dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
struct dp_txrx_peer *ta_peer, struct dp_txrx_peer *ta_peer,
uint8_t *rx_tlv_hdr,
struct hal_rx_msdu_metadata *msdu_metadata, struct hal_rx_msdu_metadata *msdu_metadata,
struct dp_be_intrabss_params *params) 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; return true;
params.dest_soc = soc; 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, &params)) { &msdu_metadata, &params)) {
ret = dp_rx_intrabss_ucast_fwd(params.dest_soc, ta_peer, ret = dp_rx_intrabss_ucast_fwd(params.dest_soc, ta_peer,
params.tx_vdev_id, params.tx_vdev_id,

View File

@@ -21,6 +21,7 @@
#define _HAL_BE_RX_H_ #define _HAL_BE_RX_H_
#include "hal_be_hw_headers.h" #include "hal_be_hw_headers.h"
#include "hal_be_rx_tlv.h"
#include "hal_rx.h" #include "hal_rx.h"
#include <wbm_release_ring_rx.h> #include <wbm_release_ring_rx.h>
@@ -224,20 +225,28 @@
#define HAL_RX_PEER_ID_GET(msdu_metadata) \ #define HAL_RX_PEER_ID_GET(msdu_metadata) \
(((msdu_metadata)->da_idx) & HAL_RX_DA_IDX_PEER_ID_MASK) (((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 * enum hal_be_rx_wbm_error_source: Indicates which module initiated the
* release of this buffer or descriptor * 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_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_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_FW_RX: FW released this buffer or descriptor from the
* RX path * 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 * RX path
* @ HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor * @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_FW_TX: FW released this buffer or descriptor from the
* RX path * 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 * RX path
*/ */
enum hal_be_rx_wbm_error_source { 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); 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_ */ #endif /* _HAL_BE_RX_H_ */

View File

@@ -85,7 +85,8 @@ struct rx_msdu_end_compact {
wds_learning_event : 1, wds_learning_event : 1,
wds_roaming_event : 1, wds_roaming_event : 1,
wds_keep_alive_event : 1, wds_keep_alive_event : 1,
reserved_9b : 9; dest_chip_pmac_id : 1,
reserved_9b : 8;
uint32_t msdu_length : 14, uint32_t msdu_length : 14,
stbc : 1, stbc : 1,
ipsec_esp : 1, ipsec_esp : 1,
@@ -240,7 +241,8 @@ struct rx_msdu_end_compact {
aggregation_count : 8; aggregation_count : 8;
uint32_t reserved_8a : 24, uint32_t reserved_8a : 24,
key_id_octet : 8; 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_keep_alive_event : 1,
wds_roaming_event : 1, wds_roaming_event : 1,
wds_learning_event : 1, wds_learning_event : 1,