diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 75a02b06ef16..bdec6b50094b 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -507,6 +507,7 @@ static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle, { void *peer; struct cdp_pdev *pdev; + QDF_STATUS qdf_status; uint8_t peer_id; uint8_t vdev_id = del_sta_self_req_param->session_id; struct wma_target_req *msg = NULL; @@ -519,7 +520,8 @@ static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle, pdev = cds_get_context(QDF_MODULE_ID_TXRX); if (NULL == pdev) { WMA_LOGE("%s: Failed to get pdev", __func__); - return QDF_STATUS_E_FAULT; + qdf_status = QDF_STATUS_E_FAULT; + goto error; } peer = cdp_peer_find_by_addr(soc, pdev, @@ -528,7 +530,8 @@ static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle, if (!peer) { WMA_LOGE("%s Failed to find peer %pM", __func__, del_sta_self_req_param->self_mac_addr); - return QDF_STATUS_SUCCESS; + qdf_status = QDF_STATUS_SUCCESS; + goto error; } wma_remove_peer(wma_handle, del_sta_self_req_param->self_mac_addr, @@ -540,7 +543,8 @@ static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle, qdf_mem_malloc(sizeof(struct del_sta_self_rsp_params)); if (sta_self_wmi_rsp == NULL) { WMA_LOGE(FL("Failed to allocate memory")); - return QDF_STATUS_E_NOMEM; + qdf_status = QDF_STATUS_E_NOMEM; + goto error; } sta_self_wmi_rsp->self_sta_param = del_sta_self_req_param; sta_self_wmi_rsp->generate_rsp = generate_vdev_rsp; @@ -554,10 +558,13 @@ static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle, vdev_id); wma_remove_req(wma_handle, vdev_id, WMA_DEL_P2P_SELF_STA_RSP_START); - return QDF_STATUS_E_FAILURE; + qdf_status = QDF_STATUS_E_FAILURE; + goto error; } } return QDF_STATUS_SUCCESS; +error: + return qdf_status; } static void @@ -781,8 +788,19 @@ QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle, /* P2P Device */ if ((iface->type == WMI_VDEV_TYPE_AP) && (iface->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) { - wma_self_peer_remove(wma_handle, pdel_sta_self_req_param, - generateRsp); + status = wma_self_peer_remove(wma_handle, + pdel_sta_self_req_param, generateRsp); + if ((status != QDF_STATUS_SUCCESS) && generateRsp) { + WMA_LOGE("can't remove selfpeer, send rsp session: %d", + vdev_id); + goto send_fail_rsp; + } else { + WMA_LOGE("can't remove selfpeer, free msg session: %d", + vdev_id); + qdf_mem_free(pdel_sta_self_req_param); + pdel_sta_self_req_param = NULL; + return status; + } if (!wmi_service_enabled(wma_handle->wmi_handle, wmi_service_sync_delete_cmds)) status = wma_handle_vdev_detach(wma_handle,