qcacmn: Add APIs to modify connect_req/connected vdevs bmap for ML STA

Add APIs to modify connect_req/connected vdevs bmap for ML STA

Change-Id: I3c68f2f7a87db49eb72ddf0d9e85ae7387974c85
This commit is contained in:
Himanshu Batra
2021-09-14 09:13:59 +05:30
committed by Madan Koyyalamudi
orang tua 08e7ee70fe
melakukan 2100a410a5
2 mengubah file dengan 172 tambahan dan 119 penghapusan

Melihat File

@@ -22,6 +22,7 @@
#include <wlan_cm_ucfg_api.h>
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_mlo_mgr_cmn.h>
#ifdef WLAN_FEATURE_11BE_MLO
#include <wlan_mlo_mgr_public_structs.h>
@@ -138,7 +139,6 @@ ucfg_mlo_get_assoc_link_vdev(struct wlan_objmgr_vdev *vdev);
typedef void (*mlo_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
void *arg);
#ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
/*
* mlo_iterate_connected_vdev_list: Iterate on connected ML links
*
@@ -148,9 +148,31 @@ typedef void (*mlo_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
*
* Return: none
*/
static inline
void mlo_iterate_connected_vdev_list(struct wlan_objmgr_vdev *vdev,
mlo_vdev_op_handler handler,
void *arg);
void *arg)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
uint8_t i = 0;
if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev)))
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
if (qdf_test_bit(i, sta_ctx->wlan_connected_links)) {
if (handler)
handler(mlo_dev_ctx->wlan_vdev_list[i], arg);
}
}
}
/*
* mlo_update_connect_req_links: update connect req links index
@@ -160,8 +182,61 @@ void mlo_iterate_connected_vdev_list(struct wlan_objmgr_vdev *vdev,
*
* Return: none
*/
void
mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value);
static inline void
mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
uint8_t i = 0;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
if (vdev == mlo_dev_ctx->wlan_vdev_list[i]) {
if (value)
qdf_set_bit(i, sta_ctx->wlan_connect_req_links);
else
qdf_clear_bit(
i, sta_ctx->wlan_connect_req_links);
}
}
}
/*
* mlo_is_vdev_connect_req_link: API to check if vdev is in active connection
*
* @vdev: vdev object
*
* Return: true is vdev is participating in active connect else false
*/
static inline bool
mlo_is_vdev_connect_req_link(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
if (!mlo_dev_ctx)
return false;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return false;
if (qdf_test_bit(
mlo_get_link_vdev_ix(vdev->mlo_dev_ctx, vdev),
sta_ctx->wlan_connect_req_links))
return true;
return false;
}
/*
* mlo_clear_connect_req_links: clear connect req links bitmap
@@ -170,7 +245,22 @@ mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value);
*
* Return: none
*/
void mlo_clear_connect_req_links_bmap(struct wlan_objmgr_vdev *vdev);
static inline
void mlo_clear_connect_req_links_bmap(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
qdf_mem_zero(sta_ctx->wlan_connect_req_links,
sizeof(sta_ctx->wlan_connect_req_links));
}
/*
* mlo_update_connected_links: update connected links index
@@ -180,8 +270,32 @@ void mlo_clear_connect_req_links_bmap(struct wlan_objmgr_vdev *vdev);
*
* Return: none
*/
void
mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value);
static inline void
mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
uint8_t i = 0;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
if (vdev == mlo_dev_ctx->wlan_vdev_list[i]) {
if (value)
qdf_set_bit(i, sta_ctx->wlan_connected_links);
else
qdf_clear_bit(i, sta_ctx->wlan_connected_links);
}
}
}
/*
* mlo_clear_connected_links: clear connected links bitmap
@@ -190,8 +304,25 @@ mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value);
*
* Return: none
*/
void mlo_clear_connected_links_bmap(struct wlan_objmgr_vdev *vdev);
static inline
void mlo_clear_connected_links_bmap(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
qdf_mem_zero(sta_ctx->wlan_connected_links,
sizeof(sta_ctx->wlan_connected_links));
}
#ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
/*
* mlo_get_ml_vdev_by_mac: get ml vdev from mac
*
@@ -300,6 +431,12 @@ static inline void
mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value)
{ }
static inline bool
mlo_is_vdev_connect_req_link(struct wlan_objmgr_vdev *vdev)
{
return true;
}
static inline void
mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value)
{ }

Melihat File

@@ -295,8 +295,10 @@ QDF_STATUS mlo_connect(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_E_NOMEM;
}
if (QDF_IS_STATUS_SUCCESS(status))
if (QDF_IS_STATUS_SUCCESS(status)) {
mlo_clear_connected_links_bmap(vdev);
status = wlan_cm_start_connect(vdev, req);
}
mlo_dev_lock_release(mlo_dev_ctx);
return status;
@@ -477,6 +479,26 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
}
#endif
static inline void
mlo_update_connected_links_bmap(struct wlan_mlo_dev_context *mlo_dev_ctx,
struct mlo_partner_info ml_parnter_info)
{
uint8_t i = 0;
uint8_t j = 0;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
for (j = 0; j < ml_parnter_info.num_partner_links; j++) {
if (wlan_vdev_get_link_id(mlo_dev_ctx->wlan_vdev_list[i]) ==
ml_parnter_info.partner_link_info[j].link_id)
mlo_update_connected_links(
mlo_dev_ctx->wlan_vdev_list[i], 1);
}
}
}
void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_connect_resp *rsp)
{
@@ -497,6 +519,7 @@ void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev,
}
return;
} else {
mlo_update_connected_links(vdev, 0);
if (rsp->reason == CM_NO_CANDIDATE_FOUND ||
rsp->reason == CM_HW_MODE_FAILURE ||
rsp->reason == CM_SER_FAILURE)
@@ -529,6 +552,8 @@ void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev,
mlo_dev_ctx->sta_ctx->assoc_rsp.ptr,
rsp->connect_ies.assoc_rsp.ptr,
rsp->connect_ies.assoc_rsp.len);
mlo_update_connected_links_bmap(mlo_dev_ctx,
rsp->ml_parnter_info);
}
mlo_send_link_connect(vdev, mlo_dev_ctx,
&rsp->connect_ies.assoc_rsp,
@@ -933,6 +958,7 @@ void mlo_sta_link_disconn_notify(struct wlan_objmgr_vdev *vdev,
if (!wlan_cm_is_vdev_disconnected(vdev))
return;
mlo_update_connected_links(vdev, 0);
if (vdev == mlo_get_assoc_link_vdev(mlo_dev_ctx)) {
if (sta_ctx->connect_req) {
mlo_connect(mlo_get_assoc_link_vdev(mlo_dev_ctx),
@@ -957,116 +983,6 @@ bool mlo_is_mld_sta(struct wlan_objmgr_vdev *vdev)
}
#ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
void mlo_iterate_connected_vdev_list(struct wlan_objmgr_vdev *vdev,
mlo_vdev_op_handler handler,
void *arg)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
uint8_t i = 0;
if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev)))
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
if (qdf_test_bit(i, sta_ctx->wlan_connected_links)) {
if (handler)
handler(mlo_dev_ctx->wlan_vdev_list[i], arg);
}
}
}
void mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
uint8_t i = 0;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
if (vdev == mlo_dev_ctx->wlan_vdev_list[i]) {
if (value)
qdf_set_bit(i, sta_ctx->wlan_connect_req_links);
else
qdf_clear_bit(i, sta_ctx->wlan_connect_req_links);
}
}
}
void mlo_clear_connect_req_links_bmap(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
qdf_mem_zero(sta_ctx->wlan_connect_req_links,
sizeof(sta_ctx->wlan_connect_req_links));
}
void mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
uint8_t i = 0;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
if (vdev == mlo_dev_ctx->wlan_vdev_list[i]) {
if (value)
qdf_set_bit(i, sta_ctx->wlan_connected_links);
else
qdf_clear_bit(i, sta_ctx->wlan_connected_links);
}
}
}
void mlo_clear_connected_links_bmap(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx = NULL;
if (!mlo_dev_ctx)
return;
sta_ctx = mlo_dev_ctx->sta_ctx;
if (!sta_ctx)
return;
qdf_mem_zero(sta_ctx->wlan_connected_links,
sizeof(sta_ctx->wlan_connected_links));
}
struct wlan_objmgr_vdev *
mlo_get_ml_vdev_by_mac(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *macaddr)