diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 1aa6d5cb7e..67e5b2f4e8 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -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_rx_peer_metadata_peer_id_get = 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->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_be; arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_be; diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 1122f37aee..640b472faf 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -565,6 +565,14 @@ done: 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 * skb->priority */ @@ -789,7 +797,6 @@ done: if (dp_rx_intrabss_fwd_be(soc, txrx_peer, rx_tlv_hdr, nbuf, - msdu_metadata, link_id)) { nbuf = next; 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, uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf, - struct hal_rx_msdu_metadata msdu_metadata, uint8_t link_id) { uint8_t tid = qdf_nbuf_get_tid_val(nbuf); diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index 06e478d5db..26594fc7bd 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -47,7 +47,6 @@ struct dp_be_intrabss_params { * @ta_txrx_peer: source peer entry * @rx_tlv_hdr: start address of rx tlvs * @nbuf: nbuf that has to be intrabss forwarded - * @msdu_metadata: msdu metadata * @link_id: link id on which the packet is received * * 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, uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf, - struct hal_rx_msdu_metadata msdu_metadata, uint8_t link_id); #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); } +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 /** * 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); 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 static inline void 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 #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) = dp_rx_peer_metadata_vdev_id_get_be(soc, 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 */ pkt_capture_offload = diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index a1f3678d7c..3adb25473f 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -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*/ DP_PEER_PER_PKT_STATS_INCC_PKT(txrx_peer, rx.rx_lmac[lmac_id], 1, QDF_NBUF_CB_RX_PKT_LEN(nbuf), - txrx_peer->mld_peer, link_id); + txrx_peer->is_mld_peer, link_id); } #else static inline void diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index acdcd6e167..40df7e26ac 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -2330,6 +2330,12 @@ dp_rx_peer_metadata_peer_id_get(struct dp_soc *soc, uint32_t 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 * @soc: SOC handle diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 632e2ed4f4..d95fdbd445 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2417,6 +2417,15 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, 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.reo_psh_rsn == HAL_RX_WBM_REO_PSH_RSN_ERROR) { diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index bcf56a177b..eefea23330 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2154,6 +2154,7 @@ enum dp_context_type { * @dp_service_near_full_srngs: Handler for servicing the near full IRQ * @tx_implicit_rbm_set: * @dp_rx_peer_metadata_peer_id_get: + * @dp_rx_peer_mdata_link_id_get: Handle to get link id * @dp_rx_chain_msdus: * @txrx_set_vdev_param: target specific ops while setting vdev params * @txrx_get_vdev_mcast_param: target specific ops for getting vdev @@ -2304,6 +2305,7 @@ struct dp_arch_ops { uint8_t bm_id); uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc, 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, uint8_t *rx_tlv_hdr, uint8_t mac_id); /* Control Arch Ops */ diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index eb81423b13..c91f3e19f3 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -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_rx_peer_metadata_peer_id_get = 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->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li; arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li; diff --git a/dp/wifi3.0/li/dp_li_rx.h b/dp/wifi3.0/li/dp_li_rx.h index b7d1f0f3b0..2cb1340b07 100644 --- a/dp/wifi3.0/li/dp_li_rx.h +++ b/dp/wifi3.0/li/dp_li_rx.h @@ -150,6 +150,12 @@ dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata) return metadata->peer_id; } +static inline uint8_t +dp_rx_peer_mdata_link_id_get_li(uint32_t peer_metadata) +{ + return 0; +} + bool dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, qdf_nbuf_t nbuf_copy, diff --git a/qdf/linux/src/i_qdf_nbuf_m.h b/qdf/linux/src/i_qdf_nbuf_m.h index 429061197f..ef906572b9 100644 --- a/qdf/linux/src/i_qdf_nbuf_m.h +++ b/qdf/linux/src/i_qdf_nbuf_m.h @@ -73,6 +73,7 @@ * @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.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.tcp_seq_num: TCP sequence number * @u.rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number @@ -215,7 +216,8 @@ struct qdf_nbuf_cb { lmac_id:2, fr_ds:1, to_ds:1, - reserved1:14; + logical_link_id:4, + reserved1:10; uint32_t tcp_seq_num; uint32_t tcp_ack_num; 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. \ 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) \ QDF_NBUF_CB_TX_IPA_OWNED(skb) diff --git a/qdf/linux/src/i_qdf_nbuf_w.h b/qdf/linux/src/i_qdf_nbuf_w.h index acbd4ae04b..7854b4ab89 100644 --- a/qdf/linux/src/i_qdf_nbuf_w.h +++ b/qdf/linux/src/i_qdf_nbuf_w.h @@ -81,9 +81,8 @@ * * @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.logical_link_id: logical link 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.reserved2: reserved * @@ -214,9 +213,8 @@ struct qdf_nbuf_cb { /* 2nd word rx_mpdu_desc_info */ uint32_t peer_id:13, ml_peer_valid:1, - logical_link_id:2, vdev_id:8, - lmac_id:2, + hw_link_id:4, chip_id:3, reserved2:3; #ifndef BIG_ENDIAN_HOST @@ -437,10 +435,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (((struct qdf_nbuf_cb *) \ ((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) \ (((struct qdf_nbuf_cb *) \ ((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 *) \ ((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) \ ((QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT((skb))) = val)