diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c index 76ca43698983..09447d26232e 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c @@ -539,7 +539,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, } if (!found) { /* No platform data for this device, try OF (Open Firwmare) */ - brcmf_of_probe(dev, bus_type, settings); + brcmf_of_probe(dev, bus_type, settings, chip, chiprev); } return settings; } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c index eda9a81223a1..b5447d45cb43 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c @@ -23,16 +23,61 @@ #include "common.h" #include "of.h" +static const char * const bcm43456c5_ccode_map[] = { + "AE-AE-6", "AG-AG-2", "AI-AI-1", "AL-AL-2", "AS-AS-12", "AT-AT-4", + "AU-AU-6", "AW-AW-2", "AZ-AZ-2", + "BA-BA-2", "BD-BD-1", "BE-BE-4", "BG-BG-4", "BH-BH-4", "BM-BM-12", + "BN-BN-4", "BR-BR-4", "BS-BS-2", "BY-BY-3", + "CA-CA-2", "CH-CH-4", "CN-CN-38", "CO-CO-17", "CR-CR-17", "CY-CY-4", + "CZ-CZ-4", + "DE-DE-7", "DK-DK-4", + "EC-EC-21", "EE-EE-4", "EG-EG-13", "ES-ES-4", "ET-ET-2", + "FI-FI-4", "FR-FR-5", + "GB-GB-6", "GD-GD-2", "GF-GF-2", "GP-GP-2", "GR-GR-4", "GT-GT-1", + "GU-GU-30", + "HK-HK-2", "HR-HR-4", "HU-HU-4", + "ID-ID-1", "IE-IE-5", "IL-IL-14", "IN-IN-3", "IS-IS-4", "IT-IT-4", + "JO-JO-3", "JP-JP-58", + "KH-KH-2", "KR-KR-96", "KW-KW-5", "KY-KY-3", + "LA-LA-2", "LB-LB-5", "LI-LI-4", "LK-LK-1", "LS-LS-2", "LT-LT-4", + "LU-LU-3", "LV-LV-4", + "MA-MA-2", "MC-MC-1", "MD-MD-2", "ME-ME-2", "MK-MK-2", "MN-MN-1", + "MQ-MQ-2", "MR-MR-2", "MT-MT-4", "MU-MU-2", "MV-MV-3", "MW-MW-1", + "MX-MX-44", "MY-MY-3", + "NI-NI-2", "NL-NL-4", "NO-NO-4", "NZ-NZ-4", + "OM-OM-4", + "PA-PA-17", "PE-PE-20", "PH-PH-5", "PL-PL-4", "PR-PR-38", "PT-PT-4", + "PY-PY-2", + "Q2-Q2-993", + "RE-RE-2", "RO-RO-4", "RS-RS-2", "RU-RU-13", + "SE-SE-4", "SI-SI-4", "SK-SK-4", "SV-SV-25", + "TH-TH-5", "TN-TN-1", "TR-TR-7", "TT-TT-3", "TW-TW-65", + "UA-UA-8", "US-US-988", + "VA-VA-2", "VE-VE-3", "VG-VG-2", "VN-VN-4", + "XZ-XZ-11", + "YT-YT-2", + "ZA-ZA-6", +}; + static int brcmf_of_get_country_codes(struct device *dev, - struct brcmf_mp_device *settings) + struct brcmf_mp_device *settings, + u32 chip, u32 chiprev) { struct device_node *np = dev->of_node; + const char * const *ccode_map = NULL; struct brcmfmac_pd_cc_entry *cce; struct brcmfmac_pd_cc *cc; int count; int i; count = of_property_count_strings(np, "brcm,ccode-map"); + + /* Use hard-coded map table over DT one for BCM4345/9 */ + if (chip == 0x4345 && chiprev == 0x9) { + count = ARRAY_SIZE(bcm43456c5_ccode_map); + ccode_map = bcm43456c5_ccode_map; + } + if (count < 0) { /* The property is optional, so return success if it doesn't * exist. Otherwise propagate the error code. @@ -51,9 +96,14 @@ static int brcmf_of_get_country_codes(struct device *dev, cce = &cc->table[i]; - if (of_property_read_string_index(np, "brcm,ccode-map", - i, &map)) - continue; + /* Try hard-coded map table first, and DT otherwise. */ + if (ccode_map) { + map = ccode_map[i]; + } else { + if (of_property_read_string_index(np, "brcm,ccode-map", + i, &map)) + continue; + } /* String format e.g. US-Q2-86 */ if (sscanf(map, "%2c-%2c-%d", cce->iso3166, cce->cc, @@ -70,7 +120,7 @@ static int brcmf_of_get_country_codes(struct device *dev, } void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, - struct brcmf_mp_device *settings) + struct brcmf_mp_device *settings, u32 chip, u32 chiprev) { struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio; struct device_node *np = dev->of_node; @@ -83,7 +133,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) return; - err = brcmf_of_get_country_codes(dev, settings); + err = brcmf_of_get_country_codes(dev, settings, chip, chiprev); if (err) brcmf_err("failed to get OF country code map (err=%d)\n", err); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h index 95b7032d54b1..612b875ea051 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h @@ -15,10 +15,11 @@ */ #ifdef CONFIG_OF void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, - struct brcmf_mp_device *settings); + struct brcmf_mp_device *settings, u32 chip, u32 chiprev); #else static void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, - struct brcmf_mp_device *settings) + struct brcmf_mp_device *settings, + u32 chip, u32 chiprev) { } #endif /* CONFIG_OF */