diff --git a/dp/inc/cdp_txrx_mlo.h b/dp/inc/cdp_txrx_mlo.h index dd62541d41..e07dfdfc8d 100644 --- a/dp/inc/cdp_txrx_mlo.h +++ b/dp/inc/cdp_txrx_mlo.h @@ -56,7 +56,8 @@ static inline void cdp_soc_mlo_soc_setup(ol_txrx_soc_handle soc, } static inline void cdp_soc_mlo_soc_teardown(ol_txrx_soc_handle soc, - struct cdp_mlo_ctxt *mlo_ctx) + struct cdp_mlo_ctxt *mlo_ctx, + bool is_force_down) { if (!soc || !soc->ops) { QDF_BUG(0); @@ -67,7 +68,7 @@ static inline void cdp_soc_mlo_soc_teardown(ol_txrx_soc_handle soc, !soc->ops->mlo_ops->mlo_soc_teardown) return; - soc->ops->mlo_ops->mlo_soc_teardown(soc, mlo_ctx); + soc->ops->mlo_ops->mlo_soc_teardown(soc, mlo_ctx, is_force_down); } /* diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 3d02e1f39c..77e32c86c8 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -154,7 +154,8 @@ struct cdp_mlo_ops { void (*mlo_soc_setup)(struct cdp_soc_t *cdp_soc, struct cdp_mlo_ctxt *mlo_ctxt); void (*mlo_soc_teardown)(struct cdp_soc_t *cdp_soc, - struct cdp_mlo_ctxt *mlo_ctxt); + struct cdp_mlo_ctxt *mlo_ctxt, + bool is_force_down); QDF_STATUS (*update_mlo_ptnr_list)(struct cdp_soc_t *soc_hdl, int8_t *vdev_ids, uint8_t num_vdevs, uint8_t vdev_id); diff --git a/dp/wifi3.0/be/mlo/dp_mlo.c b/dp/wifi3.0/be/mlo/dp_mlo.c index 0d0c3b651a..4882287ff4 100644 --- a/dp/wifi3.0/be/mlo/dp_mlo.c +++ b/dp/wifi3.0/be/mlo/dp_mlo.c @@ -182,7 +182,8 @@ static void dp_mlo_soc_setup(struct cdp_soc_t *soc_hdl, } static void dp_mlo_soc_teardown(struct cdp_soc_t *soc_hdl, - struct cdp_mlo_ctxt *cdp_ml_ctxt) + struct cdp_mlo_ctxt *cdp_ml_ctxt, + bool is_force_down) { struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_mlo_ctxt *mlo_ctxt = cdp_mlo_ctx_to_dp(cdp_ml_ctxt); @@ -192,6 +193,16 @@ static void dp_mlo_soc_teardown(struct cdp_soc_t *soc_hdl, return; dp_mlo_set_soc_by_chip_id(mlo_ctxt, NULL, be_soc->mlo_chip_id); + + /* + * In force teardown case disable the interrupts before + * going down. As target may be still active, we may still + * continue to receive traffic. Disabling interrupts to + * ensure we dont process interrupts while clean up on + * other SOC. + */ + if (is_force_down) + dp_soc_interrupt_detach(soc_hdl); } static QDF_STATUS dp_mlo_add_ptnr_vdev(struct dp_vdev *vdev1, diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 2f660d5e1f..1582c39121 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -4311,4 +4311,12 @@ void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl, { } #endif + +/* + * dp_soc_interrupt_detach() - Deregister any allocations done for interrupts + * @txrx_soc: DP SOC handle + * + * Return: none + */ +void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc); #endif /* #ifndef _DP_INTERNAL_H_ */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 5af4948fbf..cee89e6db6 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -3419,7 +3419,7 @@ static inline bool dp_skip_rx_mon_ring_mask_set(struct dp_soc *soc) * * Return: none */ -static void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc) +void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; int i; diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c b/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c index acf4bc0868..4906641165 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c @@ -469,7 +469,8 @@ void mlo_link_teardown_complete(struct wlan_objmgr_pdev *pdev) soc = mlo_ctx->setup_info.soc_list[chip_idx]; if (soc) cdp_soc_mlo_soc_teardown(wlan_psoc_get_dp_handle(soc), - mlo_ctx->dp_handle); + mlo_ctx->dp_handle, + false); } qdf_event_set(&mlo_ctx->setup_info.event); @@ -494,7 +495,8 @@ static void mlo_force_teardown(void) soc = mlo_ctx->setup_info.soc_list[chip_idx]; if (soc) cdp_soc_mlo_soc_teardown(wlan_psoc_get_dp_handle(soc), - mlo_ctx->dp_handle); + mlo_ctx->dp_handle, + true); } }