Commit 3468968e authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville

ath9k: allow disabling bands via platform data

Some devices have multiple bands enables in the EEPROM data, even though
they are only calibrated for one. Allow platform data to disable
unsupported bands.
Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a59dadbe
...@@ -2344,17 +2344,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) ...@@ -2344,17 +2344,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
} }
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE); eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
ath_err(common, if (eeval & AR5416_OPFLAGS_11A) {
"no band has been marked as supported in EEPROM\n"); if (ah->disable_5ghz)
return -EINVAL; ath_warn(common, "disabling 5GHz band\n");
else
pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
} }
if (eeval & AR5416_OPFLAGS_11A) if (eeval & AR5416_OPFLAGS_11G) {
pCap->hw_caps |= ATH9K_HW_CAP_5GHZ; if (ah->disable_2ghz)
ath_warn(common, "disabling 2GHz band\n");
else
pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
}
if (eeval & AR5416_OPFLAGS_11G) if ((pCap->hw_caps & (ATH9K_HW_CAP_2GHZ | ATH9K_HW_CAP_5GHZ)) == 0) {
pCap->hw_caps |= ATH9K_HW_CAP_2GHZ; ath_err(common, "both bands are disabled\n");
return -EINVAL;
}
if (AR_SREV_9485(ah) || if (AR_SREV_9485(ah) ||
AR_SREV_9285(ah) || AR_SREV_9285(ah) ||
......
...@@ -930,6 +930,8 @@ struct ath_hw { ...@@ -930,6 +930,8 @@ struct ath_hw {
bool is_clk_25mhz; bool is_clk_25mhz;
int (*get_mac_revision)(void); int (*get_mac_revision)(void);
int (*external_reset)(void); int (*external_reset)(void);
bool disable_2ghz;
bool disable_5ghz;
const struct firmware *eeprom_blob; const struct firmware *eeprom_blob;
......
...@@ -531,6 +531,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, ...@@ -531,6 +531,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
ah->is_clk_25mhz = pdata->is_clk_25mhz; ah->is_clk_25mhz = pdata->is_clk_25mhz;
ah->get_mac_revision = pdata->get_mac_revision; ah->get_mac_revision = pdata->get_mac_revision;
ah->external_reset = pdata->external_reset; ah->external_reset = pdata->external_reset;
ah->disable_2ghz = pdata->disable_2ghz;
ah->disable_5ghz = pdata->disable_5ghz;
if (!pdata->endian_check) if (!pdata->endian_check)
ah->ah_flags |= AH_NO_EEP_SWAP; ah->ah_flags |= AH_NO_EEP_SWAP;
} }
......
...@@ -34,6 +34,8 @@ struct ath9k_platform_data { ...@@ -34,6 +34,8 @@ struct ath9k_platform_data {
bool endian_check; bool endian_check;
bool is_clk_25mhz; bool is_clk_25mhz;
bool tx_gain_buffalo; bool tx_gain_buffalo;
bool disable_2ghz;
bool disable_5ghz;
int (*get_mac_revision)(void); int (*get_mac_revision)(void);
int (*external_reset)(void); int (*external_reset)(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment