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 |
|