542 lines · c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause2/* Copyright(c) 2018-2019 Realtek Corporation3 */4 5#include "main.h"6#include "regd.h"7#include "debug.h"8#include "phy.h"9 10#define COUNTRY_REGD_ENT(_alpha2, _regd_2g, _regd_5g) \11 {.alpha2 = (_alpha2), \12 .txpwr_regd_2g = (_regd_2g), \13 .txpwr_regd_5g = (_regd_5g), \14 }15 16#define rtw_dbg_regd_dump(_dev, _msg, _args...) \17do { \18 struct rtw_dev *__d = (_dev); \19 const struct rtw_regd *__r = &__d->regd; \20 rtw_dbg(__d, RTW_DBG_REGD, _msg \21 "apply alpha2 %c%c, regd {%d, %d}, dfs_region %d\n",\22 ##_args, \23 __r->regulatory->alpha2[0], \24 __r->regulatory->alpha2[1], \25 __r->regulatory->txpwr_regd_2g, \26 __r->regulatory->txpwr_regd_5g, \27 __r->dfs_region); \28} while (0)29 30/* If country code is not correctly defined in efuse,31 * use worldwide country code and txpwr regd.32 */33static const struct rtw_regulatory rtw_reg_ww =34 COUNTRY_REGD_ENT("00", RTW_REGD_WW, RTW_REGD_WW);35 36static const struct rtw_regulatory rtw_reg_map[] = {37 COUNTRY_REGD_ENT("AD", RTW_REGD_ETSI, RTW_REGD_ETSI),38 COUNTRY_REGD_ENT("AE", RTW_REGD_ETSI, RTW_REGD_ETSI),39 COUNTRY_REGD_ENT("AF", RTW_REGD_ETSI, RTW_REGD_ETSI),40 COUNTRY_REGD_ENT("AG", RTW_REGD_FCC, RTW_REGD_FCC),41 COUNTRY_REGD_ENT("AI", RTW_REGD_ETSI, RTW_REGD_ETSI),42 COUNTRY_REGD_ENT("AL", RTW_REGD_ETSI, RTW_REGD_ETSI),43 COUNTRY_REGD_ENT("AM", RTW_REGD_ETSI, RTW_REGD_ETSI),44 COUNTRY_REGD_ENT("AN", RTW_REGD_FCC, RTW_REGD_FCC),45 COUNTRY_REGD_ENT("AO", RTW_REGD_ETSI, RTW_REGD_ETSI),46 COUNTRY_REGD_ENT("AQ", RTW_REGD_ETSI, RTW_REGD_ETSI),47 COUNTRY_REGD_ENT("AR", RTW_REGD_MEXICO, RTW_REGD_MEXICO),48 COUNTRY_REGD_ENT("AS", RTW_REGD_FCC, RTW_REGD_FCC),49 COUNTRY_REGD_ENT("AT", RTW_REGD_ETSI, RTW_REGD_ETSI),50 COUNTRY_REGD_ENT("AU", RTW_REGD_ACMA, RTW_REGD_ACMA),51 COUNTRY_REGD_ENT("AW", RTW_REGD_FCC, RTW_REGD_FCC),52 COUNTRY_REGD_ENT("AZ", RTW_REGD_ETSI, RTW_REGD_ETSI),53 COUNTRY_REGD_ENT("BA", RTW_REGD_ETSI, RTW_REGD_ETSI),54 COUNTRY_REGD_ENT("BB", RTW_REGD_FCC, RTW_REGD_FCC),55 COUNTRY_REGD_ENT("BD", RTW_REGD_ETSI, RTW_REGD_ETSI),56 COUNTRY_REGD_ENT("BE", RTW_REGD_ETSI, RTW_REGD_ETSI),57 COUNTRY_REGD_ENT("BF", RTW_REGD_ETSI, RTW_REGD_ETSI),58 COUNTRY_REGD_ENT("BG", RTW_REGD_ETSI, RTW_REGD_ETSI),59 COUNTRY_REGD_ENT("BH", RTW_REGD_ETSI, RTW_REGD_ETSI),60 COUNTRY_REGD_ENT("BI", RTW_REGD_ETSI, RTW_REGD_ETSI),61 COUNTRY_REGD_ENT("BJ", RTW_REGD_ETSI, RTW_REGD_ETSI),62 COUNTRY_REGD_ENT("BM", RTW_REGD_FCC, RTW_REGD_FCC),63 COUNTRY_REGD_ENT("BN", RTW_REGD_ETSI, RTW_REGD_ETSI),64 COUNTRY_REGD_ENT("BO", RTW_REGD_FCC, RTW_REGD_FCC),65 COUNTRY_REGD_ENT("BR", RTW_REGD_FCC, RTW_REGD_FCC),66 COUNTRY_REGD_ENT("BS", RTW_REGD_FCC, RTW_REGD_FCC),67 COUNTRY_REGD_ENT("BT", RTW_REGD_ETSI, RTW_REGD_ETSI),68 COUNTRY_REGD_ENT("BV", RTW_REGD_ETSI, RTW_REGD_ETSI),69 COUNTRY_REGD_ENT("BW", RTW_REGD_ETSI, RTW_REGD_ETSI),70 COUNTRY_REGD_ENT("BY", RTW_REGD_ETSI, RTW_REGD_ETSI),71 COUNTRY_REGD_ENT("BZ", RTW_REGD_FCC, RTW_REGD_FCC),72 COUNTRY_REGD_ENT("CA", RTW_REGD_IC, RTW_REGD_IC),73 COUNTRY_REGD_ENT("CC", RTW_REGD_ACMA, RTW_REGD_ACMA),74 COUNTRY_REGD_ENT("CD", RTW_REGD_ETSI, RTW_REGD_ETSI),75 COUNTRY_REGD_ENT("CF", RTW_REGD_ETSI, RTW_REGD_ETSI),76 COUNTRY_REGD_ENT("CG", RTW_REGD_ETSI, RTW_REGD_ETSI),77 COUNTRY_REGD_ENT("CH", RTW_REGD_ETSI, RTW_REGD_ETSI),78 COUNTRY_REGD_ENT("CI", RTW_REGD_ETSI, RTW_REGD_ETSI),79 COUNTRY_REGD_ENT("CK", RTW_REGD_ETSI, RTW_REGD_ETSI),80 COUNTRY_REGD_ENT("CL", RTW_REGD_CHILE, RTW_REGD_CHILE),81 COUNTRY_REGD_ENT("CM", RTW_REGD_ETSI, RTW_REGD_ETSI),82 COUNTRY_REGD_ENT("CN", RTW_REGD_CN, RTW_REGD_CN),83 COUNTRY_REGD_ENT("CO", RTW_REGD_FCC, RTW_REGD_FCC),84 COUNTRY_REGD_ENT("CR", RTW_REGD_FCC, RTW_REGD_FCC),85 COUNTRY_REGD_ENT("CV", RTW_REGD_ETSI, RTW_REGD_ETSI),86 COUNTRY_REGD_ENT("CX", RTW_REGD_ACMA, RTW_REGD_ACMA),87 COUNTRY_REGD_ENT("CY", RTW_REGD_ETSI, RTW_REGD_ETSI),88 COUNTRY_REGD_ENT("CZ", RTW_REGD_ETSI, RTW_REGD_ETSI),89 COUNTRY_REGD_ENT("DE", RTW_REGD_ETSI, RTW_REGD_ETSI),90 COUNTRY_REGD_ENT("DJ", RTW_REGD_ETSI, RTW_REGD_ETSI),91 COUNTRY_REGD_ENT("DK", RTW_REGD_ETSI, RTW_REGD_ETSI),92 COUNTRY_REGD_ENT("DM", RTW_REGD_FCC, RTW_REGD_FCC),93 COUNTRY_REGD_ENT("DO", RTW_REGD_FCC, RTW_REGD_FCC),94 COUNTRY_REGD_ENT("DZ", RTW_REGD_ETSI, RTW_REGD_ETSI),95 COUNTRY_REGD_ENT("EC", RTW_REGD_FCC, RTW_REGD_FCC),96 COUNTRY_REGD_ENT("EE", RTW_REGD_ETSI, RTW_REGD_ETSI),97 COUNTRY_REGD_ENT("EG", RTW_REGD_ETSI, RTW_REGD_ETSI),98 COUNTRY_REGD_ENT("EH", RTW_REGD_ETSI, RTW_REGD_ETSI),99 COUNTRY_REGD_ENT("ER", RTW_REGD_ETSI, RTW_REGD_ETSI),100 COUNTRY_REGD_ENT("ES", RTW_REGD_ETSI, RTW_REGD_ETSI),101 COUNTRY_REGD_ENT("ET", RTW_REGD_ETSI, RTW_REGD_ETSI),102 COUNTRY_REGD_ENT("FI", RTW_REGD_ETSI, RTW_REGD_ETSI),103 COUNTRY_REGD_ENT("FJ", RTW_REGD_FCC, RTW_REGD_FCC),104 COUNTRY_REGD_ENT("FK", RTW_REGD_ETSI, RTW_REGD_ETSI),105 COUNTRY_REGD_ENT("FM", RTW_REGD_FCC, RTW_REGD_FCC),106 COUNTRY_REGD_ENT("FO", RTW_REGD_ETSI, RTW_REGD_ETSI),107 COUNTRY_REGD_ENT("FR", RTW_REGD_ETSI, RTW_REGD_ETSI),108 COUNTRY_REGD_ENT("GA", RTW_REGD_ETSI, RTW_REGD_ETSI),109 COUNTRY_REGD_ENT("GB", RTW_REGD_UK, RTW_REGD_UK),110 COUNTRY_REGD_ENT("GD", RTW_REGD_FCC, RTW_REGD_FCC),111 COUNTRY_REGD_ENT("GE", RTW_REGD_ETSI, RTW_REGD_ETSI),112 COUNTRY_REGD_ENT("GF", RTW_REGD_ETSI, RTW_REGD_ETSI),113 COUNTRY_REGD_ENT("GG", RTW_REGD_ETSI, RTW_REGD_ETSI),114 COUNTRY_REGD_ENT("GH", RTW_REGD_ETSI, RTW_REGD_ETSI),115 COUNTRY_REGD_ENT("GI", RTW_REGD_ETSI, RTW_REGD_ETSI),116 COUNTRY_REGD_ENT("GL", RTW_REGD_ETSI, RTW_REGD_ETSI),117 COUNTRY_REGD_ENT("GM", RTW_REGD_ETSI, RTW_REGD_ETSI),118 COUNTRY_REGD_ENT("GN", RTW_REGD_ETSI, RTW_REGD_ETSI),119 COUNTRY_REGD_ENT("GP", RTW_REGD_ETSI, RTW_REGD_ETSI),120 COUNTRY_REGD_ENT("GQ", RTW_REGD_ETSI, RTW_REGD_ETSI),121 COUNTRY_REGD_ENT("GR", RTW_REGD_ETSI, RTW_REGD_ETSI),122 COUNTRY_REGD_ENT("GS", RTW_REGD_ETSI, RTW_REGD_ETSI),123 COUNTRY_REGD_ENT("GT", RTW_REGD_FCC, RTW_REGD_FCC),124 COUNTRY_REGD_ENT("GU", RTW_REGD_FCC, RTW_REGD_FCC),125 COUNTRY_REGD_ENT("GW", RTW_REGD_ETSI, RTW_REGD_ETSI),126 COUNTRY_REGD_ENT("GY", RTW_REGD_FCC, RTW_REGD_FCC),127 COUNTRY_REGD_ENT("HK", RTW_REGD_ETSI, RTW_REGD_ETSI),128 COUNTRY_REGD_ENT("HM", RTW_REGD_ACMA, RTW_REGD_ACMA),129 COUNTRY_REGD_ENT("HN", RTW_REGD_FCC, RTW_REGD_FCC),130 COUNTRY_REGD_ENT("HR", RTW_REGD_ETSI, RTW_REGD_ETSI),131 COUNTRY_REGD_ENT("HT", RTW_REGD_FCC, RTW_REGD_FCC),132 COUNTRY_REGD_ENT("HU", RTW_REGD_ETSI, RTW_REGD_ETSI),133 COUNTRY_REGD_ENT("ID", RTW_REGD_ETSI, RTW_REGD_ETSI),134 COUNTRY_REGD_ENT("IE", RTW_REGD_ETSI, RTW_REGD_ETSI),135 COUNTRY_REGD_ENT("IL", RTW_REGD_ETSI, RTW_REGD_ETSI),136 COUNTRY_REGD_ENT("IM", RTW_REGD_ETSI, RTW_REGD_ETSI),137 COUNTRY_REGD_ENT("IN", RTW_REGD_ETSI, RTW_REGD_ETSI),138 COUNTRY_REGD_ENT("IO", RTW_REGD_ETSI, RTW_REGD_ETSI),139 COUNTRY_REGD_ENT("IQ", RTW_REGD_ETSI, RTW_REGD_ETSI),140 COUNTRY_REGD_ENT("IR", RTW_REGD_ETSI, RTW_REGD_ETSI),141 COUNTRY_REGD_ENT("IS", RTW_REGD_ETSI, RTW_REGD_ETSI),142 COUNTRY_REGD_ENT("IT", RTW_REGD_ETSI, RTW_REGD_ETSI),143 COUNTRY_REGD_ENT("JE", RTW_REGD_ETSI, RTW_REGD_ETSI),144 COUNTRY_REGD_ENT("JM", RTW_REGD_FCC, RTW_REGD_FCC),145 COUNTRY_REGD_ENT("JO", RTW_REGD_ETSI, RTW_REGD_ETSI),146 COUNTRY_REGD_ENT("JP", RTW_REGD_MKK, RTW_REGD_MKK),147 COUNTRY_REGD_ENT("KE", RTW_REGD_ETSI, RTW_REGD_ETSI),148 COUNTRY_REGD_ENT("KG", RTW_REGD_ETSI, RTW_REGD_ETSI),149 COUNTRY_REGD_ENT("KH", RTW_REGD_ETSI, RTW_REGD_ETSI),150 COUNTRY_REGD_ENT("KI", RTW_REGD_ETSI, RTW_REGD_ETSI),151 COUNTRY_REGD_ENT("KM", RTW_REGD_ETSI, RTW_REGD_ETSI),152 COUNTRY_REGD_ENT("KN", RTW_REGD_FCC, RTW_REGD_FCC),153 COUNTRY_REGD_ENT("KR", RTW_REGD_KCC, RTW_REGD_KCC),154 COUNTRY_REGD_ENT("KW", RTW_REGD_ETSI, RTW_REGD_ETSI),155 COUNTRY_REGD_ENT("KY", RTW_REGD_FCC, RTW_REGD_FCC),156 COUNTRY_REGD_ENT("KZ", RTW_REGD_ETSI, RTW_REGD_ETSI),157 COUNTRY_REGD_ENT("LA", RTW_REGD_ETSI, RTW_REGD_ETSI),158 COUNTRY_REGD_ENT("LB", RTW_REGD_ETSI, RTW_REGD_ETSI),159 COUNTRY_REGD_ENT("LC", RTW_REGD_FCC, RTW_REGD_FCC),160 COUNTRY_REGD_ENT("LI", RTW_REGD_ETSI, RTW_REGD_ETSI),161 COUNTRY_REGD_ENT("LK", RTW_REGD_ETSI, RTW_REGD_ETSI),162 COUNTRY_REGD_ENT("LR", RTW_REGD_ETSI, RTW_REGD_ETSI),163 COUNTRY_REGD_ENT("LS", RTW_REGD_ETSI, RTW_REGD_ETSI),164 COUNTRY_REGD_ENT("LT", RTW_REGD_ETSI, RTW_REGD_ETSI),165 COUNTRY_REGD_ENT("LU", RTW_REGD_ETSI, RTW_REGD_ETSI),166 COUNTRY_REGD_ENT("LV", RTW_REGD_ETSI, RTW_REGD_ETSI),167 COUNTRY_REGD_ENT("LY", RTW_REGD_ETSI, RTW_REGD_ETSI),168 COUNTRY_REGD_ENT("MA", RTW_REGD_ETSI, RTW_REGD_ETSI),169 COUNTRY_REGD_ENT("MC", RTW_REGD_ETSI, RTW_REGD_ETSI),170 COUNTRY_REGD_ENT("MD", RTW_REGD_ETSI, RTW_REGD_ETSI),171 COUNTRY_REGD_ENT("ME", RTW_REGD_ETSI, RTW_REGD_ETSI),172 COUNTRY_REGD_ENT("MF", RTW_REGD_FCC, RTW_REGD_FCC),173 COUNTRY_REGD_ENT("MG", RTW_REGD_ETSI, RTW_REGD_ETSI),174 COUNTRY_REGD_ENT("MH", RTW_REGD_FCC, RTW_REGD_FCC),175 COUNTRY_REGD_ENT("MK", RTW_REGD_ETSI, RTW_REGD_ETSI),176 COUNTRY_REGD_ENT("ML", RTW_REGD_ETSI, RTW_REGD_ETSI),177 COUNTRY_REGD_ENT("MM", RTW_REGD_ETSI, RTW_REGD_ETSI),178 COUNTRY_REGD_ENT("MN", RTW_REGD_ETSI, RTW_REGD_ETSI),179 COUNTRY_REGD_ENT("MO", RTW_REGD_ETSI, RTW_REGD_ETSI),180 COUNTRY_REGD_ENT("MP", RTW_REGD_FCC, RTW_REGD_FCC),181 COUNTRY_REGD_ENT("MQ", RTW_REGD_ETSI, RTW_REGD_ETSI),182 COUNTRY_REGD_ENT("MR", RTW_REGD_ETSI, RTW_REGD_ETSI),183 COUNTRY_REGD_ENT("MS", RTW_REGD_ETSI, RTW_REGD_ETSI),184 COUNTRY_REGD_ENT("MT", RTW_REGD_ETSI, RTW_REGD_ETSI),185 COUNTRY_REGD_ENT("MU", RTW_REGD_ETSI, RTW_REGD_ETSI),186 COUNTRY_REGD_ENT("MV", RTW_REGD_ETSI, RTW_REGD_ETSI),187 COUNTRY_REGD_ENT("MW", RTW_REGD_ETSI, RTW_REGD_ETSI),188 COUNTRY_REGD_ENT("MX", RTW_REGD_MEXICO, RTW_REGD_MEXICO),189 COUNTRY_REGD_ENT("MY", RTW_REGD_ETSI, RTW_REGD_ETSI),190 COUNTRY_REGD_ENT("MZ", RTW_REGD_ETSI, RTW_REGD_ETSI),191 COUNTRY_REGD_ENT("NA", RTW_REGD_ETSI, RTW_REGD_ETSI),192 COUNTRY_REGD_ENT("NC", RTW_REGD_ETSI, RTW_REGD_ETSI),193 COUNTRY_REGD_ENT("NE", RTW_REGD_ETSI, RTW_REGD_ETSI),194 COUNTRY_REGD_ENT("NF", RTW_REGD_ACMA, RTW_REGD_ACMA),195 COUNTRY_REGD_ENT("NG", RTW_REGD_ETSI, RTW_REGD_ETSI),196 COUNTRY_REGD_ENT("NI", RTW_REGD_FCC, RTW_REGD_FCC),197 COUNTRY_REGD_ENT("NL", RTW_REGD_ETSI, RTW_REGD_ETSI),198 COUNTRY_REGD_ENT("NO", RTW_REGD_ETSI, RTW_REGD_ETSI),199 COUNTRY_REGD_ENT("NP", RTW_REGD_ETSI, RTW_REGD_ETSI),200 COUNTRY_REGD_ENT("NR", RTW_REGD_ETSI, RTW_REGD_ETSI),201 COUNTRY_REGD_ENT("NU", RTW_REGD_ACMA, RTW_REGD_ACMA),202 COUNTRY_REGD_ENT("NZ", RTW_REGD_ACMA, RTW_REGD_ACMA),203 COUNTRY_REGD_ENT("OM", RTW_REGD_ETSI, RTW_REGD_ETSI),204 COUNTRY_REGD_ENT("PA", RTW_REGD_FCC, RTW_REGD_FCC),205 COUNTRY_REGD_ENT("PE", RTW_REGD_FCC, RTW_REGD_FCC),206 COUNTRY_REGD_ENT("PF", RTW_REGD_ETSI, RTW_REGD_ETSI),207 COUNTRY_REGD_ENT("PG", RTW_REGD_ETSI, RTW_REGD_ETSI),208 COUNTRY_REGD_ENT("PH", RTW_REGD_ETSI, RTW_REGD_ETSI),209 COUNTRY_REGD_ENT("PK", RTW_REGD_ETSI, RTW_REGD_ETSI),210 COUNTRY_REGD_ENT("PL", RTW_REGD_ETSI, RTW_REGD_ETSI),211 COUNTRY_REGD_ENT("PM", RTW_REGD_ETSI, RTW_REGD_ETSI),212 COUNTRY_REGD_ENT("PR", RTW_REGD_FCC, RTW_REGD_FCC),213 COUNTRY_REGD_ENT("PS", RTW_REGD_ETSI, RTW_REGD_ETSI),214 COUNTRY_REGD_ENT("PT", RTW_REGD_ETSI, RTW_REGD_ETSI),215 COUNTRY_REGD_ENT("PW", RTW_REGD_FCC, RTW_REGD_FCC),216 COUNTRY_REGD_ENT("PY", RTW_REGD_FCC, RTW_REGD_FCC),217 COUNTRY_REGD_ENT("QA", RTW_REGD_QATAR, RTW_REGD_QATAR),218 COUNTRY_REGD_ENT("RE", RTW_REGD_ETSI, RTW_REGD_ETSI),219 COUNTRY_REGD_ENT("RO", RTW_REGD_ETSI, RTW_REGD_ETSI),220 COUNTRY_REGD_ENT("RS", RTW_REGD_ETSI, RTW_REGD_ETSI),221 COUNTRY_REGD_ENT("RU", RTW_REGD_ETSI, RTW_REGD_ETSI),222 COUNTRY_REGD_ENT("RW", RTW_REGD_ETSI, RTW_REGD_ETSI),223 COUNTRY_REGD_ENT("SA", RTW_REGD_ETSI, RTW_REGD_ETSI),224 COUNTRY_REGD_ENT("SB", RTW_REGD_ETSI, RTW_REGD_ETSI),225 COUNTRY_REGD_ENT("SC", RTW_REGD_FCC, RTW_REGD_FCC),226 COUNTRY_REGD_ENT("SE", RTW_REGD_ETSI, RTW_REGD_ETSI),227 COUNTRY_REGD_ENT("SG", RTW_REGD_ETSI, RTW_REGD_ETSI),228 COUNTRY_REGD_ENT("SH", RTW_REGD_ETSI, RTW_REGD_ETSI),229 COUNTRY_REGD_ENT("SI", RTW_REGD_ETSI, RTW_REGD_ETSI),230 COUNTRY_REGD_ENT("SJ", RTW_REGD_ETSI, RTW_REGD_ETSI),231 COUNTRY_REGD_ENT("SK", RTW_REGD_ETSI, RTW_REGD_ETSI),232 COUNTRY_REGD_ENT("SL", RTW_REGD_ETSI, RTW_REGD_ETSI),233 COUNTRY_REGD_ENT("SM", RTW_REGD_ETSI, RTW_REGD_ETSI),234 COUNTRY_REGD_ENT("SN", RTW_REGD_ETSI, RTW_REGD_ETSI),235 COUNTRY_REGD_ENT("SO", RTW_REGD_ETSI, RTW_REGD_ETSI),236 COUNTRY_REGD_ENT("SR", RTW_REGD_FCC, RTW_REGD_FCC),237 COUNTRY_REGD_ENT("ST", RTW_REGD_ETSI, RTW_REGD_ETSI),238 COUNTRY_REGD_ENT("SV", RTW_REGD_FCC, RTW_REGD_FCC),239 COUNTRY_REGD_ENT("SX", RTW_REGD_FCC, RTW_REGD_FCC),240 COUNTRY_REGD_ENT("SZ", RTW_REGD_ETSI, RTW_REGD_ETSI),241 COUNTRY_REGD_ENT("TC", RTW_REGD_ETSI, RTW_REGD_ETSI),242 COUNTRY_REGD_ENT("TD", RTW_REGD_ETSI, RTW_REGD_ETSI),243 COUNTRY_REGD_ENT("TF", RTW_REGD_ETSI, RTW_REGD_ETSI),244 COUNTRY_REGD_ENT("TG", RTW_REGD_ETSI, RTW_REGD_ETSI),245 COUNTRY_REGD_ENT("TH", RTW_REGD_ETSI, RTW_REGD_ETSI),246 COUNTRY_REGD_ENT("TJ", RTW_REGD_ETSI, RTW_REGD_ETSI),247 COUNTRY_REGD_ENT("TK", RTW_REGD_ACMA, RTW_REGD_ACMA),248 COUNTRY_REGD_ENT("TM", RTW_REGD_ETSI, RTW_REGD_ETSI),249 COUNTRY_REGD_ENT("TN", RTW_REGD_ETSI, RTW_REGD_ETSI),250 COUNTRY_REGD_ENT("TO", RTW_REGD_ETSI, RTW_REGD_ETSI),251 COUNTRY_REGD_ENT("TR", RTW_REGD_ETSI, RTW_REGD_ETSI),252 COUNTRY_REGD_ENT("TT", RTW_REGD_FCC, RTW_REGD_FCC),253 COUNTRY_REGD_ENT("TV", RTW_REGD_ETSI, RTW_REGD_WW),254 COUNTRY_REGD_ENT("TW", RTW_REGD_FCC, RTW_REGD_FCC),255 COUNTRY_REGD_ENT("TZ", RTW_REGD_ETSI, RTW_REGD_ETSI),256 COUNTRY_REGD_ENT("UA", RTW_REGD_UKRAINE, RTW_REGD_UKRAINE),257 COUNTRY_REGD_ENT("UG", RTW_REGD_ETSI, RTW_REGD_ETSI),258 COUNTRY_REGD_ENT("US", RTW_REGD_FCC, RTW_REGD_FCC),259 COUNTRY_REGD_ENT("UY", RTW_REGD_FCC, RTW_REGD_FCC),260 COUNTRY_REGD_ENT("UZ", RTW_REGD_ETSI, RTW_REGD_ETSI),261 COUNTRY_REGD_ENT("VA", RTW_REGD_ETSI, RTW_REGD_ETSI),262 COUNTRY_REGD_ENT("VC", RTW_REGD_FCC, RTW_REGD_FCC),263 COUNTRY_REGD_ENT("VE", RTW_REGD_FCC, RTW_REGD_FCC),264 COUNTRY_REGD_ENT("VG", RTW_REGD_FCC, RTW_REGD_FCC),265 COUNTRY_REGD_ENT("VI", RTW_REGD_FCC, RTW_REGD_FCC),266 COUNTRY_REGD_ENT("VN", RTW_REGD_ETSI, RTW_REGD_ETSI),267 COUNTRY_REGD_ENT("VU", RTW_REGD_ETSI, RTW_REGD_ETSI),268 COUNTRY_REGD_ENT("WF", RTW_REGD_ETSI, RTW_REGD_ETSI),269 COUNTRY_REGD_ENT("WS", RTW_REGD_FCC, RTW_REGD_FCC),270 COUNTRY_REGD_ENT("XK", RTW_REGD_ETSI, RTW_REGD_ETSI),271 COUNTRY_REGD_ENT("YE", RTW_REGD_ETSI, RTW_REGD_ETSI),272 COUNTRY_REGD_ENT("YT", RTW_REGD_ETSI, RTW_REGD_ETSI),273 COUNTRY_REGD_ENT("ZA", RTW_REGD_ETSI, RTW_REGD_ETSI),274 COUNTRY_REGD_ENT("ZM", RTW_REGD_ETSI, RTW_REGD_ETSI),275 COUNTRY_REGD_ENT("ZW", RTW_REGD_ETSI, RTW_REGD_ETSI),276};277 278static void rtw_regd_apply_hw_cap_flags(struct wiphy *wiphy)279{280 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);281 struct ieee80211_supported_band *sband;282 struct ieee80211_channel *ch;283 struct rtw_dev *rtwdev = hw->priv;284 struct rtw_efuse *efuse = &rtwdev->efuse;285 int i;286 287 if (efuse->hw_cap.bw & BIT(RTW_CHANNEL_WIDTH_80))288 return;289 290 sband = wiphy->bands[NL80211_BAND_2GHZ];291 if (!sband)292 goto out_5g;293 294 for (i = 0; i < sband->n_channels; i++) {295 ch = &sband->channels[i];296 ch->flags |= IEEE80211_CHAN_NO_80MHZ;297 }298 299out_5g:300 sband = wiphy->bands[NL80211_BAND_5GHZ];301 if (!sband)302 return;303 304 for (i = 0; i < sband->n_channels; i++) {305 ch = &sband->channels[i];306 ch->flags |= IEEE80211_CHAN_NO_80MHZ;307 }308}309 310static bool rtw_reg_is_ww(const struct rtw_regulatory *reg)311{312 return reg == &rtw_reg_ww;313}314 315static bool rtw_reg_match(const struct rtw_regulatory *reg, const char *alpha2)316{317 return memcmp(reg->alpha2, alpha2, 2) == 0;318}319 320static const struct rtw_regulatory *rtw_reg_find_by_name(const char *alpha2)321{322 unsigned int i;323 324 for (i = 0; i < ARRAY_SIZE(rtw_reg_map); i++) {325 if (rtw_reg_match(&rtw_reg_map[i], alpha2))326 return &rtw_reg_map[i];327 }328 329 return &rtw_reg_ww;330}331 332static333void rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request);334 335/* call this before ieee80211_register_hw() */336int rtw_regd_init(struct rtw_dev *rtwdev)337{338 struct wiphy *wiphy = rtwdev->hw->wiphy;339 const struct rtw_regulatory *chip_reg;340 341 if (!wiphy)342 return -EINVAL;343 344 wiphy->reg_notifier = rtw_regd_notifier;345 346 chip_reg = rtw_reg_find_by_name(rtwdev->efuse.country_code);347 if (!rtw_reg_is_ww(chip_reg)) {348 rtwdev->regd.state = RTW_REGD_STATE_PROGRAMMED;349 350 /* Set REGULATORY_STRICT_REG before ieee80211_register_hw(),351 * stack will wait for regulatory_hint() and consider it352 * as the superset for our regulatory rule.353 */354 wiphy->regulatory_flags |= REGULATORY_STRICT_REG;355 wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_IGNORE;356 } else {357 rtwdev->regd.state = RTW_REGD_STATE_WORLDWIDE;358 }359 360 rtwdev->regd.regulatory = &rtw_reg_ww;361 rtwdev->regd.dfs_region = NL80211_DFS_UNSET;362 rtw_dbg_regd_dump(rtwdev, "regd init state %d: ", rtwdev->regd.state);363 364 rtw_regd_apply_hw_cap_flags(wiphy);365 return 0;366}367 368/* call this after ieee80211_register_hw() */369int rtw_regd_hint(struct rtw_dev *rtwdev)370{371 struct wiphy *wiphy = rtwdev->hw->wiphy;372 int ret;373 374 if (!wiphy)375 return -EINVAL;376 377 if (rtwdev->regd.state == RTW_REGD_STATE_PROGRAMMED) {378 rtw_dbg(rtwdev, RTW_DBG_REGD,379 "country domain %c%c is PGed on efuse",380 rtwdev->efuse.country_code[0],381 rtwdev->efuse.country_code[1]);382 383 ret = regulatory_hint(wiphy, rtwdev->efuse.country_code);384 if (ret) {385 rtw_warn(rtwdev,386 "failed to hint regulatory: %d\n", ret);387 return ret;388 }389 }390 391 return 0;392}393 394static bool rtw_regd_mgmt_worldwide(struct rtw_dev *rtwdev,395 struct rtw_regd *next_regd,396 struct regulatory_request *request)397{398 struct wiphy *wiphy = rtwdev->hw->wiphy;399 400 next_regd->state = RTW_REGD_STATE_WORLDWIDE;401 402 if (request->initiator == NL80211_REGDOM_SET_BY_USER &&403 !rtw_reg_is_ww(next_regd->regulatory)) {404 next_regd->state = RTW_REGD_STATE_SETTING;405 wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_IGNORE;406 }407 408 return true;409}410 411static bool rtw_regd_mgmt_programmed(struct rtw_dev *rtwdev,412 struct rtw_regd *next_regd,413 struct regulatory_request *request)414{415 if (request->initiator == NL80211_REGDOM_SET_BY_DRIVER &&416 rtw_reg_match(next_regd->regulatory, rtwdev->efuse.country_code)) {417 next_regd->state = RTW_REGD_STATE_PROGRAMMED;418 return true;419 }420 421 return false;422}423 424static bool rtw_regd_mgmt_setting(struct rtw_dev *rtwdev,425 struct rtw_regd *next_regd,426 struct regulatory_request *request)427{428 struct wiphy *wiphy = rtwdev->hw->wiphy;429 430 if (request->initiator != NL80211_REGDOM_SET_BY_USER)431 return false;432 433 next_regd->state = RTW_REGD_STATE_SETTING;434 435 if (rtw_reg_is_ww(next_regd->regulatory)) {436 next_regd->state = RTW_REGD_STATE_WORLDWIDE;437 wiphy->regulatory_flags &= ~REGULATORY_COUNTRY_IE_IGNORE;438 }439 440 return true;441}442 443static bool (*const rtw_regd_handler[RTW_REGD_STATE_NR])444 (struct rtw_dev *, struct rtw_regd *, struct regulatory_request *) = {445 [RTW_REGD_STATE_WORLDWIDE] = rtw_regd_mgmt_worldwide,446 [RTW_REGD_STATE_PROGRAMMED] = rtw_regd_mgmt_programmed,447 [RTW_REGD_STATE_SETTING] = rtw_regd_mgmt_setting,448};449 450static bool rtw_regd_state_hdl(struct rtw_dev *rtwdev,451 struct rtw_regd *next_regd,452 struct regulatory_request *request)453{454 next_regd->regulatory = rtw_reg_find_by_name(request->alpha2);455 next_regd->dfs_region = request->dfs_region;456 return rtw_regd_handler[rtwdev->regd.state](rtwdev, next_regd, request);457}458 459static460void rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request)461{462 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);463 struct rtw_dev *rtwdev = hw->priv;464 struct rtw_hal *hal = &rtwdev->hal;465 struct rtw_regd next_regd = {0};466 bool hdl;467 468 hdl = rtw_regd_state_hdl(rtwdev, &next_regd, request);469 if (!hdl) {470 rtw_dbg(rtwdev, RTW_DBG_REGD,471 "regd state %d: ignore request %c%c of initiator %d\n",472 rtwdev->regd.state,473 request->alpha2[0],474 request->alpha2[1],475 request->initiator);476 return;477 }478 479 rtw_dbg(rtwdev, RTW_DBG_REGD, "regd state: %d -> %d\n",480 rtwdev->regd.state, next_regd.state);481 482 mutex_lock(&rtwdev->mutex);483 rtwdev->regd = next_regd;484 rtw_dbg_regd_dump(rtwdev, "get alpha2 %c%c from initiator %d: ",485 request->alpha2[0],486 request->alpha2[1],487 request->initiator);488 489 rtw_phy_adaptivity_set_mode(rtwdev);490 rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);491 mutex_unlock(&rtwdev->mutex);492}493 494u8 rtw_regd_get(struct rtw_dev *rtwdev)495{496 struct rtw_hal *hal = &rtwdev->hal;497 u8 band = hal->current_band_type;498 499 return band == RTW_BAND_2G ?500 rtwdev->regd.regulatory->txpwr_regd_2g :501 rtwdev->regd.regulatory->txpwr_regd_5g;502}503EXPORT_SYMBOL(rtw_regd_get);504 505bool rtw_regd_srrc(struct rtw_dev *rtwdev)506{507 struct rtw_regd *regd = &rtwdev->regd;508 509 return rtw_reg_match(regd->regulatory, "CN");510}511EXPORT_SYMBOL(rtw_regd_srrc);512 513struct rtw_regd_alternative_t {514 bool set;515 u8 alt;516};517 518#define DECL_REGD_ALT(_regd, _regd_alt) \519 [(_regd)] = {.set = true, .alt = (_regd_alt)}520 521static const struct rtw_regd_alternative_t522rtw_regd_alt[RTW_REGD_MAX] = {523 DECL_REGD_ALT(RTW_REGD_IC, RTW_REGD_FCC),524 DECL_REGD_ALT(RTW_REGD_KCC, RTW_REGD_ETSI),525 DECL_REGD_ALT(RTW_REGD_ACMA, RTW_REGD_ETSI),526 DECL_REGD_ALT(RTW_REGD_CHILE, RTW_REGD_FCC),527 DECL_REGD_ALT(RTW_REGD_UKRAINE, RTW_REGD_ETSI),528 DECL_REGD_ALT(RTW_REGD_MEXICO, RTW_REGD_FCC),529 DECL_REGD_ALT(RTW_REGD_CN, RTW_REGD_ETSI),530 DECL_REGD_ALT(RTW_REGD_QATAR, RTW_REGD_ETSI),531 DECL_REGD_ALT(RTW_REGD_UK, RTW_REGD_ETSI),532};533 534bool rtw_regd_has_alt(u8 regd, u8 *regd_alt)535{536 if (!rtw_regd_alt[regd].set)537 return false;538 539 *regd_alt = rtw_regd_alt[regd].alt;540 return true;541}542