diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index b7bccc5549..4cac8a417e 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -276,6 +276,7 @@ extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc, enum hal_reo_cmd_type type, struct hal_reo_cmd_params *params, void (*callback_fn), void *data); +extern void dp_reo_cmdlist_destroy(struct dp_soc *soc); extern void dp_reo_status_ring_handler(struct dp_soc *soc); void dp_aggregate_vdev_stats(struct dp_vdev *vdev); uint16_t dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 4d921ca219..a4888cafa0 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1675,12 +1675,13 @@ static void dp_soc_detach_wifi3(void *txrx_soc) dp_srng_cleanup(soc, &soc->reo_cmd_ring, REO_CMD, 0); dp_srng_cleanup(soc, &soc->reo_status_ring, REO_STATUS, 0); - qdf_spinlock_destroy(&soc->rx.reo_cmd_lock); - qdf_spinlock_destroy(&soc->peer_ref_mutex); htt_soc_detach(soc->htt_handle); + dp_reo_cmdlist_destroy(soc); + qdf_spinlock_destroy(&soc->rx.reo_cmd_lock); dp_reo_desc_freelist_destroy(soc); + wlan_cfg_soc_detach(soc->wlan_cfg_ctx); dp_soc_wds_detach(soc); diff --git a/dp/wifi3.0/dp_reo.c b/dp/wifi3.0/dp_reo.c index 14571e2cba..969bc03183 100644 --- a/dp/wifi3.0/dp_reo.c +++ b/dp/wifi3.0/dp_reo.c @@ -168,3 +168,30 @@ next: hal_srng_access_end(soc->hal_soc, soc->reo_status_ring.hal_srng); } + +/** + * dp_reo_cmdlist_destroy - Free REO commands in the queue + * @soc: DP SoC hanle + * + */ +void dp_reo_cmdlist_destroy(struct dp_soc *soc) +{ + struct dp_reo_cmd_info *reo_cmd = NULL; + union hal_reo_status reo_status; + + reo_status.queue_status.header.status = + HAL_REO_CMD_FAILED; + + qdf_spin_lock_bh(&soc->rx.reo_cmd_lock); + TAILQ_FOREACH(reo_cmd, &soc->rx.reo_cmd_list, + reo_cmd_list_elem) { + TAILQ_REMOVE(&soc->rx.reo_cmd_list, reo_cmd, + reo_cmd_list_elem); + if (reo_cmd) { + reo_cmd->handler(soc, reo_cmd->data, + &reo_status); + qdf_mem_free(reo_cmd); + } + } + qdf_spin_unlock_bh(&soc->rx.reo_cmd_lock); +}