qcacmn: Add support of HW Link ID

Add support of HW Link ID in PeerMetaData.
Retrieve the HW Link ID in both Rx per packet
path and RX Error path, store it in nbuf cb.
Use the stored value from nbuf while updating
MLO peer link statistics.

Change-Id: I11596d44fe8557af568fd399d0c0a04d2b887b2a
CRs-Fixed: 3397721
This commit is contained in:
Kenvish Butani
2023-01-21 12:36:55 +05:30
committed by Madan Koyyalamudi
parent ee22464bee
commit 4c88b99fe7
11 changed files with 85 additions and 14 deletions

View File

@@ -2722,6 +2722,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
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;
arch_ops->dp_rx_peer_mdata_link_id_get =
dp_rx_peer_mdata_link_id_get_be;
arch_ops->soc_cfg_attach = dp_soc_cfg_attach_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->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_be;
arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_be; arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_be;

View File

@@ -565,6 +565,14 @@ done:
rx_bufs_used++; rx_bufs_used++;
if (txrx_peer->is_mld_peer) {
link_id = ((dp_rx_get_msdu_hw_link_id(nbuf)) + 1);
if (link_id < 1 || link_id > DP_MAX_MLO_LINKS)
link_id = 0;
} else {
link_id = 0;
}
/* when hlos tid override is enabled, save tid in /* when hlos tid override is enabled, save tid in
* skb->priority * skb->priority
*/ */
@@ -789,7 +797,6 @@ done:
if (dp_rx_intrabss_fwd_be(soc, txrx_peer, if (dp_rx_intrabss_fwd_be(soc, txrx_peer,
rx_tlv_hdr, rx_tlv_hdr,
nbuf, nbuf,
msdu_metadata,
link_id)) { link_id)) {
nbuf = next; nbuf = next;
tid_stats->intrabss_cnt++; tid_stats->intrabss_cnt++;
@@ -1626,7 +1633,6 @@ dp_rx_intrabss_mcast_handler_be(struct dp_soc *soc,
bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf,
struct hal_rx_msdu_metadata msdu_metadata,
uint8_t link_id) uint8_t link_id)
{ {
uint8_t tid = qdf_nbuf_get_tid_val(nbuf); uint8_t tid = qdf_nbuf_get_tid_val(nbuf);

View File

@@ -47,7 +47,6 @@ struct dp_be_intrabss_params {
* @ta_txrx_peer: source peer entry * @ta_txrx_peer: source peer entry
* @rx_tlv_hdr: start address of rx tlvs * @rx_tlv_hdr: start address of rx tlvs
* @nbuf: nbuf that has to be intrabss forwarded * @nbuf: nbuf that has to be intrabss forwarded
* @msdu_metadata: msdu metadata
* @link_id: link id on which the packet is received * @link_id: link id on which the packet is received
* *
* Return: true if it is forwarded else false * Return: true if it is forwarded else false
@@ -56,7 +55,6 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc,
struct dp_txrx_peer *ta_txrx_peer, struct dp_txrx_peer *ta_txrx_peer,
uint8_t *rx_tlv_hdr, uint8_t *rx_tlv_hdr,
qdf_nbuf_t nbuf, qdf_nbuf_t nbuf,
struct hal_rx_msdu_metadata msdu_metadata,
uint8_t link_id); uint8_t link_id);
#endif #endif
@@ -233,6 +231,15 @@ dp_rx_peer_metadata_lmac_id_get_be(uint32_t peer_metadata)
return HTT_RX_PEER_META_DATA_V1_LMAC_ID_GET(peer_metadata); return HTT_RX_PEER_META_DATA_V1_LMAC_ID_GET(peer_metadata);
} }
static inline uint8_t
dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata)
{
#ifdef DP_MLO_LINK_STATS_SUPPORT
return HTT_RX_PEER_META_DATA_V1A_LOGICAL_LINK_ID_GET(peer_metadata);
#endif
return 0;
}
#ifdef WLAN_FEATURE_NEAR_FULL_IRQ #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
/** /**
* dp_rx_nf_process() - Near Full state handler for RX rings. * dp_rx_nf_process() - Near Full state handler for RX rings.
@@ -630,11 +637,37 @@ dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
lmac_id = dp_rx_peer_metadata_lmac_id_get_be(peer_mdata); lmac_id = dp_rx_peer_metadata_lmac_id_get_be(peer_mdata);
qdf_nbuf_set_lmac_id(nbuf, lmac_id); qdf_nbuf_set_lmac_id(nbuf, lmac_id);
} }
static inline void
dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
{
uint8_t logical_link_id;
logical_link_id = dp_rx_peer_mdata_link_id_get_be(peer_mdata);
QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf) = logical_link_id;
}
static inline uint8_t
dp_rx_get_msdu_hw_link_id(qdf_nbuf_t nbuf)
{
return QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf);
}
#else #else
static inline void static inline void
dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
{ {
} }
static inline void
dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
{
}
static inline uint8_t
dp_rx_get_msdu_hw_link_id(qdf_nbuf_t nbuf)
{
return QDF_NBUF_CB_RX_HW_LINK_ID(nbuf);
}
#endif #endif
#ifndef CONFIG_NBUF_AP_PLATFORM #ifndef CONFIG_NBUF_AP_PLATFORM
@@ -687,6 +720,7 @@ static inline uint8_t dp_rx_copy_desc_info_in_nbuf_cb(struct dp_soc *soc,
QDF_NBUF_CB_RX_VDEV_ID(nbuf) = QDF_NBUF_CB_RX_VDEV_ID(nbuf) =
dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata); dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata);
dp_rx_set_msdu_lmac_id(nbuf, peer_mdata); dp_rx_set_msdu_lmac_id(nbuf, peer_mdata);
dp_rx_set_msdu_hw_link_id(nbuf, peer_mdata);
/* to indicate whether this msdu is rx offload */ /* to indicate whether this msdu is rx offload */
pkt_capture_offload = pkt_capture_offload =

