Jelajahi Sumber

qcacld-3.0: Redesign the Stop BSS request/response flow

Remove the redundant structures and operations in CSR module
for the stop bss request/response processing to/from SAP/NDI
modules.

Change-Id: I0db36caa509699fe5e0e9709d3e3689e551aad4f
CRs-Fixed: 3148791
Surya Prakash Sivaraj 3 tahun lalu
induk
melakukan
cd92b53903

+ 12 - 0
core/mac/inc/sir_api.h

@@ -1222,6 +1222,7 @@ struct deauth_cnf {
 	struct qdf_mac_addr peer_macaddr;
 };
 
+#ifndef SAP_CP_CLEANUP
 /* / Definition for stop BSS request message */
 struct stop_bss_req {
 	uint16_t messageType;   /* eWNI_SME_STOP_BSS_REQ */
@@ -1230,6 +1231,17 @@ struct stop_bss_req {
 	tSirResultCodes reasonCode;
 	struct qdf_mac_addr bssid;      /* Self BSSID */
 };
+#else
+struct stop_bss_req {
+	uint8_t vdev_id;
+	uint32_t cmd_id;
+};
+
+struct stop_bss_rsp {
+	uint8_t vdev_id;
+	tSirResultCodes status_code;
+};
+#endif
 
 /* / Definition for Channel Switch indication for station */
 /* / MAC ---> */

+ 5 - 0
core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c

@@ -1682,8 +1682,13 @@ void lim_process_ap_mlm_del_bss_rsp(struct mac_context *mac,
 	/* Initialize number of associated stations during cleanup */
 	pe_session->gLimNumOfCurrentSTAs = 0;
 end:
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP, rc,
 			 pe_session->smeSessionId);
+#else
+	lim_send_stop_bss_response(mac, pe_session->vdev_id, rc);
+#endif
 	pe_delete_session(mac, pe_session);
 }
 

+ 47 - 20
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -5964,9 +5964,14 @@ void lim_send_stop_bss_failure_resp(struct mac_context *mac_ctx,
 
 	MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE, session->peSessionId,
 			  session->limSmeState));
-
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	lim_send_sme_rsp(mac_ctx, eWNI_SME_STOP_BSS_RSP,
 			 eSIR_SME_STOP_BSS_FAILURE, session->smeSessionId);
+#else
+	lim_send_stop_bss_response(mac_ctx, session->vdev_id,
+				   eSIR_SME_STOP_BSS_FAILURE);
+#endif
 }
 
 void lim_delete_all_peers(struct pe_session *session)
@@ -6083,29 +6088,42 @@ __lim_handle_sme_stop_bss_request(struct mac_context *mac, uint32_t *msg_buf)
 	struct stop_bss_req stop_bss_req;
 	tLimSmeStates prevState;
 	struct pe_session *pe_session;
-	uint8_t smesessionId;
-	uint8_t sessionId;
+/* To be removed after SAP CSR cleanup changes */
+#ifdef SAP_CP_CLEANUP
+	struct qdf_mac_addr bssid;
+#endif
+	uint8_t vdev_id;
+	uint8_t session_id;
 
 	qdf_mem_copy(&stop_bss_req, msg_buf, sizeof(stop_bss_req));
-	smesessionId = stop_bss_req.sessionId;
-
-	if (!lim_is_sme_stop_bss_req_valid(msg_buf)) {
-		pe_warn("received invalid SME_STOP_BSS_REQ message");
-		/* Send Stop BSS response to host */
-		lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
-				 eSIR_SME_INVALID_PARAMETERS, smesessionId);
-		return;
-	}
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
+	vdev_id = stop_bss_req.sessionId;
 
 	pe_session = pe_find_session_by_bssid(mac,
 				stop_bss_req.bssid.bytes,
-				&sessionId);
+				&session_id);
 	if (!pe_session) {
 		pe_err("session does not exist for given BSSID");
 		lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
-				 eSIR_SME_INVALID_PARAMETERS, smesessionId);
+				eSIR_SME_INVALID_PARAMETERS, vdev_id);
 		return;
 	}
