162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2018-2019 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include "main.h" 662306a36Sopenharmony_ci#include "regd.h" 762306a36Sopenharmony_ci#include "debug.h" 862306a36Sopenharmony_ci#include "phy.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define COUNTRY_REGD_ENT(_alpha2, _regd_2g, _regd_5g) \ 1162306a36Sopenharmony_ci {.alpha2 = (_alpha2), \ 1262306a36Sopenharmony_ci .txpwr_regd_2g = (_regd_2g), \ 1362306a36Sopenharmony_ci .txpwr_regd_5g = (_regd_5g), \ 1462306a36Sopenharmony_ci } 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define rtw_dbg_regd_dump(_dev, _msg, _args...) \ 1762306a36Sopenharmony_cido { \ 1862306a36Sopenharmony_ci struct rtw_dev *__d = (_dev); \ 1962306a36Sopenharmony_ci const struct rtw_regd *__r = &__d->regd; \ 2062306a36Sopenharmony_ci rtw_dbg(__d, RTW_DBG_REGD, _msg \ 2162306a36Sopenharmony_ci "apply alpha2 %c%c, regd {%d, %d}, dfs_region %d\n",\ 2262306a36Sopenharmony_ci ##_args, \ 2362306a36Sopenharmony_ci __r->regulatory->alpha2[0], \ 2462306a36Sopenharmony_ci __r->regulatory->alpha2[1], \ 2562306a36Sopenharmony_ci __r->regulatory->txpwr_regd_2g, \ 2662306a36Sopenharmony_ci __r->regulatory->txpwr_regd_5g, \ 2762306a36Sopenharmony_ci __r->dfs_region); \ 2862306a36Sopenharmony_ci} while (0) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* If country code is not correctly defined in efuse, 3162306a36Sopenharmony_ci * use worldwide country code and txpwr regd. 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_cistatic const struct rtw_regulatory rtw_reg_ww = 3462306a36Sopenharmony_ci COUNTRY_REGD_ENT("00", RTW_REGD_WW, RTW_REGD_WW); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic const struct rtw_regulatory rtw_reg_map[] = { 3762306a36Sopenharmony_ci COUNTRY_REGD_ENT("AD", RTW_REGD_ETSI, RTW_REGD_ETSI), 3862306a36Sopenharmony_ci COUNTRY_REGD_ENT("AE", RTW_REGD_ETSI, RTW_REGD_ETSI), 3962306a36Sopenharmony_ci COUNTRY_REGD_ENT("AF", RTW_REGD_ETSI, RTW_REGD_ETSI), 4062306a36Sopenharmony_ci COUNTRY_REGD_ENT("AG", RTW_REGD_FCC, RTW_REGD_FCC), 4162306a36Sopenharmony_ci COUNTRY_REGD_ENT("AI", RTW_REGD_ETSI, RTW_REGD_ETSI), 4262306a36Sopenharmony_ci COUNTRY_REGD_ENT("AL", RTW_REGD_ETSI, RTW_REGD_ETSI), 4362306a36Sopenharmony_ci COUNTRY_REGD_ENT("AM", RTW_REGD_ETSI, RTW_REGD_ETSI), 4462306a36Sopenharmony_ci COUNTRY_REGD_ENT("AN", RTW_REGD_FCC, RTW_REGD_FCC), 4562306a36Sopenharmony_ci COUNTRY_REGD_ENT("AO", RTW_REGD_ETSI, RTW_REGD_ETSI), 4662306a36Sopenharmony_ci COUNTRY_REGD_ENT("AQ", RTW_REGD_ETSI, RTW_REGD_ETSI), 4762306a36Sopenharmony_ci COUNTRY_REGD_ENT("AR", RTW_REGD_MEXICO, RTW_REGD_MEXICO), 4862306a36Sopenharmony_ci COUNTRY_REGD_ENT("AS", RTW_REGD_FCC, RTW_REGD_FCC), 4962306a36Sopenharmony_ci COUNTRY_REGD_ENT("AT", RTW_REGD_ETSI, RTW_REGD_ETSI), 5062306a36Sopenharmony_ci COUNTRY_REGD_ENT("AU", RTW_REGD_ACMA, RTW_REGD_ACMA), 5162306a36Sopenharmony_ci COUNTRY_REGD_ENT("AW", RTW_REGD_FCC, RTW_REGD_FCC), 5262306a36Sopenharmony_ci COUNTRY_REGD_ENT("AZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 5362306a36Sopenharmony_ci COUNTRY_REGD_ENT("BA", RTW_REGD_ETSI, RTW_REGD_ETSI), 5462306a36Sopenharmony_ci COUNTRY_REGD_ENT("BB", RTW_REGD_FCC, RTW_REGD_FCC), 5562306a36Sopenharmony_ci COUNTRY_REGD_ENT("BD", RTW_REGD_ETSI, RTW_REGD_ETSI), 5662306a36Sopenharmony_ci COUNTRY_REGD_ENT("BE", RTW_REGD_ETSI, RTW_REGD_ETSI), 5762306a36Sopenharmony_ci COUNTRY_REGD_ENT("BF", RTW_REGD_ETSI, RTW_REGD_ETSI), 5862306a36Sopenharmony_ci COUNTRY_REGD_ENT("BG", RTW_REGD_ETSI, RTW_REGD_ETSI), 5962306a36Sopenharmony_ci COUNTRY_REGD_ENT("BH", RTW_REGD_ETSI, RTW_REGD_ETSI), 6062306a36Sopenharmony_ci COUNTRY_REGD_ENT("BI", RTW_REGD_ETSI, RTW_REGD_ETSI), 6162306a36Sopenharmony_ci COUNTRY_REGD_ENT("BJ", RTW_REGD_ETSI, RTW_REGD_ETSI), 6262306a36Sopenharmony_ci COUNTRY_REGD_ENT("BM", RTW_REGD_FCC, RTW_REGD_FCC), 6362306a36Sopenharmony_ci COUNTRY_REGD_ENT("BN", RTW_REGD_ETSI, RTW_REGD_ETSI), 6462306a36Sopenharmony_ci COUNTRY_REGD_ENT("BO", RTW_REGD_FCC, RTW_REGD_FCC), 6562306a36Sopenharmony_ci COUNTRY_REGD_ENT("BR", RTW_REGD_FCC, RTW_REGD_FCC), 6662306a36Sopenharmony_ci COUNTRY_REGD_ENT("BS", RTW_REGD_FCC, RTW_REGD_FCC), 6762306a36Sopenharmony_ci COUNTRY_REGD_ENT("BT", RTW_REGD_ETSI, RTW_REGD_ETSI), 6862306a36Sopenharmony_ci COUNTRY_REGD_ENT("BV", RTW_REGD_ETSI, RTW_REGD_ETSI), 6962306a36Sopenharmony_ci COUNTRY_REGD_ENT("BW", RTW_REGD_ETSI, RTW_REGD_ETSI), 7062306a36Sopenharmony_ci COUNTRY_REGD_ENT("BY", RTW_REGD_ETSI, RTW_REGD_ETSI), 7162306a36Sopenharmony_ci COUNTRY_REGD_ENT("BZ", RTW_REGD_FCC, RTW_REGD_FCC), 7262306a36Sopenharmony_ci COUNTRY_REGD_ENT("CA", RTW_REGD_IC, RTW_REGD_IC), 7362306a36Sopenharmony_ci COUNTRY_REGD_ENT("CC", RTW_REGD_ETSI, RTW_REGD_ETSI), 7462306a36Sopenharmony_ci COUNTRY_REGD_ENT("CD", RTW_REGD_ETSI, RTW_REGD_ETSI), 7562306a36Sopenharmony_ci COUNTRY_REGD_ENT("CF", RTW_REGD_ETSI, RTW_REGD_ETSI), 7662306a36Sopenharmony_ci COUNTRY_REGD_ENT("CG", RTW_REGD_ETSI, RTW_REGD_ETSI), 7762306a36Sopenharmony_ci COUNTRY_REGD_ENT("CH", RTW_REGD_ETSI, RTW_REGD_ETSI), 7862306a36Sopenharmony_ci COUNTRY_REGD_ENT("CI", RTW_REGD_ETSI, RTW_REGD_ETSI), 7962306a36Sopenharmony_ci COUNTRY_REGD_ENT("CK", RTW_REGD_ETSI, RTW_REGD_ETSI), 8062306a36Sopenharmony_ci COUNTRY_REGD_ENT("CL", RTW_REGD_FCC, RTW_REGD_FCC), 8162306a36Sopenharmony_ci COUNTRY_REGD_ENT("CM", RTW_REGD_ETSI, RTW_REGD_ETSI), 8262306a36Sopenharmony_ci COUNTRY_REGD_ENT("CN", RTW_REGD_ETSI, RTW_REGD_ETSI), 8362306a36Sopenharmony_ci COUNTRY_REGD_ENT("CO", RTW_REGD_FCC, RTW_REGD_FCC), 8462306a36Sopenharmony_ci COUNTRY_REGD_ENT("CR", RTW_REGD_FCC, RTW_REGD_FCC), 8562306a36Sopenharmony_ci COUNTRY_REGD_ENT("CV", RTW_REGD_ETSI, RTW_REGD_ETSI), 8662306a36Sopenharmony_ci COUNTRY_REGD_ENT("CX", RTW_REGD_ACMA, RTW_REGD_ACMA), 8762306a36Sopenharmony_ci COUNTRY_REGD_ENT("CY", RTW_REGD_ETSI, RTW_REGD_ETSI), 8862306a36Sopenharmony_ci COUNTRY_REGD_ENT("CZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 8962306a36Sopenharmony_ci COUNTRY_REGD_ENT("DE", RTW_REGD_ETSI, RTW_REGD_ETSI), 9062306a36Sopenharmony_ci COUNTRY_REGD_ENT("DJ", RTW_REGD_ETSI, RTW_REGD_ETSI), 9162306a36Sopenharmony_ci COUNTRY_REGD_ENT("DK", RTW_REGD_ETSI, RTW_REGD_ETSI), 9262306a36Sopenharmony_ci COUNTRY_REGD_ENT("DM", RTW_REGD_FCC, RTW_REGD_FCC), 9362306a36Sopenharmony_ci COUNTRY_REGD_ENT("DO", RTW_REGD_FCC, RTW_REGD_FCC), 9462306a36Sopenharmony_ci COUNTRY_REGD_ENT("DZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 9562306a36Sopenharmony_ci COUNTRY_REGD_ENT("EC", RTW_REGD_FCC, RTW_REGD_FCC), 9662306a36Sopenharmony_ci COUNTRY_REGD_ENT("EE", RTW_REGD_ETSI, RTW_REGD_ETSI), 9762306a36Sopenharmony_ci COUNTRY_REGD_ENT("EG", RTW_REGD_ETSI, RTW_REGD_ETSI), 9862306a36Sopenharmony_ci COUNTRY_REGD_ENT("EH", RTW_REGD_ETSI, RTW_REGD_ETSI), 9962306a36Sopenharmony_ci COUNTRY_REGD_ENT("ER", RTW_REGD_ETSI, RTW_REGD_ETSI), 10062306a36Sopenharmony_ci COUNTRY_REGD_ENT("ES", RTW_REGD_ETSI, RTW_REGD_ETSI), 10162306a36Sopenharmony_ci COUNTRY_REGD_ENT("ET", RTW_REGD_ETSI, RTW_REGD_ETSI), 10262306a36Sopenharmony_ci COUNTRY_REGD_ENT("FI", RTW_REGD_ETSI, RTW_REGD_ETSI), 10362306a36Sopenharmony_ci COUNTRY_REGD_ENT("FJ", RTW_REGD_FCC, RTW_REGD_FCC), 10462306a36Sopenharmony_ci COUNTRY_REGD_ENT("FK", RTW_REGD_ETSI, RTW_REGD_ETSI), 10562306a36Sopenharmony_ci COUNTRY_REGD_ENT("FM", RTW_REGD_FCC, RTW_REGD_FCC), 10662306a36Sopenharmony_ci COUNTRY_REGD_ENT("FO", RTW_REGD_ETSI, RTW_REGD_ETSI), 10762306a36Sopenharmony_ci COUNTRY_REGD_ENT("FR", RTW_REGD_ETSI, RTW_REGD_ETSI), 10862306a36Sopenharmony_ci COUNTRY_REGD_ENT("GA", RTW_REGD_ETSI, RTW_REGD_ETSI), 10962306a36Sopenharmony_ci COUNTRY_REGD_ENT("GB", RTW_REGD_ETSI, RTW_REGD_ETSI), 11062306a36Sopenharmony_ci COUNTRY_REGD_ENT("GD", RTW_REGD_FCC, RTW_REGD_FCC), 11162306a36Sopenharmony_ci COUNTRY_REGD_ENT("GE", RTW_REGD_ETSI, RTW_REGD_ETSI), 11262306a36Sopenharmony_ci COUNTRY_REGD_ENT("GF", RTW_REGD_ETSI, RTW_REGD_ETSI), 11362306a36Sopenharmony_ci COUNTRY_REGD_ENT("GG", RTW_REGD_ETSI, RTW_REGD_ETSI), 11462306a36Sopenharmony_ci COUNTRY_REGD_ENT("GH", RTW_REGD_ETSI, RTW_REGD_ETSI), 11562306a36Sopenharmony_ci COUNTRY_REGD_ENT("GI", RTW_REGD_ETSI, RTW_REGD_ETSI), 11662306a36Sopenharmony_ci COUNTRY_REGD_ENT("GL", RTW_REGD_ETSI, RTW_REGD_ETSI), 11762306a36Sopenharmony_ci COUNTRY_REGD_ENT("GM", RTW_REGD_ETSI, RTW_REGD_ETSI), 11862306a36Sopenharmony_ci COUNTRY_REGD_ENT("GN", RTW_REGD_ETSI, RTW_REGD_ETSI), 11962306a36Sopenharmony_ci COUNTRY_REGD_ENT("GP", RTW_REGD_ETSI, RTW_REGD_ETSI), 12062306a36Sopenharmony_ci COUNTRY_REGD_ENT("GQ", RTW_REGD_ETSI, RTW_REGD_ETSI), 12162306a36Sopenharmony_ci COUNTRY_REGD_ENT("GR", RTW_REGD_ETSI, RTW_REGD_ETSI), 12262306a36Sopenharmony_ci COUNTRY_REGD_ENT("GS", RTW_REGD_ETSI, RTW_REGD_ETSI), 12362306a36Sopenharmony_ci COUNTRY_REGD_ENT("GT", RTW_REGD_FCC, RTW_REGD_FCC), 12462306a36Sopenharmony_ci COUNTRY_REGD_ENT("GU", RTW_REGD_FCC, RTW_REGD_FCC), 12562306a36Sopenharmony_ci COUNTRY_REGD_ENT("GW", RTW_REGD_ETSI, RTW_REGD_ETSI), 12662306a36Sopenharmony_ci COUNTRY_REGD_ENT("GY", RTW_REGD_FCC, RTW_REGD_FCC), 12762306a36Sopenharmony_ci COUNTRY_REGD_ENT("HK", RTW_REGD_ETSI, RTW_REGD_ETSI), 12862306a36Sopenharmony_ci COUNTRY_REGD_ENT("HM", RTW_REGD_ACMA, RTW_REGD_ACMA), 12962306a36Sopenharmony_ci COUNTRY_REGD_ENT("HN", RTW_REGD_FCC, RTW_REGD_FCC), 13062306a36Sopenharmony_ci COUNTRY_REGD_ENT("HR", RTW_REGD_ETSI, RTW_REGD_ETSI), 13162306a36Sopenharmony_ci COUNTRY_REGD_ENT("HT", RTW_REGD_FCC, RTW_REGD_FCC), 13262306a36Sopenharmony_ci COUNTRY_REGD_ENT("HU", RTW_REGD_ETSI, RTW_REGD_ETSI), 13362306a36Sopenharmony_ci COUNTRY_REGD_ENT("ID", RTW_REGD_ETSI, RTW_REGD_ETSI), 13462306a36Sopenharmony_ci COUNTRY_REGD_ENT("IE", RTW_REGD_ETSI, RTW_REGD_ETSI), 13562306a36Sopenharmony_ci COUNTRY_REGD_ENT("IL", RTW_REGD_ETSI, RTW_REGD_ETSI), 13662306a36Sopenharmony_ci COUNTRY_REGD_ENT("IM", RTW_REGD_ETSI, RTW_REGD_ETSI), 13762306a36Sopenharmony_ci COUNTRY_REGD_ENT("IN", RTW_REGD_ETSI, RTW_REGD_ETSI), 13862306a36Sopenharmony_ci COUNTRY_REGD_ENT("IO", RTW_REGD_ETSI, RTW_REGD_ETSI), 13962306a36Sopenharmony_ci COUNTRY_REGD_ENT("IQ", RTW_REGD_ETSI, RTW_REGD_ETSI), 14062306a36Sopenharmony_ci COUNTRY_REGD_ENT("IR", RTW_REGD_ETSI, RTW_REGD_ETSI), 14162306a36Sopenharmony_ci COUNTRY_REGD_ENT("IS", RTW_REGD_ETSI, RTW_REGD_ETSI), 14262306a36Sopenharmony_ci COUNTRY_REGD_ENT("IT", RTW_REGD_ETSI, RTW_REGD_ETSI), 14362306a36Sopenharmony_ci COUNTRY_REGD_ENT("JE", RTW_REGD_ETSI, RTW_REGD_ETSI), 14462306a36Sopenharmony_ci COUNTRY_REGD_ENT("JM", RTW_REGD_FCC, RTW_REGD_FCC), 14562306a36Sopenharmony_ci COUNTRY_REGD_ENT("JO", RTW_REGD_ETSI, RTW_REGD_ETSI), 14662306a36Sopenharmony_ci COUNTRY_REGD_ENT("JP", RTW_REGD_MKK, RTW_REGD_MKK), 14762306a36Sopenharmony_ci COUNTRY_REGD_ENT("KE", RTW_REGD_ETSI, RTW_REGD_ETSI), 14862306a36Sopenharmony_ci COUNTRY_REGD_ENT("KG", RTW_REGD_ETSI, RTW_REGD_ETSI), 14962306a36Sopenharmony_ci COUNTRY_REGD_ENT("KH", RTW_REGD_ETSI, RTW_REGD_ETSI), 15062306a36Sopenharmony_ci COUNTRY_REGD_ENT("KI", RTW_REGD_ETSI, RTW_REGD_ETSI), 15162306a36Sopenharmony_ci COUNTRY_REGD_ENT("KM", RTW_REGD_ETSI, RTW_REGD_ETSI), 15262306a36Sopenharmony_ci COUNTRY_REGD_ENT("KN", RTW_REGD_FCC, RTW_REGD_FCC), 15362306a36Sopenharmony_ci COUNTRY_REGD_ENT("KR", RTW_REGD_KCC, RTW_REGD_KCC), 15462306a36Sopenharmony_ci COUNTRY_REGD_ENT("KW", RTW_REGD_ETSI, RTW_REGD_ETSI), 15562306a36Sopenharmony_ci COUNTRY_REGD_ENT("KY", RTW_REGD_FCC, RTW_REGD_FCC), 15662306a36Sopenharmony_ci COUNTRY_REGD_ENT("KZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 15762306a36Sopenharmony_ci COUNTRY_REGD_ENT("LA", RTW_REGD_ETSI, RTW_REGD_ETSI), 15862306a36Sopenharmony_ci COUNTRY_REGD_ENT("LB", RTW_REGD_ETSI, RTW_REGD_ETSI), 15962306a36Sopenharmony_ci COUNTRY_REGD_ENT("LC", RTW_REGD_FCC, RTW_REGD_FCC), 16062306a36Sopenharmony_ci COUNTRY_REGD_ENT("LI", RTW_REGD_ETSI, RTW_REGD_ETSI), 16162306a36Sopenharmony_ci COUNTRY_REGD_ENT("LK", RTW_REGD_ETSI, RTW_REGD_ETSI), 16262306a36Sopenharmony_ci COUNTRY_REGD_ENT("LR", RTW_REGD_ETSI, RTW_REGD_ETSI), 16362306a36Sopenharmony_ci COUNTRY_REGD_ENT("LS", RTW_REGD_ETSI, RTW_REGD_ETSI), 16462306a36Sopenharmony_ci COUNTRY_REGD_ENT("LT", RTW_REGD_ETSI, RTW_REGD_ETSI), 16562306a36Sopenharmony_ci COUNTRY_REGD_ENT("LU", RTW_REGD_ETSI, RTW_REGD_ETSI), 16662306a36Sopenharmony_ci COUNTRY_REGD_ENT("LV", RTW_REGD_ETSI, RTW_REGD_ETSI), 16762306a36Sopenharmony_ci COUNTRY_REGD_ENT("LY", RTW_REGD_ETSI, RTW_REGD_ETSI), 16862306a36Sopenharmony_ci COUNTRY_REGD_ENT("MA", RTW_REGD_ETSI, RTW_REGD_ETSI), 16962306a36Sopenharmony_ci COUNTRY_REGD_ENT("MC", RTW_REGD_ETSI, RTW_REGD_ETSI), 17062306a36Sopenharmony_ci COUNTRY_REGD_ENT("MD", RTW_REGD_ETSI, RTW_REGD_ETSI), 17162306a36Sopenharmony_ci COUNTRY_REGD_ENT("ME", RTW_REGD_ETSI, RTW_REGD_ETSI), 17262306a36Sopenharmony_ci COUNTRY_REGD_ENT("MF", RTW_REGD_FCC, RTW_REGD_FCC), 17362306a36Sopenharmony_ci COUNTRY_REGD_ENT("MG", RTW_REGD_ETSI, RTW_REGD_ETSI), 17462306a36Sopenharmony_ci COUNTRY_REGD_ENT("MH", RTW_REGD_FCC, RTW_REGD_FCC), 17562306a36Sopenharmony_ci COUNTRY_REGD_ENT("MK", RTW_REGD_ETSI, RTW_REGD_ETSI), 17662306a36Sopenharmony_ci COUNTRY_REGD_ENT("ML", RTW_REGD_ETSI, RTW_REGD_ETSI), 17762306a36Sopenharmony_ci COUNTRY_REGD_ENT("MM", RTW_REGD_ETSI, RTW_REGD_ETSI), 17862306a36Sopenharmony_ci COUNTRY_REGD_ENT("MN", RTW_REGD_ETSI, RTW_REGD_ETSI), 17962306a36Sopenharmony_ci COUNTRY_REGD_ENT("MO", RTW_REGD_ETSI, RTW_REGD_ETSI), 18062306a36Sopenharmony_ci COUNTRY_REGD_ENT("MP", RTW_REGD_FCC, RTW_REGD_FCC), 18162306a36Sopenharmony_ci COUNTRY_REGD_ENT("MQ", RTW_REGD_ETSI, RTW_REGD_ETSI), 18262306a36Sopenharmony_ci COUNTRY_REGD_ENT("MR", RTW_REGD_ETSI, RTW_REGD_ETSI), 18362306a36Sopenharmony_ci COUNTRY_REGD_ENT("MS", RTW_REGD_ETSI, RTW_REGD_ETSI), 18462306a36Sopenharmony_ci COUNTRY_REGD_ENT("MT", RTW_REGD_ETSI, RTW_REGD_ETSI), 18562306a36Sopenharmony_ci COUNTRY_REGD_ENT("MU", RTW_REGD_ETSI, RTW_REGD_ETSI), 18662306a36Sopenharmony_ci COUNTRY_REGD_ENT("MV", RTW_REGD_ETSI, RTW_REGD_ETSI), 18762306a36Sopenharmony_ci COUNTRY_REGD_ENT("MW", RTW_REGD_ETSI, RTW_REGD_ETSI), 18862306a36Sopenharmony_ci COUNTRY_REGD_ENT("MX", RTW_REGD_MEXICO, RTW_REGD_MEXICO), 18962306a36Sopenharmony_ci COUNTRY_REGD_ENT("MY", RTW_REGD_ETSI, RTW_REGD_ETSI), 19062306a36Sopenharmony_ci COUNTRY_REGD_ENT("MZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 19162306a36Sopenharmony_ci COUNTRY_REGD_ENT("NA", RTW_REGD_ETSI, RTW_REGD_ETSI), 19262306a36Sopenharmony_ci COUNTRY_REGD_ENT("NC", RTW_REGD_ETSI, RTW_REGD_ETSI), 19362306a36Sopenharmony_ci COUNTRY_REGD_ENT("NE", RTW_REGD_ETSI, RTW_REGD_ETSI), 19462306a36Sopenharmony_ci COUNTRY_REGD_ENT("NF", RTW_REGD_ACMA, RTW_REGD_ACMA), 19562306a36Sopenharmony_ci COUNTRY_REGD_ENT("NG", RTW_REGD_ETSI, RTW_REGD_ETSI), 19662306a36Sopenharmony_ci COUNTRY_REGD_ENT("NI", RTW_REGD_FCC, RTW_REGD_FCC), 19762306a36Sopenharmony_ci COUNTRY_REGD_ENT("NL", RTW_REGD_ETSI, RTW_REGD_ETSI), 19862306a36Sopenharmony_ci COUNTRY_REGD_ENT("NO", RTW_REGD_ETSI, RTW_REGD_ETSI), 19962306a36Sopenharmony_ci COUNTRY_REGD_ENT("NP", RTW_REGD_ETSI, RTW_REGD_ETSI), 20062306a36Sopenharmony_ci COUNTRY_REGD_ENT("NR", RTW_REGD_ETSI, RTW_REGD_ETSI), 20162306a36Sopenharmony_ci COUNTRY_REGD_ENT("NU", RTW_REGD_ACMA, RTW_REGD_ACMA), 20262306a36Sopenharmony_ci COUNTRY_REGD_ENT("NZ", RTW_REGD_ACMA, RTW_REGD_ACMA), 20362306a36Sopenharmony_ci COUNTRY_REGD_ENT("OM", RTW_REGD_ETSI, RTW_REGD_ETSI), 20462306a36Sopenharmony_ci COUNTRY_REGD_ENT("PA", RTW_REGD_FCC, RTW_REGD_FCC), 20562306a36Sopenharmony_ci COUNTRY_REGD_ENT("PE", RTW_REGD_FCC, RTW_REGD_FCC), 20662306a36Sopenharmony_ci COUNTRY_REGD_ENT("PF", RTW_REGD_ETSI, RTW_REGD_ETSI), 20762306a36Sopenharmony_ci COUNTRY_REGD_ENT("PG", RTW_REGD_ETSI, RTW_REGD_ETSI), 20862306a36Sopenharmony_ci COUNTRY_REGD_ENT("PH", RTW_REGD_ETSI, RTW_REGD_ETSI), 20962306a36Sopenharmony_ci COUNTRY_REGD_ENT("PK", RTW_REGD_ETSI, RTW_REGD_ETSI), 21062306a36Sopenharmony_ci COUNTRY_REGD_ENT("PL", RTW_REGD_ETSI, RTW_REGD_ETSI), 21162306a36Sopenharmony_ci COUNTRY_REGD_ENT("PM", RTW_REGD_ETSI, RTW_REGD_ETSI), 21262306a36Sopenharmony_ci COUNTRY_REGD_ENT("PR", RTW_REGD_FCC, RTW_REGD_FCC), 21362306a36Sopenharmony_ci COUNTRY_REGD_ENT("PS", RTW_REGD_ETSI, RTW_REGD_ETSI), 21462306a36Sopenharmony_ci COUNTRY_REGD_ENT("PT", RTW_REGD_ETSI, RTW_REGD_ETSI), 21562306a36Sopenharmony_ci COUNTRY_REGD_ENT("PW", RTW_REGD_FCC, RTW_REGD_FCC), 21662306a36Sopenharmony_ci COUNTRY_REGD_ENT("PY", RTW_REGD_FCC, RTW_REGD_FCC), 21762306a36Sopenharmony_ci COUNTRY_REGD_ENT("QA", RTW_REGD_ETSI, RTW_REGD_ETSI), 21862306a36Sopenharmony_ci COUNTRY_REGD_ENT("RE", RTW_REGD_ETSI, RTW_REGD_ETSI), 21962306a36Sopenharmony_ci COUNTRY_REGD_ENT("RO", RTW_REGD_ETSI, RTW_REGD_ETSI), 22062306a36Sopenharmony_ci COUNTRY_REGD_ENT("RS", RTW_REGD_ETSI, RTW_REGD_ETSI), 22162306a36Sopenharmony_ci COUNTRY_REGD_ENT("RU", RTW_REGD_ETSI, RTW_REGD_ETSI), 22262306a36Sopenharmony_ci COUNTRY_REGD_ENT("RW", RTW_REGD_ETSI, RTW_REGD_ETSI), 22362306a36Sopenharmony_ci COUNTRY_REGD_ENT("SA", RTW_REGD_ETSI, RTW_REGD_ETSI), 22462306a36Sopenharmony_ci COUNTRY_REGD_ENT("SB", RTW_REGD_ETSI, RTW_REGD_ETSI), 22562306a36Sopenharmony_ci COUNTRY_REGD_ENT("SC", RTW_REGD_FCC, RTW_REGD_FCC), 22662306a36Sopenharmony_ci COUNTRY_REGD_ENT("SE", RTW_REGD_ETSI, RTW_REGD_ETSI), 22762306a36Sopenharmony_ci COUNTRY_REGD_ENT("SG", RTW_REGD_ETSI, RTW_REGD_ETSI), 22862306a36Sopenharmony_ci COUNTRY_REGD_ENT("SH", RTW_REGD_ETSI, RTW_REGD_ETSI), 22962306a36Sopenharmony_ci COUNTRY_REGD_ENT("SI", RTW_REGD_ETSI, RTW_REGD_ETSI), 23062306a36Sopenharmony_ci COUNTRY_REGD_ENT("SJ", RTW_REGD_ETSI, RTW_REGD_ETSI), 23162306a36Sopenharmony_ci COUNTRY_REGD_ENT("SK", RTW_REGD_ETSI, RTW_REGD_ETSI), 23262306a36Sopenharmony_ci COUNTRY_REGD_ENT("SL", RTW_REGD_ETSI, RTW_REGD_ETSI), 23362306a36Sopenharmony_ci COUNTRY_REGD_ENT("SM", RTW_REGD_ETSI, RTW_REGD_ETSI), 23462306a36Sopenharmony_ci COUNTRY_REGD_ENT("SN", RTW_REGD_ETSI, RTW_REGD_ETSI), 23562306a36Sopenharmony_ci COUNTRY_REGD_ENT("SO", RTW_REGD_ETSI, RTW_REGD_ETSI), 23662306a36Sopenharmony_ci COUNTRY_REGD_ENT("SR", RTW_REGD_FCC, RTW_REGD_FCC), 23762306a36Sopenharmony_ci COUNTRY_REGD_ENT("ST", RTW_REGD_FCC, RTW_REGD_FCC), 23862306a36Sopenharmony_ci COUNTRY_REGD_ENT("SV", RTW_REGD_FCC, RTW_REGD_FCC), 23962306a36Sopenharmony_ci COUNTRY_REGD_ENT("SX", RTW_REGD_FCC, RTW_REGD_FCC), 24062306a36Sopenharmony_ci COUNTRY_REGD_ENT("SZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 24162306a36Sopenharmony_ci COUNTRY_REGD_ENT("TC", RTW_REGD_ETSI, RTW_REGD_ETSI), 24262306a36Sopenharmony_ci COUNTRY_REGD_ENT("TD", RTW_REGD_ETSI, RTW_REGD_ETSI), 24362306a36Sopenharmony_ci COUNTRY_REGD_ENT("TF", RTW_REGD_ETSI, RTW_REGD_ETSI), 24462306a36Sopenharmony_ci COUNTRY_REGD_ENT("TG", RTW_REGD_ETSI, RTW_REGD_ETSI), 24562306a36Sopenharmony_ci COUNTRY_REGD_ENT("TH", RTW_REGD_ETSI, RTW_REGD_ETSI), 24662306a36Sopenharmony_ci COUNTRY_REGD_ENT("TJ", RTW_REGD_ETSI, RTW_REGD_ETSI), 24762306a36Sopenharmony_ci COUNTRY_REGD_ENT("TK", RTW_REGD_ACMA, RTW_REGD_ACMA), 24862306a36Sopenharmony_ci COUNTRY_REGD_ENT("TM", RTW_REGD_ETSI, RTW_REGD_ETSI), 24962306a36Sopenharmony_ci COUNTRY_REGD_ENT("TN", RTW_REGD_ETSI, RTW_REGD_ETSI), 25062306a36Sopenharmony_ci COUNTRY_REGD_ENT("TO", RTW_REGD_ETSI, RTW_REGD_ETSI), 25162306a36Sopenharmony_ci COUNTRY_REGD_ENT("TR", RTW_REGD_ETSI, RTW_REGD_ETSI), 25262306a36Sopenharmony_ci COUNTRY_REGD_ENT("TT", RTW_REGD_FCC, RTW_REGD_FCC), 25362306a36Sopenharmony_ci COUNTRY_REGD_ENT("TV", RTW_REGD_ETSI, RTW_REGD_WW), 25462306a36Sopenharmony_ci COUNTRY_REGD_ENT("TW", RTW_REGD_FCC, RTW_REGD_FCC), 25562306a36Sopenharmony_ci COUNTRY_REGD_ENT("TZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 25662306a36Sopenharmony_ci COUNTRY_REGD_ENT("UA", RTW_REGD_ETSI, RTW_REGD_ETSI), 25762306a36Sopenharmony_ci COUNTRY_REGD_ENT("UG", RTW_REGD_ETSI, RTW_REGD_ETSI), 25862306a36Sopenharmony_ci COUNTRY_REGD_ENT("US", RTW_REGD_FCC, RTW_REGD_FCC), 25962306a36Sopenharmony_ci COUNTRY_REGD_ENT("UY", RTW_REGD_FCC, RTW_REGD_FCC), 26062306a36Sopenharmony_ci COUNTRY_REGD_ENT("UZ", RTW_REGD_ETSI, RTW_REGD_ETSI), 26162306a36Sopenharmony_ci COUNTRY_REGD_ENT("VA", RTW_REGD_ETSI, RTW_REGD_ETSI), 26262306a36Sopenharmony_ci COUNTRY_REGD_ENT("VC", RTW_REGD_FCC, RTW_REGD_FCC), 26362306a36Sopenharmony_ci COUNTRY_REGD_ENT("VE", RTW_REGD_FCC, RTW_REGD_FCC), 26462306a36Sopenharmony_ci COUNTRY_REGD_ENT("VG", RTW_REGD_FCC, RTW_REGD_FCC), 26562306a36Sopenharmony_ci COUNTRY_REGD_ENT("VI", RTW_REGD_FCC, RTW_REGD_FCC), 26662306a36Sopenharmony_ci COUNTRY_REGD_ENT("VN", RTW_REGD_ETSI, RTW_REGD_ETSI), 26762306a36Sopenharmony_ci COUNTRY_REGD_ENT("VU", RTW_REGD_ETSI, RTW_REGD_ETSI), 26862306a36Sopenharmony_ci COUNTRY_REGD_ENT("WF", RTW_REGD_ETSI, RTW_REGD_ETSI), 26962306a36Sopenharmony_ci COUNTRY_REGD_ENT("WS", RTW_REGD_FCC, RTW_REGD_FCC), 27062306a36Sopenharmony_ci COUNTRY_REGD_ENT("XK", RTW_REGD_ETSI, RTW_REGD_ETSI), 27162306a36Sopenharmony_ci COUNTRY_REGD_ENT("YE", RTW_REGD_ETSI, RTW_REGD_ETSI), 27262306a36Sopenharmony_ci COUNTRY_REGD_ENT("YT", RTW_REGD_ETSI, RTW_REGD_ETSI), 27362306a36Sopenharmony_ci COUNTRY_REGD_ENT("ZA", RTW_REGD_ETSI, RTW_REGD_ETSI), 27462306a36Sopenharmony_ci COUNTRY_REGD_ENT("ZM", RTW_REGD_ETSI, RTW_REGD_ETSI), 27562306a36Sopenharmony_ci COUNTRY_REGD_ENT("ZW", RTW_REGD_ETSI, RTW_REGD_ETSI), 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic void rtw_regd_apply_hw_cap_flags(struct wiphy *wiphy) 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); 28162306a36Sopenharmony_ci struct ieee80211_supported_band *sband; 28262306a36Sopenharmony_ci struct ieee80211_channel *ch; 28362306a36Sopenharmony_ci struct rtw_dev *rtwdev = hw->priv; 28462306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 28562306a36Sopenharmony_ci int i; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci if (efuse->hw_cap.bw & BIT(RTW_CHANNEL_WIDTH_80)) 28862306a36Sopenharmony_ci return; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci sband = wiphy->bands[NL80211_BAND_2GHZ]; 29162306a36Sopenharmony_ci if (!sband) 29262306a36Sopenharmony_ci goto out_5g; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci for (i = 0; i < sband->n_channels; i++) { 29562306a36Sopenharmony_ci ch = &sband->channels[i]; 29662306a36Sopenharmony_ci ch->flags |= IEEE80211_CHAN_NO_80MHZ; 29762306a36Sopenharmony_ci } 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ciout_5g: 30062306a36Sopenharmony_ci sband = wiphy->bands[NL80211_BAND_5GHZ]; 30162306a36Sopenharmony_ci if (!sband) 30262306a36Sopenharmony_ci return; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci for (i = 0; i < sband->n_channels; i++) { 30562306a36Sopenharmony_ci ch = &sband->channels[i]; 30662306a36Sopenharmony_ci ch->flags |= IEEE80211_CHAN_NO_80MHZ; 30762306a36Sopenharmony_ci } 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic bool rtw_reg_is_ww(const struct rtw_regulatory *reg) 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci return reg == &rtw_reg_ww; 31362306a36Sopenharmony_ci} 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistatic bool rtw_reg_match(const struct rtw_regulatory *reg, const char *alpha2) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci return memcmp(reg->alpha2, alpha2, 2) == 0; 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic const struct rtw_regulatory *rtw_reg_find_by_name(const char *alpha2) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci unsigned int i; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rtw_reg_map); i++) { 32562306a36Sopenharmony_ci if (rtw_reg_match(&rtw_reg_map[i], alpha2)) 32662306a36Sopenharmony_ci return &rtw_reg_map[i]; 32762306a36Sopenharmony_ci } 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci return &rtw_reg_ww; 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic 33362306a36Sopenharmony_civoid rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci/* call this before ieee80211_register_hw() */ 33662306a36Sopenharmony_ciint rtw_regd_init(struct rtw_dev *rtwdev) 33762306a36Sopenharmony_ci{ 33862306a36Sopenharmony_ci struct wiphy *wiphy = rtwdev->hw->wiphy; 33962306a36Sopenharmony_ci const struct rtw_regulatory *chip_reg; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci if (!wiphy) 34262306a36Sopenharmony_ci return -EINVAL; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci wiphy->reg_notifier = rtw_regd_notifier; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci chip_reg = rtw_reg_find_by_name(rtwdev->efuse.country_code); 34762306a36Sopenharmony_ci if (!rtw_reg_is_ww(chip_reg)) { 34862306a36Sopenharmony_ci rtwdev->regd.state = RTW_REGD_STATE_PROGRAMMED; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci /* Set REGULATORY_STRICT_REG before ieee80211_register_hw(), 35162306a36Sopenharmony_ci * stack will wait for regulatory_hint() and consider it 35262306a36Sopenharmony_ci * as the superset for our regulatory rule. 35362306a36Sopenharmony_ci */ 35462306a36Sopenharmony_ci wiphy->regulatory_flags |= REGULATORY_STRICT_REG; 35562306a36Sopenharmony_ci wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_IGNORE; 35662306a36Sopenharmony_ci } else { 35762306a36Sopenharmony_ci rtwdev->regd.state = RTW_REGD_STATE_WORLDWIDE; 35862306a36Sopenharmony_ci } 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci rtwdev->regd.regulatory = &rtw_reg_ww; 36162306a36Sopenharmony_ci rtwdev->regd.dfs_region = NL80211_DFS_UNSET; 36262306a36Sopenharmony_ci rtw_dbg_regd_dump(rtwdev, "regd init state %d: ", rtwdev->regd.state); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci rtw_regd_apply_hw_cap_flags(wiphy); 36562306a36Sopenharmony_ci return 0; 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci/* call this after ieee80211_register_hw() */ 36962306a36Sopenharmony_ciint rtw_regd_hint(struct rtw_dev *rtwdev) 37062306a36Sopenharmony_ci{ 37162306a36Sopenharmony_ci struct wiphy *wiphy = rtwdev->hw->wiphy; 37262306a36Sopenharmony_ci int ret; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci if (!wiphy) 37562306a36Sopenharmony_ci return -EINVAL; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci if (rtwdev->regd.state == RTW_REGD_STATE_PROGRAMMED) { 37862306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_REGD, 37962306a36Sopenharmony_ci "country domain %c%c is PGed on efuse", 38062306a36Sopenharmony_ci rtwdev->efuse.country_code[0], 38162306a36Sopenharmony_ci rtwdev->efuse.country_code[1]); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci ret = regulatory_hint(wiphy, rtwdev->efuse.country_code); 38462306a36Sopenharmony_ci if (ret) { 38562306a36Sopenharmony_ci rtw_warn(rtwdev, 38662306a36Sopenharmony_ci "failed to hint regulatory: %d\n", ret); 38762306a36Sopenharmony_ci return ret; 38862306a36Sopenharmony_ci } 38962306a36Sopenharmony_ci } 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci return 0; 39262306a36Sopenharmony_ci} 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_cistatic bool rtw_regd_mgmt_worldwide(struct rtw_dev *rtwdev, 39562306a36Sopenharmony_ci struct rtw_regd *next_regd, 39662306a36Sopenharmony_ci struct regulatory_request *request) 39762306a36Sopenharmony_ci{ 39862306a36Sopenharmony_ci struct wiphy *wiphy = rtwdev->hw->wiphy; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci next_regd->state = RTW_REGD_STATE_WORLDWIDE; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci if (request->initiator == NL80211_REGDOM_SET_BY_USER && 40362306a36Sopenharmony_ci !rtw_reg_is_ww(next_regd->regulatory)) { 40462306a36Sopenharmony_ci next_regd->state = RTW_REGD_STATE_SETTING; 40562306a36Sopenharmony_ci wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_IGNORE; 40662306a36Sopenharmony_ci } 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci return true; 40962306a36Sopenharmony_ci} 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_cistatic bool rtw_regd_mgmt_programmed(struct rtw_dev *rtwdev, 41262306a36Sopenharmony_ci struct rtw_regd *next_regd, 41362306a36Sopenharmony_ci struct regulatory_request *request) 41462306a36Sopenharmony_ci{ 41562306a36Sopenharmony_ci if (request->initiator == NL80211_REGDOM_SET_BY_DRIVER && 41662306a36Sopenharmony_ci rtw_reg_match(next_regd->regulatory, rtwdev->efuse.country_code)) { 41762306a36Sopenharmony_ci next_regd->state = RTW_REGD_STATE_PROGRAMMED; 41862306a36Sopenharmony_ci return true; 41962306a36Sopenharmony_ci } 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci return false; 42262306a36Sopenharmony_ci} 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic bool rtw_regd_mgmt_setting(struct rtw_dev *rtwdev, 42562306a36Sopenharmony_ci struct rtw_regd *next_regd, 42662306a36Sopenharmony_ci struct regulatory_request *request) 42762306a36Sopenharmony_ci{ 42862306a36Sopenharmony_ci struct wiphy *wiphy = rtwdev->hw->wiphy; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci if (request->initiator != NL80211_REGDOM_SET_BY_USER) 43162306a36Sopenharmony_ci return false; 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci next_regd->state = RTW_REGD_STATE_SETTING; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci if (rtw_reg_is_ww(next_regd->regulatory)) { 43662306a36Sopenharmony_ci next_regd->state = RTW_REGD_STATE_WORLDWIDE; 43762306a36Sopenharmony_ci wiphy->regulatory_flags &= ~REGULATORY_COUNTRY_IE_IGNORE; 43862306a36Sopenharmony_ci } 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci return true; 44162306a36Sopenharmony_ci} 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistatic bool (*const rtw_regd_handler[RTW_REGD_STATE_NR]) 44462306a36Sopenharmony_ci (struct rtw_dev *, struct rtw_regd *, struct regulatory_request *) = { 44562306a36Sopenharmony_ci [RTW_REGD_STATE_WORLDWIDE] = rtw_regd_mgmt_worldwide, 44662306a36Sopenharmony_ci [RTW_REGD_STATE_PROGRAMMED] = rtw_regd_mgmt_programmed, 44762306a36Sopenharmony_ci [RTW_REGD_STATE_SETTING] = rtw_regd_mgmt_setting, 44862306a36Sopenharmony_ci}; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_cistatic bool rtw_regd_state_hdl(struct rtw_dev *rtwdev, 45162306a36Sopenharmony_ci struct rtw_regd *next_regd, 45262306a36Sopenharmony_ci struct regulatory_request *request) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci next_regd->regulatory = rtw_reg_find_by_name(request->alpha2); 45562306a36Sopenharmony_ci next_regd->dfs_region = request->dfs_region; 45662306a36Sopenharmony_ci return rtw_regd_handler[rtwdev->regd.state](rtwdev, next_regd, request); 45762306a36Sopenharmony_ci} 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistatic 46062306a36Sopenharmony_civoid rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request) 46162306a36Sopenharmony_ci{ 46262306a36Sopenharmony_ci struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); 46362306a36Sopenharmony_ci struct rtw_dev *rtwdev = hw->priv; 46462306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 46562306a36Sopenharmony_ci struct rtw_regd next_regd = {0}; 46662306a36Sopenharmony_ci bool hdl; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci hdl = rtw_regd_state_hdl(rtwdev, &next_regd, request); 46962306a36Sopenharmony_ci if (!hdl) { 47062306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_REGD, 47162306a36Sopenharmony_ci "regd state %d: ignore request %c%c of initiator %d\n", 47262306a36Sopenharmony_ci rtwdev->regd.state, 47362306a36Sopenharmony_ci request->alpha2[0], 47462306a36Sopenharmony_ci request->alpha2[1], 47562306a36Sopenharmony_ci request->initiator); 47662306a36Sopenharmony_ci return; 47762306a36Sopenharmony_ci } 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_REGD, "regd state: %d -> %d\n", 48062306a36Sopenharmony_ci rtwdev->regd.state, next_regd.state); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 48362306a36Sopenharmony_ci rtwdev->regd = next_regd; 48462306a36Sopenharmony_ci rtw_dbg_regd_dump(rtwdev, "get alpha2 %c%c from initiator %d: ", 48562306a36Sopenharmony_ci request->alpha2[0], 48662306a36Sopenharmony_ci request->alpha2[1], 48762306a36Sopenharmony_ci request->initiator); 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci rtw_phy_adaptivity_set_mode(rtwdev); 49062306a36Sopenharmony_ci rtw_phy_set_tx_power_level(rtwdev, hal->current_channel); 49162306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 49262306a36Sopenharmony_ci} 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ciu8 rtw_regd_get(struct rtw_dev *rtwdev) 49562306a36Sopenharmony_ci{ 49662306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 49762306a36Sopenharmony_ci u8 band = hal->current_band_type; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci return band == RTW_BAND_2G ? 50062306a36Sopenharmony_ci rtwdev->regd.regulatory->txpwr_regd_2g : 50162306a36Sopenharmony_ci rtwdev->regd.regulatory->txpwr_regd_5g; 50262306a36Sopenharmony_ci} 50362306a36Sopenharmony_ciEXPORT_SYMBOL(rtw_regd_get); 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_cistruct rtw_regd_alternative_t { 50662306a36Sopenharmony_ci bool set; 50762306a36Sopenharmony_ci u8 alt; 50862306a36Sopenharmony_ci}; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci#define DECL_REGD_ALT(_regd, _regd_alt) \ 51162306a36Sopenharmony_ci [(_regd)] = {.set = true, .alt = (_regd_alt)} 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic const struct rtw_regd_alternative_t 51462306a36Sopenharmony_cirtw_regd_alt[RTW_REGD_MAX] = { 51562306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_IC, RTW_REGD_FCC), 51662306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_KCC, RTW_REGD_ETSI), 51762306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_ACMA, RTW_REGD_ETSI), 51862306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_CHILE, RTW_REGD_FCC), 51962306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_UKRAINE, RTW_REGD_ETSI), 52062306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_MEXICO, RTW_REGD_FCC), 52162306a36Sopenharmony_ci DECL_REGD_ALT(RTW_REGD_CN, RTW_REGD_ETSI), 52262306a36Sopenharmony_ci}; 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_cibool rtw_regd_has_alt(u8 regd, u8 *regd_alt) 52562306a36Sopenharmony_ci{ 52662306a36Sopenharmony_ci if (!rtw_regd_alt[regd].set) 52762306a36Sopenharmony_ci return false; 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci *regd_alt = rtw_regd_alt[regd].alt; 53062306a36Sopenharmony_ci return true; 53162306a36Sopenharmony_ci} 532