Explorar o código

qcacmn: Avoid deadlock in back to back connect for MLO

When mlo_connect is posted, mlo_dev_ctx lock is acquired.
As part of which is CM is not in init state, disconnection is posted
before processing of connect request.

In disconnect, mlo_sta_vdev_list is fetched which internally takes the
same mlo_dev_ctx lock leading to deadlock

Add fix to avoid deadlock in back to back connect handling.

Change-Id: Ic88229a7709e11edc790fb66401bb0336d8a1e27
CRs-Fixed: 3365031
Santosh Anbu %!s(int64=2) %!d(string=hai) anos
pai
achega
001bc02d42
Modificáronse 1 ficheiros con 6 adicións e 1 borrados
  1. 6 1
      umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

+ 6 - 1
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -539,7 +539,6 @@ QDF_STATUS mlo_connect(struct wlan_objmgr_vdev *vdev,
 
 		mlo_dev_lock_acquire(mlo_dev_ctx);
 		status = mlo_validate_connect_req(vdev, mlo_dev_ctx, req);
-
 		copied_conn_req_lock_acquire(sta_ctx);
 		if (!sta_ctx->copied_conn_req)
 			sta_ctx->copied_conn_req = qdf_mem_malloc(
@@ -1814,6 +1813,7 @@ done:
 	return handled;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
 void mlo_internal_disconnect_links(struct wlan_objmgr_vdev *vdev)
 {
 	struct wlan_mlo_dev_context *mlo_dev_ctx = NULL;
@@ -1863,6 +1863,11 @@ void mlo_internal_disconnect_links(struct wlan_objmgr_vdev *vdev)
 		mlo_release_vdev_ref(wlan_vdev_list[i]);
 	}
 }
+#else
+void mlo_internal_disconnect_links(struct wlan_objmgr_vdev *vdev)
+{
+}
+#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
 
 void mlo_sta_get_vdev_list(struct wlan_objmgr_vdev *vdev, uint16_t *vdev_count,
 			   struct wlan_objmgr_vdev **wlan_vdev_list)