qcacld-3.0: Modify connect start code in if mgr

Modify connect start code in interface manager by
moving disable roam and tdls link teardown notify
APIs from HDD to if mgr. Alongside, move tdls link
teardown notify API from HDD to if mgr in start bss API.
Also, move the tdls link teardown API to TDLS module from
HDD module as TDLS should manage the wait logic.

Change-Id: I09fa31878563a3daaa7c5fde46327475829317b3
CRs-Fixed: 2811807
This commit is contained in:
Gururaj Pandurangi 2020-09-30 12:31:01 -07:00 • committed by snandini
commit a266ccd8f0
18 changed files with 299 additions and 143 deletions

View file

@ -1315,30 +1315,27 @@ void tdls_disable_offchan_and_teardown_links(
}
}
void tdls_teardown_connections(struct wlan_objmgr_psoc *psoc)
void tdls_teardown_connections(struct tdls_link_teardown *tdls_teardown)
{
struct tdls_osif_indication indication;
struct tdls_soc_priv_obj *tdls_soc;
struct tdls_vdev_priv_obj *tdls_vdev_obj;
struct wlan_objmgr_vdev *tdls_vdev;
tdls_soc = wlan_psoc_get_tdls_soc_obj(psoc);
if (!tdls_soc)
return;
/* Get the tdls specific vdev and clear the links */
tdls_vdev = tdls_get_vdev(psoc, WLAN_TDLS_SB_ID);
tdls_vdev = tdls_get_vdev(tdls_teardown->psoc, WLAN_TDLS_SB_ID);
if (!tdls_vdev) {
tdls_err("Unable get the vdev");
return;
}
tdls_vdev_obj = wlan_vdev_get_tdls_vdev_obj(tdls_vdev);
if (!tdls_vdev_obj) {
tdls_err("vdev priv is NULL");
return;
}
tdls_disable_offchan_and_teardown_links(tdls_vdev);
indication.vdev = tdls_vdev;
if (tdls_soc->tdls_event_cb)
tdls_soc->tdls_event_cb(tdls_soc->tdls_evt_cb_data,
TDLS_EVENT_TEARDOWN_LINKS_DONE,
&indication);
qdf_event_set(&tdls_vdev_obj->tdls_teardown_comp);
wlan_objmgr_vdev_release_ref(tdls_vdev, WLAN_TDLS_SB_ID);
wlan_objmgr_psoc_release_ref(tdls_teardown->psoc, WLAN_TDLS_SB_ID);
qdf_mem_free(tdls_teardown);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2020 The Linux Foundation. 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
@ -152,7 +152,7 @@ void tdls_discovery_timeout_peer_cb(void *user_data);
void tdls_implicit_disable(struct tdls_vdev_priv_obj *tdls_vdev);
/**
* tdls_is_vdev_authenticated() -check the vdev authentication state
* tdls_is_vdev_authenticated() - check the vdev authentication state
* @vdev: vdev oobject
*
* Return: true or false
@ -160,12 +160,12 @@ void tdls_implicit_disable(struct tdls_vdev_priv_obj *tdls_vdev);
bool tdls_is_vdev_authenticated(struct wlan_objmgr_vdev *vdev);
/**
* tdls_teardown_connections() -teardown and delete all the tdls peers
* @psoc: psoc object
* tdls_teardown_connections() - teardown and delete all the tdls peers
* @tdls_teardown: tdls teardown struct
*
* Return: true or false
*/
void tdls_teardown_connections(struct wlan_objmgr_psoc *psoc);
void tdls_teardown_connections(struct tdls_link_teardown *tdls_teardown);
/**
* tdls_disable_offchan_and_teardown_links - Disable offchannel
@ -178,7 +178,7 @@ void tdls_disable_offchan_and_teardown_links(
struct wlan_objmgr_vdev *vdev);
/**
* tdls_delete_all_tdls_peers(): send request to delete tdls peers
* tdls_delete_all_tdls_peers() - send request to delete tdls peers
* @vdev: vdev object
* @tdls_soc: tdls soc object
*

View file

@ -271,7 +271,7 @@ QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
tdls_vdev_obj = qdf_mem_malloc(sizeof(*tdls_vdev_obj));
if (!tdls_vdev_obj) {
status = QDF_STATUS_E_NOMEM;
goto err;
goto err_attach;
}
status = wlan_objmgr_vdev_component_obj_attach(vdev,
@ -280,12 +280,16 @@ QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
tdls_err("Failed to attach vdev tdls component");
goto err;
goto err_attach;
}
tdls_vdev_obj->vdev = vdev;
status = tdls_vdev_init(tdls_vdev_obj);
if (QDF_IS_STATUS_ERROR(status))
goto err;
goto err_vdev_init;
status = qdf_event_create(&tdls_vdev_obj->tdls_teardown_comp);
if (QDF_IS_STATUS_ERROR(status))
goto err_event_create;
pdev = wlan_vdev_get_pdev(vdev);
@ -295,19 +299,28 @@ QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
if (QDF_STATUS_SUCCESS != status) {
tdls_err("scan event register failed ");
tdls_vdev_deinit(tdls_vdev_obj);
goto err;
goto err_register;
}
tdls_debug("tdls object attach to vdev successfully");
return status;
err:
err_register:
qdf_event_destroy(&tdls_vdev_obj->tdls_teardown_comp);
err_event_create:
tdls_vdev_deinit(tdls_vdev_obj);
err_vdev_init:
wlan_objmgr_vdev_component_obj_detach(vdev,
WLAN_UMAC_COMP_TDLS,
(void *)tdls_vdev_obj);
err_attach:
if (tdls_soc_obj->tdls_osif_deinit_cb)
tdls_soc_obj->tdls_osif_deinit_cb(vdev);
if (tdls_vdev_obj) {
qdf_mem_free(tdls_vdev_obj);
tdls_vdev_obj = NULL;
}
return status;
}
@ -315,7 +328,7 @@ QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev,
void *arg)
{
QDF_STATUS status;
void *tdls_vdev_obj;
struct tdls_vdev_priv_obj *tdls_vdev_obj;
struct tdls_soc_priv_obj *tdls_soc_obj;
uint32_t tdls_feature_flags;
@ -343,16 +356,18 @@ QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_E_FAILURE;
}
qdf_event_destroy(&tdls_vdev_obj->tdls_teardown_comp);
tdls_vdev_deinit(tdls_vdev_obj);
status = wlan_objmgr_vdev_component_obj_detach(vdev,
WLAN_UMAC_COMP_TDLS,
tdls_vdev_obj);
if (QDF_IS_STATUS_ERROR(status))
tdls_err("Failed to detach vdev tdls component");
tdls_vdev_deinit(tdls_vdev_obj);
qdf_mem_free(tdls_vdev_obj);
if (tdls_soc_obj->tdls_osif_deinit_cb)
tdls_soc_obj->tdls_osif_deinit_cb(vdev);
qdf_mem_free(tdls_vdev_obj);
return status;
}

View file

@ -255,6 +255,7 @@ struct tdls_soc_priv_obj {
* @valid_mac_entries: number of valid mac entry in @ct_peer_mac_table
* @magic: magic
* @tx_queue: tx frame queue
* @tdls_teardown_comp: tdls teardown completion
*/
struct tdls_vdev_priv_obj {
struct wlan_objmgr_vdev *vdev;
@ -271,6 +272,7 @@ struct tdls_vdev_priv_obj {
uint32_t magic;
uint8_t session_id;
qdf_list_t tx_queue;
qdf_event_t tdls_teardown_comp;
};
/**

View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* DOC: contains tdls link teardown declarations
*/
#ifndef _WLAN_TDLS_API_H_
#define _WLAN_TDLS_API_H_
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_objmgr_vdev_obj.h"
/**
* wlan_tdls_teardown_links() - notify TDLS module to teardown all TDLS links
* @psoc: psoc object
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_tdls_teardown_links(struct wlan_objmgr_psoc *psoc);
/**
* wlan_tdls_teardown_links_sync() - teardown all the TDLS links
* @psoc: psoc object
*
* Return: None
*/
void wlan_tdls_teardown_links_sync(struct wlan_objmgr_psoc *psoc);
#endif

View file

@ -1337,4 +1337,12 @@ struct tdls_del_sta_req {
struct qdf_mac_addr peermac;
};
/**
* struct tdls_link_teardown - TDLS link teardown struct
* @psoc: soc object
*/
struct tdls_link_teardown {
struct wlan_objmgr_psoc *psoc;
};
#endif

View file

@ -152,12 +152,20 @@ QDF_STATUS ucfg_tdls_send_mgmt_frame(
QDF_STATUS ucfg_tdls_responder(struct tdls_set_responder_req *msg_req);
/**
* ucfg_tdls_teardown_links() - teardown all TDLS links
* ucfg_tdls_teardown_links() - notify TDLS modules to teardown all TDLS links.
* @psoc: psoc object
*
* Return: QDF_STATUS
*/
QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_tdls_teardown_links_sync() - teardown all TDLS links.
* @psoc: psoc object
*
* Return: None
*/
QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_psoc *psoc);
void ucfg_tdls_teardown_links_sync(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_tdls_notify_reset_adapter() - notify reset adapter
@ -350,6 +358,11 @@ QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_psoc *psoc)
return QDF_STATUS_SUCCESS;
}
static inline
void ucfg_tdls_teardown_links_sync(struct wlan_objmgr_psoc *psoc)
{
}
static inline
QDF_STATUS ucfg_tdls_set_rssi(struct wlan_objmgr_vdev *vdev,
uint8_t *mac, int8_t rssi)

View file

@ -0,0 +1,111 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* DOC: contains tdls link teardown definitions
*/
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_tdls_api.h"
#include "../../core/src/wlan_tdls_main.h"
#include "../../core/src/wlan_tdls_ct.h"
#include "../../core/src/wlan_tdls_mgmt.h"
#include <wlan_objmgr_global_obj.h>
#include <wlan_objmgr_cmn.h>
static QDF_STATUS tdls_teardown_flush_cb(struct scheduler_msg *msg)
{
struct tdls_link_teardown *tdls_teardown = msg->bodyptr;
struct wlan_objmgr_psoc *psoc = tdls_teardown->psoc;
wlan_objmgr_psoc_release_ref(psoc, WLAN_TDLS_SB_ID);
qdf_mem_free(tdls_teardown);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_tdls_teardown_links(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;
struct scheduler_msg msg = {0, };
struct tdls_link_teardown *link_teardown;
link_teardown = qdf_mem_malloc(sizeof(*link_teardown));
if (!link_teardown)
return QDF_STATUS_E_NOMEM;
wlan_objmgr_psoc_get_ref(psoc, WLAN_TDLS_SB_ID);
link_teardown->psoc = psoc;
msg.bodyptr = link_teardown;
msg.callback = tdls_process_cmd;
msg.flush_callback = tdls_teardown_flush_cb;
msg.type = TDLS_CMD_TEARDOWN_LINKS;
status = scheduler_post_message(QDF_MODULE_ID_HDD,
QDF_MODULE_ID_TDLS,
QDF_MODULE_ID_OS_IF, &msg);
if (QDF_IS_STATUS_ERROR(status)) {
tdls_err("post msg fail, %d", status);
wlan_objmgr_psoc_release_ref(psoc, WLAN_TDLS_SB_ID);
qdf_mem_free(link_teardown);
}
return status;
}
void wlan_tdls_teardown_links_sync(struct wlan_objmgr_psoc *psoc)
{
struct tdls_vdev_priv_obj *vdev_priv_obj;
QDF_STATUS status;
struct wlan_objmgr_vdev *vdev;
vdev = tdls_get_vdev(psoc, WLAN_TDLS_NB_ID);
if (!vdev)
return;
vdev_priv_obj = wlan_vdev_get_tdls_vdev_obj(vdev);
if (!vdev_priv_obj) {
tdls_err("vdev priv is NULL");
goto release_ref;
}
qdf_event_reset(&vdev_priv_obj->tdls_teardown_comp);
status = wlan_tdls_teardown_links(psoc);
if (QDF_IS_STATUS_ERROR(status)) {
tdls_err("wlan_tdls_teardown_links failed err %d", status);
goto release_ref;
}
tdls_debug("Wait for tdls teardown completion. Timeout %u ms",
WAIT_TIME_FOR_TDLS_TEARDOWN_LINKS);
status = qdf_wait_for_event_completion(
&vdev_priv_obj->tdls_teardown_comp,
WAIT_TIME_FOR_TDLS_TEARDOWN_LINKS);
if (QDF_IS_STATUS_ERROR(status)) {
tdls_err(" Teardown Completion timed out %d", status);
goto release_ref;
}
tdls_debug("TDLS teardown completion status %d ", status);
release_ref:
wlan_objmgr_vdev_release_ref(vdev,
WLAN_TDLS_NB_ID);
}

View file

@ -34,6 +34,7 @@
#include "wlan_scan_ucfg_api.h"
#include "wlan_tdls_cfg.h"
#include "cfg_ucfg_api.h"
#include "wlan_tdls_api.h"
QDF_STATUS ucfg_tdls_init(void)
{
@ -487,7 +488,6 @@ static QDF_STATUS ucfg_tdls_post_msg_flush_cb(struct scheduler_msg *msg)
struct wlan_objmgr_vdev *vdev = NULL;
switch (msg->type) {
case TDLS_CMD_TEARDOWN_LINKS:
case TDLS_NOTIFY_RESET_ADAPTERS:
ptr = NULL;
break;
@ -826,23 +826,14 @@ QDF_STATUS ucfg_tdls_responder(struct tdls_set_responder_req *req)
return status;
}
void ucfg_tdls_teardown_links_sync(struct wlan_objmgr_psoc *psoc)
{
return wlan_tdls_teardown_links_sync(psoc);
}
QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;
struct scheduler_msg msg = {0, };
tdls_debug("Enter ");
msg.bodyptr = psoc;
msg.callback = tdls_process_cmd;
msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
msg.type = TDLS_CMD_TEARDOWN_LINKS;
status = scheduler_post_message(QDF_MODULE_ID_HDD,
QDF_MODULE_ID_TDLS,
QDF_MODULE_ID_OS_IF, &msg);
tdls_debug("Exit ");
return status;
return wlan_tdls_teardown_links(psoc);
}
QDF_STATUS ucfg_tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev)