From 70e9286f37e4a97e01a56dd51191539e94d576c6 Mon Sep 17 00:00:00 2001 From: KARTHIK KUMAR T Date: Mon, 5 Dec 2022 00:03:21 +0530 Subject: [PATCH] qcacmn: mcast_mlo handling in intrabss fwd mcast mlo handling for the intra bss fwd Change-Id: I23c1a9759ac3ac59f2f46fdb456c616c77823e8c CRs-Fixed: 3353501 --- dp/wifi3.0/be/dp_be.c | 3 +- dp/wifi3.0/be/dp_be_rx.c | 68 ++++++++++++++++++++++++++++++++++------ dp/wifi3.0/be/dp_be_rx.h | 11 ++++--- dp/wifi3.0/dp_rx.c | 7 +++-- dp/wifi3.0/dp_types.h | 8 ++--- dp/wifi3.0/li/dp_li.c | 3 +- 6 files changed, 76 insertions(+), 24 deletions(-) diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 58d52c5711..644c607593 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -2502,7 +2502,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) #endif arch_ops->dp_rx_desc_cookie_2_va = dp_rx_desc_cookie_2_va_be; - arch_ops->dp_rx_intrabss_handle_nawds = dp_rx_intrabss_handle_nawds_be; + arch_ops->dp_rx_intrabss_mcast_handler = + dp_rx_intrabss_mcast_handler_be; arch_ops->dp_rx_word_mask_subscribe = dp_rx_word_mask_subscribe_be; arch_ops->txrx_soc_attach = dp_soc_attach_be; diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 26cbd9444d..032189ba5d 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1613,8 +1613,50 @@ void dp_rx_word_mask_subscribe_be(struct dp_soc *soc, { } #endif -/* - * dp_rx_intrabss_handle_nawds_be() - Forward mcbc intrabss pkts in nawds case + +#if defined(WLAN_MCAST_MLO) && defined(CONFIG_MLO_SINGLE_DEV) +static inline +bool dp_rx_intrabss_mlo_mcbc_fwd(struct dp_soc *soc, struct dp_vdev *vdev, + qdf_nbuf_t nbuf_copy) +{ + struct dp_vdev *mcast_primary_vdev = NULL; + struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev); + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct cdp_tx_exception_metadata tx_exc_metadata = {0}; + + if (!vdev->mlo_vdev) + return false; + + tx_exc_metadata.is_mlo_mcast = 1; + mcast_primary_vdev = dp_mlo_get_mcast_primary_vdev(be_soc, + be_vdev, + DP_MOD_ID_RX); + + if (!mcast_primary_vdev) + return false; + + nbuf_copy = dp_tx_send_exception((struct cdp_soc_t *) + mcast_primary_vdev->pdev->soc, + mcast_primary_vdev->vdev_id, + nbuf_copy, &tx_exc_metadata); + + if (nbuf_copy) + qdf_nbuf_free(nbuf_copy); + + dp_vdev_unref_delete(mcast_primary_vdev->pdev->soc, + mcast_primary_vdev, DP_MOD_ID_RX); + return true; +} +#else +static inline +bool dp_rx_intrabss_mlo_mcbc_fwd(struct dp_soc *soc, struct dp_vdev *vdev, + qdf_nbuf_t nbuf_copy) +{ + return false; +} +#endif +/** + * dp_rx_intrabss_mcast_handler_be() - handler for mcast packets * @soc: core txrx main context * @ta_txrx_peer: source txrx_peer entry * @nbuf_copy: nbuf that has to be intrabss forwarded @@ -1623,10 +1665,10 @@ void dp_rx_word_mask_subscribe_be(struct dp_soc *soc, * Return: true if it is forwarded else false */ bool -dp_rx_intrabss_handle_nawds_be(struct dp_soc *soc, - struct dp_txrx_peer *ta_txrx_peer, - qdf_nbuf_t nbuf_copy, - struct cdp_tid_rx_stats *tid_stats) +dp_rx_intrabss_mcast_handler_be(struct dp_soc *soc, + struct dp_txrx_peer *ta_txrx_peer, + qdf_nbuf_t nbuf_copy, + struct cdp_tid_rx_stats *tid_stats) { if (qdf_unlikely(ta_txrx_peer->vdev->nawds_enabled)) { struct cdp_tx_exception_metadata tx_exc_metadata = {0}; @@ -1635,10 +1677,11 @@ dp_rx_intrabss_handle_nawds_be(struct dp_soc *soc, tx_exc_metadata.peer_id = ta_txrx_peer->peer_id; tx_exc_metadata.is_intrabss_fwd = 1; tx_exc_metadata.tid = HTT_TX_EXT_TID_INVALID; + if (dp_tx_send_exception((struct cdp_soc_t *)soc, - ta_txrx_peer->vdev->vdev_id, - nbuf_copy, - &tx_exc_metadata)) { + ta_txrx_peer->vdev->vdev_id, + nbuf_copy, + &tx_exc_metadata)) { DP_PEER_PER_PKT_STATS_INC_PKT(ta_txrx_peer, rx.intra_bss.fail, 1, len); @@ -1652,6 +1695,11 @@ dp_rx_intrabss_handle_nawds_be(struct dp_soc *soc, } return true; } + + if (dp_rx_intrabss_mlo_mcbc_fwd(soc, ta_txrx_peer->vdev, + nbuf_copy)) + return true; + return false; } diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index 192cd7bafc..eb40450b92 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -58,8 +58,8 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct hal_rx_msdu_metadata msdu_metadata); #endif -/* - * dp_rx_intrabss_handle_nawds_be() - Forward mcbc intrabss pkts in nawds case +/** + * dp_rx_intrabss_mcast_handler_be() - intrabss mcast handler * @soc: core txrx main context * @ta_txrx_peer: source txrx_peer entry * @nbuf_copy: nbuf that has to be intrabss forwarded @@ -68,9 +68,10 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, * Return: true if it is forwarded else false */ bool -dp_rx_intrabss_handle_nawds_be(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, - qdf_nbuf_t nbuf_copy, - struct cdp_tid_rx_stats *tid_stats); +dp_rx_intrabss_mcast_handler_be(struct dp_soc *soc, + struct dp_txrx_peer *ta_txrx_peer, + qdf_nbuf_t nbuf_copy, + struct cdp_tid_rx_stats *tid_stats); void dp_rx_word_mask_subscribe_be(struct dp_soc *soc, uint32_t *msg_word, diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index f5a1dacb0b..5aedf003c8 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1071,8 +1071,9 @@ bool dp_rx_intrabss_mcbc_fwd(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, qdf_mem_set(nbuf_copy->cb, 0x0, sizeof(nbuf_copy->cb)); dp_classify_critical_pkts(soc, ta_peer->vdev, nbuf_copy); - if (soc->arch_ops.dp_rx_intrabss_handle_nawds(soc, ta_peer, nbuf_copy, - tid_stats)) + if (soc->arch_ops.dp_rx_intrabss_mcast_handler(soc, ta_peer, + nbuf_copy, + tid_stats)) return false; /* Don't send packets if tx is paused */ diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 3574891c54..d1092d6483 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1927,10 +1927,10 @@ struct dp_arch_ops { struct dp_rx_desc **r_rx_desc); bool - (*dp_rx_intrabss_handle_nawds)(struct dp_soc *soc, - struct dp_txrx_peer *ta_txrx_peer, - qdf_nbuf_t nbuf_copy, - struct cdp_tid_rx_stats *tid_stats); + (*dp_rx_intrabss_mcast_handler)(struct dp_soc *soc, + struct dp_txrx_peer *ta_txrx_peer, + qdf_nbuf_t nbuf_copy, + struct cdp_tid_rx_stats *tid_stats); void (*dp_rx_word_mask_subscribe)( struct dp_soc *soc, diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 7ce08c1536..7d983cdfa0 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -643,7 +643,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->txrx_peer_setup = dp_peer_setup_li; arch_ops->dp_rx_desc_cookie_2_va = dp_rx_desc_cookie_2_va_li; - arch_ops->dp_rx_intrabss_handle_nawds = dp_rx_intrabss_handle_nawds_li; + arch_ops->dp_rx_intrabss_mcast_handler = + dp_rx_intrabss_handle_nawds_li; arch_ops->dp_rx_word_mask_subscribe = dp_rx_word_mask_subscribe_li; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li; arch_ops->dp_rx_peer_metadata_peer_id_get =