diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 1ffe633e15..8052cba4eb 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -2153,6 +2153,32 @@ static void dp_mlo_mcast_reset_pri_mcast(struct dp_vdev_be *be_vdev, be_ptnr_vdev->mcast_primary = false; } +#if defined(CONFIG_MLO_SINGLE_DEV) +static void dp_txrx_set_mlo_mcast_primary_vdev_param_be( + struct dp_vdev *vdev, + cdp_config_param_type val) +{ + 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( + be_vdev->vdev.pdev->soc); + + be_vdev->mcast_primary = val.cdp_vdev_param_mcast_vdev; + vdev->mlo_vdev = true; + + if (be_vdev->mcast_primary) { + struct cdp_txrx_peer_params_update params = {0}; + + params.chip_id = be_soc->mlo_chip_id; + params.pdev_id = be_vdev->vdev.pdev->pdev_id; + params.osif_vdev = be_vdev->vdev.osif_vdev; + dp_wdi_event_handler( + WDI_EVENT_MCAST_PRIMARY_UPDATE, + be_vdev->vdev.pdev->soc, + (void *)¶ms, CDP_INVALID_PEER, + WDI_NO_VAL, params.pdev_id); + } +} +#else static void dp_txrx_set_mlo_mcast_primary_vdev_param_be( struct dp_vdev *vdev, cdp_config_param_type val) @@ -2185,6 +2211,7 @@ static void dp_txrx_set_mlo_mcast_primary_vdev_param_be( WDI_NO_VAL, params.pdev_id); } } +#endif static void dp_txrx_reset_mlo_mcast_primary_vdev_param_be( struct dp_vdev *vdev, diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 63b8d15e39..8f8fc6eb1b 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -1924,7 +1924,7 @@ fail: } #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) && \ - defined(WLAN_MCAST_MLO) + defined(WLAN_MCAST_MLO) && !defined(CONFIG_MLO_SINGLE_DEV) static bool dp_rx_igmp_handler(struct dp_soc *soc, struct dp_vdev *vdev, struct dp_txrx_peer *peer, diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 62ee5e39be..3ef0bb224a 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2257,9 +2257,31 @@ int dp_tx_frame_is_drop(struct dp_vdev *vdev, uint8_t *srcmac, uint8_t *dstmac) /* MLO vdev id inc offset */ #define DP_MLO_VDEV_ID_OFFSET 0x80 -static inline void -dp_tx_bypass_reinjection(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc) +#ifdef QCA_SUPPORT_WDS_EXTENDED +static inline bool +dp_tx_wds_ext_check(struct cdp_tx_exception_metadata *tx_exc_metadata) { + if (tx_exc_metadata && tx_exc_metadata->is_wds_extended) + return true; + + return false; +} +#else +static inline bool +dp_tx_wds_ext_check(struct cdp_tx_exception_metadata *tx_exc_metadata) +{ + return false; +} +#endif + +static inline void +dp_tx_bypass_reinjection(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, + struct cdp_tx_exception_metadata *tx_exc_metadata) +{ + /* wds ext enabled will not set the TO_FW bit */ + if (dp_tx_wds_ext_check(tx_exc_metadata)) + return; + if (!(tx_desc->flags & DP_TX_DESC_FLAG_TO_FW)) { tx_desc->flags |= DP_TX_DESC_FLAG_TO_FW; qdf_atomic_inc(&soc->num_tx_exception); @@ -2291,7 +2313,8 @@ dp_tx_update_mcast_param(uint16_t peer_id, } #else static inline void -dp_tx_bypass_reinjection(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc) +dp_tx_bypass_reinjection(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, + struct cdp_tx_exception_metadata *tx_exc_metadata) { } @@ -2391,7 +2414,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf, DP_TCL_METADATA_TYPE_PEER_BASED); DP_TX_TCL_METADATA_PEER_ID_SET(htt_tcl_metadata, peer_id); - dp_tx_bypass_reinjection(soc, tx_desc); + dp_tx_bypass_reinjection(soc, tx_desc, tx_exc_metadata); } else htt_tcl_metadata = vdev->htt_tcl_metadata; @@ -3953,7 +3976,8 @@ int dp_tx_proxy_arp(struct dp_vdev *vdev, qdf_nbuf_t nbuf) } #endif -#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) +#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) && \ + !defined(CONFIG_MLO_SINGLE_DEV) #ifdef WLAN_MCAST_MLO static bool dp_tx_reinject_mlo_hdl(struct dp_soc *soc, struct dp_vdev *vdev, @@ -5574,7 +5598,7 @@ void dp_tx_prefetch_next_nbuf_data(struct dp_tx_desc_s *next) * Return: true when packet is reinjected */ #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) && \ - defined(WLAN_MCAST_MLO) + defined(WLAN_MCAST_MLO) && !defined(CONFIG_MLO_SINGLE_DEV) static inline bool dp_tx_mcast_reinject_handler(struct dp_soc *soc, struct dp_tx_desc_s *desc) { diff --git a/hal/wifi3.0/be/hal_be_tx.h b/hal/wifi3.0/be/hal_be_tx.h index 6391b94e8e..4d1640f5df 100644 --- a/hal/wifi3.0/be/hal_be_tx.h +++ b/hal/wifi3.0/be/hal_be_tx.h @@ -813,7 +813,7 @@ hal_tx_vdev_mismatch_routing_set(hal_soc_handle_t hal_soc_hdl, * Return: void */ #if defined(HWIO_TCL_R0_CMN_CONFIG_MCAST_CMN_PN_SN_MLO_REINJECT_ENABLE_BMSK) && \ - defined(WLAN_MCAST_MLO) + defined(WLAN_MCAST_MLO) && !defined(CONFIG_MLO_SINGLE_DEV) static inline void hal_tx_mcast_mlo_reinject_routing_set( hal_soc_handle_t hal_soc_hdl,