qcacld-3.0: Cleanup all NDPs as part of NAN disable

NDPs can exist on an NDI only when the NAN discovery is active.
Currently, firmware sends NDP_END indication for all NDPs when NAN
is disabled. Host driver removes the NDI entry from the policy mgr
based on these NDP_END indications. But firmware might miss to send
the NDP_END indication in some cases though the NDPs are deleted
in firmware. This leads to stale NDI entries in the policy mgr and
it prevents STA connections as NDI+STA without NAN discovery is not
a valid concurrency.
Host driver can remove all NDPs before sending NAN disable request
to firmware to avoid this. This is a blocking call in driver and
wait for the NDP_HOST_UPDATE event from firmware. Cleanup the policy
mgr entries in timeout case as well to avoid further failures due
to unsupported concurrency.

Change-Id: I8df905b7ae4cfe5dfb5affe5b6a3fd478851a453
CRs-Fixed: 2774329
This commit is contained in:
Srinivas Dasari
2020-09-10 19:59:09 +05:30
committed by snandini
parent c7ab3145b8
commit 6cc76d41ab

View File

@@ -1130,12 +1130,30 @@ ucfg_nan_is_vdev_creation_supp_by_host(struct nan_psoc_priv_obj *nan_obj)
return nan_obj->cfg_param.nan_separate_iface_support;
}
static void ucfg_nan_cleanup_all_ndps(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;
uint32_t ndi_count, vdev_id, i;
ndi_count = policy_mgr_mode_specific_connection_count(psoc, PM_NDI_MODE,
NULL);
for (i = 0; i < ndi_count; i++) {
vdev_id = policy_mgr_mode_specific_vdev_id(psoc, PM_NDI_MODE);
status = ucfg_nan_disable_ndi(psoc, vdev_id);
if (status == QDF_STATUS_E_TIMEOUT)
policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE,
vdev_id);
}
}
QDF_STATUS ucfg_disable_nan_discovery(struct wlan_objmgr_psoc *psoc,
uint8_t *data, uint32_t data_len)
{
struct nan_disable_req *nan_req;
QDF_STATUS status;
ucfg_nan_cleanup_all_ndps(psoc);
nan_req = qdf_mem_malloc(sizeof(*nan_req) + data_len);
if (!nan_req)
return -ENOMEM;