Browse Source

qcacld-3.0: Move AP AP MCC allow check to policy mgr

This is requirement about moving AP AP MCC allow check to policy manager.

Change-Id: I2ac147e1a4ebdd42dfbcdcd6f8df98cc5c269cc9
CRs-Fixed: 3200011
Wu Gao 2 years ago
parent
commit
a4864947dd

+ 13 - 0
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -4393,4 +4393,17 @@ policy_mgr_get_connected_roaming_vdev_band_mask(struct wlan_objmgr_psoc *psoc,
 bool policy_mgr_is_sta_chan_valid_for_connect_and_roam(
 					struct wlan_objmgr_pdev *pdev,
 					qdf_freq_t freq);
+
+/**
+ * policy_mgr_is_ap_ap_mcc_allow() - Check AP AP MCC allow or not
+ * @psoc: psoc object
+ * @vdev: vdev object of new SAP or P2P GO
+ *
+ * Check if AP AP MCC allow or not when new SAP or P2P GO creating
+ *
+ * Return: True if the target allow AP AP MCC,
+ *         False otherwise.
+ */
+bool policy_mgr_is_ap_ap_mcc_allow(struct wlan_objmgr_psoc *psoc,
+				   struct wlan_objmgr_vdev *vdev);
 #endif /* __WLAN_POLICY_MGR_API_H */

+ 30 - 0
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -7871,3 +7871,33 @@ bool policy_mgr_is_hwmode_offload_enabled(struct wlan_objmgr_psoc *psoc)
 				   wmi_service_hw_mode_policy_offload_support);
 }
 
+bool policy_mgr_is_ap_ap_mcc_allow(struct wlan_objmgr_psoc *psoc,
+				   struct wlan_objmgr_vdev *vdev)
+{
+	enum QDF_OPMODE mode;
+	uint8_t mcc_to_scc_switch;
+
+	if (!psoc || !vdev) {
+		policy_mgr_debug("psoc or vdev is NULL");
+		return false;
+	}
+
+	mode = wlan_vdev_mlme_get_opmode(vdev);
+	policy_mgr_get_mcc_scc_switch(psoc, &mcc_to_scc_switch);
+
+	if (mode == QDF_P2P_GO_MODE &&
+	    policy_mgr_is_p2p_p2p_conc_supported(psoc))
+		return true;
+	if (!policy_mgr_concurrent_beaconing_sessions_running(psoc))
+		return true;
+	if (policy_mgr_dual_beacon_on_single_mac_mcc_capable(psoc))
+		return true;
+	if (!policy_mgr_dual_beacon_on_single_mac_scc_capable(psoc))
+		return true;
+	if ((mcc_to_scc_switch !=
+		QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION) &&
+	    (mcc_to_scc_switch != QDF_MCC_TO_SCC_WITH_PREFERRED_BAND))
+		return true;
+
+	return false;
+}

+ 10 - 14
core/hdd/src/wlan_hdd_hostapd.c

@@ -6957,31 +6957,27 @@ wlan_hdd_is_ap_ap_force_scc_override(struct hdd_adapter *adapter,
 	enum nl80211_channel_type channel_type;
 	uint8_t con_vdev_id;
 	uint32_t con_freq;
-	uint8_t mcc_to_scc_switch;
 	struct ieee80211_channel *ieee_chan;
 	uint32_t freq;
 	QDF_STATUS status;
+	struct wlan_objmgr_vdev *vdev;
 
 	if (!hdd_ctx || !chandef) {
 		hdd_err("hdd context or chandef is NULL");
 		return false;
 	}
 	freq = chandef->chan->center_freq;
-	if (adapter->device_mode == QDF_P2P_GO_MODE &&
-	    policy_mgr_is_p2p_p2p_conc_supported(hdd_ctx->psoc))
-		return false;
-	if (!policy_mgr_concurrent_beaconing_sessions_running(hdd_ctx->psoc))
-		return false;
-	if (policy_mgr_dual_beacon_on_single_mac_mcc_capable(hdd_ctx->psoc))
-		return false;
-	if (!policy_mgr_dual_beacon_on_single_mac_scc_capable(hdd_ctx->psoc))
+	vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_ID);
+	if (!vdev) {
+		hdd_err("failed to get vdev");
 		return false;
-	ucfg_policy_mgr_get_mcc_scc_switch(hdd_ctx->psoc,
-					   &mcc_to_scc_switch);
-	if ((mcc_to_scc_switch !=
-		QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION) &&
-	    (mcc_to_scc_switch != QDF_MCC_TO_SCC_WITH_PREFERRED_BAND))
+	}
+	if (policy_mgr_is_ap_ap_mcc_allow(hdd_ctx->psoc, vdev)) {
+		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
 		return false;
+	}
+	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
+
 	cc_count = policy_mgr_get_mode_specific_conn_info(hdd_ctx->psoc,
 							  &op_freq[0],
 							  &vdev_id[0],