qcacmn: Parse function is split to modularize code
Instead of having a large function, the parse function is
split into 3 for A)Country ISO B)CountryCode and
C)RegDomain Pair ID.
Change-Id: I5b3574cd54644d1eac13e3eff762eb7cbdd35a73
CRs-Fixed: 2002892
diff --git a/umac/regulatory/core/src/reg_db_parser.c b/umac/regulatory/core/src/reg_db_parser.c
index d69f3ce..57f2620 100644
--- a/umac/regulatory/core/src/reg_db_parser.c
+++ b/umac/regulatory/core/src/reg_db_parser.c
@@ -26,11 +26,6 @@
#include "reg_db_parser.h"
#include <qdf_mem.h>
-int reg_create_master_chan_list(uint8_t *event_buf)
-{
- return 0;
-}
-
QDF_STATUS reg_is_country_code_valid(uint8_t alpha[3])
{
uint16_t i;
@@ -83,115 +78,246 @@
return QDF_STATUS_SUCCESS;
}
-/* Given a country code the function
- * finds current regulatory information
- */
-QDF_STATUS reg_get_cur_reginfo(uint8_t *alpha,
- uint32_t max_rules,
- struct cur_regulatory_info *reg_info)
+QDF_STATUS reg_get_rdpair_from_country_iso(uint8_t *alpha,
+ uint16_t *country_index,
+ uint16_t *regdmn_pair)
{
uint16_t i, j;
- uint8_t rgalpha[3];
int num_countries;
int num_reg_dmn;
- int default_country_2g;
- int default_country_5g;
-
- rgalpha[0] = alpha[0];
- rgalpha[1] = alpha[1];
- rgalpha[2] = 0;
get_num_countries(&num_countries);
get_num_reg_dmn_pairs(&num_reg_dmn);
- if (reg_is_country_code_valid(rgalpha)) {
- for (i = 0; i < num_countries; i++) {
- if ((g_all_countries[i].alpha2[0] == alpha[0]) &&
+ for (i = 0; i < num_countries; i++) {
+ if ((g_all_countries[i].alpha2[0] == alpha[0]) &&
(g_all_countries[i].alpha2[1] == alpha[1]) &&
(g_all_countries[i].alpha2[2] == alpha[2]))
- break;
- else
- continue;
- }
- for (j = 0; j < num_reg_dmn; j++) {
- if (g_reg_dmn_pairs[j].reg_dmn_pair_id ==
+ break;
+ }
+
+ if (i == num_countries) {
+ *country_index = -1;
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ for (j = 0; j < num_reg_dmn; j++) {
+ if (g_reg_dmn_pairs[j].reg_dmn_pair_id ==
g_all_countries[i].reg_dmn_pair_id)
- break;
- else
- continue;
- }
+ break;
+ }
- if ((max_rules >= regdomains_2g[
- g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules +
- regdomains_5g[
- g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules)) {
+ if (j == num_reg_dmn) {
+ *regdmn_pair = -1;
+ return QDF_STATUS_E_FAILURE;
+ }
- reg_info->dfs_region = regdomains_5g[
- g_reg_dmn_pairs[j].dmn_id_5g].dfs_region;
- reg_info->phybitmap = g_all_countries[i].phymode_bitmap;
- reg_info->max_bw_2g = g_all_countries[i].max_bw_2g;
- reg_info->max_bw_5g = g_all_countries[i].max_bw_5g;
- reg_info->min_bw_2g = regdomains_2g[
- g_reg_dmn_pairs[j].dmn_id_2g].min_bw;
- reg_info->min_bw_5g = regdomains_5g[
- g_reg_dmn_pairs[j].dmn_id_5g].min_bw;
- reg_info->num_2g_reg_rules = regdomains_2g[
- g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules;
- reg_info->num_5g_reg_rules = regdomains_5g[
- g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules;
- reg_info->reg_rules_2g_ptr = (struct cur_reg_rule *)
- qdf_mem_malloc((reg_info->num_2g_reg_rules) *
- sizeof(struct cur_reg_rule));
+ *country_index = i;
+ *regdmn_pair = j;
- reg_info->reg_rules_5g_ptr = (struct cur_reg_rule *)
- qdf_mem_malloc((reg_info->num_5g_reg_rules) *
- sizeof(struct cur_reg_rule));
+ return QDF_STATUS_SUCCESS;
+}
- reg_regrules_assign(g_reg_dmn_pairs[j].dmn_id_2g,
- g_reg_dmn_pairs[j].dmn_id_5g, reg_info);
+QDF_STATUS reg_get_rdpair_from_country_code(uint16_t cc,
+ uint16_t *country_index,
+ uint16_t *regdmn_pair)
+{
+ uint16_t i, j;
+ int num_countries;
+ int num_reg_dmn;
- alpha[0] = g_all_countries[i].alpha2_11d[0];
- alpha[1] = g_all_countries[i].alpha2_11d[1];
+ get_num_countries(&num_countries);
+ get_num_reg_dmn_pairs(&num_reg_dmn);
- return QDF_STATUS_SUCCESS;
- } else if (!((max_rules >= regdomains_2g[
- g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules +
- regdomains_5g[
- g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules)))
- return QDF_STATUS_E_NOMEM;
- } else {
- get_default_country_2g(&default_country_2g);
- get_default_country_5g(&default_country_5g);
+ for (i = 0; i < num_countries; i++) {
+ if (g_all_countries[i].country_code == cc)
+ break;
+ }
- if ((max_rules >=
- regdomains_2g[default_country_2g].num_reg_rules +
- regdomains_5g[default_country_5g].num_reg_rules)) {
- reg_info->dfs_region =
- regdomains_5g[default_country_5g].dfs_region;
- reg_info->phybitmap = 0;
- reg_info->max_bw_2g = 40;
- reg_info->max_bw_5g = 160;
- reg_info->min_bw_2g =
- regdomains_2g[default_country_2g].min_bw;
- reg_info->min_bw_5g =
- regdomains_5g[default_country_5g].min_bw;
- reg_info->num_2g_reg_rules =
- regdomains_2g[default_country_2g].num_reg_rules;
- reg_info->num_5g_reg_rules =
- regdomains_5g[default_country_5g].num_reg_rules;
+ if (i == num_countries) {
+ *country_index = -1;
+ return QDF_STATUS_E_FAILURE;
+ }
- reg_regrules_assign(default_country_2g,
- default_country_5g, reg_info);
+ for (j = 0; j < num_reg_dmn; j++) {
+ if (g_reg_dmn_pairs[j].reg_dmn_pair_id ==
+ g_all_countries[i].reg_dmn_pair_id)
+ break;
+ }
- alpha[0] = '0';
- alpha[1] = '0';
+ if (j == num_reg_dmn) {
+ *regdmn_pair = -1;
+ return QDF_STATUS_E_FAILURE;
+ }
- return QDF_STATUS_SUCCESS;
- } else if (!((max_rules >= regdomains_2g[
- default_country_2g].num_reg_rules +
- regdomains_5g[default_country_5g].num_reg_rules)
- ))
- return QDF_STATUS_E_NOMEM;
+ *country_index = i;
+ *regdmn_pair = j;
+
+ return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS reg_get_reginfo_form_country_code_and_regdmn_pair(
+ uint32_t max_rules,
+ struct cur_regulatory_info *reg_info,
+ uint16_t country_index,
+ uint16_t regdmn_pair)
+{
+ uint16_t i, j;
+
+ i = country_index;
+ j = regdmn_pair;
+
+ if ((max_rules >=
+ regdomains_2g[g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules +
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules)
+ ) {
+
+ reg_info->dfs_region =
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].dfs_region;
+ reg_info->phybitmap = g_all_countries[i].phymode_bitmap;
+ reg_info->max_bw_2g = g_all_countries[i].max_bw_2g;
+ reg_info->max_bw_5g = g_all_countries[i].max_bw_5g;
+ reg_info->min_bw_2g =
+ regdomains_2g[g_reg_dmn_pairs[j].dmn_id_2g].min_bw;
+ reg_info->min_bw_5g =
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].min_bw;
+ reg_info->num_2g_reg_rules =
+ regdomains_2g[g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules;
+ reg_info->num_5g_reg_rules =
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules;
+
+ reg_info->reg_rules_2g_ptr = (struct cur_reg_rule *)
+ qdf_mem_malloc((reg_info->num_2g_reg_rules) *
+ sizeof(struct cur_reg_rule));
+ reg_info->reg_rules_5g_ptr = (struct cur_reg_rule *)
+ qdf_mem_malloc((reg_info->num_5g_reg_rules) *
+ sizeof(struct cur_reg_rule));
+
+ reg_regrules_assign(g_reg_dmn_pairs[j].dmn_id_2g,
+ g_reg_dmn_pairs[j].dmn_id_5g, reg_info);
+
+ return QDF_STATUS_SUCCESS;
+ } else if (!((max_rules >= regdomains_2g[
+ g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules +
+ regdomains_5g[
+ g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules)))
+ return QDF_STATUS_E_NOMEM;
+
+ return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS reg_get_reginfo_form_regdmn_pair(
+ uint32_t max_rules,
+ struct cur_regulatory_info *reg_info,
+ uint16_t regdmn_pair)
+{
+ uint16_t j;
+
+ j = regdmn_pair;
+
+ if ((max_rules >=
+ regdomains_2g[g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules +
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules)
+ ) {
+
+ reg_info->dfs_region =
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].dfs_region;
+ reg_info->phybitmap = 0;
+ reg_info->max_bw_2g = 40;
+ reg_info->max_bw_5g = 160;
+ reg_info->min_bw_2g =
+ regdomains_2g[g_reg_dmn_pairs[j].dmn_id_2g].min_bw;
+ reg_info->min_bw_5g =
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].min_bw;
+ reg_info->num_2g_reg_rules =
+ regdomains_2g[g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules;
+ reg_info->num_5g_reg_rules =
+ regdomains_5g[g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules;
+
+ reg_info->reg_rules_2g_ptr = (struct cur_reg_rule *)
+ qdf_mem_malloc((reg_info->num_2g_reg_rules) *
+ sizeof(struct cur_reg_rule));
+ reg_info->reg_rules_5g_ptr = (struct cur_reg_rule *)
+ qdf_mem_malloc((reg_info->num_5g_reg_rules) *
+ sizeof(struct cur_reg_rule));
+
+ reg_regrules_assign(g_reg_dmn_pairs[j].dmn_id_2g,
+ g_reg_dmn_pairs[j].dmn_id_5g, reg_info);
+
+ return QDF_STATUS_SUCCESS;
+ } else if (!((max_rules >= regdomains_2g[
+ g_reg_dmn_pairs[j].dmn_id_2g].num_reg_rules +
+ regdomains_5g[
+ g_reg_dmn_pairs[j].dmn_id_5g].num_reg_rules)))
+ return QDF_STATUS_E_NOMEM;
+
+ return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS reg_get_reginfo_for_default_regdmn_pair(
+ uint32_t max_rules,
+ struct cur_regulatory_info *reg_info)
+{
+ int default_country_2g;
+ int default_country_5g;
+
+ get_default_country_2g(&default_country_2g);
+ get_default_country_5g(&default_country_5g);
+
+ if ((max_rules >= regdomains_2g[default_country_2g].num_reg_rules +
+ regdomains_5g[default_country_5g].num_reg_rules)) {
+ reg_info->dfs_region =
+ regdomains_5g[default_country_5g].dfs_region;
+ reg_info->phybitmap = 0;
+ reg_info->max_bw_2g = 40;
+ reg_info->max_bw_5g = 160;
+ reg_info->min_bw_2g = regdomains_2g[default_country_2g].min_bw;
+ reg_info->min_bw_5g = regdomains_5g[default_country_5g].min_bw;
+ reg_info->num_2g_reg_rules =
+ regdomains_2g[default_country_2g].num_reg_rules;
+ reg_info->num_5g_reg_rules =
+ regdomains_5g[default_country_5g].num_reg_rules;
+ reg_info->reg_rules_2g_ptr = (struct cur_reg_rule *)
+ qdf_mem_malloc((reg_info->num_2g_reg_rules) *
+ sizeof(struct cur_reg_rule));
+ reg_info->reg_rules_5g_ptr = (struct cur_reg_rule *)
+ qdf_mem_malloc((reg_info->num_5g_reg_rules) *
+ sizeof(struct cur_reg_rule));
+
+ reg_regrules_assign(default_country_2g,
+ default_country_5g, reg_info);
+
+ return QDF_STATUS_SUCCESS;
+ } else if (!((max_rules >=
+ regdomains_2g[default_country_2g].num_reg_rules +
+ regdomains_5g[default_country_5g].num_reg_rules)))
+ return QDF_STATUS_E_NOMEM;
+ return QDF_STATUS_SUCCESS;
+}
+
+/* Given a country code the function finds current regulatory information */
+QDF_STATUS reg_get_cur_reginfo(uint32_t max_rules,
+ struct cur_regulatory_info *reg_info,
+ uint16_t country_index,
+ uint16_t regdmn_pair)
+{
+ if ((country_index != (uint16_t)(-1)) &&
+ (regdmn_pair != (uint16_t)(-1)))
+ reg_get_reginfo_form_country_code_and_regdmn_pair(
+ max_rules,
+ reg_info,
+ country_index,
+ regdmn_pair);
+ else {
+ if (regdmn_pair != (uint16_t)(-1))
+ reg_get_reginfo_form_regdmn_pair(
+ max_rules,
+ reg_info,
+ regdmn_pair);
+ else
+ reg_get_reginfo_for_default_regdmn_pair(
+ max_rules,
+ reg_info);
}
return QDF_STATUS_SUCCESS;
diff --git a/umac/regulatory/core/src/reg_db_parser.h b/umac/regulatory/core/src/reg_db_parser.h
index dba006e..863cf0c 100644
--- a/umac/regulatory/core/src/reg_db_parser.h
+++ b/umac/regulatory/core/src/reg_db_parser.h
@@ -37,9 +37,10 @@
uint8_t dmn_id_5g,
struct cur_regulatory_info *reg_info);
-QDF_STATUS reg_get_cur_reginfo(uint8_t *alpha,
- uint32_t max_rules,
- struct cur_regulatory_info *reg_info);
+QDF_STATUS reg_get_cur_reginfo(uint32_t max_rules,
+ struct cur_regulatory_info *reg_info,
+ uint16_t country_index,
+ uint16_t regdmn_pair);
QDF_STATUS reg_get_rdpair_from_country_iso(uint8_t *alpha,
uint16_t *country_index,
diff --git a/umac/regulatory/core/src/reg_services.c b/umac/regulatory/core/src/reg_services.c
index 1f00e27..8211ea4 100644
--- a/umac/regulatory/core/src/reg_services.c
+++ b/umac/regulatory/core/src/reg_services.c
@@ -32,6 +32,7 @@
#include "reg_services.h"
#include "reg_priv.h"
+#include "reg_db_parser.h"
#define MAX_PWR_FCC_CHAN_12 8
#define MAX_PWR_FCC_CHAN_13 2