ソースを参照

qcacmn: Move repetitive function bodies into a single function

The body of the two following functions:
1)reg_get_num_sp_freq_ranges,
2)reg_cp_freq_ranges
have much in common.

Move the common part into a single function in order to optimize code size.

Change-Id: Ice9e925ef0e64baa41f867a92a3c3d2902374d74
CRs-Fixed: 3019338
Abhijit Pradhan 3 年 前
コミット
bd02b05aa5

+ 2 - 2
umac/regulatory/core/src/reg_opclass.c

@@ -593,9 +593,9 @@ static bool reg_is_subrange(struct freq_range *range_first,
 /**
  * reg_is_cfi_freq_in_ranges() - Check if the given 'cfi' in the any of the
  * frequency ranges
- * @cfi_freq: The ceter frequency index frequency
+ * @cfi_freq: The center frequency index frequency
  * @bw: bandwidth of the band with center freq cfi_freq
- * @p_frange_lst: Pointer to frequencey range list (AFC)
+ * @p_frange_lst: Pointer to frequency range list (AFC)
  *
  * return: True if the cfi is in the ranges, else false
  */

+ 99 - 42
umac/regulatory/core/src/reg_services_common.c

@@ -4927,19 +4927,36 @@ reg_intersect_ranges(struct freq_range *first_range,
 }
 
 /**
- * reg_get_num_sp_freq_ranges() - Find the number of reg rules from the Standard
- * power regulatory rules
+ * reg_act_sp_rule_cb -  A function pointer type that calculate something
+ * from the input frequency range
+ * @rule_fr: Pointer to frequencey range
+ * @arg: Pointer to generic argument (a.k.a. context)
+ *
+ * Return: Void
+ */
+typedef void (*reg_act_sp_rule_cb)(struct freq_range *rule_fr,
+				   void *arg);
+
+/**
+ * reg_iterate_sp_rules() - Iterate through the Standard Power reg rules, for
+ * every reg rule call the call back function to take some action or calculate
+ * something
  * @pdev: Pointer to pdev
+ * @pdev_priv_obj: Pointer to pdev private object
+ * @action_on_sp_rule: A function pointer to take some action or calculate
+ * something for every sp rule
+ * @arg: Pointer to opque object (argument/context)
  *
- * Return: number of frequency ranges
+ * Return: Void
  */
-static uint8_t reg_get_num_sp_freq_ranges(struct wlan_objmgr_pdev *pdev,
-					  struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj)
+static void reg_iterate_sp_rules(struct wlan_objmgr_pdev *pdev,
+				 struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj,
+				 reg_act_sp_rule_cb sp_rule_action,
+				 void *arg)
 {
 	struct cur_reg_rule *p_sp_reg_rule;
 	struct reg_rule_info *psoc_reg_rules;
 	uint8_t n_6g_sp_ap_reg_rules;
-	uint8_t num_freq_ranges;
 	qdf_freq_t low_5g;
 	qdf_freq_t high_5g;
 	uint8_t i;
@@ -4957,7 +4974,6 @@ static uint8_t reg_get_num_sp_freq_ranges(struct wlan_objmgr_pdev *pdev,
 	reg_debug("chip_range = [%u, %u]", low_5g, high_5g);
 	reg_debug("Num_6g_rules = %u", n_6g_sp_ap_reg_rules);
 
-	num_freq_ranges = 0;
 	for (i = 0; i < n_6g_sp_ap_reg_rules; i++) {
 		struct freq_range sp_range;
 		struct freq_range out_range;
@@ -4967,23 +4983,87 @@ static uint8_t reg_get_num_sp_freq_ranges(struct wlan_objmgr_pdev *pdev,
 		reg_debug("Rule:[%u, %u]",
 			  p_sp_reg_rule->start_freq,
 			  p_sp_reg_rule->end_freq);
-
 		out_range = reg_intersect_ranges(&chip_range, &sp_range);
-		if (reg_is_empty_range(&out_range))
-			continue;
+
+		if (sp_rule_action)
+			sp_rule_action(&out_range, arg);
 
 		p_sp_reg_rule++;
-		num_freq_ranges++;
 	}
+}
+
+/**
+ * reg_afc_incr_num_ranges() - Increment the number of frequency ranges
+ * @p_range: Pointer to frequency range
+ * @num_freq_ranges: Pointer to number of frequency ranges. This needs to be
+ * (Actual type: uint8_t *num_freq_ranges)
+ * incremented by the function
+ *
+ * Return: Void
+ */
+static void reg_afc_incr_num_ranges(struct freq_range *p_range,
+				    void *num_freq_ranges)
+{
+	if (!reg_is_empty_range(p_range))
+		(*(uint8_t *)num_freq_ranges)++;
+}
+
+/**
+ * reg_get_num_sp_freq_ranges() - Find the number of reg rules from the Standard
+ * power regulatory rules
+ * @pdev: Pointer to pdev
+ *
+ * Return: number of frequency ranges
+ */
+static uint8_t reg_get_num_sp_freq_ranges(struct wlan_objmgr_pdev *pdev,
+					  struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj)
+{
+	uint8_t num_freq_ranges;
+
+	num_freq_ranges = 0;
+	reg_iterate_sp_rules(pdev,
+			     pdev_priv_obj,
+			     reg_afc_incr_num_ranges,
+			     &num_freq_ranges);
 
 	reg_debug("Num_freq_ranges=%u", num_freq_ranges);
 	return num_freq_ranges;
 }
 
+/**
+ * reg_afc_get_intersected_ranges() - Get the intersected range into range obj
+ * @rule_fr: Pointer to the rule for frequency range
+ * @arg: Pointer to opaque object (argument/context)
+ * (Actual type: struct wlan_afc_freq_range_obj **p_range_obj)
+ * incremented by the function
+ *
+ * Return: Void
+ */
+static void reg_afc_get_intersected_ranges(struct freq_range *rule_fr,
+					   void *arg)
+{
+	struct wlan_afc_freq_range_obj *p_range;
+	struct wlan_afc_freq_range_obj **pp_range;
+
+	pp_range = (struct wlan_afc_freq_range_obj **)arg;
+	p_range = *pp_range;
+
+	if (!reg_is_empty_range(rule_fr)) {
+		reg_assign_vars_with_range_vals(rule_fr,
+						&p_range->lowfreq,
+						&p_range->highfreq);
+		reg_debug("Range = [%u, %u]", p_range->lowfreq, p_range->highfreq);
+		(*pp_range)++;
+	}
+}
+
 /**
  * reg_cp_freq_ranges() - Copy frequency ranges  from the Standard power
  * regulatory rules
  * @pdev: Pointer to pdev
+ * @pdev_priv_obj: Pointer to pdev private object
+ * @num_freq_ranges: Number of frequency ranges
+ * @p_range_obj: Pointer to range object
  *
  * Return: void
  */
@@ -4992,38 +5072,15 @@ static void reg_cp_freq_ranges(struct wlan_objmgr_pdev *pdev,
 			       uint8_t num_freq_ranges,
 			       struct wlan_afc_freq_range_obj *p_range_obj)
 {
-	struct cur_reg_rule *p_sp_reg_rule;
-	struct reg_rule_info *psoc_reg_rules;
-	uint8_t i;
-	qdf_freq_t low_5g;
-	qdf_freq_t high_5g;
-	struct freq_range chip_range;
-
-	psoc_reg_rules = reg_get_reg_rules_for_pdev(pdev);
-	p_sp_reg_rule = psoc_reg_rules->reg_rules_6g_ap[REG_STANDARD_POWER_AP];
-
-	low_5g = pdev_priv_obj->range_5g_low;
-	high_5g = pdev_priv_obj->range_5g_high;
+	struct wlan_afc_freq_range_obj *p_range;
 
-	chip_range = reg_init_freq_range(low_5g, high_5g);
+	reg_debug("Num freq ranges = %u", num_freq_ranges);
 
-	for (i = 0; i < num_freq_ranges; i++) {
-		struct freq_range sp_range;
-		struct freq_range out_range;
-
-		sp_range = reg_init_freq_range(p_sp_reg_rule->start_freq,
-					       p_sp_reg_rule->end_freq);
-
-		out_range = reg_intersect_ranges(&chip_range, &sp_range);
-		if (reg_is_empty_range(&out_range))
-			continue;
-
-		reg_assign_vars_with_range_vals(&out_range,
-						&p_range_obj->lowfreq,
-						&p_range_obj->highfreq);
-		p_range_obj++;
-		p_sp_reg_rule++;
-	}
+	p_range = p_range_obj;
+	reg_iterate_sp_rules(pdev,
+			     pdev_priv_obj,
+			     reg_afc_get_intersected_ranges,
+			     &p_range);
 }
 
 /**
@@ -5363,6 +5420,7 @@ reg_get_partial_afc_req_info(struct wlan_objmgr_pdev *pdev,
 		status = QDF_STATUS_E_NOMEM;
 		goto handle_invalid_priv_object;
 	}
+
 	status = reg_dmn_get_6g_opclasses_and_channels(pdev,
 						       p_frange_lst_local,
 						       &num_opclasses,
@@ -5381,7 +5439,6 @@ reg_get_partial_afc_req_info(struct wlan_objmgr_pdev *pdev,
 					     chansize_lst);
 
 	temp_afc_req = qdf_mem_malloc(afc_req_len);
-
 	if (!temp_afc_req) {
 		reg_err("AFC request not allocated");
 		status = QDF_STATUS_E_NOMEM;