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