qcacld-3.0: Disable NDPs on SAP startup

NAN_NDP+SAP concurrency is not supported. Disable all NAN_NDP
sessions on SAP startup.

Change-Id: I73284ef4f820dd15df808b9c44da5f09c6b5db26
CRs-fixed: 2524112
此提交包含在:
Manikandan Mohan
2019-09-11 12:34:49 -07:00
提交者 nshrivas
父節點 a3d2312fff
當前提交 a440567c76
共有 4 個檔案被更改,包括 65 行新增25 行删除

查看文件

@@ -314,11 +314,13 @@ int ucfg_nan_register_wma_callbacks(struct wlan_objmgr_psoc *psoc,
* ucfg_nan_check_and_disable_unsupported_ndi: ucfg API to check if NAN Datapath
* is active on multiple NDI's and disable the unsupported concurrencies.
* @psoc: pointer to psoc object
* @force: When set forces NDI disable
*
* Return: QDF_STATUS
*/
QDF_STATUS
ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc);
ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc,
bool force);
/**
* ucfg_ndi_remove_entry_from_policy_mgr() - API to remove NDI entry from
@@ -342,7 +344,8 @@ static inline void ucfg_nan_disable_concurrency(struct wlan_objmgr_psoc *psoc)
}
static inline QDF_STATUS
ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc)
ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc,
bool force)
{
return QDF_STATUS_SUCCESS;
}

查看文件

@@ -724,12 +724,11 @@ void ucfg_nan_disable_concurrency(struct wlan_objmgr_psoc *psoc)
osif_request_put(request);
}
QDF_STATUS
ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc)
static QDF_STATUS
ucfg_nan_disable_ndi(struct wlan_objmgr_psoc *psoc, uint32_t ndi_vdev_id)
{
enum nan_datapath_state curr_ndi_state;
struct nan_datapath_host_event *event;
uint32_t ndi_count, first_ndi_vdev_id;
struct nan_vdev_priv_obj *ndi_vdev_priv;
struct nan_datapath_end_all_ndps req = {0};
struct wlan_objmgr_vdev *ndi_vdev;
@@ -741,27 +740,10 @@ ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc)
.timeout_ms = 1000,
};
if (!psoc) {
nan_err("psoc object is NULL, no action will be taken");
return QDF_STATUS_E_INVAL;
}
if (!ucfg_is_ndi_dbs_supported(psoc))
return QDF_STATUS_SUCCESS;
ndi_count = policy_mgr_mode_specific_connection_count(psoc, PM_NDI_MODE,
NULL);
if (ndi_count < 2) {
nan_debug("No more than one NDI is active, nothing to do...");
return QDF_STATUS_SUCCESS;
}
/*
* At least 2 NDI active concurrencies exist. Disable all NDP's on the
* first NDI to support an incoming connection.
*/
first_ndi_vdev_id = policy_mgr_mode_specific_vdev_id(psoc, PM_NDI_MODE);
ndi_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, first_ndi_vdev_id,
ndi_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, ndi_vdev_id,
WLAN_NAN_ID);
if (!ndi_vdev) {
nan_err("Cannot obtain NDI vdev object!");
@@ -804,7 +786,7 @@ ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc)
goto cleanup;
}
nan_debug("Disabling all NDP's on NDI vdev id - %d", first_ndi_vdev_id);
nan_debug("Disabling all NDP's on NDI vdev id - %d", ndi_vdev_id);
err = osif_request_wait_for_response(request);
if (err) {
@@ -817,6 +799,13 @@ ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc)
if (!event->ndp_termination_in_progress) {
nan_err("Failed to terminate NDP's on NDI");
status = QDF_STATUS_E_FAILURE;
} else {
/*
* Host can assume NDP delete is successful and
* remove policy mgr entry
*/
policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE,
ndi_vdev_id);
}
cleanup:
@@ -834,6 +823,52 @@ cleanup:
return status;
}
QDF_STATUS
ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc,
bool force)
{
uint32_t ndi_count, first_ndi_vdev_id, i;
QDF_STATUS status;
if (!psoc) {
nan_err("psoc object is NULL, no action will be taken");
return QDF_STATUS_E_INVAL;
}
if (!ucfg_is_ndi_dbs_supported(psoc))
return QDF_STATUS_SUCCESS;
ndi_count = policy_mgr_mode_specific_connection_count(psoc, PM_NDI_MODE,
NULL);
/* NDP force disable is done for unsupported concurrencies: NDI+SAP */
if (force) {
nan_warn("Force disable all NDPs");
for (i = 0; i < ndi_count; i++) {
first_ndi_vdev_id =
policy_mgr_mode_specific_vdev_id(psoc,
PM_NDI_MODE);
status = ucfg_nan_disable_ndi(psoc, first_ndi_vdev_id);
if (QDF_IS_STATUS_ERROR(status))
return status;
}
return QDF_STATUS_SUCCESS;
}
if (ndi_count < 2) {
nan_debug("No more than one NDI is active, nothing to do...");
return QDF_STATUS_SUCCESS;
}
/*
* At least 2 NDI active concurrencies exist. Disable all NDP's on the
* first NDI to support an incoming connection.
*/
first_ndi_vdev_id = policy_mgr_mode_specific_vdev_id(psoc, PM_NDI_MODE);
status = ucfg_nan_disable_ndi(psoc, first_ndi_vdev_id);
return status;
}
QDF_STATUS ucfg_ndi_remove_entry_from_policy_mgr(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_psoc *psoc;