qcacld-3.0: Update policy mgr table if nan_conc control is supported

Currently, policy mgr table entries correspond to NAN/NDI are
updated only if nan_dbs is supported. Update/access the
policy mgr table even when nan_conc_control is supported by host.
This allows the host to take care of NAN cuncurrencies through
policy mgr on the non-DBS platforms.
Process NAN enable request in host if nan_conc_control is
supported, which updates the NAN entry to policy mgr table.

Change-Id: Id6e58a9bfde6ceb66a8a0b33136880f75e36090f
CRs-Fixed: 2729995
This commit is contained in:
Srinivas Dasari
2020-07-10 00:35:11 +05:30
committed by nshrivas
vanhempi c6551b04b0
commit 440a823073
5 muutettua tiedostoa jossa 77 lisäystä ja 59 poistoa

Näytä tiedosto

@@ -447,14 +447,14 @@ ndi_remove_and_update_primary_connection(struct wlan_objmgr_psoc *psoc,
peer = peer_next;
}
if (!peer && psoc_nan_obj->nan_caps.ndi_dbs_supported) {
if (!peer && NDI_CONCURRENCY_SUPPORTED(psoc)) {
policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE,
wlan_vdev_get_id(vdev));
vdev_nan_obj->ndp_init_done = false;
return QDF_STATUS_SUCCESS;
}
if (peer_nan_obj && psoc_nan_obj->nan_caps.ndi_dbs_supported) {
if (peer_nan_obj && NDI_CONCURRENCY_SUPPORTED(psoc)) {
psoc_nan_obj->cb_obj.update_ndi_conn(wlan_vdev_get_id(vdev),
&peer_nan_obj->home_chan_info);
policy_mgr_update_connection_info(psoc, wlan_vdev_get_id(vdev));
@@ -523,14 +523,33 @@ ndi_update_ndp_session(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS nan_handle_confirm(
struct nan_datapath_confirm_event *confirm)
static QDF_STATUS
ndi_update_policy_mgr_conn_table(struct nan_datapath_confirm_event *confirm,
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
{
uint8_t vdev_id, channel;
QDF_STATUS status = QDF_STATUS_SUCCESS;
if (policy_mgr_is_hw_dbs_capable(psoc)) {
status = policy_mgr_update_and_wait_for_connection_update(psoc,
vdev_id, confirm->ch[0].freq,
POLICY_MGR_UPDATE_REASON_NDP_UPDATE);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("Failed to set or wait for HW mode change");
return status;
}
}
policy_mgr_incr_active_session(psoc, QDF_NDI_MODE, vdev_id);
return status;
}
static QDF_STATUS nan_handle_confirm(struct nan_datapath_confirm_event *confirm)
{
uint8_t vdev_id;
struct wlan_objmgr_psoc *psoc;
struct nan_psoc_priv_obj *psoc_nan_obj;
struct nan_vdev_priv_obj *vdev_nan_obj;
QDF_STATUS status;
vdev_id = wlan_vdev_get_id(confirm->vdev);
psoc = wlan_vdev_get_psoc(confirm->vdev);
@@ -584,35 +603,9 @@ static QDF_STATUS nan_handle_confirm(
psoc_nan_obj->cb_obj.update_ndi_conn(vdev_id, &confirm->ch[0]);
if (psoc_nan_obj->nan_caps.ndi_dbs_supported) {
channel = wlan_freq_to_chan(confirm->ch[0].freq);
status = policy_mgr_reset_connection_update(psoc);
if (!QDF_IS_STATUS_SUCCESS(status)) {
nan_err("Policy mgr reset connection failed-%d",
status);
return status;
}
status = policy_mgr_current_connections_update(
psoc, vdev_id, wlan_chan_to_freq(channel),
POLICY_MGR_UPDATE_REASON_NDP_UPDATE,
POLICY_MGR_DEF_REQ_ID);
if (QDF_STATUS_E_FAILURE == status) {
nan_err("connections update failed!!");
return status;
}
if (QDF_STATUS_SUCCESS == status) {
status = policy_mgr_wait_for_connection_update(
psoc);
if (!QDF_IS_STATUS_SUCCESS(status)) {
nan_err("qdf wait for event failed!!");
return status;
}
}
policy_mgr_incr_active_session(psoc, QDF_NDI_MODE,
vdev_id);
if (NAN_CONCURRENCY_SUPPORTED(psoc)) {
ndi_update_policy_mgr_conn_table(confirm, psoc,
vdev_id);
vdev_nan_obj->ndp_init_done = true;
}
}
@@ -1099,6 +1092,7 @@ bool nan_is_enable_allowed(struct wlan_objmgr_psoc *psoc, uint32_t nan_ch_freq)
}
return (NAN_DISC_DISABLED == nan_get_discovery_state(psoc) &&
ucfg_is_nan_conc_control_supported(psoc) &&
policy_mgr_allow_concurrency(psoc, PM_NAN_DISC_MODE,
nan_ch_freq, HW_MODE_20_MHZ));
}
@@ -1114,21 +1108,14 @@ bool nan_is_disc_active(struct wlan_objmgr_psoc *psoc)
NAN_DISC_ENABLE_IN_PROGRESS == nan_get_discovery_state(psoc));
}
QDF_STATUS nan_discovery_pre_enable(struct wlan_objmgr_psoc *psoc,
uint32_t nan_ch_freq)
static QDF_STATUS nan_set_hw_mode(struct wlan_objmgr_psoc *psoc,
uint32_t nan_ch_freq)
{
QDF_STATUS status = QDF_STATUS_E_INVAL;
struct wlan_objmgr_pdev *pdev = NULL;
struct wlan_objmgr_vdev *vdev = NULL;
uint8_t vdev_id;
status = nan_set_discovery_state(psoc, NAN_DISC_ENABLE_IN_PROGRESS);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("Unable to set NAN Disc State to ENABLE_IN_PROGRESS");
goto pre_enable_failure;
}
policy_mgr_stop_opportunistic_timer(psoc);
if (policy_mgr_is_hw_mode_change_in_progress(psoc)) {
@@ -1146,15 +1133,6 @@ QDF_STATUS nan_discovery_pre_enable(struct wlan_objmgr_psoc *psoc,
goto pre_enable_failure;
}
if (policy_mgr_mode_specific_connection_count(psoc, PM_SAP_MODE,
NULL) &&
!policy_mgr_nan_sap_pre_enable_conc_check(psoc, PM_NAN_DISC_MODE,
nan_ch_freq)) {
nan_debug("NAN not enabled due to concurrency constraints");
status = QDF_STATUS_E_INVAL;
goto pre_enable_failure;
}
/* Piggyback on any available vdev for policy manager update */
vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_NAN_ID);
if (!vdev) {
@@ -1173,15 +1151,46 @@ QDF_STATUS nan_discovery_pre_enable(struct wlan_objmgr_psoc *psoc,
goto pre_enable_failure;
}
pre_enable_failure:
if (pdev)
wlan_objmgr_pdev_release_ref(pdev, WLAN_NAN_ID);
return status;
}
QDF_STATUS nan_discovery_pre_enable(struct wlan_objmgr_psoc *psoc,
uint32_t nan_ch_freq)
{
QDF_STATUS status = QDF_STATUS_E_INVAL;
status = nan_set_discovery_state(psoc, NAN_DISC_ENABLE_IN_PROGRESS);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("Unable to set NAN Disc State to ENABLE_IN_PROGRESS");
goto pre_enable_failure;
}
if (policy_mgr_mode_specific_connection_count(psoc, PM_SAP_MODE,
NULL) &&
!policy_mgr_nan_sap_pre_enable_conc_check(psoc, PM_NAN_DISC_MODE,
nan_ch_freq)) {
nan_debug("NAN not enabled due to concurrency constraints");
status = QDF_STATUS_E_INVAL;
goto pre_enable_failure;
}
if (policy_mgr_is_hw_dbs_capable(psoc)) {
status = nan_set_hw_mode(psoc, nan_ch_freq);
if (QDF_IS_STATUS_ERROR(status))
goto pre_enable_failure;
}
/* Try to teardown TDLS links, but do not wait */
status = ucfg_tdls_teardown_links(psoc);
if (QDF_IS_STATUS_ERROR(status))
nan_err("Failed to teardown TDLS links");
pre_enable_failure:
if (pdev)
wlan_objmgr_pdev_release_ref(pdev, WLAN_NAN_ID);
if (QDF_IS_STATUS_ERROR(status))
nan_set_discovery_state(psoc, NAN_DISC_DISABLED);

Näytä tiedosto

@@ -26,6 +26,14 @@
#include "wlan_objmgr_cmn.h"
#include "nan_public_structs.h"
#define NAN_CONCURRENCY_SUPPORTED(psoc) \
(ucfg_is_nan_dbs_supported(psoc) || \
ucfg_is_nan_conc_control_supported(psoc))
#define NDI_CONCURRENCY_SUPPORTED(psoc) \
(ucfg_is_ndi_dbs_supported(psoc) || \
ucfg_is_nan_conc_control_supported(psoc))
#ifdef WLAN_FEATURE_NAN
#define ucfg_nan_set_ndi_state(vdev, state) \
__ucfg_nan_set_ndi_state(vdev, state, __func__)

Näytä tiedosto

@@ -999,7 +999,7 @@ QDF_STATUS ucfg_ndi_remove_entry_from_policy_mgr(struct wlan_objmgr_vdev *vdev)
qdf_spin_unlock_bh(&vdev_priv_obj->lock);
if (state == NAN_DATA_NDI_DELETED_STATE &&
psoc_priv_obj->nan_caps.ndi_dbs_supported &&
NDI_CONCURRENCY_SUPPORTED(psoc) &&
active_ndp_peers) {
nan_info("Delete NDP peers: %u and remove NDI from policy mgr",
active_ndp_peers);