qcacld-3.0: Clear connection info of both ml and assoc link when disconnect

When wlan0 connect, connect info as bssid are saved to both ML adapter and
assoc link adapter.
When wlan0 disconnect, connect info as bssid isn't cleared in both adapter.

When 2nd sta connected same bssid, in __wlan_hdd_cfg80211_get_station old
wlan0 adapter is got by hdd_get_adapter_by_bssid, but it is disconnected,
so no right rssi reported.

Change-Id: I5dd2b6dcdd063509ee42088270cc85f2466e3b67
CRs-Fixed: 3317428
This commit is contained in:
Jianmin Zhu
2022-10-20 23:23:46 +08:00
committed by Madan Koyyalamudi
parent 8e68427efd
commit 5fb29aca2e
3 changed files with 27 additions and 8 deletions

View File

@@ -128,6 +128,15 @@ void hdd_adapter_set_ml_adapter(struct hdd_adapter *adapter);
* Return: adapter or NULL * Return: adapter or NULL
*/ */
struct hdd_adapter *hdd_get_ml_adater(struct hdd_context *hdd_ctx); struct hdd_adapter *hdd_get_ml_adater(struct hdd_context *hdd_ctx);
/**
* hdd_get_assoc_link_adapter() - get assoc link adapter
* @ml_adapter: ML adapter
*
* This function returns assoc link adapter
* Return: adapter or NULL
*/
struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter);
#else #else
static inline static inline
QDF_STATUS hdd_wlan_unregister_mlo_interfaces(struct hdd_adapter *adapter, QDF_STATUS hdd_wlan_unregister_mlo_interfaces(struct hdd_adapter *adapter,
@@ -158,5 +167,11 @@ struct hdd_adapter *hdd_get_ml_adater(struct hdd_context *hdd_ctx)
{ {
return NULL; return NULL;
} }
static inline
struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
{
return NULL;
}
#endif #endif
#endif #endif

View File

@@ -1217,7 +1217,6 @@ static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx,
#endif #endif
#if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC) #if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC)
static
struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter) struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
{ {
int i; int i;
@@ -1236,13 +1235,6 @@ struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
} }
return NULL; return NULL;
} }
#else
static
struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
{
return NULL;
}
#endif #endif
static void static void

View File

@@ -165,6 +165,8 @@ void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter,
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
mac_handle_t mac_handle; mac_handle_t mac_handle;
struct hdd_adapter *link_adapter;
struct hdd_station_ctx *link_sta_ctx;
mac_handle = hdd_ctx->mac_handle; mac_handle = hdd_ctx->mac_handle;
@@ -188,6 +190,16 @@ void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter,
SCAN_EVENT_TYPE_MAX, true); SCAN_EVENT_TYPE_MAX, true);
} }
if (adapter->device_mode == QDF_STA_MODE &&
hdd_adapter_is_ml_adapter(adapter)) {
/* Clear connection info in assoc link adapter as well */
link_adapter = hdd_get_assoc_link_adapter(adapter);
if (link_adapter) {
link_sta_ctx =
WLAN_HDD_GET_STATION_CTX_PTR(link_adapter);
hdd_conn_remove_connect_info(link_sta_ctx);
}
}
/* Clear saved connection information in HDD */ /* Clear saved connection information in HDD */
hdd_conn_remove_connect_info(sta_ctx); hdd_conn_remove_connect_info(sta_ctx);