diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 98f0b5fc7ba4..e74b893951b8 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -1197,6 +1197,7 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid) struct hal_reo_cmd_params params; struct reo_desc_list_node *freedesc = qdf_mem_malloc(sizeof(*freedesc)); + if (!freedesc) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: malloc failed for freedesc: tid %d\n", @@ -1222,14 +1223,31 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid) params.std.addr_lo = rx_tid->hw_qdesc_paddr & 0xffffffff; params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32; - dp_reo_send_cmd(soc, CMD_FLUSH_CACHE, ¶ms, dp_rx_tid_delete_cb, - (void *)freedesc); - rx_tid->hw_qdesc_vaddr_unaligned = NULL; rx_tid->hw_qdesc_alloc_size = 0; rx_tid->hw_qdesc_paddr = 0; - return 0; + if (QDF_STATUS_SUCCESS != dp_reo_send_cmd(soc, + CMD_FLUSH_CACHE, + ¶ms, + dp_rx_tid_delete_cb, + (void *)freedesc)) { + /* + * If dp_reo_send_cmd return failure, related TID queue desc + * should be unmapped. Also locally reo_desc, together with + * TID queue desc also need to be freed accordingly. + * + * Here invoke desc_free function directly to do clean up. + */ + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: fail to send REO cmd to flush cache: tid %d\n", + __func__, tid); + dp_reo_desc_free(soc, freedesc); + + return -EBUSY; + } else { + return 0; + } } #ifdef DP_LFR