+#else
+	vdev_id = stop_bss_req.vdev_id;
+	wlan_mlme_get_mac_vdev_id(mac->pdev, vdev_id, &bssid);
+
+	pe_session = pe_find_session_by_bssid(mac, bssid.bytes,
+					       &session_id);
+	if (!pe_session) {
+		pe_err("session does not exist for bssid " QDF_MAC_ADDR_FMT,
+		       QDF_MAC_ADDR_REF(bssid.bytes));
+		lim_send_stop_bss_response(mac, vdev_id,
+					   eSIR_SME_INVALID_PARAMETERS);
+		return;
+	}
+#endif
+
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM    /* FEATURE_WLAN_DIAG_SUPPORT */
 	lim_diag_event_report(mac, WLAN_PE_DIAG_STOP_BSS_REQ_EVENT, pe_session,
 			      0, 0);
@@ -6123,18 +6141,21 @@ __lim_handle_sme_stop_bss_request(struct mac_context *mac, uint32_t *msg_buf)
 			GET_LIM_SYSTEM_ROLE(pe_session));
 		lim_print_sme_state(mac, LOGE, pe_session->limSmeState);
 		/* / Send Stop BSS response to host */
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 		lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
 				 eSIR_SME_UNEXPECTED_REQ_RESULT_CODE,
-				 smesessionId);
+				 vdev_id);
+#else
+		lim_send_stop_bss_response(mac, vdev_id,
+					   eSIR_SME_UNEXPECTED_REQ_RESULT_CODE);
+#endif
 		return;
 	}
 
 	if (LIM_IS_AP_ROLE(pe_session))
 		lim_wpspbc_close(mac, pe_session);
 
-	pe_debug("RECEIVED STOP_BSS_REQ with reason code=%d",
-		stop_bss_req.reasonCode);
-
 	prevState = pe_session->limSmeState;
 	pe_session->limPrevSmeState = prevState;
 
@@ -6143,8 +6164,8 @@ __lim_handle_sme_stop_bss_request(struct mac_context *mac, uint32_t *msg_buf)
 		       (mac, TRACE_CODE_SME_STATE, pe_session->peSessionId,
 		       pe_session->limSmeState));
 
-	pe_session->smeSessionId = smesessionId;
-	pe_session->stop_bss_reason = stop_bss_req.reasonCode;
+	pe_session->smeSessionId = vdev_id;
+	pe_session->stop_bss_reason = 0;
 
 	if (!LIM_IS_NDI_ROLE(pe_session)) {
 		/* Free the buffer allocated in START_BSS_REQ */
@@ -6192,8 +6213,14 @@ void lim_process_sme_del_bss_rsp(struct mac_context *mac,
 	SET_LIM_PROCESS_DEFD_MESGS(mac, true);
 	dph_hash_table_init(mac, &pe_session->dph.dphHashTable);
 	lim_delete_pre_auth_list(mac);
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP, eSIR_SME_SUCCESS,
 			 pe_session->smeSessionId);
+#else
+	lim_send_stop_bss_response(mac, pe_session->vdev_id,
+				   eSIR_SME_SUCCESS);
+#endif
 	return;
 }
 

+ 39 - 0
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -81,6 +81,8 @@ void lim_send_sme_rsp(struct mac_context *mac_ctx, uint16_t msg_type,
 	msg.bodyval = 0;
 	MTRACE(mac_trace(mac_ctx, TRACE_CODE_TX_SME_MSG, vdev_id, msg.type));
 
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM    /* FEATURE_WLAN_DIAG_SUPPORT */
 	switch (msg_type) {
 	case eWNI_SME_STOP_BSS_RSP:
@@ -89,9 +91,46 @@ void lim_send_sme_rsp(struct mac_context *mac_ctx, uint16_t msg_type,
 		break;
 	}
 #endif /* FEATURE_WLAN_DIAG_SUPPORT */
+#endif
 	lim_sys_process_mmh_msg_api(mac_ctx, &msg);
 }
 
+#ifdef SAP_CP_CLEANUP
+void
+lim_send_stop_bss_response(struct mac_context *mac_ctx, uint8_t vdev_id,
+			   tSirResultCodes result_code)
+{
+	struct scheduler_msg msg = {0};
+	struct stop_bss_rsp *stop_bss_rsp;
+	struct pe_session *pe_session;
+
+	pe_debug("Sending stop bss response with reasonCode: %s",
+		 lim_result_code_str(result_code));
+
+	pe_session = pe_find_session_by_vdev_id(mac_ctx, vdev_id);
+	if (!pe_session) {
+		pe_err("Unable to find session for stop bss response");
+		return;
+	}
+
+	stop_bss_rsp = qdf_mem_malloc(sizeof(*stop_bss_rsp));
+	if (!stop_bss_rsp)
+		return;
+
+	stop_bss_rsp->status_code = result_code;
+	stop_bss_rsp->vdev_id = vdev_id;
+
+	msg.type = eWNI_SME_STOP_BSS_RSP;
+	msg.bodyptr = stop_bss_rsp;
+	msg.bodyval = 0;
+
+#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM    /* FEATURE_WLAN_DIAG_SUPPORT */
+	lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_STOP_BSS_RSP_EVENT,
+			      NULL, (uint16_t) result_code, 0);
+#endif /* FEATURE_WLAN_DIAG_SUPPORT */
+	lim_sys_process_mmh_msg_api(mac_ctx, &msg);
+}
+#endif
 /**
  * lim_get_max_rate_flags() - Get rate flags
  * @mac_ctx: Pointer to global MAC structure

+ 12 - 0
core/mac/src/pe/lim/lim_send_sme_rsp_messages.h

@@ -289,4 +289,16 @@ void lim_handle_mlo_sta_csa_param(struct wlan_objmgr_vdev *vdev,
 				  struct csa_offload_params *csa_params);
 #endif /* WLAN_FEATURE_11BE_MLO */
 
+#ifdef SAP_CP_CLEANUP
+/** lim_send_stop_bss_response() - Send stop bss response to CSR
+ *
+ * @mac_ctx : Global mac ctx
+ * @vdev_id : vdev_id
+ * @result_code: result
+ *
+ * Return: None
+ */
+void lim_send_stop_bss_response(struct mac_context *mac_ctx, uint8_t vdev_id,
+				tSirResultCodes result_code);
+#endif
 #endif /* __LIM_SEND_SME_RSP_H */

+ 0 - 26
core/mac/src/pe/lim/lim_sme_req_utils.c

@@ -496,29 +496,3 @@ bool lim_is_sme_set_context_req_valid(struct mac_context *mac,
 end:
 	return valid;
 } /*** end lim_is_sme_set_context_req_valid() ***/
-
-/**
- * lim_is_sme_stop_bss_req_valid()
- *
- ***FUNCTION:
- * This function is called by lim_process_sme_req_messages() upon
- * receiving SME_STOP_BSS_REQ message from application.
- *
- ***LOGIC:
- * Message validity checks are performed in this function
- *
- ***ASSUMPTIONS:
- *
- ***NOTE:
- *
- * @param  pMsg - Pointer to received SME_STOP_BSS_REQ message
- * @return true  when received SME_STOP_BSS_REQ is formatted correctly
- *         false otherwise
- */
-
-uint8_t lim_is_sme_stop_bss_req_valid(uint32_t *pMsg)
-{
-	uint8_t valid = true;
-
-	return valid;
-} /*** end lim_is_sme_stop_bss_req_valid() ***/

+ 0 - 2
core/mac/src/pe/lim/lim_sme_req_utils.h

