qcacmn: Fix deadlock for race condition
When connect from wpa_supplicant and roam from F/W happens at same time, supplicant hold cm cm_req_lock and wait rsp from scheduler thread, sheduler thread is blocked to wait for cm_req_lock. Change-Id: I6b9010972d29be9a32d3b85ee72891ed62b50801 CRs-Fixed: 3087193
Este cometimento está contido em:

cometido por
Madan Koyyalamudi

ascendente
df5958c77b
cometimento
50eb6fef18
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021 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 above
|
||||
@@ -29,6 +30,7 @@
|
||||
#ifdef CONN_MGR_ADV_FEATURE
|
||||
#include "wlan_blm_api.h"
|
||||
#include "wlan_cm_roam_api.h"
|
||||
#include "wlan_tdls_api.h"
|
||||
#endif
|
||||
#include <wlan_utility.h>
|
||||
#include <wlan_mlo_mgr_sta.h>
|
||||
@@ -978,6 +980,18 @@ static void cm_set_fils_wep_key(struct cnx_mgr *cm_ctx,
|
||||
cm_set_key(cm_ctx, true, 0, &resp->bssid);
|
||||
cm_set_key(cm_ctx, false, 0, &broadcast_mac);
|
||||
}
|
||||
|
||||
static void cm_teardown_tdls(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
|
||||
psoc = wlan_vdev_get_psoc(vdev);
|
||||
if (!psoc)
|
||||
return;
|
||||
|
||||
wlan_tdls_teardown_links_sync(psoc);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline
|
||||
@@ -1112,6 +1126,8 @@ post_err:
|
||||
return qdf_status;
|
||||
}
|
||||
|
||||
static inline void cm_teardown_tdls(struct wlan_objmgr_vdev *vdev) {}
|
||||
|
||||
#endif /* CONN_MGR_ADV_FEATURE */
|
||||
|
||||
static void cm_connect_prepare_scan_filter(struct wlan_objmgr_pdev *pdev,
|
||||
@@ -2319,6 +2335,9 @@ QDF_STATUS cm_connect_start_req(struct wlan_objmgr_vdev *vdev,
|
||||
|
||||
cm_set_crypto_params_from_ie(&connect_req->req);
|
||||
|
||||
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
|
||||
cm_teardown_tdls(vdev);
|
||||
|
||||
status = cm_sm_deliver_event(vdev, WLAN_CM_SM_EV_CONNECT_REQ,
|
||||
sizeof(*connect_req), connect_req);
|
||||
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador