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: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
7b89fccf15
commit
a59dadbeea
@ -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)
|
|||||||
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);
|
||||||
|
need_swap = true;
|
||||||
|
eepdata = (u16 *) (&ah->eeprom);
|
||||||
|
|
||||||
if (magic != AR5416_EEPROM_MAGIC) {
|
for (addr = 0; addr < size / sizeof(u16); addr++) {
|
||||||
magic2 = swab16(magic);
|
temp = swab16(*eepdata);
|
||||||
|
*eepdata = temp;
|
||||||
if (magic2 == AR5416_EEPROM_MAGIC) {
|
eepdata++;
|
||||||
size = sizeof(struct ar5416_eeprom_def);
|
|
||||||
need_swap = true;
|
|
||||||
eepdata = (u16 *) (&ah->eeprom);
|
|
||||||
|
|
||||||
for (addr = 0; addr < size / sizeof(u16); addr++) {
|
|
||||||
temp = swab16(*eepdata);
|
|
||||||
*eepdata = temp;
|
|
||||||
eepdata++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ath_err(common,
|
|
||||||
"Invalid EEPROM Magic. Endianness mismatch.\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
|||||||
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 {
|
|||||||
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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user