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:

committed by
snandini

parent
c7ab3145b8
commit
6cc76d41ab
@@ -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;
|
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,
|
QDF_STATUS ucfg_disable_nan_discovery(struct wlan_objmgr_psoc *psoc,
|
||||||
uint8_t *data, uint32_t data_len)
|
uint8_t *data, uint32_t data_len)
|
||||||
{
|
{
|
||||||
struct nan_disable_req *nan_req;
|
struct nan_disable_req *nan_req;
|
||||||
QDF_STATUS status;
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
ucfg_nan_cleanup_all_ndps(psoc);
|
||||||
|
|
||||||
nan_req = qdf_mem_malloc(sizeof(*nan_req) + data_len);
|
nan_req = qdf_mem_malloc(sizeof(*nan_req) + data_len);
|
||||||
if (!nan_req)
|
if (!nan_req)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
Reference in New Issue
Block a user