From ed6ae35758ce89b19fb0674fe7e131d4e53f2adb Mon Sep 17 00:00:00 2001 From: Jyoti Kumari Date: Mon, 10 May 2021 13:21:43 +0530 Subject: [PATCH] qcacld-3.0: Handle SAP concurrency in CSA and NAN/NDI case TWT is supported in STA/SAP vdevs and it's allowed only in DBS/Standalone case and not in SCC/MCC. Disable SAP TWT if 1. Concurrency occurs in SAP + NAN/NDI vdev 2. SCC/MCC occurs after CSA Change-Id: Id1400bd5555d2f48590d7d3ad7c70162d1dd92fb CRs-Fixed: 2942959 --- components/nan/core/inc/nan_public_structs.h | 2 ++ components/nan/core/src/nan_main.c | 8 ++++++++ components/nan/dispatcher/src/nan_ucfg_api.c | 2 ++ core/hdd/inc/wlan_hdd_nan.h | 10 +++++++++- core/hdd/src/wlan_hdd_assoc.c | 3 +++ core/hdd/src/wlan_hdd_main.c | 2 ++ core/hdd/src/wlan_hdd_nan.c | 14 ++++++++++++++ core/hdd/src/wlan_hdd_nan_datapath.c | 14 ++++++++++---- core/hdd/src/wlan_hdd_nan_datapath.h | 2 +- 9 files changed, 51 insertions(+), 6 deletions(-) diff --git a/components/nan/core/inc/nan_public_structs.h b/components/nan/core/inc/nan_public_structs.h index 76a014abe1cc..45cf356e5530 100644 --- a/components/nan/core/inc/nan_public_structs.h +++ b/components/nan/core/inc/nan_public_structs.h @@ -787,6 +787,7 @@ struct nan_datapath_host_event { * @ndp_delete_peers: LIM callback for deleting NDP peer * @delete_peers_by_addr: LIM callback for deleting peer by MAC address * @update_ndi_conn: WMA callback to update NDI's connection info + * @nan_concurrency_update: Callback to handle nan concurrency */ struct nan_callbacks { /* callback to os_if layer from umac */ @@ -811,6 +812,7 @@ struct nan_callbacks { QDF_STATUS (*update_ndi_conn)(uint8_t vdev_id, struct nan_datapath_channel_info *chan_info); + void (*nan_concurrency_update)(void); }; /** diff --git a/components/nan/core/src/nan_main.c b/components/nan/core/src/nan_main.c index 763c72313980..264c23bb771e 100644 --- a/components/nan/core/src/nan_main.c +++ b/components/nan/core/src/nan_main.c @@ -827,6 +827,7 @@ static QDF_STATUS nan_handle_enable_rsp(struct nan_event_params *nan_event) QDF_STATUS status; void (*call_back)(void *cookie); uint8_t vdev_id; + void (*nan_conc_callback)(void); psoc = nan_event->psoc; psoc_nan_obj = nan_get_psoc_priv_obj(psoc); @@ -874,6 +875,9 @@ fail: policy_mgr_check_n_start_opportunistic_timer(psoc); done: + nan_conc_callback = psoc_nan_obj->cb_obj.nan_concurrency_update; + if (nan_conc_callback) + nan_conc_callback(); call_back = psoc_nan_obj->cb_obj.ucfg_nan_request_process_cb; if (call_back) call_back(psoc_nan_obj->nan_disc_request_ctx); @@ -886,6 +890,7 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc) struct nan_psoc_priv_obj *psoc_nan_obj; QDF_STATUS status; uint8_t vdev_id; + void (*nan_conc_callback)(void); if (!psoc) { nan_err("psoc is NULL"); @@ -917,6 +922,9 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc) nan_err("Cannot set NAN state to disabled!"); return QDF_STATUS_E_FAILURE; } + nan_conc_callback = psoc_nan_obj->cb_obj.nan_concurrency_update; + if (nan_conc_callback) + nan_conc_callback(); return status; } diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index 9cc6d7b436d9..5c7c314336fe 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -532,6 +532,8 @@ int ucfg_nan_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc, cb_obj->os_if_nan_event_handler; psoc_obj->cb_obj.ucfg_nan_request_process_cb = ucfg_nan_request_process_cb; + psoc_obj->cb_obj.nan_concurrency_update = + cb_obj->nan_concurrency_update; return 0; } diff --git a/core/hdd/inc/wlan_hdd_nan.h b/core/hdd/inc/wlan_hdd_nan.h index acd4d2ec1cd8..e7d52baee43c 100644 --- a/core/hdd/inc/wlan_hdd_nan.h +++ b/core/hdd/inc/wlan_hdd_nan.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -79,4 +79,12 @@ static inline bool wlan_hdd_nan_is_supported(struct hdd_context *hdd_ctx) return false; } #endif /* WLAN_FEATURE_NAN */ + +/** + * hdd_nan_concurrency_update() - NAN concurrency + * + * Return: None + */ +void hdd_nan_concurrency_update(void); + #endif /* __WLAN_HDD_NAN_H */ diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 2f9293c48a23..88b8ab1bfe8d 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -82,6 +82,8 @@ #include "wlan_if_mgr_public_struct.h" #include "wlan_roam_debug.h" +#include "wlan_hdd_twt.h" + /* These are needed to recognize WPA and RSN suite types */ #define HDD_WPA_OUI_SIZE 4 #define HDD_RSN_OUI_SIZE 4 @@ -4391,6 +4393,7 @@ static void hdd_roam_channel_switch_handler(struct hdd_adapter *adapter, hdd_debug("set hw mode change not done"); policy_mgr_check_concurrent_intf_and_restart_sap(hdd_ctx->psoc); + wlan_twt_concurrency_update(hdd_ctx); } #ifdef WLAN_FEATURE_HOST_ROAM diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 97c7a00cfbe0..5b30a6d91458 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -3529,6 +3529,8 @@ static void hdd_nan_register_callbacks(struct hdd_context *hdd_ctx) cb_obj.new_peer_ind = hdd_ndp_new_peer_handler; cb_obj.peer_departed_ind = hdd_ndp_peer_departed_handler; + cb_obj.nan_concurrency_update = hdd_nan_concurrency_update; + os_if_nan_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj); } #else diff --git a/core/hdd/src/wlan_hdd_nan.c b/core/hdd/src/wlan_hdd_nan.c index a0f7792443b4..a9b30ffc5aa8 100644 --- a/core/hdd/src/wlan_hdd_nan.c +++ b/core/hdd/src/wlan_hdd_nan.c @@ -112,3 +112,17 @@ int wlan_hdd_cfg80211_nan_ext_request(struct wiphy *wiphy, return errno; } + +void hdd_nan_concurrency_update(void) +{ + struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + int ret; + + hdd_enter(); + ret = wlan_hdd_validate_context(hdd_ctx); + if (ret) + return; + + wlan_twt_concurrency_update(hdd_ctx); + hdd_exit(); +} diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c index 283998728d18..3bddacd15109 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.c +++ b/core/hdd/src/wlan_hdd_nan_datapath.c @@ -899,13 +899,15 @@ void hdd_ndp_session_end_handler(struct hdd_adapter *adapter) /** * hdd_ndp_new_peer_handler() - NDP new peer indication handler - * @adapter: pointer to adapter context - * @ind_params: indication parameters + * @vdev_id: vdev id + * @sta_id: station id + * @peer_mac_addr: peer mac address + * @first_peer: first peer * * Return: none */ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, - struct qdf_mac_addr *peer_mac_addr, bool fist_peer) + struct qdf_mac_addr *peer_mac_addr, bool first_peer) { struct hdd_context *hdd_ctx; struct hdd_adapter *adapter; @@ -948,7 +950,7 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, qdf_copy_macaddr(&roam_info->bssid, peer_mac_addr); /* perform following steps for first new peer ind */ - if (fist_peer) { + if (first_peer) { hdd_debug("Set ctx connection state to connected"); /* Disable LRO/GRO for NDI Mode */ if (hdd_ctx->ol_enable && @@ -971,6 +973,8 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, */ if (!NDI_CONCURRENCY_SUPPORTED(hdd_ctx->psoc)) hdd_indicate_active_ndp_cnt(hdd_ctx->psoc, vdev_id, 1); + + wlan_twt_concurrency_update(hdd_ctx); } qdf_mem_free(roam_info); return 0; @@ -1051,5 +1055,7 @@ void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id, */ if (!NDI_CONCURRENCY_SUPPORTED(hdd_ctx->psoc)) hdd_indicate_active_ndp_cnt(hdd_ctx->psoc, vdev_id, 0); + + wlan_twt_concurrency_update(hdd_ctx); } } diff --git a/core/hdd/src/wlan_hdd_nan_datapath.h b/core/hdd/src/wlan_hdd_nan_datapath.h index 0d0c1b73260e..6774d0f2579f 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.h +++ b/core/hdd/src/wlan_hdd_nan_datapath.h @@ -131,7 +131,7 @@ void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id, struct nan_datapath_inf_create_rsp *ndi_rsp); void hdd_ndi_drv_ndi_delete_rsp_handler(uint8_t vdev_id); int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, - struct qdf_mac_addr *peer_mac_addr, bool fist_peer); + struct qdf_mac_addr *peer_mac_addr, bool first_peer); void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id, struct qdf_mac_addr *peer_mac_addr, bool last_peer); #endif /* __WLAN_HDD_NAN_DATAPATH_H */