From 953ac7fc97a36807f021877425199a9ea9ebc2bd Mon Sep 17 00:00:00 2001 From: Harshitha Prem Date: Thu, 9 Mar 2023 22:49:05 +0530 Subject: [PATCH] ath12k: update unsupported bandwidth flags Some of the countries like TG, WS and CF are able to operate on unsupported bandwidth. This is because, the NL80211 flags are not updated with no support flag. Hence, add changes to update the unsupported bandwith flag based on the max bandwidth received from firmware Signed-off-by: Harshitha Prem --- drivers/net/wireless/ath/ath12k/reg.c | 56 ++++++++++++++++++++------- 1 file changed, 43 insertions(+), 13 deletions(-) --- a/drivers/net/wireless/ath/ath12k/reg.c +++ b/drivers/net/wireless/ath/ath12k/reg.c @@ -410,6 +410,35 @@ ath12k_map_fw_dfs_region(enum ath12k_dfs } } +static u32 ath12k_update_bw_reg_flags(u16 max_bw) +{ + u32 flags = 0; + switch (max_bw) { + case 20: + flags = (NL80211_RRF_NO_HT40 | + NL80211_RRF_NO_80MHZ | + NL80211_RRF_NO_160MHZ | + NL80211_RRF_NO_320MHZ); + break; + case 40: + flags = (NL80211_RRF_NO_80MHZ | + NL80211_RRF_NO_160MHZ | + NL80211_RRF_NO_320MHZ ); + break; + case 80: + flags = (NL80211_RRF_NO_160MHZ | + NL80211_RRF_NO_320MHZ); + break; + case 160: + flags = NL80211_RRF_NO_320MHZ; + break; + default: + break; + } + + return flags; +} + static u32 ath12k_map_fw_reg_flags(u16 reg_flags) { u32 flags = 0; @@ -578,7 +607,7 @@ ath12k_reg_build_regd(struct ath12k_base u8 i = 0, j = 0, k = 0, max_elements = 0; u8 num_rules; u16 max_bw; - u32 flags, reg_6g_number = 0, max_bw_6g = 0; + u32 flags = 0, reg_6g_number = 0, max_bw_6g = 0; char alpha2[3]; bool reg_6g_itr_set = false; enum nl80211_regulatory_power_modes pwr_mode; @@ -633,7 +662,7 @@ ath12k_reg_build_regd(struct ath12k_base reg_rule = reg_info->reg_rules_2g_ptr + i; max_bw = min_t(u16, reg_rule->max_bw, reg_info->max_bw_2g); - flags = NL80211_RRF_NO_320MHZ; + flags = ath12k_update_bw_reg_flags(reg_info->max_bw_2g); pwr_mode = 0; ath12k_copy_reg_rule(&ab->reg_freq_2g, reg_rule); } else if (reg_info->num_5g_reg_rules && @@ -641,7 +670,7 @@ ath12k_reg_build_regd(struct ath12k_base reg_rule = reg_info->reg_rules_5g_ptr + j++; max_bw = min_t(u16, reg_rule->max_bw, reg_info->max_bw_5g); - + flags = NL80211_RRF_AUTO_BW | ath12k_update_bw_reg_flags(reg_info->max_bw_5g); /* FW doesn't pass NL80211_RRF_AUTO_BW flag for * BW Auto correction, we can enable this by default * for all 5G rules here. The regulatory core performs @@ -650,8 +679,7 @@ ath12k_reg_build_regd(struct ath12k_base */ if ((reg_rule->start_freq == 5490) && (reg_rule->end_freq == 5730)) flags &= ~NL80211_RRF_NO_320MHZ; - else - flags = NL80211_RRF_AUTO_BW | NL80211_RRF_NO_320MHZ; + pwr_mode = 0; if (reg_rule->end_freq <= ATH12K_MAX_5G_FREQ) ath12k_copy_reg_rule(&ab->reg_freq_5g, reg_rule); @@ -672,17 +700,17 @@ ath12k_reg_build_regd(struct ath12k_base reg_6g_itr_set = true; } if (reg_6g_itr_set && k < max_elements) { - reg_rule = reg_rule_6g + k++; - max_bw = min_t(u16, reg_rule->max_bw, max_bw_6g); - flags = NL80211_RRF_AUTO_BW; - - if (reg_rule->psd_flag) - flags |= NL80211_RRF_PSD; - - if (reg_rule->end_freq <= ATH12K_MAX_6G_FREQ) - ath12k_copy_reg_rule(&ab->reg_freq_6g, reg_rule); - else if (reg_rule->start_freq >= ATH12K_MIN_6G_FREQ) - ath12k_copy_reg_rule(&ab->reg_freq_6g, reg_rule); + reg_rule = reg_rule_6g + k++; + max_bw = min_t(u16, reg_rule->max_bw, max_bw_6g); + flags = NL80211_RRF_AUTO_BW | ath12k_update_bw_reg_flags(max_bw_6g); + + if (reg_rule->psd_flag) + flags |= NL80211_RRF_PSD; + + if (reg_rule->end_freq <= ATH12K_MAX_6G_FREQ) + ath12k_copy_reg_rule(&ab->reg_freq_6g, reg_rule); + else if (reg_rule->start_freq >= ATH12K_MIN_6G_FREQ) + ath12k_copy_reg_rule(&ab->reg_freq_6g, reg_rule); } if (reg_6g_itr_set && k >= max_elements) {