|
@@ -1213,12 +1213,42 @@ void nan_handle_emlsr_concurrency(struct wlan_objmgr_psoc *psoc,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+bool nan_is_sta_sta_concurrency_present(struct wlan_objmgr_psoc *psoc)
|
|
|
+{
|
|
|
+ uint32_t sta_cnt;
|
|
|
+
|
|
|
+ sta_cnt = policy_mgr_mode_specific_connection_count(psoc, PM_STA_MODE,
|
|
|
+ NULL);
|
|
|
+ /* Allow if STA is not in connected state */
|
|
|
+ if (!sta_cnt)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * sta > 2 : (STA + STA + STA) or (ML STA + STA) or (ML STA + ML STA),
|
|
|
+ * STA concurrency will be present.
|
|
|
+ *
|
|
|
+ * ML STA: Although both links would be treated as separate STAs
|
|
|
+ * (sta cnt = 2) from policy mgr perspective, but it is not considered
|
|
|
+ * as STA concurrency
|
|
|
+ */
|
|
|
+ if (sta_cnt > 2 ||
|
|
|
+ (sta_cnt == 2 && policy_mgr_is_non_ml_sta_present(psoc)))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
QDF_STATUS nan_discovery_pre_enable(struct wlan_objmgr_pdev *pdev,
|
|
|
uint32_t nan_ch_freq)
|
|
|
{
|
|
|
QDF_STATUS status = QDF_STATUS_E_INVAL;
|
|
|
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
|
|
|
|
|
|
+ if (!psoc) {
|
|
|
+ nan_err("psoc is null");
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+
|
|
|
status = nan_set_discovery_state(psoc, NAN_DISC_ENABLE_IN_PROGRESS);
|
|
|
|
|
|
if (QDF_IS_STATUS_ERROR(status)) {
|
|
@@ -1235,6 +1265,16 @@ QDF_STATUS nan_discovery_pre_enable(struct wlan_objmgr_pdev *pdev,
|
|
|
goto pre_enable_failure;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Reject STA+STA in below case
|
|
|
+ * Non-ML STA: STA+STA+NAN concurrency is not supported
|
|
|
+ */
|
|
|
+ if (nan_is_sta_sta_concurrency_present(psoc)) {
|
|
|
+ nan_err("STA+STA+NAN concurrency is not allowed");
|
|
|
+ status = QDF_STATUS_E_FAILURE;
|
|
|
+ goto pre_enable_failure;
|
|
|
+ }
|
|
|
+
|
|
|
wlan_p2p_abort_scan(pdev);
|
|
|
|
|
|
if (policy_mgr_is_hw_dbs_capable(psoc)) {
|