qcacmn: Move disconnect wait logic from osif to connection mgr
Move disconnect wait logic from osif to connection mgr, so that MLO/IF manager can use the wait logic for disconnect during vdev delete. Change-Id: Ied2bbcfd6a532209f8008499424f94acc41efc0e CRs-Fixed: 2800990
This commit is contained in:

committed by
snandini

parent
abb7d72f97
commit
b8b58d8d12
@@ -401,6 +401,10 @@ QDF_STATUS cm_disconnect_complete(struct cnx_mgr *cm_ctx,
|
||||
if (!cm_ctx->disconnect_count && cm_ctx->connect_count)
|
||||
cm_flush_pending_request(cm_ctx, CONNECT_REQ_PREFIX, true);
|
||||
|
||||
/* Set the disconnect wait event once all disconnect are completed */
|
||||
if (!cm_ctx->disconnect_count)
|
||||
qdf_event_set(&cm_ctx->disconnect_complete);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -539,6 +543,31 @@ QDF_STATUS cm_disconnect_start_req(struct wlan_objmgr_vdev *vdev,
|
||||
return status;
|
||||
}
|
||||
|
||||
QDF_STATUS cm_disconnect_start_req_sync(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_disconnect_req *req)
|
||||
{
|
||||
struct cnx_mgr *cm_ctx;
|
||||
QDF_STATUS status;
|
||||
|
||||
cm_ctx = cm_get_cm_ctx(vdev);
|
||||
if (!cm_ctx)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
qdf_event_reset(&cm_ctx->disconnect_complete);
|
||||
status = cm_disconnect_start_req(vdev, req);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err("Disconnect failed with status %d", status);
|
||||
return status;
|
||||
}
|
||||
|
||||
status = qdf_wait_single_event(&cm_ctx->disconnect_complete,
|
||||
CM_DISCONNECT_CMD_TIMEOUT);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
mlme_err("Disconnect timeout with status %d", status);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
QDF_STATUS cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_discon_rsp *resp)
|
||||
{
|
||||
|
@@ -96,6 +96,7 @@ QDF_STATUS wlan_cm_init(struct vdev_mlme_obj *vdev_mlme)
|
||||
"CM",
|
||||
wlan_cm_scan_cb,
|
||||
vdev_mlme->cnx_mgr_ctx);
|
||||
qdf_event_create(&vdev_mlme->cnx_mgr_ctx->disconnect_complete);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -110,6 +111,7 @@ QDF_STATUS wlan_cm_deinit(struct vdev_mlme_obj *vdev_mlme)
|
||||
if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE)
|
||||
return QDF_STATUS_SUCCESS;
|
||||
|
||||
qdf_event_destroy(&vdev_mlme->cnx_mgr_ctx->disconnect_complete);
|
||||
scan_requester_id = vdev_mlme->cnx_mgr_ctx->scan_requester_id;
|
||||
wlan_scan_unregister_requester(psoc,
|
||||
scan_requester_id);
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#define __WLAN_CM_MAIN_H__
|
||||
|
||||
#include "include/wlan_vdev_mlme.h"
|
||||
#include <qdf_event.h>
|
||||
|
||||
#ifdef FEATURE_CM_ENABLE
|
||||
#include <wlan_cm_public_struct.h>
|
||||
@@ -177,6 +178,7 @@ struct connect_ies {
|
||||
* @global_cmd_id: global cmd id for getting cm id for connect/disconnect req
|
||||
* @max_connect_attempts: Max attempts to be tried for a connect req
|
||||
* @scan_requester_id: scan requester id.
|
||||
* @disconnect_complete: disconnect completion wait event
|
||||
*/
|
||||
struct cnx_mgr {
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
@@ -195,6 +197,7 @@ struct cnx_mgr {
|
||||
qdf_atomic_t global_cmd_id;
|
||||
uint8_t max_connect_attempts;
|
||||
wlan_scan_requester scan_requester_id;
|
||||
qdf_event_t disconnect_complete;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -363,6 +363,20 @@ QDF_STATUS cm_add_disconnect_req_to_list(struct cnx_mgr *cm_ctx,
|
||||
QDF_STATUS cm_disconnect_start_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_disconnect_req *req);
|
||||
|
||||
/**
|
||||
* cm_disconnect_start_req_sync() - disconnect request with wait till
|
||||
* completed
|
||||
* @vdev: vdev pointer
|
||||
* @req: disconnect req
|
||||
*
|
||||
* Context: Only call for north bound disconnect req, if wait till complete
|
||||
* is required, e.g. during vdev delete. Do not call from scheduler context.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS cm_disconnect_start_req_sync(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_disconnect_req *req);
|
||||
|
||||
/**
|
||||
* cm_bss_peer_delete_req() - Connection manager bss peer delete
|
||||
* request
|
||||
|
@@ -37,14 +37,36 @@ QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_req *req);
|
||||
|
||||
/**
|
||||
* wlan_cm_start_disconnect() - disconnect start request
|
||||
* wlan_cm_disconnect() - disconnect start request
|
||||
* @vdev: vdev pointer
|
||||
* @req: disconnect req
|
||||
* @source: disconnect source
|
||||
* @reason_code: disconnect reason
|
||||
* @bssid: bssid of AP to disconnect, can be null if not known
|
||||
*
|
||||
* Context: can be called from any context
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS wlan_cm_start_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_disconnect_req *req);
|
||||
QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
enum wlan_cm_source source,
|
||||
enum wlan_reason_code reason_code,
|
||||
struct qdf_mac_addr *bssid);
|
||||
|
||||
/**
|
||||
* wlan_cm_disconnect_sync() - disconnect request with wait till
|
||||
* completed
|
||||
* @vdev: vdev pointer
|
||||
* @source: disconnect source
|
||||
* @reason_code: disconnect reason
|
||||
*
|
||||
* Context: Only call for north bound disconnect req, if wait till complete
|
||||
* is required, e.g. during vdev delete. Do not call from scheduler context.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
|
||||
enum wlan_cm_source source,
|
||||
enum wlan_reason_code reason_code);
|
||||
|
||||
/**
|
||||
* wlan_cm_bss_select_ind_rsp() - Connection manager resp for bss
|
||||
|
@@ -47,6 +47,22 @@ QDF_STATUS ucfg_cm_start_connect(struct wlan_objmgr_vdev *vdev,
|
||||
QDF_STATUS ucfg_cm_start_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_disconnect_req *req);
|
||||
|
||||
/**
|
||||
* ucfg_cm_disconnect_sync() - disconnect request with wait till
|
||||
* completed
|
||||
* @vdev: vdev pointer
|
||||
* @source: disconnect source
|
||||
* @reason_code: disconnect reason
|
||||
*
|
||||
* Context: Only call for north bound disconnect req, if wait till complete
|
||||
* is required, e.g. during vdev delete. Do not call from scheduler context.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS ucfg_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
|
||||
enum wlan_cm_source source,
|
||||
enum wlan_reason_code reason_code);
|
||||
|
||||
/**
|
||||
* ucfg_cm_is_vdev_connecting() - check if vdev is in conneting state
|
||||
* @vdev: vdev pointer
|
||||
|
@@ -29,10 +29,33 @@ QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev,
|
||||
return cm_connect_start_req(vdev, req);
|
||||
}
|
||||
|
||||
QDF_STATUS wlan_cm_start_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_disconnect_req *req)
|
||||
QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
enum wlan_cm_source source,
|
||||
enum wlan_reason_code reason_code,
|
||||
struct qdf_mac_addr *bssid)
|
||||
{
|
||||
return cm_disconnect_start_req(vdev, req);
|
||||
struct wlan_cm_disconnect_req req = {0};
|
||||
|
||||
req.vdev_id = wlan_vdev_get_id(vdev);
|
||||
req.source = source;
|
||||
req.reason_code = reason_code;
|
||||
if (bssid)
|
||||
qdf_copy_macaddr(&req.bssid, bssid);
|
||||
|
||||
return cm_disconnect_start_req(vdev, &req);
|
||||
}
|
||||
|
||||
QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
|
||||
enum wlan_cm_source source,
|
||||
enum wlan_reason_code reason_code)
|
||||
{
|
||||
struct wlan_cm_disconnect_req req = {0};
|
||||
|
||||
req.vdev_id = wlan_vdev_get_id(vdev);
|
||||
req.source = source;
|
||||
req.reason_code = reason_code;
|
||||
|
||||
return cm_disconnect_start_req_sync(vdev, &req);
|
||||
}
|
||||
|
||||
QDF_STATUS wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev,
|
||||
|
@@ -35,6 +35,13 @@ QDF_STATUS ucfg_cm_start_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
return cm_disconnect_start_req(vdev, req);
|
||||
}
|
||||
|
||||
QDF_STATUS ucfg_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
|
||||
enum wlan_cm_source source,
|
||||
enum wlan_reason_code reason_code)
|
||||
{
|
||||
return wlan_cm_disconnect_sync(vdev, source, reason_code);
|
||||
}
|
||||
|
||||
bool ucfg_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
return cm_is_vdev_connecting(vdev);
|
||||
|
Reference in New Issue
Block a user