@@ -104,8 +104,6 @@ bool lim_is_sme_deauth_req_valid(struct mac_context *mac,
 bool lim_is_sme_set_context_req_valid(struct mac_context *,
 				      struct set_context_req *set_context_req);
 
-uint8_t lim_is_sme_stop_bss_req_valid(uint32_t *);
-
 /**
  * lim_is_sme_disassoc_cnf_valid() - Validate disassoc cnf message
  * @mac: Pointer to Global MAC structure

+ 8 - 1
core/mac/src/pe/nan/nan_datapath.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -403,8 +403,15 @@ void lim_ndi_del_bss_rsp(struct mac_context * mac_ctx,
 end:
 	/* Delete PE session once BSS is deleted */
 	if (session_entry) {
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 		lim_send_sme_rsp(mac_ctx, eWNI_SME_STOP_BSS_RSP,
 			rc, session_entry->smeSessionId);
+#else
+		lim_send_stop_bss_response(mac_ctx,
+					   session_entry->vdev_id,
+					   rc);
+#endif
 		pe_delete_session(mac_ctx, session_entry);
 		session_entry = NULL;
 	}

+ 2 - 0
core/sap/src/sap_fsm.c

@@ -1599,6 +1599,8 @@ static QDF_STATUS sap_goto_stopping(struct sap_context *sap_ctx)
 /* To be removed after SAP CSR cleanup changes */
 #ifndef SAP_CP_CLEANUP
 	sap_free_roam_profile(&sap_ctx->csr_roamProfile);
+#else
+	qdf_mem_zero(&sap_ctx->sap_bss_cfg, sizeof(sap_ctx->sap_bss_cfg));
 #endif
 	status = sme_roam_stop_bss(MAC_HANDLE(mac_ctx), sap_ctx->sessionId);
 	if (status != QDF_STATUS_SUCCESS) {

+ 44 - 1
core/sme/src/common/sme_api.c

@@ -2912,6 +2912,11 @@ QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
 							       pMsg->bodyptr);
 		qdf_mem_free(pMsg->bodyptr);
 		break;
+	case eWNI_SME_STOP_BSS_RSP:
+		csr_roam_roaming_state_stop_bss_rsp_processor(mac,
+							      pMsg->bodyptr);
+		qdf_mem_free(pMsg->bodyptr);
+		break;
 #endif
 	default:
 
@@ -3476,8 +3481,14 @@ QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t vdev_id)
 	if (QDF_IS_STATUS_ERROR(status))
 		return status;
 
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	status = csr_roam_issue_stop_bss_cmd(mac, vdev_id,
 					     eCSR_BSS_TYPE_INFRA_AP, false);
+#else
+	status = csr_roam_issue_stop_bss_cmd(mac, vdev_id,
+					     eCSR_BSS_TYPE_INFRA_AP);
+#endif
 	sme_release_global_lock(&mac->sme);
 
 	return status;
@@ -16418,8 +16429,37 @@ failure:
 }
 
 static QDF_STATUS sme_send_stop_bss_msg(struct mac_context *mac,
-					uint32_t vdev_id)
+					struct stop_bss_req *cfg)
 {
+	struct scheduler_msg msg = {0};
+	struct stop_bss_req *stop_bss_req;
+
+	csr_roam_state_change(mac, eCSR_ROAMING_STATE_JOINING, cfg->vdev_id);
+	csr_roam_substate_change(mac, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ,
+				 cfg->vdev_id);
+
+	sme_err("Stop bss request received for vdev : %d cmd_id : %d",
+		cfg->vdev_id, cfg->cmd_id);
+
+	stop_bss_req = qdf_mem_malloc(sizeof(*stop_bss_req));
+	if (!stop_bss_req)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_mem_copy(stop_bss_req, cfg, sizeof(*stop_bss_req));
+
+	msg.type = eWNI_SME_STOP_BSS_REQ;
+	msg.bodyptr = stop_bss_req;
+	msg.reserved = 0;
+
+	if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
+							 QDF_MODULE_ID_PE,
+							 QDF_MODULE_ID_PE,
+							 &msg)) {
+		sme_err("Failed to post stop bss request for vdev id : %d",
+			cfg->vdev_id);
+		qdf_mem_free(stop_bss_req);
+		return QDF_STATUS_E_FAILURE;
+	}
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -16440,6 +16480,9 @@ static QDF_STATUS sme_sap_activate_cmd(struct wlan_serialization_command *cmd)
 	case WLAN_SER_CMD_VDEV_START_BSS:
 		status = sme_send_start_bss_msg(mac, cmd->umac_cmd);
 		break;
+	case WLAN_SER_CMD_VDEV_STOP_BSS:
+		status = sme_send_stop_bss_msg(mac, cmd->umac_cmd);
+		break;
 	default:
 		status = QDF_STATUS_E_FAILURE;
 		break;

+ 106 - 20
core/sme/src/csr/csr_api_roam.c

@@ -3338,7 +3338,6 @@ static bool csr_roam_process_results(struct mac_context *mac_ctx, tSmeCmd *cmd,
 				       roam_result);
 		csr_set_default_dot11_mode(mac_ctx);
 		break;
