qcacld-3.0: Change WMI force mode for ML link switch case

Currently, to switch links from link A to link B, Host sends
two back-to-back WMI commands to FW, by setting link B force
active and link A force inactive respectively with force
mode MLO_LINK_FORCE_MODE_ACTIVE/MLO_LINK_FORCE_MODE_INACTIVE
but if association is in EMLSR mode, FW considers the first
WMI to set link B active (when link A is already set active)
to be a trigger to enter EMLSR mode and sends OMN frame as
part of it. To avoid this, Host has to send a single WMI
with force mode MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE and
include both active and inactive vdev bitmaps within the
same command to clearly indicate the link switch.

Change-Id: Iae58fedc800c891625d737daf238fa476382f4a1
CRs-Fixed: 3487826
This commit is contained in:
Gururaj Pandurangi
2023-04-05 16:40:46 -07:00
committed by Rahul Choudhary
parent daae501ffb
commit 01fcda20bf

View File

@@ -7317,21 +7317,22 @@ void policy_mgr_activate_mlo_links(struct wlan_objmgr_psoc *psoc,
}
/*
* Invoke Force active link cmd first, followed by Force inactive link
* cmd. This ensures that there is atleast 1 link active at any given
* time.
* If there are both active and inactive vdev count, then issue a
* single WMI with force mode MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE,
* else if there is only active vdev count, send single WMI for
* all active vdevs with force mode MLO_LINK_FORCE_MODE_ACTIVE.
*/
if (active_vdev_cnt)
if (active_vdev_cnt && inactive_vdev_cnt)
policy_mgr_mlo_sta_set_link_ext(
psoc, MLO_LINK_FORCE_REASON_CONNECT,
MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE,
active_vdev_cnt, active_vdev_lst,
inactive_vdev_cnt, inactive_vdev_lst);
else if (active_vdev_cnt && !inactive_vdev_cnt)
policy_mgr_mlo_sta_set_link(psoc,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_ACTIVE,
active_vdev_cnt,
active_vdev_lst);
if (inactive_vdev_cnt)
policy_mgr_mlo_sta_set_link(psoc, MLO_LINK_FORCE_REASON_CONNECT,
MLO_LINK_FORCE_MODE_INACTIVE,
inactive_vdev_cnt,
inactive_vdev_lst);
active_vdev_cnt, active_vdev_lst);
for (idx = 0; idx < ml_vdev_cnt; idx++)
mlo_release_vdev_ref(tmp_vdev_lst[idx]);