qcacld-3.0: Check vdev up instead of connected when chang RSO

When roaming happens, vdev CM changes from CONNECTED to ROAMING first,
vdev still keeps up, then RSO becomes ROAMING_IN_PROG later,
so need permit RSO cmd during CM ROAMING state.

Change-Id: If4902dcff6b8b4f169fb43da4a889b09e1c2875d
CRs-Fixed: 3482158
This commit is contained in:
Jianmin Zhu
2023-04-28 09:08:20 +08:00
committed by Madan Koyyalamudi
父節點 0487b4bd3e
當前提交 eb33a28d70
共有 3 個文件被更改,包括 54 次插入2 次删除

查看文件

@@ -4628,7 +4628,7 @@ cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
return status;
if (wlan_vdev_mlme_is_mlo_vdev(vdev))
is_up = mlo_check_if_all_links_up(vdev);
is_up = mlo_check_if_all_vdev_up(vdev);
else
is_up = QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);

查看文件

@@ -376,11 +376,23 @@ wlan_mlo_roam_abort_on_link(struct wlan_objmgr_psoc *psoc,
* This api will check if all the requested links are in CM connected
* state.
*
* Return: QDF_STATUS
* Return: bool, true: all links of mld connected
*/
bool
mlo_check_if_all_links_up(struct wlan_objmgr_vdev *vdev);
/**
* mlo_check_if_all_vdev_up - Check if all vdev are up
* @vdev: vdev pointer
*
* This api will check if all the requested vdev are in up
* state.
*
* Return: bool, true: all assoc/link vdevs of mld in UP state
*/
bool
mlo_check_if_all_vdev_up(struct wlan_objmgr_vdev *vdev);
/**
* mlo_roam_set_link_id - set link id post roaming
*
@@ -538,6 +550,12 @@ mlo_check_if_all_links_up(struct wlan_objmgr_vdev *vdev)
return false;
}
static inline bool
mlo_check_if_all_vdev_up(struct wlan_objmgr_vdev *vdev)
{
return false;
}
static inline void
mlo_roam_set_link_id(struct wlan_objmgr_vdev *vdev,
struct roam_offload_synch_ind *sync_ind)

查看文件

@@ -744,6 +744,40 @@ mlo_check_if_all_links_up(struct wlan_objmgr_vdev *vdev)
return false;
}
bool
mlo_check_if_all_vdev_up(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *mlo_dev_ctx;
struct wlan_mlo_sta *sta_ctx;
uint8_t i;
if (!vdev || !vdev->mlo_dev_ctx) {
mlo_err("Vdev is null");
return false;
}
mlo_dev_ctx = vdev->mlo_dev_ctx;
sta_ctx = mlo_dev_ctx->sta_ctx;
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) &&
!QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(mlo_dev_ctx->wlan_vdev_list[i]))) {
mlo_debug("Vdev id %d is not in connected state",
wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]));
return false;
}
}
if (i == WLAN_UMAC_MLO_MAX_VDEVS) {
mlo_debug("all links are up");
return true;
}
return false;
}
void
mlo_roam_set_link_id(struct wlan_objmgr_vdev *vdev,
struct roam_offload_synch_ind *sync_ind)