Browse Source

qcacmn: Dispatch reassoc failure event in sync/async context

Reassoc fail event is dispatched  either from one of the roam states in
connection SM or from peer create response handler.
Hence dispatch reassoc fail in sync/async mode.

Change-Id: I4dc462b956610a480e0c963676988492a73285f3
CRs-Fixed: 2852393
Santosh Anbu 4 years ago
parent
commit
b52ff8c14b

+ 17 - 9
umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c

@@ -83,7 +83,8 @@ cm_reassoc_fail_disconnect(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS
 cm_send_reassoc_start_fail(struct cnx_mgr *cm_ctx,
 			   wlan_cm_id cm_id,
-			   enum wlan_cm_connect_fail_reason reason)
+			   enum wlan_cm_connect_fail_reason reason,
+			   bool sync)
 {
 	struct wlan_cm_roam_resp *resp;
 	QDF_STATUS status;
@@ -93,9 +94,15 @@ cm_send_reassoc_start_fail(struct cnx_mgr *cm_ctx,
 		return QDF_STATUS_E_NOMEM;
 
 	cm_fill_roam_fail_resp_from_cm_id(cm_ctx, resp, cm_id, reason);
-	status = cm_sm_deliver_event(cm_ctx->vdev,
-				     WLAN_CM_SM_EV_REASSOC_FAILURE,
-				     sizeof(*resp), resp);
+	if (sync)
+		status = cm_sm_deliver_event_sync(
+				cm_ctx, WLAN_CM_SM_EV_REASSOC_FAILURE,
+				sizeof(*resp), resp);
+	else
+		status = cm_sm_deliver_event(cm_ctx->vdev,
+					     WLAN_CM_SM_EV_REASSOC_FAILURE,
+					     sizeof(*resp), resp);
+
 	if (QDF_IS_STATUS_ERROR(status))
 		cm_reassoc_complete(cm_ctx, resp);
 
@@ -244,7 +251,7 @@ QDF_STATUS cm_host_roam_start_req(struct cnx_mgr *cm_ctx,
 		return status;
 
 roam_err:
-	return cm_send_reassoc_start_fail(cm_ctx, cm_req->cm_id, reason);
+	return cm_send_reassoc_start_fail(cm_ctx, cm_req->cm_id, reason, true);
 }
 
 bool cm_roam_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx,
@@ -315,7 +322,8 @@ QDF_STATUS cm_reassoc_disconnect_complete(struct cnx_mgr *cm_ctx,
 		mlme_err(CM_PREFIX_FMT "Peer create request failed",
 			 CM_PREFIX_REF(vdev_id, cm_id));
 		status = cm_send_reassoc_start_fail(cm_ctx, cm_id,
-						    CM_PEER_CREATE_FAILED);
+						    CM_PEER_CREATE_FAILED,
+						    true);
 	}
 
 	return status;
@@ -342,7 +350,7 @@ cm_resume_reassoc_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 			 CM_PREFIX_REF(req.vdev_id, req.cm_id));
 		mlme_cm_bss_peer_delete_req(cm_ctx->vdev);
 		status = cm_send_reassoc_start_fail(cm_ctx, *cm_id,
-						    CM_JOIN_FAILED);
+						    CM_JOIN_FAILED, true);
 	}
 
 	return status;
@@ -710,7 +718,7 @@ QDF_STATUS cm_reassoc_start(struct cnx_mgr *cm_ctx,
 		mlme_err(CM_PREFIX_FMT "Serialization of reassoc failed",
 			 CM_PREFIX_REF(vdev_id, cm_req->cm_id));
 		return cm_send_reassoc_start_fail(cm_ctx, cm_req->cm_id,
-						  CM_SER_FAILURE);
+						  CM_SER_FAILURE, true);
 	}
 
 	return status;
@@ -795,7 +803,7 @@ QDF_STATUS cm_roam_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 
 		return cm_send_reassoc_start_fail(
 				cm_ctx, cm_id,
-				CM_PEER_CREATE_FAILED);
+				CM_PEER_CREATE_FAILED, false);
 	}
 
 	qdf_status = cm_sm_deliver_event(

+ 3 - 1
umac/mlme/connection_mgr/core/src/wlan_cm_roam.h

@@ -155,13 +155,15 @@ bool cm_roam_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx,
  * @cm_ctx: connection manager context
  * @cm_id: active command id
  * @reason: failure reason
+ * @sync: Indicate if the event has to be dispatched in sync or async mode
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
 cm_send_reassoc_start_fail(struct cnx_mgr *cm_ctx,
 			   wlan_cm_id cm_id,
-			   enum wlan_cm_connect_fail_reason reason);
+			   enum wlan_cm_connect_fail_reason reason,
+			   bool sync);
 
 #else
 static inline QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx,