qcacld-3.0: Handle SAP + MLO STA concurrency

Handle SAP and MLO STA concurrency such as:

  1) If MLO STA is present with both links
     in 5/6 Ghz then SAP comes up on 2.4 Ghz,
     then Disable one of the links.

  2) If there is channel switch for sap from
     2.4 ghz to 5 ghz, then enable both the
     links as they were disabled by previous
     operations when sap was on 2.4 ghz.

  3) If MLO STA is present with both links in
     5/6 Ghz and SAP, which was present on
     2.4 ghz, stops then renable both the as
     one of the links were disabled because
     of sap on 2.4 ghz.
     Also, in case where MLO STA roamed from
     5 + 6 link to 2.4 + 5/6 link force scc
     will happen and the disabled link has
     to be enabled.
     Both links should only be enabled if mlo
     sta has more than one links.

Change-Id: I0fd0093b20336ae32325981589c399b44a44b64e
CRs-Fixed: 3092202
Этот коммит содержится в:
Utkarsh Bhatnagar
2021-12-13 12:29:02 +05:30
коммит произвёл Madan Koyyalamudi
родитель 177d353f4a
Коммит c7e3610309
8 изменённых файлов: 290 добавлений и 72 удалений

Просмотреть файл

@@ -32,6 +32,7 @@
#include <wlan_cm_api.h>
#include <wlan_mlo_mgr_public_structs.h>
#include <wlan_mlo_mgr_cmn.h>
#include <wlan_mlme_main.h>
QDF_STATUS if_mgr_connect_start(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
@@ -146,72 +147,6 @@ static void if_mgr_get_mlo_and_legacy_sta_count(struct wlan_objmgr_psoc *psoc,
}
}
static void
if_mgr_fill_active_link_vdev_bitmap(struct mlo_link_set_active_req *req,
uint8_t *mlo_vdev_lst,
uint32_t num_mlo_vdev)
{
uint32_t entry_idx, entry_offset, vdev_idx;
uint8_t vdev_id;
for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
vdev_id = mlo_vdev_lst[vdev_idx];
entry_idx = vdev_id / 32;
entry_offset = vdev_id % 32;
if (entry_idx >= MLO_LINK_NUM_SZ) {
ifmgr_err("Invalid entry_idx %d num_mlo_vdev %d vdev %d",
entry_idx, num_mlo_vdev, vdev_id);
continue;
}
req->param.vdev_bitmap[entry_idx] |= (1 << entry_offset);
/* update entry number if entry index changed */
if (req->param.num_vdev_bitmap < entry_idx + 1)
req->param.num_vdev_bitmap = entry_idx + 1;
}
ifmgr_debug("num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
req->param.num_vdev_bitmap, req->param.vdev_bitmap[0],
req->param.vdev_bitmap[1]);
}
static void
if_mgr_sta_mlo_concurency_set_link(struct wlan_objmgr_vdev *vdev,
enum mlo_link_force_reason reason,
enum mlo_link_force_mode mode,
uint8_t num_mlo_vdev, uint8_t *mlo_vdev_lst)
{
struct mlo_link_set_active_req *req;
QDF_STATUS status;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return;
ifmgr_debug("vdev %d: mode %d num_mlo_vdev %d reason %d",
wlan_vdev_get_id(vdev), mode, num_mlo_vdev, reason);
req->ctx.vdev = vdev;
req->param.reason = reason;
req->param.force_mode = mode;
/* set MLO vdev bit mask for all case */
if_mgr_fill_active_link_vdev_bitmap(req, mlo_vdev_lst, num_mlo_vdev);
/* fill num of links for MLO_LINK_FORCE_MODE_ACTIVE_NUM */
if (mode == MLO_LINK_FORCE_MODE_ACTIVE_NUM) {
req->param.force_mode = MLO_LINK_FORCE_MODE_ACTIVE_NUM;
req->param.num_link_entry = 1;
req->param.link_num[0].num_of_link = num_mlo_vdev - 1;
}
status = mlo_ser_set_link_req(req);
if (QDF_IS_STATUS_ERROR(status))
ifmgr_err("vdev %d: Failed to set link mode %d num_mlo_vdev %d reason %d",
wlan_vdev_get_id(vdev), mode, num_mlo_vdev, reason);
qdf_mem_free(req);
}
static uint8_t
if_mgr_mlo_get_affected_links_for_sbs(struct wlan_objmgr_psoc *psoc,
uint8_t num_mlo, qdf_freq_t *freq_list,
@@ -421,8 +356,10 @@ if_mgr_sta_mlo_concurency_on_connect(struct wlan_objmgr_vdev *vdev,
if (affected_links < num_mlo)
mode = MLO_LINK_FORCE_MODE_INACTIVE;
if_mgr_sta_mlo_concurency_set_link(vdev, MLO_LINK_FORCE_REASON_CONNECT,
mode, affected_links, mlo_vdev_lst);
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_CONNECT,
mode, affected_links,
mlo_vdev_lst);
}
static void
@@ -452,10 +389,10 @@ if_mgr_sta_mlo_concurency_on_disconnect(struct wlan_objmgr_vdev *vdev,
i++;
}
if_mgr_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_mlo, mlo_vdev_list);
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_mlo, mlo_vdev_list);
}
static void