diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 72e68661a34b..33324bb2f16a 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -262,7 +262,7 @@ enum ds_mode { #define WMA_DELETE_STA_TIMEOUT (6000) /* 6 seconds */ #define WMA_DEL_P2P_SELF_STA_RSP_START 0x03 - +#define WMA_SET_LINK_PEER_RSP 0x04 #define WMA_VDEV_START_REQUEST_TIMEOUT (6000) /* 6 seconds */ #define WMA_VDEV_STOP_REQUEST_TIMEOUT (6000) /* 6 seconds */ diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 2c14408a03c5..d48932f23af2 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1435,7 +1435,7 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, tp_wma_handle wma = (tp_wma_handle) handle; WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf; wmi_vdev_stopped_event_fixed_param *resp_event; - struct wma_target_req *req_msg; + struct wma_target_req *req_msg, *del_req; struct cdp_pdev *pdev; void *peer; uint8_t peer_id; @@ -1602,6 +1602,24 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, params->bssid, req_msg->vdev_id); wma_remove_peer(wma, params->bssid, req_msg->vdev_id, peer, false); + if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap, + WMI_SERVICE_SYNC_DELETE_CMDS)) { + WMA_LOGI(FL("Wait for the peer delete. vdev_id %d"), + req_msg->vdev_id); + del_req = wma_fill_hold_req(wma, + req_msg->vdev_id, + WMA_DELETE_STA_REQ, + WMA_SET_LINK_PEER_RSP, + params, + WMA_DELETE_STA_TIMEOUT); + if (!del_req) { + WMA_LOGE(FL("Failed to allocate request. vdev_id %d"), + req_msg->vdev_id); + params->status = QDF_STATUS_E_NOMEM; + } else { + goto free_req_msg; + } + } } if (wmi_unified_vdev_down_send(wma->wmi_handle, req_msg->vdev_id) != @@ -2340,6 +2358,16 @@ int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info, wma_handle_vdev_detach(wma, data->self_sta_param, data->generate_rsp); qdf_mem_free(data); + } else if (req_msg->type == WMA_SET_LINK_PEER_RSP) { + tpLinkStateParams params = + (tpLinkStateParams) req_msg->user_data; + if (wmi_unified_vdev_down_send(wma->wmi_handle, + req_msg->vdev_id) != + QDF_STATUS_SUCCESS) { + WMA_LOGE("Failed to send vdev down cmd: vdev %d", + req_msg->vdev_id); + } + wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0); } qdf_mem_free(req_msg); return status; @@ -2432,6 +2460,11 @@ void wma_hold_req_timer(void *data) (tgt_req->type == WMA_DEL_P2P_SELF_STA_RSP_START)) { WMA_LOGA(FL("wma delete sta p2p request timed out")); QDF_ASSERT(0); + } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) && + (tgt_req->type == WMA_SET_LINK_PEER_RSP)) { + WMA_LOGA(FL("wma delete peer for set link timed out")); + if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) + QDF_BUG(0); } else { WMA_LOGE(FL("Unhandled timeout for msg_type:%d and type:%d"), tgt_req->msg_type, tgt_req->type);