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
2022-12-23 12:20:34 +05:30
提交者 Madan Koyyalamudi
父节点 fcba5ea249
当前提交 001bc02d42

查看文件

@@ -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)