From 2586d8f5984c72ec2c638287b9c7d5b3dfe2e52f Mon Sep 17 00:00:00 2001 From: Srinivas Dasari Date: Wed, 1 Jul 2020 19:41:34 +0530 Subject: [PATCH] qcacld-3.0: cleanup NAN state upon NAN enable/disable timeout Currently, driver sends NAN enable/disable request to firmware and waits for the response. NAN state is cleaned up when NAN disable indication is received. But if firmware doesn't respond to NAN enable or disable request, a timeout happens and NAN state is not cleaned up. Cleanup the NAN state upon timeout for NAN enable/disable request. Change-Id: Iadfff2b4d010407f04b529ff81b1ce1f11064695 CRs-Fixed: 2723094 --- components/nan/core/inc/wlan_nan_api.h | 15 ++++++++++++++- components/nan/core/src/nan_main.c | 14 +++++++++++--- components/nan/dispatcher/inc/nan_ucfg_api.h | 6 ++++++ components/nan/dispatcher/src/nan_ucfg_api.c | 12 ++++++++++-- core/hdd/src/wlan_hdd_main.c | 9 +++++++-- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/components/nan/core/inc/wlan_nan_api.h b/components/nan/core/inc/wlan_nan_api.h index ab79fe7411f5..d7d84eeb9294 100644 --- a/components/nan/core/inc/wlan_nan_api.h +++ b/components/nan/core/inc/wlan_nan_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 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 @@ -200,6 +200,13 @@ uint32_t wlan_nan_get_disc_5g_ch_freq(struct wlan_objmgr_psoc *psoc); */ bool wlan_nan_get_sap_conc_support(struct wlan_objmgr_psoc *psoc); +/** + * nan_disable_cleanup: Cleanup NAN state upon NAN disable + * @psoc: pointer to psoc object + * + * Return: Cleanup NAN state upon NAN disable + */ +QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc); #else /* WLAN_FEATURE_NAN */ static inline QDF_STATUS nan_init(void) { @@ -239,5 +246,11 @@ bool wlan_nan_get_sap_conc_support(struct wlan_objmgr_psoc *psoc) { return false; } + +static inline +QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc) +{ + return QDF_STATUS_E_FAILURE; +} #endif /* WLAN_FEATURE_NAN */ #endif /* _WLAN_NAN_API_H_ */ diff --git a/components/nan/core/src/nan_main.c b/components/nan/core/src/nan_main.c index ed8c9b060969..ab043985cbda 100644 --- a/components/nan/core/src/nan_main.c +++ b/components/nan/core/src/nan_main.c @@ -888,14 +888,17 @@ done: return QDF_STATUS_SUCCESS; } -static QDF_STATUS nan_handle_disable_ind(struct nan_event_params *nan_event) +QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc) { struct nan_psoc_priv_obj *psoc_nan_obj; - struct wlan_objmgr_psoc *psoc; QDF_STATUS status; uint8_t vdev_id; - psoc = nan_event->psoc; + if (!psoc) { + nan_err("psoc is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + psoc_nan_obj = nan_get_psoc_priv_obj(psoc); if (!psoc_nan_obj) { nan_err("psoc_nan_obj is NULL"); @@ -925,6 +928,11 @@ static QDF_STATUS nan_handle_disable_ind(struct nan_event_params *nan_event) return status; } +static QDF_STATUS nan_handle_disable_ind(struct nan_event_params *nan_event) +{ + return nan_disable_cleanup(nan_event->psoc); +} + static QDF_STATUS nan_handle_schedule_update( struct nan_datapath_sch_update_event *ind) { diff --git a/components/nan/dispatcher/inc/nan_ucfg_api.h b/components/nan/dispatcher/inc/nan_ucfg_api.h index 249a4769ff1b..de4d6f14e538 100644 --- a/components/nan/dispatcher/inc/nan_ucfg_api.h +++ b/components/nan/dispatcher/inc/nan_ucfg_api.h @@ -505,5 +505,11 @@ ucfg_nan_disable_ndi(struct wlan_objmgr_psoc *psoc, uint32_t ndi_vdev_id) { return QDF_STATUS_E_INVAL; } + +static inline +bool ucfg_is_nan_disable_supported(struct wlan_objmgr_psoc *psoc) +{ + return false; +} #endif /* WLAN_FEATURE_NAN */ #endif /* _NAN_UCFG_API_H_ */ diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index b4025f70a6e4..e057fcb657d5 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -758,13 +758,21 @@ post_msg: if (req_type != NAN_GENERIC_REQ) { err = osif_request_wait_for_response(request); - if (err) + if (err) { nan_debug("NAN request: %u timed out: %d", req_type, err); + if (req_type == NAN_ENABLE_REQ) { + nan_set_discovery_state(psoc, + NAN_DISC_DISABLED); + policy_mgr_check_n_start_opportunistic_timer( + psoc); + } else if (req_type == NAN_DISABLE_REQ) { + nan_disable_cleanup(psoc); + } + } if (req_type == NAN_DISABLE_REQ) psoc_priv->is_explicit_disable = false; - osif_request_put(request); } diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 6bb2236fa934..005cfdcd3e20 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -6645,8 +6645,13 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); hdd_wext_send_event(adapter->dev, SIOCGIWAP, &wrqu, NULL); - } else if (adapter->device_mode == QDF_NAN_DISC_MODE && - ucfg_is_nan_disc_active(hdd_ctx->psoc)) + } + + if ((adapter->device_mode == QDF_NAN_DISC_MODE || + (adapter->device_mode == QDF_STA_MODE && + !ucfg_nan_is_vdev_creation_allowed(hdd_ctx->psoc))) && + ucfg_is_nan_disable_supported(hdd_ctx->psoc) && + ucfg_is_nan_disc_active(hdd_ctx->psoc)) ucfg_disable_nan_discovery(hdd_ctx->psoc, NULL, 0); wlan_hdd_scan_abort(adapter);