qcacld-3.0: Add support for TWT concurrency

Add support for TWT concurrency.

Change-Id: I859c5764a6828e60554978104fd747ec5ac2a058
CRs-Fixed: 3085555
This commit is contained in:
Srinivas Girigowda
2021-11-24 18:12:50 -08:00
committed by Madan Koyyalamudi
부모 96132d1c52
커밋 b4132f35eb
6개의 변경된 파일224개의 추가작업 그리고 1개의 파일을 삭제

파일 보기

@@ -26,6 +26,7 @@
#include "twt/core/src/wlan_twt_priv.h"
#include "twt/core/src/wlan_twt_common.h"
#include <wlan_twt_tgt_if_ext_tx_api.h>
#include <wlan_serialization_api.h>
/**
* wlan_twt_add_session() - Add TWT session entry in the TWT context
@@ -1385,3 +1386,17 @@ wlan_twt_notify_event_handler(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_twt_update_beacon_template(void)
{
struct scheduler_msg msg = { 0 };
QDF_STATUS status;
msg.type = SIR_LIM_UPDATE_BEACON;
status = scheduler_post_message(QDF_MODULE_ID_TWT, QDF_MODULE_ID_PE,
QDF_MODULE_ID_PE, &msg);
if (QDF_IS_STATUS_ERROR(status))
twt_err("scheduler_post_message failed, status = %u", status);
return status;
}

파일 보기

@@ -179,3 +179,23 @@ QDF_STATUS
wlan_twt_init_context(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *peer_mac,
uint8_t dialog_id);
/**
* wlan_twt_update_beacon_template() - update beacon template
*
* SoftAP (SAP) is the beaconing entity, as per current requirement
* during Single Channel Concurrency (SCC) or Multi-Channel Concurrency (MCC)
* TWT is not supported on STA as well as SAP.
*
* Whenever SAP is forming SCC/MCC, this function shall be called to update the
* beacon, underlying LIM layer based the TWT responder flag, it disables the
* TWT responder advertisement bit in the beacon.
*
* When SAP moves from SCC/MCC to Standalone, this function shall be called
* to update the beacon, underlying LIM layer based the TWT responder flag,
* it enables the TWT responder advertisement bit in the beacon.
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_twt_update_beacon_template(void);

파일 보기

@@ -162,6 +162,25 @@ ucfg_twt_init_context(struct wlan_objmgr_psoc *psoc,
*/
QDF_STATUS
ucfg_twt_set_osif_cb(osif_twt_get_global_ops_cb osif_twt_ops);
/**
* ucfg_twt_update_beacon_template() - update beacon template
*
* SoftAP (SAP) is the beaconing entity, as per current requirement
* during Single Channel Concurrency (SCC) or Multi-Channel Concurrency (MCC)
* TWT is not supported on STA as well as SAP.
*
* Whenever SAP is forming SCC/MCC, this function shall be called to update the
* beacon, underlying LIM layer based the TWT responder flag, it disables the
* TWT responder advertisement bit in the beacon.
*
* When SAP moves from SCC/MCC to Standalone, this function shall be called
* to update the beacon, underlying LIM layer based the TWT responder flag,
* it enables the TWT responder advertisement bit in the beacon.
*
* Return: QDF_STATUS_SUCCESS
*/
QDF_STATUS ucfg_twt_update_beacon_template(void);
#else
static inline
QDF_STATUS ucfg_twt_psoc_open(struct wlan_objmgr_psoc *psoc)

파일 보기

@@ -141,3 +141,8 @@ ucfg_twt_reset_active_command(struct wlan_objmgr_psoc *psoc,
WLAN_TWT_NONE);
}
QDF_STATUS ucfg_twt_update_beacon_template(void)
{
return wlan_twt_update_beacon_template();
}

파일 보기

