Bläddra i källkod

qcacmn: Handle multiple H/w DBS modes

Host handling enhanced in case of F/w advertising multiple DBS H/w modes

Change-Id: I90dfd9360df60be126dbfa8add30d38aeb6f7bf1
CRs-Fixed: 2048301
Vikrampal 8 år sedan
förälder
incheckning
f1e9389791

+ 3 - 5
umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -1890,11 +1890,9 @@ QDF_STATUS policy_mgr_is_chan_ok_for_dnbs(struct wlan_objmgr_psoc *psoc,
  * @psoc: PSOC object information
  * @nss_dbs: NSS info of both MAC0 and MAC1
  * This function computes NSS info of both MAC0 and MAC1
- *    True: DBS capable
- *    False: not DBS capable
  *
- * Return: True or False
+ * Return: uint32_t value signifies supported RF chains
  */
-bool policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc,
-			       struct dbs_nss *nss_dbs);
+uint32_t policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc,
+				   struct dbs_nss *nss_dbs);
 #endif /* __WLAN_POLICY_MGR_API_H */

+ 20 - 21
umac/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -752,18 +752,10 @@ bool policy_mgr_is_dbs_enable(struct wlan_objmgr_psoc *psoc)
 
 bool policy_mgr_is_hw_dbs_2x2_capable(struct wlan_objmgr_psoc *psoc)
 {
-	uint32_t max_rf_chains, final_min_rf_chains = HW_MODE_SS_2x2;
 	struct dbs_nss nss_dbs;
 
-	if (policy_mgr_get_hw_dbs_nss(psoc, &nss_dbs)) {
-		max_rf_chains = QDF_MAX(nss_dbs.mac0_ss, nss_dbs.mac1_ss);
-		final_min_rf_chains
-			= QDF_MIN(final_min_rf_chains, max_rf_chains);
-	} else {
-		final_min_rf_chains = HW_MODE_SS_0x0;
-	}
-
-	return (final_min_rf_chains == HW_MODE_SS_2x2) ? true : false;
+	return ((policy_mgr_get_hw_dbs_nss(psoc, &nss_dbs)) >= HW_MODE_SS_2x2)
+		? true : false;
 }
 
 uint32_t policy_mgr_get_connection_count(struct wlan_objmgr_psoc *psoc)
@@ -2479,13 +2471,13 @@ QDF_STATUS policy_mgr_is_chan_ok_for_dnbs(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
-bool policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc,
-			       struct dbs_nss *nss_dbs)
+uint32_t policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc,
+				   struct dbs_nss *nss_dbs)
 {
 	int i, param;
 	uint32_t dbs, tx_chain0, rx_chain0, tx_chain1, rx_chain1;
 	uint32_t min_mac0_rf_chains, min_mac1_rf_chains;
-	bool is_dbs_found = false;
+	uint32_t max_rf_chains, final_max_rf_chains = HW_MODE_SS_0x0;
 	struct policy_mgr_psoc_priv_obj *pm_ctx;
 
 	pm_ctx = policy_mgr_get_context(psoc);
@@ -2510,19 +2502,26 @@ bool policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc,
 			min_mac0_rf_chains = QDF_MIN(tx_chain0, rx_chain0);
 			min_mac1_rf_chains = QDF_MIN(tx_chain1, rx_chain1);
 
-			nss_dbs->mac0_ss
-				= (min_mac0_rf_chains == 2)
-				? HW_MODE_SS_2x2 : HW_MODE_SS_1x1;
+			max_rf_chains
+			= QDF_MAX(min_mac0_rf_chains, min_mac1_rf_chains);
 
-			nss_dbs->mac1_ss
-				= (min_mac1_rf_chains == 2)
-				? HW_MODE_SS_2x2 : HW_MODE_SS_1x1;
+			if (final_max_rf_chains < max_rf_chains) {
+				final_max_rf_chains
+					= (max_rf_chains == 2)
+					? HW_MODE_SS_2x2 : HW_MODE_SS_1x1;
 
-			is_dbs_found = true;
+				nss_dbs->mac0_ss
+					= (min_mac0_rf_chains == 2)
+					? HW_MODE_SS_2x2 : HW_MODE_SS_1x1;
+
+				nss_dbs->mac1_ss
+					= (min_mac1_rf_chains == 2)
+					? HW_MODE_SS_2x2 : HW_MODE_SS_1x1;
+			}
 		} else {
 			continue;
 		}
 	}
 
-	return is_dbs_found;
+	return final_max_rf_chains;
 }