diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2008-04-21 18:41:52 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-05-07 15:02:15 -0400 |
commit | 073d3f5f1b3b6512eb82a3d40c84dedb14dc6f73 (patch) | |
tree | 49ef76bf1d863a231b0a672c2c34fb44f63fad9c /drivers/net/wireless/iwlwifi/iwl-eeprom.h | |
parent | 5da4b55f78fb2ed40926b775d4f7c791594ecbd7 (diff) |
iwlwifi: changing EEPROM layout handling
This patch
1. changes the current EEPROM handling through a single HW struct
layout representation, to more general approach, treating the EEPROM
image as a flat bytes array, handling this image through ops functions
and offsets.
2. Eeprom is dynamically allocated accroding HW type
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Ron Rindjunsky <ron.rindjunsky@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-eeprom.h')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom.h | 155 |
1 files changed, 63 insertions, 92 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h index bd0a042ca77f..26a73e918c56 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h | |||
@@ -116,7 +116,7 @@ enum { | |||
116 | 116 | ||
117 | /* *regulatory* channel data format in eeprom, one for each channel. | 117 | /* *regulatory* channel data format in eeprom, one for each channel. |
118 | * There are separate entries for FAT (40 MHz) vs. normal (20 MHz) channels. */ | 118 | * There are separate entries for FAT (40 MHz) vs. normal (20 MHz) channels. */ |
119 | struct iwl4965_eeprom_channel { | 119 | struct iwl_eeprom_channel { |
120 | u8 flags; /* EEPROM_CHANNEL_* flags copied from EEPROM */ | 120 | u8 flags; /* EEPROM_CHANNEL_* flags copied from EEPROM */ |
121 | s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ | 121 | s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ |
122 | } __attribute__ ((packed)); | 122 | } __attribute__ ((packed)); |
@@ -131,17 +131,19 @@ struct iwl4965_eeprom_channel { | |||
131 | * each of 3 target output levels */ | 131 | * each of 3 target output levels */ |
132 | #define EEPROM_TX_POWER_MEASUREMENTS (3) | 132 | #define EEPROM_TX_POWER_MEASUREMENTS (3) |
133 | 133 | ||
134 | #define EEPROM_4965_TX_POWER_VERSION (2) | 134 | /* 4965 Specific */ |
135 | 135 | /* 4965 driver does not work with txpower calibration version < 5 */ | |
136 | /* 4965 driver does not work with txpower calibration version < 5. | 136 | #define EEPROM_4965_TX_POWER_VERSION (5) |
137 | * Look for this in calib_version member of struct iwl4965_eeprom. */ | 137 | #define EEPROM_4965_CALIB_VERSION_OFFSET (2*0xB6) /* 2 bytes */ |
138 | #define EEPROM_TX_POWER_VERSION_NEW (5) | 138 | #define EEPROM_4965_CALIB_TXPOWER_OFFSET (2*0xE8) /* 48 bytes */ |
139 | #define EEPROM_4965_BOARD_REVISION (2*0x4F) /* 2 bytes */ | ||
140 | #define EEPROM_4965_BOARD_PBA (2*0x56+1) /* 9 bytes */ | ||
139 | 141 | ||
140 | /* 2.4 GHz */ | 142 | /* 2.4 GHz */ |
141 | extern const u8 iwl_eeprom_band_1[14]; | 143 | extern const u8 iwl_eeprom_band_1[14]; |
142 | 144 | ||
143 | /* | 145 | /* |
144 | * 4965 factory calibration data for one txpower level, on one channel, | 146 | * factory calibration data for one txpower level, on one channel, |
145 | * measured on one of the 2 tx chains (radio transmitter and associated | 147 | * measured on one of the 2 tx chains (radio transmitter and associated |
146 | * antenna). EEPROM contains: | 148 | * antenna). EEPROM contains: |
147 | * | 149 | * |
@@ -154,7 +156,7 @@ extern const u8 iwl_eeprom_band_1[14]; | |||
154 | * | 156 | * |
155 | * 4) RF power amplifier detector level measurement (not used). | 157 | * 4) RF power amplifier detector level measurement (not used). |
156 | */ | 158 | */ |
157 | struct iwl4965_eeprom_calib_measure { | 159 | struct iwl_eeprom_calib_measure { |
158 | u8 temperature; /* Device temperature (Celsius) */ | 160 | u8 temperature; /* Device temperature (Celsius) */ |
159 | u8 gain_idx; /* Index into gain table */ | 161 | u8 gain_idx; /* Index into gain table */ |
160 | u8 actual_pow; /* Measured RF output power, half-dBm */ | 162 | u8 actual_pow; /* Measured RF output power, half-dBm */ |
@@ -163,22 +165,22 @@ struct iwl4965_eeprom_calib_measure { | |||
163 | 165 | ||
164 | 166 | ||
165 | /* | 167 | /* |
166 | * 4965 measurement set for one channel. EEPROM contains: | 168 | * measurement set for one channel. EEPROM contains: |
167 | * | 169 | * |
168 | * 1) Channel number measured | 170 | * 1) Channel number measured |
169 | * | 171 | * |
170 | * 2) Measurements for each of 3 power levels for each of 2 radio transmitters | 172 | * 2) Measurements for each of 3 power levels for each of 2 radio transmitters |
171 | * (a.k.a. "tx chains") (6 measurements altogether) | 173 | * (a.k.a. "tx chains") (6 measurements altogether) |
172 | */ | 174 | */ |
173 | struct iwl4965_eeprom_calib_ch_info { | 175 | struct iwl_eeprom_calib_ch_info { |
174 | u8 ch_num; | 176 | u8 ch_num; |
175 | struct iwl4965_eeprom_calib_measure | 177 | struct iwl_eeprom_calib_measure |
176 | measurements[EEPROM_TX_POWER_TX_CHAINS] | 178 | measurements[EEPROM_TX_POWER_TX_CHAINS] |
177 | [EEPROM_TX_POWER_MEASUREMENTS]; | 179 | [EEPROM_TX_POWER_MEASUREMENTS]; |
178 | } __attribute__ ((packed)); | 180 | } __attribute__ ((packed)); |
179 | 181 | ||
180 | /* | 182 | /* |
181 | * 4965 txpower subband info. | 183 | * txpower subband info. |
182 | * | 184 | * |
183 | * For each frequency subband, EEPROM contains the following: | 185 | * For each frequency subband, EEPROM contains the following: |
184 | * | 186 | * |
@@ -187,16 +189,16 @@ struct iwl4965_eeprom_calib_ch_info { | |||
187 | * | 189 | * |
188 | * 2) Sample measurement sets for 2 channels close to the range endpoints. | 190 | * 2) Sample measurement sets for 2 channels close to the range endpoints. |
189 | */ | 191 | */ |
190 | struct iwl4965_eeprom_calib_subband_info { | 192 | struct iwl_eeprom_calib_subband_info { |
191 | u8 ch_from; /* channel number of lowest channel in subband */ | 193 | u8 ch_from; /* channel number of lowest channel in subband */ |
192 | u8 ch_to; /* channel number of highest channel in subband */ | 194 | u8 ch_to; /* channel number of highest channel in subband */ |
193 | struct iwl4965_eeprom_calib_ch_info ch1; | 195 | struct iwl_eeprom_calib_ch_info ch1; |
194 | struct iwl4965_eeprom_calib_ch_info ch2; | 196 | struct iwl_eeprom_calib_ch_info ch2; |
195 | } __attribute__ ((packed)); | 197 | } __attribute__ ((packed)); |
196 | 198 | ||
197 | 199 | ||
198 | /* | 200 | /* |
199 | * 4965 txpower calibration info. EEPROM contains: | 201 | * txpower calibration info. EEPROM contains: |
200 | * | 202 | * |
201 | * 1) Factory-measured saturation power levels (maximum levels at which | 203 | * 1) Factory-measured saturation power levels (maximum levels at which |
202 | * tx power amplifier can output a signal without too much distortion). | 204 | * tx power amplifier can output a signal without too much distortion). |
@@ -212,55 +214,45 @@ struct iwl4965_eeprom_calib_subband_info { | |||
212 | * characteristics of the analog radio circuitry vary with frequency. | 214 | * characteristics of the analog radio circuitry vary with frequency. |
213 | * | 215 | * |
214 | * Not all sets need to be filled with data; | 216 | * Not all sets need to be filled with data; |
215 | * struct iwl4965_eeprom_calib_subband_info contains range of channels | 217 | * struct iwl_eeprom_calib_subband_info contains range of channels |
216 | * (0 if unused) for each set of data. | 218 | * (0 if unused) for each set of data. |
217 | */ | 219 | */ |
218 | struct iwl4965_eeprom_calib_info { | 220 | struct iwl_eeprom_calib_info { |
219 | u8 saturation_power24; /* half-dBm (e.g. "34" = 17 dBm) */ | 221 | u8 saturation_power24; /* half-dBm (e.g. "34" = 17 dBm) */ |
220 | u8 saturation_power52; /* half-dBm */ | 222 | u8 saturation_power52; /* half-dBm */ |
221 | s16 voltage; /* signed */ | 223 | s16 voltage; /* signed */ |
222 | struct iwl4965_eeprom_calib_subband_info | 224 | struct iwl_eeprom_calib_subband_info |
223 | band_info[EEPROM_TX_POWER_BANDS]; | 225 | band_info[EEPROM_TX_POWER_BANDS]; |
224 | } __attribute__ ((packed)); | 226 | } __attribute__ ((packed)); |
225 | 227 | ||
226 | 228 | ||
227 | 229 | #define ADDRESS_MSK 0x0000FFFF | |
228 | /* | 230 | #define INDIRECT_TYPE_MSK 0x000F0000 |
229 | * 4965 EEPROM map | 231 | #define INDIRECT_HOST 0x00010000 |
230 | */ | 232 | #define INDIRECT_GENERAL 0x00020000 |
231 | struct iwl4965_eeprom { | 233 | #define INDIRECT_REGULATORY 0x00030000 |
232 | u8 reserved0[16]; | 234 | #define INDIRECT_CALIBRATION 0x00040000 |
233 | u16 device_id; /* abs.ofs: 16 */ | 235 | #define INDIRECT_PROCESS_ADJST 0x00050000 |
234 | u8 reserved1[2]; | 236 | #define INDIRECT_OTHERS 0x00060000 |
235 | u16 pmc; /* abs.ofs: 20 */ | 237 | #define INDIRECT_ADDRESS 0x00100000 |
236 | u8 reserved2[20]; | 238 | |
237 | u8 mac_address[6]; /* abs.ofs: 42 */ | 239 | /* General */ |
238 | u8 reserved3[58]; | 240 | #define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */ |
239 | u16 board_revision; /* abs.ofs: 106 */ | 241 | #define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */ |
240 | u8 reserved4[11]; | 242 | #define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */ |
241 | u8 board_pba_number[9]; /* abs.ofs: 119 */ | 243 | #define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */ |
242 | u8 reserved5[8]; | 244 | #define EEPROM_VERSION (2*0x44) /* 2 bytes */ |
243 | u16 version; /* abs.ofs: 136 */ | 245 | #define EEPROM_SKU_CAP (2*0x45) /* 1 bytes */ |
244 | u8 sku_cap; /* abs.ofs: 138 */ | 246 | #define EEPROM_LEDS_MODE (2*0x45+1) /* 1 bytes */ |
245 | u8 leds_mode; /* abs.ofs: 139 */ | 247 | #define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */ |
246 | u16 oem_mode; | 248 | #define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ |
247 | u16 wowlan_mode; /* abs.ofs: 142 */ | 249 | #define EEPROM_3945_M_VERSION (2*0x4A) /* 1 bytes */ |
248 | u16 leds_time_interval; /* abs.ofs: 144 */ | 250 | #define EEPROM_ANTENNA_SWITCH_TYPE (2*0x4A+1) /* 1 bytes */ |
249 | u8 leds_off_time; /* abs.ofs: 146 */ | ||
250 | u8 leds_on_time; /* abs.ofs: 147 */ | ||
251 | u8 almgor_m_version; /* abs.ofs: 148 */ | ||
252 | u8 antenna_switch_type; /* abs.ofs: 149 */ | ||
253 | u8 reserved6[8]; | ||
254 | u16 board_revision_4965; /* abs.ofs: 158 */ | ||
255 | u8 reserved7[13]; | ||
256 | u8 board_pba_number_4965[9]; /* abs.ofs: 173 */ | ||
257 | u8 reserved8[10]; | ||
258 | u8 sku_id[4]; /* abs.ofs: 192 */ | ||
259 | 251 | ||
260 | /* | 252 | /* |
261 | * Per-channel regulatory data. | 253 | * Per-channel regulatory data. |
262 | * | 254 | * |
263 | * Each channel that *might* be supported by 3945 or 4965 has a fixed location | 255 | * Each channel that *might* be supported by iwl has a fixed location |
264 | * in EEPROM containing EEPROM_CHANNEL_* usage flags (LSB) and max regulatory | 256 | * in EEPROM containing EEPROM_CHANNEL_* usage flags (LSB) and max regulatory |
265 | * txpower (MSB). | 257 | * txpower (MSB). |
266 | * | 258 | * |
@@ -269,40 +261,38 @@ struct iwl4965_eeprom { | |||
269 | * | 261 | * |
270 | * 2.4 GHz channels 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 | 262 | * 2.4 GHz channels 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 |
271 | */ | 263 | */ |
272 | u16 band_1_count; /* abs.ofs: 196 */ | 264 | #define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */ |
273 | struct iwl4965_eeprom_channel band_1_channels[14]; /* abs.ofs: 196 */ | 265 | #define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */ |
266 | #define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */ | ||
274 | 267 | ||
275 | /* | 268 | /* |
276 | * 4.9 GHz channels 183, 184, 185, 187, 188, 189, 192, 196, | 269 | * 4.9 GHz channels 183, 184, 185, 187, 188, 189, 192, 196, |
277 | * 5.0 GHz channels 7, 8, 11, 12, 16 | 270 | * 5.0 GHz channels 7, 8, 11, 12, 16 |
278 | * (4915-5080MHz) (none of these is ever supported) | 271 | * (4915-5080MHz) (none of these is ever supported) |
279 | */ | 272 | */ |
280 | u16 band_2_count; /* abs.ofs: 226 */ | 273 | #define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */ |
281 | struct iwl4965_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */ | 274 | #define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */ |
282 | 275 | ||
283 | /* | 276 | /* |
284 | * 5.2 GHz channels 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 | 277 | * 5.2 GHz channels 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 |
285 | * (5170-5320MHz) | 278 | * (5170-5320MHz) |
286 | */ | 279 | */ |
287 | u16 band_3_count; /* abs.ofs: 254 */ | 280 | #define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */ |
288 | struct iwl4965_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */ | 281 | #define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */ |
289 | 282 | ||
290 | /* | 283 | /* |
291 | * 5.5 GHz channels 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 | 284 | * 5.5 GHz channels 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 |
292 | * (5500-5700MHz) | 285 | * (5500-5700MHz) |
293 | */ | 286 | */ |
294 | u16 band_4_count; /* abs.ofs: 280 */ | 287 | #define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */ |
295 | struct iwl4965_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */ | 288 | #define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */ |
296 | 289 | ||
297 | /* | 290 | /* |
298 | * 5.7 GHz channels 145, 149, 153, 157, 161, 165 | 291 | * 5.7 GHz channels 145, 149, 153, 157, 161, 165 |
299 | * (5725-5825MHz) | 292 | * (5725-5825MHz) |
300 | */ | 293 | */ |
301 | u16 band_5_count; /* abs.ofs: 304 */ | 294 | #define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */ |
302 | struct iwl4965_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */ | 295 | #define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */ |
303 | |||
304 | u8 reserved10[2]; | ||
305 | |||
306 | 296 | ||
307 | /* | 297 | /* |
308 | * 2.4 GHz FAT channels 1 (5), 2 (6), 3 (7), 4 (8), 5 (9), 6 (10), 7 (11) | 298 | * 2.4 GHz FAT channels 1 (5), 2 (6), 3 (7), 4 (8), 5 (9), 6 (10), 7 (11) |
@@ -319,52 +309,33 @@ struct iwl4965_eeprom { | |||
319 | * | 309 | * |
320 | * NOTE: 4965 does not support FAT channels on 2.4 GHz. | 310 | * NOTE: 4965 does not support FAT channels on 2.4 GHz. |
321 | */ | 311 | */ |
322 | struct iwl4965_eeprom_channel band_24_channels[7]; /* abs.ofs: 320 */ | 312 | #define EEPROM_4965_REGULATORY_BAND_24_FAT_CHANNELS (2*0xA0) /* 14 bytes */ |
323 | u8 reserved11[2]; | ||
324 | 313 | ||
325 | /* | 314 | /* |
326 | * 5.2 GHz FAT channels 36 (40), 44 (48), 52 (56), 60 (64), | 315 | * 5.2 GHz FAT channels 36 (40), 44 (48), 52 (56), 60 (64), |
327 | * 100 (104), 108 (112), 116 (120), 124 (128), 132 (136), 149 (153), 157 (161) | 316 | * 100 (104), 108 (112), 116 (120), 124 (128), 132 (136), 149 (153), 157 (161) |
328 | */ | 317 | */ |
329 | struct iwl4965_eeprom_channel band_52_channels[11]; /* abs.ofs: 336 */ | 318 | #define EEPROM_4965_REGULATORY_BAND_52_FAT_CHANNELS (2*0xA8) /* 22 bytes */ |
330 | u8 reserved12[6]; | ||
331 | |||
332 | /* | ||
333 | * 4965 driver requires txpower calibration format version 5 or greater. | ||
334 | * Driver does not work with txpower calibration version < 5. | ||
335 | * This value is simply a 16-bit number, no major/minor versions here. | ||
336 | */ | ||
337 | u16 calib_version; /* abs.ofs: 364 */ | ||
338 | u8 reserved13[2]; | ||
339 | u8 reserved14[96]; /* abs.ofs: 368 */ | ||
340 | |||
341 | /* | ||
342 | * 4965 Txpower calibration data. | ||
343 | */ | ||
344 | struct iwl4965_eeprom_calib_info calib_info; /* abs.ofs: 464 */ | ||
345 | |||
346 | u8 reserved16[140]; /* fill out to full 1024 byte block */ | ||
347 | |||
348 | |||
349 | } __attribute__ ((packed)); | ||
350 | |||
351 | #define IWL_EEPROM_IMAGE_SIZE 1024 | ||
352 | |||
353 | /* End of EEPROM */ | ||
354 | 319 | ||
355 | struct iwl_eeprom_ops { | 320 | struct iwl_eeprom_ops { |
321 | const u32 regulatory_bands[7]; | ||
356 | int (*verify_signature) (struct iwl_priv *priv); | 322 | int (*verify_signature) (struct iwl_priv *priv); |
357 | int (*acquire_semaphore) (struct iwl_priv *priv); | 323 | int (*acquire_semaphore) (struct iwl_priv *priv); |
358 | void (*release_semaphore) (struct iwl_priv *priv); | 324 | void (*release_semaphore) (struct iwl_priv *priv); |
325 | const u8* (*query_addr) (const struct iwl_priv *priv, size_t offset); | ||
359 | }; | 326 | }; |
360 | 327 | ||
361 | 328 | ||
362 | void iwl_eeprom_get_mac(const struct iwl_priv *priv, u8 *mac); | 329 | void iwl_eeprom_get_mac(const struct iwl_priv *priv, u8 *mac); |
363 | int iwl_eeprom_init(struct iwl_priv *priv); | 330 | int iwl_eeprom_init(struct iwl_priv *priv); |
331 | void iwl_eeprom_free(struct iwl_priv *priv); | ||
332 | const u8 *iwl_eeprom_query_addr(const struct iwl_priv *priv, size_t offset); | ||
333 | u16 iwl_eeprom_query16(const struct iwl_priv *priv, size_t offset); | ||
364 | 334 | ||
365 | int iwlcore_eeprom_verify_signature(struct iwl_priv *priv); | 335 | int iwlcore_eeprom_verify_signature(struct iwl_priv *priv); |
366 | int iwlcore_eeprom_acquire_semaphore(struct iwl_priv *priv); | 336 | int iwlcore_eeprom_acquire_semaphore(struct iwl_priv *priv); |
367 | void iwlcore_eeprom_release_semaphore(struct iwl_priv *priv); | 337 | void iwlcore_eeprom_release_semaphore(struct iwl_priv *priv); |
338 | const u8 *iwlcore_eeprom_query_addr(const struct iwl_priv *priv, size_t offset); | ||
368 | 339 | ||
369 | int iwl_init_channel_map(struct iwl_priv *priv); | 340 | int iwl_init_channel_map(struct iwl_priv *priv); |
370 | void iwl_free_channel_map(struct iwl_priv *priv); | 341 | void iwl_free_channel_map(struct iwl_priv *priv); |