@@ -79,6 +79,26 @@ QDF_STATUS hdd_send_twt_responder_enable_cmd(struct hdd_context *hdd_ctx)
return QDF_STATUS_SUCCESS;
}
void wlan_twt_concurrency_update(struct hdd_context *hdd_ctx)
{
qdf_sched_work(0, &hdd_ctx->twt_en_dis_work);
}
void hdd_twt_update_work_handler(void *data)
{
struct hdd_context *hdd_ctx = (struct hdd_context *)data;
struct osif_psoc_sync *psoc_sync;
int ret;
ret = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync);
if (ret)
return;
osif_twt_concurrency_update_handler(hdd_ctx->psoc, hdd_ctx->pdev);
osif_psoc_sync_op_stop(psoc_sync);
}
QDF_STATUS hdd_send_twt_requestor_enable_cmd(struct hdd_context *hdd_ctx)
{
uint8_t pdev_id = hdd_ctx->pdev->pdev_objmgr.wlan_pdev_id;
@@ -109,6 +129,8 @@ int hdd_test_config_twt_setup_session(struct hdd_adapter *adapter,
void wlan_hdd_twt_deinit(struct hdd_context *hdd_ctx)
{
qdf_flush_work(&hdd_ctx->twt_en_dis_work);
qdf_destroy_work(NULL, &hdd_ctx->twt_en_dis_work);
}
void
@@ -130,6 +152,13 @@ QDF_STATUS hdd_send_twt_responder_disable_cmd(struct hdd_context *hdd_ctx)
return QDF_STATUS_SUCCESS;
}
void wlan_hdd_twt_init(struct hdd_context *hdd_ctx)
{
osif_twt_send_requestor_enable_cmd(hdd_ctx->psoc, 0);
qdf_create_work(0, &hdd_ctx->twt_en_dis_work,
hdd_twt_update_work_handler, hdd_ctx);
}
/**
* hdd_twt_terminate_session - Process TWT terminate
* operation in the received vendor command and

파일 보기

@@ -28,7 +28,6 @@
#include <wlan_cm_api.h>
#include <wlan_cfg80211.h>
#include <wlan_cm_roam_api.h>
#include <wlan_serialization_api.h>
#include <osif_twt_internal.h>
#include <wlan_osif_request_manager.h>
@@ -814,3 +813,139 @@ int osif_twt_sta_teardown_req(struct wlan_objmgr_vdev *vdev,
return osif_send_sta_twt_teardown_req(vdev, psoc, &params);
}
static void
osif_twt_concurrency_update_on_scc_mcc(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct wlan_objmgr_vdev *vdev = object;
struct twt_conc_context *twt_arg = arg;
QDF_STATUS status;
uint8_t pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
if (vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE &&
vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
osif_debug("Concurrency exist on SAP vdev");
status = osif_twt_send_responder_disable_cmd(twt_arg->psoc,
pdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("TWT responder disable cmd to fw failed");
return;
}
ucfg_twt_update_beacon_template();
}
if (vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE &&
vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
osif_debug("Concurrency exist on STA vdev");
status = osif_twt_send_requestor_disable_cmd(twt_arg->psoc,
pdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("TWT requestor disable cmd to fw failed");
return;
}
}
}
static void
osif_twt_concurrency_update_on_dbs(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct wlan_objmgr_vdev *vdev = object;
struct twt_conc_context *twt_arg = arg;
QDF_STATUS status;
uint8_t pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
if (vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE &&
vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
osif_debug("SAP vdev exist");
status = osif_twt_send_responder_enable_cmd(twt_arg->psoc,
pdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("TWT responder enable cmd to firmware failed");
return;
}
ucfg_twt_update_beacon_template();
}
if (vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE &&
vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
osif_debug("STA vdev exist");
status = osif_twt_send_requestor_enable_cmd(twt_arg->psoc,
pdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("TWT requestor enable cmd to firmware failed");
return;
}
}
}
void osif_twt_concurrency_update_handler(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_pdev *pdev)
{
uint32_t num_connections, sap_count, sta_count;
QDF_STATUS status;
struct twt_conc_context twt_arg;
uint8_t pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
num_connections = policy_mgr_get_connection_count(psoc);
sta_count = policy_mgr_mode_specific_connection_count(psoc,
PM_STA_MODE,
NULL);
sap_count = policy_mgr_mode_specific_connection_count(psoc,
PM_SAP_MODE,
NULL);
twt_arg.psoc = psoc;
osif_debug("Total connection %d, sta_count %d, sap_count %d",
num_connections, sta_count, sap_count);
switch (num_connections) {
case 1:
if (sta_count == 1) {
osif_twt_send_requestor_enable_cmd(psoc, pdev_id);
} else if (sap_count == 1) {
osif_twt_send_responder_enable_cmd(psoc, pdev_id);
ucfg_twt_update_beacon_template();
}
break;
case 2:
if (policy_mgr_current_concurrency_is_scc(psoc) ||
policy_mgr_current_concurrency_is_mcc(psoc)) {
status = wlan_objmgr_pdev_iterate_obj_list(
pdev,
WLAN_VDEV_OP,
osif_twt_concurrency_update_on_scc_mcc,
&twt_arg, 0,
WLAN_TWT_ID);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("SAP not in SCC/MCC concurrency");
return;
}
} else if (policy_mgr_is_current_hwmode_dbs(psoc)) {
status = wlan_objmgr_pdev_iterate_obj_list(
pdev,
WLAN_VDEV_OP,
osif_twt_concurrency_update_on_dbs,
&twt_arg, 0,
WLAN_TWT_ID);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("SAP not in DBS case");
return;
}
}
break;
case 3:
status = wlan_objmgr_pdev_iterate_obj_list(
pdev,
WLAN_VDEV_OP,
osif_twt_concurrency_update_on_scc_mcc,
&twt_arg, 0,
WLAN_TWT_ID);
break;
default:
osif_err("Unexpected number of connections: %d",
num_connections);
break;
}
}