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

ath9k: add support for endian swap of eeprom from platform data

On some devices (especially little-endian ones), the flash EEPROM data
has a different endian, which needs to be detected.
Add a flag to the platform data to allow overriding that behavior
Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7b89fccf
...@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah) ...@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)
{ {
struct ar5416_eeprom_def *eep = &ah->eeprom.def; struct ar5416_eeprom_def *eep = &ah->eeprom.def;
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
u16 *eepdata, temp, magic, magic2; u16 *eepdata, temp, magic;
u32 sum = 0, el; u32 sum = 0, el;
bool need_swap = false; bool need_swap = false;
int i, addr, size; int i, addr, size;
...@@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah) ...@@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)
return false; return false;
} }
if (!ath9k_hw_use_flash(ah)) { if (swab16(magic) == AR5416_EEPROM_MAGIC &&
ath_dbg(common, EEPROM, "Read Magic = 0x%04X\n", magic); !(ah->ah_flags & AH_NO_EEP_SWAP)) {
size = sizeof(struct ar5416_eeprom_def);
if (magic != AR5416_EEPROM_MAGIC) { need_swap = true;
magic2 = swab16(magic); eepdata = (u16 *) (&ah->eeprom);
if (magic2 == AR5416_EEPROM_MAGIC) {
size = sizeof(struct ar5416_eeprom_def);
need_swap = true;
eepdata = (u16 *) (&ah->eeprom);
for (addr = 0; addr < size / sizeof(u16); addr++) { for (addr = 0; addr < size / sizeof(u16); addr++) {
temp = swab16(*eepdata); temp = swab16(*eepdata);
*eepdata = temp; *eepdata = temp;
eepdata++; eepdata++;
}
} else {
ath_err(common,
"Invalid EEPROM Magic. Endianness mismatch.\n");
return -EINVAL;
}
} }
} }
......
...@@ -731,6 +731,7 @@ enum ath_cal_list { ...@@ -731,6 +731,7 @@ enum ath_cal_list {
#define AH_USE_EEPROM 0x1 #define AH_USE_EEPROM 0x1
#define AH_UNPLUGGED 0x2 /* The card has been physically removed. */ #define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
#define AH_FASTCC 0x4 #define AH_FASTCC 0x4
#define AH_NO_EEP_SWAP 0x8 /* Do not swap EEPROM data */
struct ath_hw { struct ath_hw {
struct ath_ops reg_ops; struct ath_ops reg_ops;
......
...@@ -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;
if (!pdata->endian_check)
ah->ah_flags |= AH_NO_EEP_SWAP;
} }
common->ops = &ah->reg_ops; common->ops = &ah->reg_ops;
......
...@@ -31,6 +31,7 @@ struct ath9k_platform_data { ...@@ -31,6 +31,7 @@ struct ath9k_platform_data {
u32 gpio_mask; u32 gpio_mask;
u32 gpio_val; u32 gpio_val;
bool endian_check;
bool is_clk_25mhz; bool is_clk_25mhz;
bool tx_gain_buffalo; bool tx_gain_buffalo;
......
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