From bbee817b3a46939bccc4daf3bd76cac32af381d1 Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Fri, 7 Apr 2017 19:26:33 -0700 Subject: [PATCH] qcacld-3.0: Wait for peer delete in vdev stop handler In failure scenario join response sent to umac before peer delete response is received from firmware. Defer the join response till the peer delete response is received from firmware. Change-Id: Icac97e0ed0e374bdd7f7d50e357af8f88b519f4d CRs-Fixed: 2030841 --- core/wma/inc/wma.h | 2 +- core/wma/src/wma_dev_if.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) 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);