qcacld-3.0: Handle link removal for ML STA

Handle link removal for ML STA vdev:
Send force link command to target if MLO STA link number > 1.
Select other inactive link to active if possible.

Change-Id: I40567364ad240399caf6be6683b96d17f6a4aab0
CRs-Fixed: 3352849
此提交包含在:
Liangwei Dong
2022-11-25 13:56:42 +08:00
提交者 Madan Koyyalamudi
父節點 f725025a1d
當前提交 2f9f0a579b
共有 3 個檔案被更改,包括 322 行新增4 行删除

查看文件

@@ -42,6 +42,7 @@
#include <wlan_mlo_mgr_public_structs.h>
#include <wlan_mlo_mgr_cmn.h>
#include <lim_mlo.h>
#include "wlan_mlo_mgr_sta.h"
#endif
static struct vdev_mlme_ops sta_mlme_ops;
@@ -1783,6 +1784,71 @@ vdevmgr_vdev_peer_delete_all_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
return status;
}
#ifdef WLAN_FEATURE_11BE_MLO
static QDF_STATUS vdevmgr_reconfig_req_cb(struct scheduler_msg *msg)
{
struct wlan_objmgr_vdev *vdev = msg->bodyptr;
if (!vdev) {
mlme_err("vdev null");
return QDF_STATUS_E_INVAL;
}
policy_mgr_handle_link_removal_on_vdev(vdev);
mlo_sta_stop_reconfig_timer_by_vdev(vdev);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS vdevmgr_reconfig_req_flush_cb(struct scheduler_msg *msg)
{
struct wlan_objmgr_vdev *vdev = msg->bodyptr;
if (!vdev) {
mlme_err("vdev null");
return QDF_STATUS_E_INVAL;
}
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
return QDF_STATUS_SUCCESS;
}
static void
vdevmgr_vdev_reconfig_timer_complete(struct vdev_mlme_obj *vdev_mlme)
{
struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev;
struct scheduler_msg msg = {0};
QDF_STATUS ret;
if (!vdev) {
mlme_err("invalid vdev");
return;
}
mlme_debug("vdev %d link removal timed out", wlan_vdev_get_id(vdev));
msg.bodyptr = vdev;
msg.callback = vdevmgr_reconfig_req_cb;
msg.flush_callback = vdevmgr_reconfig_req_flush_cb;
ret = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_MLME_CM_ID);
if (QDF_IS_STATUS_ERROR(ret))
return;
ret = scheduler_post_message(QDF_MODULE_ID_MLME,
QDF_MODULE_ID_TARGET_IF,
QDF_MODULE_ID_TARGET_IF, &msg);
if (QDF_IS_STATUS_ERROR(ret)) {
mlme_err("vdev %d failed to post scheduler_msg",
wlan_vdev_get_id(vdev));
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
return;
}
}
#endif
QDF_STATUS mlme_vdev_self_peer_create(struct wlan_objmgr_vdev *vdev)
{
struct vdev_mlme_obj *vdev_mlme;
@@ -1929,6 +1995,10 @@ static struct vdev_mlme_ops sta_mlme_ops = {
.mlme_vdev_sta_disconn_start = sta_mlme_vdev_sta_disconnect_start,
.mlme_vdev_ext_peer_delete_all_rsp =
vdevmgr_vdev_peer_delete_all_rsp_handle,
#ifdef WLAN_FEATURE_11BE_MLO
.mlme_vdev_reconfig_timer_complete =
vdevmgr_vdev_reconfig_timer_complete,
#endif
};
static struct vdev_mlme_ops ap_mlme_ops = {