From a725261a81fe0166c0d65d19335c092503c4776e Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Thu, 12 Oct 2023 17:31:56 +0800 Subject: [PATCH] qcacmn: Fix standby link removal fail Add callback mlme_vdev_reconfig_notify_standby to cld code to handle standby link removal. For standby link, it is going to be removed by AP, so don't start link removal timer for it. Force inactive it to avoid link switch to it. Change-Id: Iae8eebeb2263b0057026c0e80223ef5c6b68a41f CRs-Fixed: 3640204 --- umac/mlme/include/wlan_vdev_mlme.h | 6 ++++++ umac/mlo_mgr/src/wlan_mlo_mgr_sta.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h index 463562d047..eaf50c5061 100644 --- a/umac/mlme/include/wlan_vdev_mlme.h +++ b/umac/mlme/include/wlan_vdev_mlme.h @@ -28,6 +28,7 @@ struct vdev_mlme_obj; struct cnx_mgr; +struct ml_rv_info; /* Requestor ID for multiple vdev restart */ #define MULTIPLE_VDEV_RESTART_REQ_ID 0x1234 @@ -721,6 +722,8 @@ enum vdev_start_resp_type { * the first ml reconfig IE * @mlme_vdev_reconfig_timer_complete: callback to process ml reconfing * operation + * @mlme_vdev_reconfig_notify_standby: callback to notify to process standby + * link removal * @mlme_vdev_notify_mlo_sync_wait_entry: */ struct vdev_mlme_ops { @@ -806,6 +809,9 @@ struct vdev_mlme_ops { uint16_t *tbtt_count, uint16_t bcn_int); void (*mlme_vdev_reconfig_timer_complete)( struct vdev_mlme_obj *vdev_mlme); + QDF_STATUS (*mlme_vdev_reconfig_notify_standby)( + struct vdev_mlme_obj *vdev_mlme, + struct ml_rv_info *reconfig_info); QDF_STATUS (*mlme_vdev_notify_mlo_sync_wait_entry)( struct vdev_mlme_obj *vdev_mlme); }; diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c index 43f41ff8b7..229d2f8921 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c @@ -2012,6 +2012,29 @@ QDF_STATUS mlo_sta_handle_csa_standby_link( qdf_mem_free(params.chan); return status; } + +static void mlo_sta_handle_link_reconfig_standby_link( + struct wlan_objmgr_vdev *vdev, + struct ml_rv_info *reconfig_info) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return; + if (vdev_mlme->ops && + vdev_mlme->ops->mlme_vdev_reconfig_notify_standby) { + vdev_mlme->ops->mlme_vdev_reconfig_notify_standby( + vdev_mlme, + reconfig_info); + } +} +#else +static void mlo_sta_handle_link_reconfig_standby_link( + struct wlan_objmgr_vdev *vdev, + struct ml_rv_info *reconfig_info) +{ +} #endif QDF_STATUS mlo_sta_csa_save_params(struct wlan_mlo_dev_context *mlo_dev_ctx, @@ -2704,6 +2727,8 @@ check_ml_rv: } } + mlo_sta_handle_link_reconfig_standby_link(vdev, &reconfig_info); + err_release_refs: for (i = 0; i < vdev_count; i++)