Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+10 −21
Original line number Diff line number Diff line
@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)
{
	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,13 +272,8 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)
		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) {
	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);
@@ -288,12 +283,6 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)
			*eepdata = temp;
			eepdata++;
		}
			} else {
				ath_err(common,
					"Invalid EEPROM Magic. Endianness mismatch.\n");
				return -EINVAL;
			}
		}
	}

	ath_dbg(common, EEPROM, "need_swap = %s\n",
+1 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -531,6 +531,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
		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;
+1 −0
Original line number Diff line number Diff line
@@ -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;