View File

@@ -2472,7 +2472,7 @@ dp_peer_update_rx_pkt_per_lmac(struct dp_txrx_peer *txrx_peer,
/* only count stats per lmac for MLO connection*/ /* only count stats per lmac for MLO connection*/
DP_PEER_PER_PKT_STATS_INCC_PKT(txrx_peer, rx.rx_lmac[lmac_id], 1, DP_PEER_PER_PKT_STATS_INCC_PKT(txrx_peer, rx.rx_lmac[lmac_id], 1,
QDF_NBUF_CB_RX_PKT_LEN(nbuf), QDF_NBUF_CB_RX_PKT_LEN(nbuf),
txrx_peer->mld_peer, link_id); txrx_peer->is_mld_peer, link_id);
} }
#else #else
static inline void static inline void

View File

@@ -2330,6 +2330,12 @@ dp_rx_peer_metadata_peer_id_get(struct dp_soc *soc, uint32_t peer_metadata)
peer_metadata); peer_metadata);
} }
static inline uint8_t
dp_rx_peer_mdata_link_id_get(struct dp_soc *soc, uint32_t peer_metadata)
{
return soc->arch_ops.dp_rx_peer_mdata_link_id_get(peer_metadata);
}
/** /**
* dp_rx_desc_pool_init_generic() - Generic Rx descriptors initialization * dp_rx_desc_pool_init_generic() - Generic Rx descriptors initialization
* @soc: SOC handle * @soc: SOC handle

View File

@@ -2417,6 +2417,15 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
continue; continue;
} }
if (txrx_peer && txrx_peer->is_mld_peer) {
link_id = ((dp_rx_peer_mdata_link_id_get(
soc,
peer_meta_data)) + 1);
if (link_id < 1 || link_id > DP_MAX_MLO_LINKS)
link_id = 0;
} else
link_id = 0;
if (wbm_err_info.wbm_err_src == HAL_RX_WBM_ERR_SRC_REO) { if (wbm_err_info.wbm_err_src == HAL_RX_WBM_ERR_SRC_REO) {
if (wbm_err_info.reo_psh_rsn if (wbm_err_info.reo_psh_rsn
== HAL_RX_WBM_REO_PSH_RSN_ERROR) { == HAL_RX_WBM_REO_PSH_RSN_ERROR) {

View File

@@ -2154,6 +2154,7 @@ enum dp_context_type {
* @dp_service_near_full_srngs: Handler for servicing the near full IRQ * @dp_service_near_full_srngs: Handler for servicing the near full IRQ
* @tx_implicit_rbm_set: * @tx_implicit_rbm_set:
* @dp_rx_peer_metadata_peer_id_get: * @dp_rx_peer_metadata_peer_id_get:
* @dp_rx_peer_mdata_link_id_get: Handle to get link id
* @dp_rx_chain_msdus: * @dp_rx_chain_msdus:
* @txrx_set_vdev_param: target specific ops while setting vdev params * @txrx_set_vdev_param: target specific ops while setting vdev params
* @txrx_get_vdev_mcast_param: target specific ops for getting vdev * @txrx_get_vdev_mcast_param: target specific ops for getting vdev
@@ -2304,6 +2305,7 @@ struct dp_arch_ops {
uint8_t bm_id); uint8_t bm_id);
uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc, uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc,
uint32_t peer_metadata); uint32_t peer_metadata);
uint8_t (*dp_rx_peer_mdata_link_id_get)(uint32_t peer_metadata);
bool (*dp_rx_chain_msdus)(struct dp_soc *soc, qdf_nbuf_t nbuf, bool (*dp_rx_chain_msdus)(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, uint8_t mac_id); uint8_t *rx_tlv_hdr, uint8_t mac_id);
/* Control Arch Ops */ /* Control Arch Ops */

View File

@@ -657,6 +657,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
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;
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_li; dp_rx_peer_metadata_peer_id_get_li;
arch_ops->dp_rx_peer_mdata_link_id_get =
dp_rx_peer_mdata_link_id_get_li;
arch_ops->soc_cfg_attach = dp_soc_cfg_attach_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->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li;
arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li; arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li;

