Browse Source

qcacmn: Find best 6 GHz power type for connection

Find the best 6 GHz power type for connection
according to following regulatory policy:
1) SP power type is selected only if AP advertises
   SP and client supports SP.
2) LPI power type is selected only if AP advertises
   LPI and client supports LPI.
3) VLP power type is selected for the below cases,
   a) AP advertises VLP and client supports VLP
   b) AP advertises SP but client doesn't support
      SP but supports VLP.
   c) AP advertises LPI but client doesn't support
      LPI but supports VLP.

Change-Id: I6e3b9fc4bf7445c58681ef0ea8e45b434851a5b6
CRs-Fixed: 3456182
Asutosh Mohapatra 2 years ago
parent
commit
459cea50e2

+ 28 - 53
umac/regulatory/core/src/reg_utils.c

@@ -394,12 +394,10 @@ QDF_STATUS reg_get_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
 #ifdef CONFIG_REG_CLIENT
 #ifdef CONFIG_BAND_6GHZ
 QDF_STATUS
-reg_get_6g_power_type_for_ctry(struct wlan_objmgr_psoc *psoc,
-			       struct wlan_objmgr_pdev *pdev,
-			       uint8_t *ap_ctry, uint8_t *sta_ctry,
-			       enum reg_6g_ap_type *pwr_type_6g,
-			       bool *ctry_code_match,
-			       enum reg_6g_ap_type ap_pwr_type)
+reg_get_best_6g_power_type(struct wlan_objmgr_psoc *psoc,
+			   struct wlan_objmgr_pdev *pdev,
+			   enum reg_6g_ap_type *pwr_type_6g,
+			   enum reg_6g_ap_type ap_pwr_type)
 {
 	struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj;
 
@@ -410,65 +408,42 @@ reg_get_6g_power_type_for_ctry(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	reg_debug("STA country: %c%c, AP country: %c%c, AP power type: %d",
-		  sta_ctry[0], sta_ctry[1], ap_ctry[0], ap_ctry[1],
-		  ap_pwr_type);
-
-	if (!qdf_mem_cmp(ap_ctry, sta_ctry, REG_ALPHA2_LEN)) {
-		*ctry_code_match = true;
-		if (ap_pwr_type == REG_VERY_LOW_POWER_AP) {
-			if (!pdev_priv_obj->reg_rules.num_of_6g_client_reg_rules[ap_pwr_type]) {
-				reg_err("VLP not supported, can't connect");
-				return QDF_STATUS_E_NOSUPPORT;
-			}
-		}
+	if (pdev_priv_obj->reg_rules.num_of_6g_client_reg_rules[ap_pwr_type]) {
+		reg_debug("AP power type: %d , is supported by client",
+			  ap_pwr_type);
 		return QDF_STATUS_SUCCESS;
 	}
 
-	*ctry_code_match = false;
-	/*
-	 * If reg_info=0 not included, STA should operate in VLP mode.
-	 * If STA country doesn't support VLP, do not return if Wi-Fi
-	 * safe mode or RF test mode or enable relaxed connection policy,
-	 * rather STA should operate in LPI mode.
-	 * wlan_cm_get_check_6ghz_security API returns true if
-	 * neither Safe mode nor RF test mode are enabled.
-	 * wlan_cm_get_relaxed_6ghz_conn_policy API returns true if
-	 * enabled.
-	 */
-	if (ap_pwr_type != REG_INDOOR_AP) {
-		if (wlan_reg_ctry_support_vlp(sta_ctry) &&
-		    wlan_reg_ctry_support_vlp(ap_ctry)) {
-			reg_debug("STA ctry doesn't match with AP ctry, switch to VLP");
+	if (ap_pwr_type == REG_INDOOR_AP) {
+		if (pdev_priv_obj->reg_rules.num_of_6g_client_reg_rules[REG_VERY_LOW_POWER_AP]) {
 			*pwr_type_6g = REG_VERY_LOW_POWER_AP;
+			reg_debug("AP power type = %d, selected power type = %d",
+				  ap_pwr_type, *pwr_type_6g);
+			return QDF_STATUS_SUCCESS;
 		} else {
-			reg_debug("AP or STA doesn't support VLP");
-			*pwr_type_6g = REG_INDOOR_AP;
+			goto no_support;
 		}
-
-		if (!wlan_reg_ctry_support_vlp(sta_ctry) &&
-		    wlan_cm_get_check_6ghz_security(psoc) &&
-		    !wlan_cm_get_relaxed_6ghz_conn_policy(psoc)) {
-			reg_err("VLP not supported, can't connect");
-			return QDF_STATUS_E_NOSUPPORT;
+	} else if (ap_pwr_type == REG_STANDARD_POWER_AP) {
+		if (pdev_priv_obj->reg_rules.num_of_6g_client_reg_rules[REG_VERY_LOW_POWER_AP]) {
+			*pwr_type_6g = REG_VERY_LOW_POWER_AP;
+			reg_debug("AP power type = %d, selected power type = %d",
+				  ap_pwr_type, *pwr_type_6g);
+			return QDF_STATUS_SUCCESS;
+		} else {
+			goto no_support;
 		}
 	}
 
-	if (ap_pwr_type == REG_INDOOR_AP) {
-		reg_debug("Indoor AP, allow STA IN LPI");
-		*pwr_type_6g = REG_INDOOR_AP;
-	}
-
-	return QDF_STATUS_SUCCESS;
+no_support:
+	reg_err("AP power type = %d, not supported", ap_pwr_type);
+	return QDF_STATUS_E_NOSUPPORT;
 }
 #else
 QDF_STATUS
-reg_get_6g_power_type_for_ctry(struct wlan_objmgr_psoc *psoc,
-			       struct wlan_objmgr_pdev *pdev,
-			       uint8_t *ap_ctry, uint8_t *sta_ctry,
-			       enum reg_6g_ap_type *pwr_type_6g,
-			       bool *ctry_code_match,
-			       enum reg_6g_ap_type ap_pwr_type)
+reg_get_best_6g_power_type(struct wlan_objmgr_psoc *psoc,
+			   struct wlan_objmgr_pdev *pdev,
+			   enum reg_6g_ap_type *pwr_type_6g,
+			   enum reg_6g_ap_type ap_pwr_type)
 {
 	return QDF_STATUS_SUCCESS;
 }

+ 14 - 10
umac/regulatory/core/src/reg_utils.h

@@ -262,23 +262,27 @@ QDF_STATUS reg_get_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
 
 #ifdef CONFIG_REG_CLIENT
 /**
- * reg_get_6g_power_type_for_ctry() - Return power type for 6G based on cntry IE
+ * reg_get_best_6g_power_type() - Return best power type for 6 GHz connection
  * @psoc: pointer to psoc
  * @pdev: pointer to pdev
- * @ap_ctry: pointer to country string in country IE
- * @sta_ctry: pointer to sta programmed country
  * @pwr_type_6g: pointer to 6G power type
- * @ctry_code_match: Check for country IE and sta country code match
  * @ap_pwr_type: AP's power type as advertised in HE ops IE
+ *
+ * This function computes best power type for 6 GHz connection.
+ * SP power type is selected only if AP advertises SP and client supports SP.
+ * LPI power type is selected only if AP advertises LPI and client supports LPI.
+ * VLP power type is selected for the below cases,
+ * a) AP advertises VLP and client supports VLP.
+ * b) AP advertises SP but client doesn't support SP but supports VLP.
+ * c) AP advertises LPI but client doesn't support LPI but supports VLP.
+ *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-reg_get_6g_power_type_for_ctry(struct wlan_objmgr_psoc *psoc,
-			       struct wlan_objmgr_pdev *pdev,
-			       uint8_t *ap_ctry, uint8_t *sta_ctry,
-			       enum reg_6g_ap_type *pwr_type_6g,
-			       bool *ctry_code_match,
-			       enum reg_6g_ap_type ap_pwr_type);
+reg_get_best_6g_power_type(struct wlan_objmgr_psoc *psoc,
+			   struct wlan_objmgr_pdev *pdev,
+			   enum reg_6g_ap_type *pwr_type_6g,
+			   enum reg_6g_ap_type ap_pwr_type);
 #endif
 
 /**

+ 6 - 11
umac/regulatory/dispatcher/inc/wlan_reg_services_api.h

@@ -586,24 +586,19 @@ QDF_STATUS wlan_reg_read_current_country(struct wlan_objmgr_psoc *psoc,
 
 #ifdef CONFIG_REG_CLIENT
 /**
- * wlan_reg_get_6g_power_type_for_ctry() - Return power type for 6G based
- * on country IE
+ * wlan_reg_get_best_6g_power_type() - Return best power type for 6GHz
+ * connection
  * @psoc: pointer to psoc
  * @pdev: pointer to pdev
- * @ap_ctry: pointer to country string in country IE
- * @sta_ctry: pointer to sta programmed country
  * @pwr_type_6g: pointer to 6G power type
- * @ctry_code_match: Check for country IE and sta country code match
  * @ap_pwr_type: AP's power type for 6G as advertised in HE ops IE
  * Return: QDF_STATUS
  */
 QDF_STATUS
-wlan_reg_get_6g_power_type_for_ctry(struct wlan_objmgr_psoc *psoc,
-				    struct wlan_objmgr_pdev *pdev,
-				    uint8_t *ap_ctry, uint8_t *sta_ctry,
-				    enum reg_6g_ap_type *pwr_type_6g,
-				    bool *ctry_code_match,
-				    enum reg_6g_ap_type ap_pwr_type);
+wlan_reg_get_best_6g_power_type(struct wlan_objmgr_psoc *psoc,
+				struct wlan_objmgr_pdev *pdev,
+				enum reg_6g_ap_type *pwr_type_6g,
+				enum reg_6g_ap_type ap_pwr_type);
 #endif
 
 #ifdef CONFIG_CHAN_FREQ_API

+ 7 - 10
umac/regulatory/dispatcher/src/wlan_reg_services_api.c

@@ -104,16 +104,13 @@ qdf_export_symbol(wlan_reg_get_pwrmode_chan_list);
 
 #ifdef CONFIG_REG_CLIENT
 QDF_STATUS
-wlan_reg_get_6g_power_type_for_ctry(struct wlan_objmgr_psoc *psoc,
-				    struct wlan_objmgr_pdev *pdev,
-				    uint8_t *ap_ctry, uint8_t *sta_ctry,
-				    enum reg_6g_ap_type *pwr_type_6g,
-				    bool *ctry_code_match,
-				    enum reg_6g_ap_type ap_pwr_type)
-{
-	return reg_get_6g_power_type_for_ctry(psoc, pdev, ap_ctry, sta_ctry,
-					      pwr_type_6g, ctry_code_match,
-					      ap_pwr_type);
+wlan_reg_get_best_6g_power_type(struct wlan_objmgr_psoc *psoc,
+				struct wlan_objmgr_pdev *pdev,
+				enum reg_6g_ap_type *pwr_type_6g,
+				enum reg_6g_ap_type ap_pwr_type)
+{
+	return reg_get_best_6g_power_type(psoc, pdev, pwr_type_6g,
+					  ap_pwr_type);
 }
 #endif