1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- From: Felix Fietkau <[email protected]>
- Date: Sat, 18 Oct 2014 18:24:15 +0200
- Subject: [PATCH] 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 <[email protected]>
- ---
- --- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
- +++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
- @@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(str
- {
- struct ar5416_eeprom_def *eep = &ah->eeprom.def;
- struct ath_common *common = ath9k_hw_common(ah);
- - u16 *eepdata, temp, magic, magic2;
- + u16 *eepdata, temp, magic;
- u32 sum = 0, el;
- bool need_swap = false;
- int i, addr, size;
- @@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(str
- return false;
- }
-
- - if (!ath9k_hw_use_flash(ah)) {
- - ath_dbg(common, EEPROM, "Read Magic = 0x%04X\n", magic);
- -
- - if (magic != AR5416_EEPROM_MAGIC) {
- - magic2 = swab16(magic);
- -
- - 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++) {
- - temp = swab16(*eepdata);
- - *eepdata = temp;
- - eepdata++;
- - }
- - } else {
- - ath_err(common,
- - "Invalid EEPROM Magic. Endianness mismatch.\n");
- - return -EINVAL;
- - }
- + if (swab16(magic) == AR5416_EEPROM_MAGIC &&
- + !(ah->ah_flags & AH_NO_EEP_SWAP)) {
- + 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++;
- }
- }
-
- --- a/drivers/net/wireless/ath/ath9k/hw.h
- +++ b/drivers/net/wireless/ath/ath9k/hw.h
- @@ -731,6 +731,7 @@ enum ath_cal_list {
- #define AH_USE_EEPROM 0x1
- #define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
- #define AH_FASTCC 0x4
- +#define AH_NO_EEP_SWAP 0x8 /* Do not swap EEPROM data */
-
- struct ath_hw {
- struct ath_ops reg_ops;
- --- a/drivers/net/wireless/ath/ath9k/init.c
- +++ b/drivers/net/wireless/ath/ath9k/init.c
- @@ -531,6 +531,8 @@ static int ath9k_init_softc(u16 devid, s
- ah->is_clk_25mhz = pdata->is_clk_25mhz;
- ah->get_mac_revision = pdata->get_mac_revision;
- ah->external_reset = pdata->external_reset;
- + if (!pdata->endian_check)
- + ah->ah_flags |= AH_NO_EEP_SWAP;
- }
-
- common->ops = &ah->reg_ops;
- --- a/include/linux/ath9k_platform.h
- +++ b/include/linux/ath9k_platform.h
- @@ -31,6 +31,7 @@ struct ath9k_platform_data {
- u32 gpio_mask;
- u32 gpio_val;
-
- + bool endian_check;
- bool is_clk_25mhz;
- bool tx_gain_buffalo;
-
|