View File

@@ -150,6 +150,12 @@ dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata)
return metadata->peer_id; return metadata->peer_id;
} }
static inline uint8_t
dp_rx_peer_mdata_link_id_get_li(uint32_t peer_metadata)
{
return 0;
}
bool bool
dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
qdf_nbuf_t nbuf_copy, qdf_nbuf_t nbuf_copy,

View File

@@ -73,6 +73,7 @@
* @u.rx.dev.priv_cb_m.lmac_id: lmac id for RX packet * @u.rx.dev.priv_cb_m.lmac_id: lmac id for RX packet
* @u.rx.dev.priv_cb_m.fr_ds: from DS bit in RX packet * @u.rx.dev.priv_cb_m.fr_ds: from DS bit in RX packet
* @u.rx.dev.priv_cb_m.to_ds: to DS bit in RX packet * @u.rx.dev.priv_cb_m.to_ds: to DS bit in RX packet
* @u.rx.dev.priv_cb_m.logical_link_id: link id of RX packet
* @u.rx.dev.priv_cb_m.reserved1: reserved bits * @u.rx.dev.priv_cb_m.reserved1: reserved bits
* @u.rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number * @u.rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number
* @u.rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number * @u.rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number
@@ -215,7 +216,8 @@ struct qdf_nbuf_cb {
lmac_id:2, lmac_id:2,
fr_ds:1, fr_ds:1,
to_ds:1, to_ds:1,
reserved1:14; logical_link_id:4,
reserved1:10;
uint32_t tcp_seq_num; uint32_t tcp_seq_num;
uint32_t tcp_ack_num; uint32_t tcp_ack_num;
union { union {
@@ -602,6 +604,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
lmac_id) lmac_id)
#define QDF_NBUF_CB_RX_LOGICAL_LINK_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
logical_link_id)
#define __qdf_nbuf_ipa_owned_get(skb) \ #define __qdf_nbuf_ipa_owned_get(skb) \
QDF_NBUF_CB_TX_IPA_OWNED(skb) QDF_NBUF_CB_TX_IPA_OWNED(skb)

View File

@@ -81,9 +81,8 @@
* *
* @u.rx.hw_info.desc_tlv_members.peer_id: peer id * @u.rx.hw_info.desc_tlv_members.peer_id: peer id
* @u.rx.hw_info.desc_tlv_members.ml_peer_valid: is ml peer valid * @u.rx.hw_info.desc_tlv_members.ml_peer_valid: is ml peer valid
* @u.rx.hw_info.desc_tlv_members.logical_link_id: logical link id
* @u.rx.hw_info.desc_tlv_members.vdev_id: vdev id * @u.rx.hw_info.desc_tlv_members.vdev_id: vdev id
* @u.rx.hw_info.desc_tlv_members.lmac_id: lmac id * @u.rx.hw_info.desc_tlv_members.hw_link_id: link id of RX packet
* @u.rx.hw_info.desc_tlv_members.chip_id: chip id * @u.rx.hw_info.desc_tlv_members.chip_id: chip id
* @u.rx.hw_info.desc_tlv_members.reserved2: reserved * @u.rx.hw_info.desc_tlv_members.reserved2: reserved
* *
@@ -214,9 +213,8 @@ struct qdf_nbuf_cb {
/* 2nd word rx_mpdu_desc_info */ /* 2nd word rx_mpdu_desc_info */
uint32_t peer_id:13, uint32_t peer_id:13,
ml_peer_valid:1, ml_peer_valid:1,
logical_link_id:2,
vdev_id:8, vdev_id:8,
lmac_id:2, hw_link_id:4,
chip_id:3, chip_id:3,
reserved2:3; reserved2:3;
#ifndef BIG_ENDIAN_HOST #ifndef BIG_ENDIAN_HOST
@@ -437,10 +435,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
(((struct qdf_nbuf_cb *) \ (((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.hw_info.desc_tlv_members.vdev_id) ((skb)->cb))->u.rx.hw_info.desc_tlv_members.vdev_id)
#define QDF_NBUF_CB_RX_PACKET_LMAC_ID(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.hw_info.desc_tlv_members.lmac_id)
#define QDF_NBUF_CB_RX_PKT_LEN(skb) \ #define QDF_NBUF_CB_RX_PKT_LEN(skb) \
(((struct qdf_nbuf_cb *) \ (((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.hw_info.desc_tlv_members.msdu_len) ((skb)->cb))->u.rx.hw_info.desc_tlv_members.msdu_len)
@@ -634,6 +628,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
(((struct qdf_nbuf_cb *) \ (((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.flow_idx_timeout) ((skb)->cb))->u.rx.flow_idx_timeout)
#define QDF_NBUF_CB_RX_HW_LINK_ID(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.hw_info.desc_tlv_members.hw_link_id)
#define __qdf_nbuf_set_rx_flow_idx_timeout(skb, val) \ #define __qdf_nbuf_set_rx_flow_idx_timeout(skb, val) \
((QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT((skb))) = val) ((QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT((skb))) = val)