-#endif
 	case eCsrStopBssSuccess:
 		if (CSR_IS_NDI(profile)) {
 			qdf_mem_zero(roam_info, sizeof(*roam_info));
@@ -3363,6 +3362,7 @@ static bool csr_roam_process_results(struct mac_context *mac_ctx, tSmeCmd *cmd,
 					       roam_status, roam_result);
 		}
 		break;
+#endif
 	case eCsrNothingToJoin:
 	default:
 		csr_roam_process_results_default(mac_ctx, cmd, context, res);
@@ -3730,10 +3730,16 @@ QDF_STATUS csr_roam_ndi_stop(struct mac_context *mac_ctx, uint8_t vdev_id)
 	sme_debug("vdev_id: %d is_vdev_up %d is_start_bss_in_active_q %d",
 		  vdev_id, is_vdev_up, is_start_bss_in_active_q);
 
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	if (is_vdev_up || is_start_bss_in_active_q)
 		status = csr_roam_issue_stop_bss_cmd(mac_ctx, vdev_id,
 						     eCSR_BSS_TYPE_NDI, true);
-
+#else
+	if (is_vdev_up || is_start_bss_in_active_q)
+		status = csr_roam_issue_stop_bss_cmd(mac_ctx, vdev_id,
+						     eCSR_BSS_TYPE_NDI);
+#endif
 	return status;
 }
 
@@ -3788,7 +3794,6 @@ csr_roaming_state_config_cnf_processor(struct mac_context *mac_ctx,
 		return;
 	}
 }
-#endif
 
 static void csr_roam_roaming_state_stop_bss_rsp_processor(struct mac_context *mac,
 							  tSirSmeRsp *pSmeRsp)
@@ -3805,13 +3810,29 @@ static void csr_roam_roaming_state_stop_bss_rsp_processor(struct mac_context *ma
 			if (pSmeRsp->status_code != eSIR_SME_SUCCESS)
 				result_code = eCsrStopBssFailure;
 		}
-/* To be removed after SAP CSR cleanup changes */
-#ifndef SAP_CP_CLEANUP
 		csr_roam_complete(mac, result_code, NULL, pSmeRsp->vdev_id);
-#endif
 	}
 }
 
+#else
+void csr_roam_roaming_state_stop_bss_rsp_processor(struct mac_context *mac,
+						   void *msg)
+{
+	struct stop_bss_rsp *stop_bss_rsp = (struct stop_bss_rsp *)msg;
+	uint8_t vdev_id = stop_bss_rsp->vdev_id;
+	enum csr_sap_response_type result_code = CSR_SAP_STOP_BSS_SUCCESS;
+
+	sme_debug("Received stop bss rsp on vdev: %d", vdev_id);
+	mac->roam.roamSession[vdev_id].connectState =
+					eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
+	if (CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ(mac, vdev_id)) {
+		if (stop_bss_rsp->status_code != eSIR_SME_SUCCESS)
+			result_code = CSR_SAP_STOP_BSS_FAILURE;
+		csr_process_sap_response(mac, result_code, NULL, vdev_id);
+	}
+}
+#endif
+
 static
 void csr_roam_roaming_state_disassoc_rsp_processor(struct mac_context *mac,
 						   struct disassoc_rsp *rsp)
