View | Details | Raw Unified | Return to bug 14874
Collapse All | Expand All

(-)a/drivers/net/wireless/ath/ath5k/eeprom.c (-3 / +29 lines)
Lines 97-103 ath5k_eeprom_init_header(struct ath5k_hw *ah) Link Here
97
	struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
97
	struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
98
	int ret;
98
	int ret;
99
	u16 val;
99
	u16 val;
100
	u32 cksum, offset;
100
	u32 cksum, offset, eep_max = AR5K_EEPROM_INFO_MAX;
101
101
102
	/*
102
	/*
103
	 * Read values from EEPROM and store them in the capability structure
103
	 * Read values from EEPROM and store them in the capability structure
Lines 116-127 ath5k_eeprom_init_header(struct ath5k_hw *ah) Link Here
116
	 * Validate the checksum of the EEPROM date. There are some
116
	 * Validate the checksum of the EEPROM date. There are some
117
	 * devices with invalid EEPROMs.
117
	 * devices with invalid EEPROMs.
118
	 */
118
	 */
119
	for (cksum = 0, offset = 0; offset < AR5K_EEPROM_INFO_MAX; offset++) {
119
	AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_UPPER, val);
120
	if (val) {
121
		eep_max = (val & AR5K_EEPROM_SIZE_UPPER_MASK) <<
122
			   AR5K_EEPROM_SIZE_ENDLOC_SHIFT;
123
		AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_LOWER, val);
124
		eep_max = (eep_max | val) - AR5K_EEPROM_INFO_BASE;
125
126
		/*
127
		 * Fail safe check to prevent stupid loops due
128
		 * to busted EEPROMs. XXX: This value is likely too
129
		 * big still, waiting on a better value.
130
		 */
131
		if (eep_max > (3 * AR5K_EEPROM_INFO_MAX)) {
132
			ATH5K_ERR(ah->ah_sc, "Invalid max custom EEPROM size: "
133
				  "%d (0x%04x) max expected: %d (0x%04x)\n",
134
				  eep_max, eep_max,
135
				  3 * AR5K_EEPROM_INFO_MAX,
136
				  3 * AR5K_EEPROM_INFO_MAX);
137
			return -EIO;
138
		}
139
	}
140
141
	for (cksum = 0, offset = 0; offset < eep_max; offset++) {
120
		AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val);
142
		AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val);
121
		cksum ^= val;
143
		cksum ^= val;
122
	}
144
	}
123
	if (cksum != AR5K_EEPROM_INFO_CKSUM) {
145
	if (cksum != AR5K_EEPROM_INFO_CKSUM) {
124
		ATH5K_ERR(ah->ah_sc, "Invalid EEPROM checksum 0x%04x\n", cksum);
146
		ATH5K_ERR(ah->ah_sc, "Invalid EEPROM "
147
			  "checksum: 0x%04x eep_max: 0x%04x (%s)\n",
148
			  cksum, eep_max,
149
			  eep_max == AR5K_EEPROM_INFO_MAX ?
150
				"default size" : "custom size");
125
		return -EIO;
151
		return -EIO;
126
	}
152
	}
127
153
(-)a/drivers/net/wireless/ath/ath5k/eeprom.h (-1 / +8 lines)
Lines 37-42 Link Here
37
#define AR5K_EEPROM_RFKILL_POLARITY_S	1
37
#define AR5K_EEPROM_RFKILL_POLARITY_S	1
38
38
39
#define AR5K_EEPROM_REG_DOMAIN		0x00bf	/* EEPROM regdom */
39
#define AR5K_EEPROM_REG_DOMAIN		0x00bf	/* EEPROM regdom */
40
41
/* FLASH(EEPROM) Defines for AR531X chips */
42
#define AR5K_EEPROM_SIZE_LOWER		0x1b /* size info -- lower */
43
#define AR5K_EEPROM_SIZE_UPPER		0x1c /* size info -- upper */
44
#define AR5K_EEPROM_SIZE_UPPER_MASK	0xfff0
45
#define AR5K_EEPROM_SIZE_UPPER_SHIFT	4
46
#define AR5K_EEPROM_SIZE_ENDLOC_SHIFT	12
47
40
#define AR5K_EEPROM_CHECKSUM		0x00c0	/* EEPROM checksum */
48
#define AR5K_EEPROM_CHECKSUM		0x00c0	/* EEPROM checksum */
41
#define AR5K_EEPROM_INFO_BASE		0x00c0	/* EEPROM header */
49
#define AR5K_EEPROM_INFO_BASE		0x00c0	/* EEPROM header */
42
#define AR5K_EEPROM_INFO_MAX		(0x400 - AR5K_EEPROM_INFO_BASE)
50
#define AR5K_EEPROM_INFO_MAX		(0x400 - AR5K_EEPROM_INFO_BASE)
43
- 

Return to bug 14874