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
Этот коммит содержится в:

коммит произвёл
Madan Koyyalamudi

родитель
177d353f4a
Коммит
c7e3610309
@@ -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
|
||||
|
Ссылка в новой задаче
Block a user