|
@@ -11798,6 +11798,54 @@ static uint16_t wmi_set_htc_tx_tag_tlv(wmi_unified_t wmi_handle,
|
|
|
return htc_tx_tag;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_BAND_6GHZ
|
|
|
+static struct cur_reg_rule
|
|
|
+*create_ext_reg_rules_from_wmi(uint32_t num_reg_rules,
|
|
|
+ wmi_regulatory_rule_ext_struct *wmi_reg_rule)
|
|
|
+{
|
|
|
+ struct cur_reg_rule *reg_rule_ptr;
|
|
|
+ uint32_t count;
|
|
|
+
|
|
|
+ if (!num_reg_rules)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ reg_rule_ptr = qdf_mem_malloc(num_reg_rules *
|
|
|
+ sizeof(*reg_rule_ptr));
|
|
|
+
|
|
|
+ if (!reg_rule_ptr)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ for (count = 0; count < num_reg_rules; count++) {
|
|
|
+ reg_rule_ptr[count].start_freq =
|
|
|
+ WMI_REG_RULE_START_FREQ_GET(
|
|
|
+ wmi_reg_rule[count].freq_info);
|
|
|
+ reg_rule_ptr[count].end_freq =
|
|
|
+ WMI_REG_RULE_END_FREQ_GET(
|
|
|
+ wmi_reg_rule[count].freq_info);
|
|
|
+ reg_rule_ptr[count].max_bw =
|
|
|
+ WMI_REG_RULE_MAX_BW_GET(
|
|
|
+ wmi_reg_rule[count].bw_pwr_info);
|
|
|
+ reg_rule_ptr[count].reg_power =
|
|
|
+ WMI_REG_RULE_REG_POWER_GET(
|
|
|
+ wmi_reg_rule[count].bw_pwr_info);
|
|
|
+ reg_rule_ptr[count].ant_gain =
|
|
|
+ WMI_REG_RULE_ANTENNA_GAIN_GET(
|
|
|
+ wmi_reg_rule[count].bw_pwr_info);
|
|
|
+ reg_rule_ptr[count].flags =
|
|
|
+ WMI_REG_RULE_FLAGS_GET(
|
|
|
+ wmi_reg_rule[count].flag_info);
|
|
|
+ reg_rule_ptr[count].psd_flag =
|
|
|
+ WMI_REG_RULE_PSD_FLAG_GET(
|
|
|
+ wmi_reg_rule[count].psd_power_info);
|
|
|
+ reg_rule_ptr[count].psd_eirp =
|
|
|
+ WMI_REG_RULE_PSD_EIRP_GET(
|
|
|
+ wmi_reg_rule[count].psd_power_info);
|
|
|
+ }
|
|
|
+
|
|
|
+ return reg_rule_ptr;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static struct cur_reg_rule
|
|
|
*create_reg_rules_from_wmi(uint32_t num_reg_rules,
|
|
|
wmi_regulatory_rule_struct *wmi_reg_rule)
|
|
@@ -11838,6 +11886,316 @@ static struct cur_reg_rule
|
|
|
return reg_rule_ptr;
|
|
|
}
|
|
|
|
|
|
+static enum cc_setting_code wmi_reg_status_to_reg_status(
|
|
|
+ WMI_REG_SET_CC_STATUS_CODE wmi_status_code)
|
|
|
+{
|
|
|
+ if (wmi_status_code == WMI_REG_SET_CC_STATUS_PASS)
|
|
|
+ return REG_SET_CC_STATUS_PASS;
|
|
|
+ else if (wmi_status_code == WMI_REG_CURRENT_ALPHA2_NOT_FOUND)
|
|
|
+ return REG_CURRENT_ALPHA2_NOT_FOUND;
|
|
|
+ else if (wmi_status_code == WMI_REG_INIT_ALPHA2_NOT_FOUND)
|
|
|
+ return REG_INIT_ALPHA2_NOT_FOUND;
|
|
|
+ else if (wmi_status_code == WMI_REG_SET_CC_CHANGE_NOT_ALLOWED)
|
|
|
+ return REG_SET_CC_CHANGE_NOT_ALLOWED;
|
|
|
+ else if (wmi_status_code == WMI_REG_SET_CC_STATUS_NO_MEMORY)
|
|
|
+ return REG_SET_CC_STATUS_NO_MEMORY;
|
|
|
+ else if (wmi_status_code == WMI_REG_SET_CC_STATUS_FAIL)
|
|
|
+ return REG_SET_CC_STATUS_FAIL;
|
|
|
+
|
|
|
+ wmi_debug("Unknown reg status code from WMI");
|
|
|
+ return REG_SET_CC_STATUS_FAIL;
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_BAND_6GHZ
|
|
|
+static QDF_STATUS extract_reg_chan_list_ext_update_event_tlv(
|
|
|
+ wmi_unified_t wmi_handle, uint8_t *evt_buf,
|
|
|
+ struct cur_regulatory_info *reg_info, uint32_t len)
|
|
|
+{
|
|
|
+ uint32_t i, j;
|
|
|
+ WMI_REG_CHAN_LIST_CC_EXT_EVENTID_param_tlvs *param_buf;
|
|
|
+ wmi_reg_chan_list_cc_event_ext_fixed_param *ext_chan_list_event_hdr;
|
|
|
+ wmi_regulatory_rule_ext_struct *ext_wmi_reg_rule;
|
|
|
+ uint32_t num_2g_reg_rules, num_5g_reg_rules;
|
|
|
+ uint32_t num_6g_reg_rules_ap[REG_CURRENT_MAX_AP_TYPE];
|
|
|
+ uint32_t *num_6g_reg_rules_client[REG_CURRENT_MAX_AP_TYPE];
|
|
|
+ uint32_t total_reg_rules = 0;
|
|
|
+
|
|
|
+ param_buf = (WMI_REG_CHAN_LIST_CC_EXT_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf) {
|
|
|
+ wmi_err("invalid channel list event buf");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ ext_chan_list_event_hdr = param_buf->fixed_param;
|
|
|
+
|
|
|
+ reg_info->num_2g_reg_rules = ext_chan_list_event_hdr->num_2g_reg_rules;
|
|
|
+ reg_info->num_5g_reg_rules = ext_chan_list_event_hdr->num_5g_reg_rules;
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_STANDARD_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_ap_sp;
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_INDOOR_AP] =
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_ap_lpi;
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_VERY_LOW_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_ap_vlp;
|
|
|
+
|
|
|
+ wmi_debug("num reg rules from fw");
|
|
|
+ wmi_debug("AP SP %d, LPI %d, VLP %d",
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_STANDARD_POWER_AP],
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_INDOOR_AP],
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_VERY_LOW_POWER_AP]);
|
|
|
+
|
|
|
+ for (i = 0; i < REG_MAX_CLIENT_TYPE; i++) {
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_STANDARD_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_client_sp[i];
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_INDOOR_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_client_lpi[i];
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_VERY_LOW_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_client_vlp[i];
|
|
|
+ wmi_debug("client %d SP %d, LPI %d, VLP %d", i,
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_client_sp[i],
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_client_lpi[i],
|
|
|
+ ext_chan_list_event_hdr->num_6g_reg_rules_client_vlp[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ num_2g_reg_rules = reg_info->num_2g_reg_rules;
|
|
|
+ total_reg_rules += num_2g_reg_rules;
|
|
|
+ num_5g_reg_rules = reg_info->num_5g_reg_rules;
|
|
|
+ total_reg_rules += num_5g_reg_rules;
|
|
|
+ for (i = 0; i < REG_CURRENT_MAX_AP_TYPE; i++) {
|
|
|
+ num_6g_reg_rules_ap[i] = reg_info->num_6g_reg_rules_ap[i];
|
|
|
+ if (num_6g_reg_rules_ap[i] > MAX_6G_REG_RULES) {
|
|
|
+ wmi_err_rl("Invalid num_6g_reg_rules_ap: %u",
|
|
|
+ num_6g_reg_rules_ap[i]);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+ total_reg_rules += num_6g_reg_rules_ap[i];
|
|
|
+ num_6g_reg_rules_client[i] =
|
|
|
+ reg_info->num_6g_reg_rules_client[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < REG_MAX_CLIENT_TYPE; i++) {
|
|
|
+ total_reg_rules +=
|
|
|
+ num_6g_reg_rules_client[REG_STANDARD_POWER_AP][i];
|
|
|
+ total_reg_rules += num_6g_reg_rules_client[REG_INDOOR_AP][i];
|
|
|
+ total_reg_rules +=
|
|
|
+ num_6g_reg_rules_client[REG_VERY_LOW_POWER_AP][i];
|
|
|
+ if ((num_6g_reg_rules_client[REG_STANDARD_POWER_AP][i] >
|
|
|
+ MAX_6G_REG_RULES) ||
|
|
|
+ (num_6g_reg_rules_client[REG_INDOOR_AP][i] >
|
|
|
+ MAX_6G_REG_RULES) ||
|
|
|
+ (num_6g_reg_rules_client[REG_VERY_LOW_POWER_AP][i] >
|
|
|
+ MAX_6G_REG_RULES)) {
|
|
|
+ wmi_err_rl("Invalid num_6g_reg_rules_client_sp: %u, num_6g_reg_rules_client_lpi: %u, num_6g_reg_rules_client_vlp: %u, client %d",
|
|
|
+ num_6g_reg_rules_client[REG_STANDARD_POWER_AP][i],
|
|
|
+ num_6g_reg_rules_client[REG_INDOOR_AP][i],
|
|
|
+ num_6g_reg_rules_client[REG_VERY_LOW_POWER_AP][i],
|
|
|
+ i);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (total_reg_rules != param_buf->num_reg_rule_array) {
|
|
|
+ wmi_err_rl("Total reg rules %u does not match event params num reg rule %u",
|
|
|
+ total_reg_rules, param_buf->num_reg_rule_array);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((num_2g_reg_rules > MAX_REG_RULES) ||
|
|
|
+ (num_5g_reg_rules > MAX_REG_RULES)) {
|
|
|
+ wmi_err_rl("Invalid num_2g_reg_rules: %u, num_5g_reg_rules: %u",
|
|
|
+ num_2g_reg_rules, num_5g_reg_rules);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((num_6g_reg_rules_ap[REG_STANDARD_POWER_AP] > MAX_6G_REG_RULES) ||
|
|
|
+ (num_6g_reg_rules_ap[REG_INDOOR_AP] > MAX_6G_REG_RULES) ||
|
|
|
+ (num_6g_reg_rules_ap[REG_VERY_LOW_POWER_AP] > MAX_6G_REG_RULES)) {
|
|
|
+ wmi_err_rl("Invalid num_6g_reg_rules_ap_sp: %u, num_6g_reg_rules_ap_lpi: %u, num_6g_reg_rules_ap_vlp: %u",
|
|
|
+ num_6g_reg_rules_ap[REG_STANDARD_POWER_AP],
|
|
|
+ num_6g_reg_rules_ap[REG_INDOOR_AP],
|
|
|
+ num_6g_reg_rules_ap[REG_VERY_LOW_POWER_AP]);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (param_buf->num_reg_rule_array >
|
|
|
+ (WMI_SVC_MSG_MAX_SIZE - sizeof(*ext_chan_list_event_hdr)) /
|
|
|
+ sizeof(*ext_wmi_reg_rule)) {
|
|
|
+ wmi_err_rl("Invalid ext_num_reg_rule_array: %u",
|
|
|
+ param_buf->num_reg_rule_array);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ qdf_mem_copy(reg_info->alpha2, &ext_chan_list_event_hdr->alpha2,
|
|
|
+ REG_ALPHA2_LEN);
|
|
|
+ reg_info->dfs_region = ext_chan_list_event_hdr->dfs_region;
|
|
|
+ reg_info->phybitmap = convert_phybitmap_tlv(
|
|
|
+ ext_chan_list_event_hdr->phybitmap);
|
|
|
+ reg_info->offload_enabled = true;
|
|
|
+ reg_info->num_phy = ext_chan_list_event_hdr->num_phy;
|
|
|
+ reg_info->phy_id = wmi_handle->ops->convert_phy_id_target_to_host(
|
|
|
+ wmi_handle, ext_chan_list_event_hdr->phy_id);
|
|
|
+ reg_info->ctry_code = ext_chan_list_event_hdr->country_id;
|
|
|
+ reg_info->reg_dmn_pair = ext_chan_list_event_hdr->domain_code;
|
|
|
+
|
|
|
+ reg_info->status_code =
|
|
|
+ wmi_reg_status_to_reg_status(ext_chan_list_event_hdr->
|
|
|
+ status_code);
|
|
|
+
|
|
|
+ reg_info->min_bw_2g = ext_chan_list_event_hdr->min_bw_2g;
|
|
|
+ reg_info->max_bw_2g = ext_chan_list_event_hdr->max_bw_2g;
|
|
|
+ reg_info->min_bw_5g = ext_chan_list_event_hdr->min_bw_5g;
|
|
|
+ reg_info->max_bw_5g = ext_chan_list_event_hdr->max_bw_5g;
|
|
|
+ reg_info->min_bw_6g_ap[REG_STANDARD_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->min_bw_6g_ap_sp;
|
|
|
+ reg_info->max_bw_6g_ap[REG_STANDARD_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->max_bw_6g_ap_sp;
|
|
|
+ reg_info->min_bw_6g_ap[REG_INDOOR_AP] =
|
|
|
+ ext_chan_list_event_hdr->min_bw_6g_ap_lpi;
|
|
|
+ reg_info->max_bw_6g_ap[REG_INDOOR_AP] =
|
|
|
+ ext_chan_list_event_hdr->max_bw_6g_ap_lpi;
|
|
|
+ reg_info->min_bw_6g_ap[REG_VERY_LOW_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->min_bw_6g_ap_vlp;
|
|
|
+ reg_info->max_bw_6g_ap[REG_VERY_LOW_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->max_bw_6g_ap_vlp;
|
|
|
+
|
|
|
+ for (i = 0; i < REG_MAX_CLIENT_TYPE; i++) {
|
|
|
+ reg_info->min_bw_6g_client[REG_STANDARD_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->min_bw_6g_client_sp[i];
|
|
|
+ reg_info->max_bw_6g_client[REG_STANDARD_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->max_bw_6g_client_sp[i];
|
|
|
+ reg_info->min_bw_6g_client[REG_INDOOR_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->min_bw_6g_client_lpi[i];
|
|
|
+ reg_info->max_bw_6g_client[REG_INDOOR_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->max_bw_6g_client_lpi[i];
|
|
|
+ reg_info->min_bw_6g_client[REG_VERY_LOW_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->min_bw_6g_client_vlp[i];
|
|
|
+ reg_info->max_bw_6g_client[REG_VERY_LOW_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->max_bw_6g_client_vlp[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ wmi_debug("num_phys = %u and phy_id = %u",
|
|
|
+ reg_info->num_phy, reg_info->phy_id);
|
|
|
+
|
|
|
+ wmi_debug("cc %s dfs %d BW: min_2g %d max_2g %d min_5g %d max_5g %d",
|
|
|
+ reg_info->alpha2, reg_info->dfs_region, reg_info->min_bw_2g,
|
|
|
+ reg_info->max_bw_2g, reg_info->min_bw_5g,
|
|
|
+ reg_info->max_bw_5g);
|
|
|
+
|
|
|
+ wmi_debug("min_bw_6g_ap_sp %d max_bw_6g_ap_sp %d min_bw_6g_ap_lpi %d max_bw_6g_ap_lpi %d min_bw_6g_ap_vlp %d max_bw_6g_ap_vlp %d",
|
|
|
+ reg_info->min_bw_6g_ap[REG_STANDARD_POWER_AP],
|
|
|
+ reg_info->max_bw_6g_ap[REG_STANDARD_POWER_AP],
|
|
|
+ reg_info->min_bw_6g_ap[REG_INDOOR_AP],
|
|
|
+ reg_info->max_bw_6g_ap[REG_INDOOR_AP],
|
|
|
+ reg_info->min_bw_6g_ap[REG_VERY_LOW_POWER_AP],
|
|
|
+ reg_info->max_bw_6g_ap[REG_VERY_LOW_POWER_AP]);
|
|
|
+
|
|
|
+ wmi_debug("min_bw_6g_def_cli_sp %d max_bw_6g_def_cli_sp %d min_bw_6g_def_cli_lpi %d max_bw_6g_def_cli_lpi %d min_bw_6g_def_cli_vlp %d max_bw_6g_def_cli_vlp %d",
|
|
|
+ reg_info->min_bw_6g_client[REG_STANDARD_POWER_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->max_bw_6g_client[REG_STANDARD_POWER_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->min_bw_6g_client[REG_INDOOR_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->max_bw_6g_client[REG_INDOOR_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->min_bw_6g_client[REG_VERY_LOW_POWER_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->max_bw_6g_client[REG_VERY_LOW_POWER_AP][REG_DEFAULT_CLIENT]);
|
|
|
+
|
|
|
+ wmi_debug("min_bw_6g_sub_client_sp %d max_bw_6g_sub_client_sp %d min_bw_6g_sub_client_lpi %d max_bw_6g_sub_client_lpi %d min_bw_6g_sub_client_vlp %d max_bw_6g_sub_client_vlp %d",
|
|
|
+ reg_info->min_bw_6g_client[REG_STANDARD_POWER_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->max_bw_6g_client[REG_STANDARD_POWER_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->min_bw_6g_client[REG_INDOOR_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->max_bw_6g_client[REG_INDOOR_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->min_bw_6g_client[REG_VERY_LOW_POWER_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->max_bw_6g_client[REG_VERY_LOW_POWER_AP][REG_SUBORDINATE_CLIENT]);
|
|
|
+
|
|
|
+ wmi_debug("num_2g_reg_rules %d num_5g_reg_rules %d",
|
|
|
+ num_2g_reg_rules, num_5g_reg_rules);
|
|
|
+
|
|
|
+ wmi_debug("num_6g_ap_sp_reg_rules %d num_6g_ap_lpi_reg_rules %d num_6g_ap_vlp_reg_rules %d",
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_STANDARD_POWER_AP],
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_INDOOR_AP],
|
|
|
+ reg_info->num_6g_reg_rules_ap[REG_VERY_LOW_POWER_AP]);
|
|
|
+
|
|
|
+ wmi_debug("num_6g_def_cli_sp_reg_rules %d num_6g_def_cli_lpi_reg_rules %d num_6g_def_cli_vlp_reg_rules %d",
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_STANDARD_POWER_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_INDOOR_AP][REG_DEFAULT_CLIENT],
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_VERY_LOW_POWER_AP][REG_DEFAULT_CLIENT]);
|
|
|
+
|
|
|
+ wmi_debug("num_6g_sub_cli_sp_reg_rules %d num_6g_sub_cli_lpi_reg_rules %d num_6g_sub_cli_vlp_reg_rules %d",
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_STANDARD_POWER_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_INDOOR_AP][REG_SUBORDINATE_CLIENT],
|
|
|
+ reg_info->num_6g_reg_rules_client[REG_VERY_LOW_POWER_AP][REG_SUBORDINATE_CLIENT]);
|
|
|
+
|
|
|
+ ext_wmi_reg_rule =
|
|
|
+ (wmi_regulatory_rule_ext_struct *)
|
|
|
+ ((uint8_t *)ext_chan_list_event_hdr +
|
|
|
+ sizeof(wmi_reg_chan_list_cc_event_ext_fixed_param) +
|
|
|
+ WMI_TLV_HDR_SIZE);
|
|
|
+ reg_info->reg_rules_2g_ptr =
|
|
|
+ create_ext_reg_rules_from_wmi(num_2g_reg_rules,
|
|
|
+ ext_wmi_reg_rule);
|
|
|
+ ext_wmi_reg_rule += num_2g_reg_rules;
|
|
|
+ reg_info->reg_rules_5g_ptr =
|
|
|
+ create_ext_reg_rules_from_wmi(num_5g_reg_rules,
|
|
|
+ ext_wmi_reg_rule);
|
|
|
+ ext_wmi_reg_rule += num_5g_reg_rules;
|
|
|
+
|
|
|
+ for (i = 0; i < REG_CURRENT_MAX_AP_TYPE; i++) {
|
|
|
+ reg_info->reg_rules_6g_ap_ptr[i] =
|
|
|
+ create_ext_reg_rules_from_wmi(num_6g_reg_rules_ap[i],
|
|
|
+ ext_wmi_reg_rule);
|
|
|
+
|
|
|
+ ext_wmi_reg_rule += num_6g_reg_rules_ap[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ for (j = 0; j < REG_CURRENT_MAX_AP_TYPE; j++) {
|
|
|
+ for (i = 0; i < REG_MAX_CLIENT_TYPE; i++) {
|
|
|
+ reg_info->reg_rules_6g_client_ptr[j][i] =
|
|
|
+ create_ext_reg_rules_from_wmi(
|
|
|
+ num_6g_reg_rules_client[j][i],
|
|
|
+ ext_wmi_reg_rule);
|
|
|
+
|
|
|
+ ext_wmi_reg_rule += num_6g_reg_rules_client[j][i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ reg_info->client_type = ext_chan_list_event_hdr->client_type;
|
|
|
+ reg_info->rnr_tpe_usable = ext_chan_list_event_hdr->rnr_tpe_usable;
|
|
|
+ reg_info->unspecified_ap_usable =
|
|
|
+ ext_chan_list_event_hdr->unspecified_ap_usable;
|
|
|
+ reg_info->domain_code_6g_ap[REG_STANDARD_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_ap_sp;
|
|
|
+ reg_info->domain_code_6g_ap[REG_INDOOR_AP] =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_ap_lpi;
|
|
|
+ reg_info->domain_code_6g_ap[REG_VERY_LOW_POWER_AP] =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_ap_vlp;
|
|
|
+
|
|
|
+ wmi_debug("client type %d", reg_info->client_type);
|
|
|
+ wmi_debug("RNR TPE usable %d", reg_info->rnr_tpe_usable);
|
|
|
+ wmi_debug("unspecified AP usable %d", reg_info->unspecified_ap_usable);
|
|
|
+ wmi_debug("domain code AP SP %d, LPI %d, VLP %d",
|
|
|
+ reg_info->domain_code_6g_ap[REG_STANDARD_POWER_AP],
|
|
|
+ reg_info->domain_code_6g_ap[REG_INDOOR_AP],
|
|
|
+ reg_info->domain_code_6g_ap[REG_VERY_LOW_POWER_AP]);
|
|
|
+
|
|
|
+ for (i = 0; i < REG_MAX_CLIENT_TYPE; i++) {
|
|
|
+ reg_info->domain_code_6g_client[REG_STANDARD_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_client_sp[i];
|
|
|
+ reg_info->domain_code_6g_client[REG_INDOOR_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_client_lpi[i];
|
|
|
+ reg_info->domain_code_6g_client[REG_VERY_LOW_POWER_AP][i] =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_client_vlp[i];
|
|
|
+ wmi_debug("domain code client %d SP %d, LPI %d, VLP %d", i,
|
|
|
+ reg_info->domain_code_6g_client[REG_STANDARD_POWER_AP][i],
|
|
|
+ reg_info->domain_code_6g_client[REG_INDOOR_AP][i],
|
|
|
+ reg_info->domain_code_6g_client[REG_VERY_LOW_POWER_AP][i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ reg_info->domain_code_6g_super_id =
|
|
|
+ ext_chan_list_event_hdr->domain_code_6g_super_id;
|
|
|
+
|
|
|
+ wmi_debug("processed regulatory extended channel list");
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static QDF_STATUS extract_reg_chan_list_update_event_tlv(
|
|
|
wmi_unified_t wmi_handle, uint8_t *evt_buf,
|
|
|
struct cur_regulatory_info *reg_info, uint32_t len)
|
|
@@ -11889,23 +12247,9 @@ static QDF_STATUS extract_reg_chan_list_update_event_tlv(
|
|
|
wmi_handle, chan_list_event_hdr->phy_id);
|
|
|
reg_info->ctry_code = chan_list_event_hdr->country_id;
|
|
|
reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code;
|
|
|
- if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_PASS)
|
|
|
- reg_info->status_code = REG_SET_CC_STATUS_PASS;
|
|
|
- else if (chan_list_event_hdr->status_code ==
|
|
|
- WMI_REG_CURRENT_ALPHA2_NOT_FOUND)
|
|
|
- reg_info->status_code = REG_CURRENT_ALPHA2_NOT_FOUND;
|
|
|
- else if (chan_list_event_hdr->status_code ==
|
|
|
- WMI_REG_INIT_ALPHA2_NOT_FOUND)
|
|
|
- reg_info->status_code = REG_INIT_ALPHA2_NOT_FOUND;
|
|
|
- else if (chan_list_event_hdr->status_code ==
|
|
|
- WMI_REG_SET_CC_CHANGE_NOT_ALLOWED)
|
|
|
- reg_info->status_code = REG_SET_CC_CHANGE_NOT_ALLOWED;
|
|
|
- else if (chan_list_event_hdr->status_code ==
|
|
|
- WMI_REG_SET_CC_STATUS_NO_MEMORY)
|
|
|
- reg_info->status_code = REG_SET_CC_STATUS_NO_MEMORY;
|
|
|
- else if (chan_list_event_hdr->status_code ==
|
|
|
- WMI_REG_SET_CC_STATUS_FAIL)
|
|
|
- reg_info->status_code = REG_SET_CC_STATUS_FAIL;
|
|
|
+
|
|
|
+ reg_info->status_code =
|
|
|
+ wmi_reg_status_to_reg_status(chan_list_event_hdr->status_code);
|
|
|
|
|
|
reg_info->min_bw_2g = chan_list_event_hdr->min_bw_2g;
|
|
|
reg_info->max_bw_2g = chan_list_event_hdr->max_bw_2g;
|
|
@@ -14411,6 +14755,10 @@ struct wmi_ops tlv_ops = {
|
|
|
.send_dfs_phyerr_offload_dis_cmd = send_dfs_phyerr_offload_dis_cmd_tlv,
|
|
|
.extract_reg_chan_list_update_event =
|
|
|
extract_reg_chan_list_update_event_tlv,
|
|
|
+#ifdef CONFIG_BAND_6GHZ
|
|
|
+ .extract_reg_chan_list_ext_update_event =
|
|
|
+ extract_reg_chan_list_ext_update_event_tlv,
|
|
|
+#endif
|
|
|
#ifdef WLAN_SUPPORT_RF_CHARACTERIZATION
|
|
|
.extract_num_rf_characterization_entries =
|
|
|
extract_num_rf_characterization_entries_tlv,
|
|
@@ -14756,6 +15104,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
|
|
|
event_ids[wmi_vdev_ocac_complete_event_id] =
|
|
|
WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID;
|
|
|
event_ids[wmi_reg_chan_list_cc_event_id] = WMI_REG_CHAN_LIST_CC_EVENTID;
|
|
|
+ event_ids[wmi_reg_chan_list_cc_ext_event_id] =
|
|
|
+ WMI_REG_CHAN_LIST_CC_EXT_EVENTID;
|
|
|
event_ids[wmi_inst_rssi_stats_event_id] = WMI_INST_RSSI_STATS_EVENTID;
|
|
|
event_ids[wmi_pdev_tpc_config_event_id] = WMI_PDEV_TPC_CONFIG_EVENTID;
|
|
|
event_ids[wmi_peer_sta_ps_statechg_event_id] =
|