@@ -3963,10 +3984,13 @@ void csr_roaming_state_msg_processor(struct mac_context *mac, void *msg_buf)
 	pSmeRsp = (tSirSmeRsp *)msg_buf;
 
 	switch (pSmeRsp->messageType) {
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	case eWNI_SME_STOP_BSS_RSP:
 		/* or the Stop Bss response message... */
 		csr_roam_roaming_state_stop_bss_rsp_processor(mac, pSmeRsp);
 		break;
+#endif
 	case eWNI_SME_DISASSOC_RSP:
 		/* or the Disassociate response message... */
 		if (CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ(mac, pSmeRsp->vdev_id)) {
@@ -9098,25 +9122,71 @@ error:
 
 QDF_STATUS csr_roam_issue_stop_bss_cmd(struct mac_context *mac,
 				       uint8_t vdev_id,
-				       eCsrRoamBssType bss_type,
-				       bool high_priority)
+				       eCsrRoamBssType bss_type)
 {
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_serialization_command cmd = {0};
+	enum wlan_serialization_status status;
+	struct stop_bss_req *stop_bss_req;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, vdev_id,
+						    WLAN_LEGACY_MAC_ID);
+	if (!vdev) {
+		sme_err("VDEV not found for vdev id : %d", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	/* Change the substate in case it is wait-for-key */
+	if (CSR_IS_WAIT_FOR_KEY(mac, vdev_id)) {
+		cm_stop_wait_for_key_timer(mac->psoc, vdev_id);
+		csr_roam_substate_change(mac, eCSR_ROAM_SUBSTATE_NONE,
+					 vdev_id);
+	}
+
+	sme_debug("Stop BSS vdev_id: %d bss_type %d", vdev_id, bss_type);
+	stop_bss_req = qdf_mem_malloc(sizeof(*stop_bss_req));
+	if (!stop_bss_req)
+		return QDF_STATUS_E_FAILURE;
+
+	stop_bss_req->vdev_id = vdev_id;
+	stop_bss_req->cmd_id = csr_get_monotonous_number(mac);
+
+	cmd.cmd_id = stop_bss_req->cmd_id;
+	csr_set_sap_ser_params(&cmd, WLAN_SER_CMD_VDEV_STOP_BSS);
+	cmd.umac_cmd = stop_bss_req;
+	cmd.vdev = vdev;
+	csr_fill_cmd_timeout(&cmd);
+
+	status = wlan_vdev_mlme_ser_stop_bss(&cmd);
+	switch (status) {
+	case WLAN_SER_CMD_PENDING:
+	case WLAN_SER_CMD_ACTIVE:
+		break;
+	default:
+		sme_err("ser cmd status %d", status);
+		goto error;
+	}
 	return QDF_STATUS_SUCCESS;
+
+error:
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
+	qdf_mem_free(stop_bss_req);
+	return QDF_STATUS_E_FAILURE;
 }
 
-/**
- * csr_process_sap_defaults() - API to process the default response
- * for SAP from LIM
- * @mac_ctx: mac context
- * @req: Serialization command posted by SAP
- * @vdev_id : vdev id
- *
- * Return: void
- */
-static void csr_process_sap_defaults(struct mac_context *mac_ctx,
-				     struct wlan_serialization_command *req,
-				     uint32_t vdev_id)
+static void csr_process_stop_bss_response(struct mac_context *mac_ctx,
+					  uint32_t vdev_id)
 {
+	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, vdev_id);
+
+	if (CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ(mac_ctx, vdev_id)) {
+		csr_roam_free_connected_info(mac_ctx, &session->connectedInfo);
+		csr_set_default_dot11_mode(mac_ctx);
+	}
+
+	csr_roam_call_callback(mac_ctx, vdev_id, NULL,
+			       0, eCSR_ROAM_INFRA_IND,
+			       eCSR_ROAM_RESULT_INFRA_STOPPED);
 	return;
 }
 
@@ -9171,6 +9241,22 @@ static bool csr_process_sap_results(struct mac_context *mac_ctx,
 				       0, roam_status, roam_result);
 		csr_set_default_dot11_mode(mac_ctx);
 		break;
+	case CSR_SAP_STOP_BSS_SUCCESS:
+	case CSR_SAP_STOP_BSS_FAILURE:
+		if (opmode == QDF_NDI_MODE) {
+			qdf_mem_zero(roam_info, sizeof(*roam_info));
+			csr_roam_update_ndp_return_params(mac_ctx, result,
+							  &roam_status,
+							  &roam_result,
+							  roam_info);
+			csr_roam_call_callback(mac_ctx, vdev_id,
+					       roam_info, 0,
+					       roam_status,
+					       roam_result);
+		} else {
+			csr_process_stop_bss_response(mac_ctx, vdev_id);
+		}
+		break;
 	default:
 		sme_err("Invalid response");
 		break;

+ 29 - 2
core/sme/src/csr/csr_inside_api.h

@@ -185,8 +185,6 @@ QDF_STATUS csr_get_cfg_valid_channels(struct mac_context *mac,
 /* to free memory allocated inside the profile structure */
 void csr_release_profile(struct mac_context *mac,
 			 struct csr_roam_profile *pProfile);
-#else
-void csr_clear_start_bss_config(struct start_bss_config *sap_config);
 #endif
 
 enum csr_cfgdot11mode
@@ -461,6 +459,7 @@ QDF_STATUS csr_apply_channel_and_power_list(struct mac_context *mac);
  */
 QDF_STATUS csr_roam_ndi_stop(struct mac_context *mac, uint8_t vdev_id);
 
+#ifndef SAP_CP_CLEANUP
 /* This function is used to stop a BSS. It is similar of csr_roamIssueDisconnect
  * but this function doesn't have any logic other than blindly trying to stop
  * BSS
@@ -468,6 +467,20 @@ QDF_STATUS csr_roam_ndi_stop(struct mac_context *mac, uint8_t vdev_id);
 QDF_STATUS csr_roam_issue_stop_bss_cmd(struct mac_context *mac, uint8_t vdev_id,
 				       eCsrRoamBssType bss_type,
 				       bool high_priority);
+#else
+/**
+ * csr_roam_issue_stop_bss_cmd() - This API posts the stop bss command
+ * to the serialization module.
+ *
+ * @mac: Global mac context
+ * @vdev_id: Vdev id
+ * @bss_type: BSS type
+ *
+ * Return : QDF_STATUS
+ */
+QDF_STATUS csr_roam_issue_stop_bss_cmd(struct mac_context *mac, uint8_t vdev_id,
+				       eCsrRoamBssType bss_type);
+#endif
 
 /**
  * csr_roam_issue_disassociate_sta_cmd() - disassociate a associated station
@@ -588,10 +601,12 @@ csr_roam_prepare_bss_params(struct mac_context *mac_ctx, uint32_t session_id,
 void csr_remove_bssid_from_scan_list(struct mac_context *mac_ctx,
 				     tSirMacAddr bssid);
 
+#ifndef SAP_CP_CLEANUP
 QDF_STATUS
 csr_roam_set_bss_config_cfg(struct mac_context *mac_ctx, uint32_t session_id,
 			    struct csr_roam_profile *profile,
 			    struct bss_config_param *bss_cfg);
+#endif
 
 void csr_prune_channel_list_for_mode(struct mac_context *mac,
 				     struct csr_channel *pChannelList);
@@ -695,5 +710,17 @@ void csr_process_sap_response(struct mac_context *mac,
 void
 csr_roam_roaming_state_start_bss_rsp_processor(struct mac_context *mac,
 					       void *msg);
+
+/**
+ * csr_roam_roaming_state_stop_bss_rsp_processor() - Handles stop bss
+ * response from LIM
+ *
+ * @mac: mac context
+ * @msg: stop bss response pointer
+ *
+ * Return: void
+ */
+void csr_roam_roaming_state_stop_bss_rsp_processor(struct mac_context *mac,
+						   void *msg);
 #endif
 #endif /* CSR_INSIDE_API_H__ */

+ 10 - 0
core/sme/src/nan/nan_datapath_api.c

@@ -112,14 +112,24 @@ void csr_roam_update_ndp_return_params(struct mac_context *mac_ctx,
 		*roam_status = eCSR_ROAM_NDP_STATUS_UPDATE;
 		*roam_result = eCSR_ROAM_RESULT_NDI_CREATE_RSP;
 		break;
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	case eCsrStopBssSuccess:
+#else
+	case CSR_SAP_STOP_BSS_SUCCESS:
+#endif
 		roam_info->ndp.ndi_delete_params.reason = 0;
 		roam_info->ndp.ndi_delete_params.status =
 						NDP_RSP_STATUS_SUCCESS;
 		*roam_status = eCSR_ROAM_NDP_STATUS_UPDATE;
 		*roam_result = eCSR_ROAM_RESULT_NDI_DELETE_RSP;
 		break;
+/* To be removed after SAP CSR cleanup changes */
+#ifndef SAP_CP_CLEANUP
 	case eCsrStopBssFailure:
+#else
+	case CSR_SAP_STOP_BSS_FAILURE:
+#endif
 		roam_info->ndp.ndi_delete_params.status = NDP_RSP_STATUS_ERROR;
 		roam_info->ndp.ndi_delete_params.reason =
 					NDP_NAN_DATA_IFACE_DELETE_FAILED;