wifi: mt76: mt792x: extend MTCL of APCI to version3 for EHT control

This patch introduces version 3 of the MTCL table, which provides
regulatory information for WiFi 7. It also configured by the platform
vender like the version 1 and 2.

Signed-off-by: Ming Yen Hsieh <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Ming Yen Hsieh
2025-03-10 13:18:36 +01:00
committed by Felix Fietkau
parent 772dcb4b4e
commit b94b025490
3 changed files with 120 additions and 27 deletions
+78 -23
View File
@@ -66,13 +66,22 @@ free:
}
/* MTCL : Country List Table for 6G band */
/* MTCL : Country List Table for 6G band and 11BE */
static int
mt792x_asar_acpi_read_mtcl(struct mt792x_dev *dev, u8 **table, u8 *version)
{
int ret;
int len, ret;
*version = ((ret = mt792x_acpi_read(dev, MT792x_ACPI_MTCL, table, NULL)) < 0)
? 1 : 2;
ret = mt792x_acpi_read(dev, MT792x_ACPI_MTCL, table, &len);
if (ret)
return ret;
if (len == sizeof(struct mt792x_asar_cl))
*version = ((struct mt792x_asar_cl *)*table)->version;
else if (len == sizeof(struct mt792x_asar_cl_v3))
*version = ((struct mt792x_asar_cl_v3 *)*table)->version;
else
return -EINVAL;
return ret;
}
@@ -351,10 +360,24 @@ u8 mt792x_acpi_get_flags(struct mt792x_phy *phy)
}
EXPORT_SYMBOL_GPL(mt792x_acpi_get_flags);
static u8
static u32
mt792x_acpi_get_mtcl_map_v3(int row, int column, struct mt792x_asar_cl_v3 *cl)
{
u32 config = 0;
u8 mode_be = 0;
mode_be = (cl->mode_be > 0x02) ? 0 : cl->mode_be;
if (cl->version > 2 && cl->clbe[row] & BIT(column))
config |= (mode_be & 0x3) << 4;
return config;
}
static u32
mt792x_acpi_get_mtcl_map(int row, int column, struct mt792x_asar_cl *cl)
{
u8 config = 0;
u32 config = 0;
u8 mode_6g, mode_5g9;
mode_6g = (cl->mode_6g > 0x02) ? 0 : cl->mode_6g;
@@ -368,30 +391,44 @@ mt792x_acpi_get_mtcl_map(int row, int column, struct mt792x_asar_cl *cl)
return config;
}
u8 mt792x_acpi_get_mtcl_conf(struct mt792x_phy *phy, char *alpha2)
static u32
mt792x_acpi_parse_mtcl_tbl_v3(struct mt792x_phy *phy, char *alpha2)
{
static const char * const cc_list_all[] = {
"00", "EU", "AR", "AU", "AZ", "BY", "BO", "BR",
"CA", "CL", "CN", "ID", "JP", "MY", "MX", "ME",
"MA", "NZ", "NG", "PH", "RU", "RS", "SG", "KR",
"TW", "TH", "UA", "GB", "US", "VN", "KH", "PY",
};
static const char * const cc_list_eu[] = {
"AT", "BE", "BG", "CY", "CZ", "HR", "DK", "EE",
"FI", "FR", "DE", "GR", "HU", "IS", "IE", "IT",
"LV", "LI", "LT", "LU", "MT", "NL", "NO", "PL",
"PT", "RO", "SK", "SI", "ES", "SE", "CH",
};
struct mt792x_acpi_sar *sar = phy->acpisar;
struct mt792x_asar_cl *cl;
struct mt792x_asar_cl_v3 *cl = sar->countrylist_v3;
int col, row, i;
if (!sar)
return 0xf;
if (sar->ver != 3)
goto out;
cl = sar->countrylist;
if (!cl)
return 0xc;
return MT792X_ACPI_MTCL_INVALID;
for (i = 0; i < ARRAY_SIZE(cc_list_be); i++) {
col = 7 - i % 8;
row = i / 8;
if (!memcmp(cc_list_be[i], alpha2, 2))
return mt792x_acpi_get_mtcl_map_v3(row, col, cl);
}
for (i = 0; i < ARRAY_SIZE(cc_list_eu); i++) {
if (!memcmp(cc_list_eu[i], alpha2, 2))
return mt792x_acpi_get_mtcl_map_v3(3, 7, cl);
}
out:
/* Depends on driver */
return 0x20;
}
static u32
mt792x_acpi_parse_mtcl_tbl(struct mt792x_phy *phy, char *alpha2)
{
struct mt792x_acpi_sar *sar = phy->acpisar;
struct mt792x_asar_cl *cl = sar->countrylist;
int col, row, i;
if (!cl)
return MT792X_ACPI_MTCL_INVALID;
for (i = 0; i < ARRAY_SIZE(cc_list_all); i++) {
col = 7 - i % 8;
@@ -406,4 +443,22 @@ u8 mt792x_acpi_get_mtcl_conf(struct mt792x_phy *phy, char *alpha2)
return mt792x_acpi_get_mtcl_map(0, 7, cl);
}
u32 mt792x_acpi_get_mtcl_conf(struct mt792x_phy *phy, char *alpha2)
{
struct mt792x_acpi_sar *sar = phy->acpisar;
u32 config = 0;
if (!sar)
return MT792X_ACPI_MTCL_INVALID;
config = mt792x_acpi_parse_mtcl_tbl_v3(phy, alpha2);
if (config == MT792X_ACPI_MTCL_INVALID)
return MT792X_ACPI_MTCL_INVALID;
config |= mt792x_acpi_parse_mtcl_tbl(phy, alpha2);
return config;
}
EXPORT_SYMBOL_GPL(mt792x_acpi_get_mtcl_conf);