Browse Source

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
Sandeep Puligilla 8 years ago
parent
commit
bbee817b3a
2 changed files with 35 additions and 2 deletions
  1. 1 1
      core/wma/inc/wma.h
  2. 34 1
      core/wma/src/wma_dev_if.c

+ 1 - 1
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 */
 

+ 34 - 1
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);