Changeset 3868

Show
Ignore:
Timestamp:
10/08/08 18:04:10 (3 months ago)
Author:
mickflemm
Message:
  • Add support for RF2413
  • Comment out RF5112 for now (working on an abstract way to handle different table formats etc)
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ath_info/trunk/ath_info.c

    r3806 r3868  
    2929#include <endian.h> 
    3030#include <byteswap.h> 
     31#include "eeprom.h" 
    3132 
    3233#undef ARRAY_SIZE 
     
    6566}; 
    6667 
    67 /* Known MAC revision numbers */ 
    68 #define AR5K_SREV_MAC_AR5210    0x00 
    69 #define AR5K_SREV_MAC_AR5311    0x10 
    70 #define AR5K_SREV_MAC_AR5311A   0x20 
    71 #define AR5K_SREV_MAC_AR5311B   0x30 
    72 #define AR5K_SREV_MAC_AR5211    0x40 
    73 #define AR5K_SREV_MAC_AR5212    0x50 
    74 #define AR5K_SREV_MAC_AR5213    0x55 
    75 #define AR5K_SREV_MAC_AR5213A   0x59 
    76 #define AR5K_SREV_MAC_AR5513    0x61 
    77 #define AR5K_SREV_MAC_AR2413    0x78 
    78 #define AR5K_SREV_MAC_AR2414    0x79 
    79 #define AR5K_SREV_MAC_AR2424    0xa0 
    80 #define AR5K_SREV_MAC_AR5424    0xa3 
    81 #define AR5K_SREV_MAC_AR5413    0xa4 
    82 #define AR5K_SREV_MAC_AR5414    0xa5 
    83 #define AR5K_SREV_MAC_AR5416    0xc0 
    84 #define AR5K_SREV_MAC_AR5418    0xca 
    85 #define AR5K_SREV_MAC_AR2425    0xe2 
    86  
    87 /* Known PHY revision numbers */ 
    88 #define AR5K_SREV_PHY_5110      0x00 
    89 #define AR5K_SREV_PHY_5111      0x10 
    90 #define AR5K_SREV_PHY_5111A     0x15 
    91 #define AR5K_SREV_PHY_2111      0x20 
    92 #define AR5K_SREV_PHY_5112      0x30 
    93 #define AR5K_SREV_PHY_5112A     0x35 
    94 #define AR5K_SREV_PHY_2112      0x40 
    95 #define AR5K_SREV_PHY_2112A     0x45 
    96 #define AR5K_SREV_PHY_SC0       0x56    /* Found on 2413/2414 */ 
    97 #define AR5K_SREV_PHY_SC1       0x63    /* Found on 5413/5414 */ 
    98 #define AR5K_SREV_PHY_SC2       0xa2    /* Found on 2424/5424 */ 
    99 #define AR5K_SREV_PHY_5133      0xc0    /* MIMO found on 5418 */ 
     68#define AR5K_SREV_UNKNOWN       0xff 
     69 
     70#define AR5K_SREV_AR5210        0x00 /* Crete */ 
     71#define AR5K_SREV_AR5311        0x10 /* Maui 1 */ 
     72#define AR5K_SREV_AR5311A       0x20 /* Maui 2 */ 
     73#define AR5K_SREV_AR5311B       0x30 /* Spirit */ 
     74#define AR5K_SREV_AR5211        0x40 /* Oahu */ 
     75#define AR5K_SREV_AR5212        0x50 /* Venice */ 
     76#define AR5K_SREV_AR5213        0x55 /* ??? */ 
     77#define AR5K_SREV_AR5213A       0x59 /* Hainan */ 
     78#define AR5K_SREV_AR2413        0x78 /* Griffin lite */ 
     79#define AR5K_SREV_AR2414        0x70 /* Griffin */ 
     80#define AR5K_SREV_AR5424        0x90 /* Condor */ 
     81#define AR5K_SREV_AR5413        0xa4 /* Eagle lite */ 
     82#define AR5K_SREV_AR5414        0xa0 /* Eagle */ 
     83#define AR5K_SREV_AR2415        0xb0 /* Cobra */ 
     84#define AR5K_SREV_AR5416        0xc0 /* PCI-E */ 
     85#define AR5K_SREV_AR5418        0xca /* PCI-E */ 
     86#define AR5K_SREV_AR2425        0xe0 /* Swan */ 
     87#define AR5K_SREV_AR2417        0xf0 /* Nala */ 
     88 
     89#define AR5K_SREV_RAD_5110      0x00 
     90#define AR5K_SREV_RAD_5111      0x10 
     91#define AR5K_SREV_RAD_5111A     0x15 
     92#define AR5K_SREV_RAD_2111      0x20 
     93#define AR5K_SREV_RAD_5112      0x30 
     94#define AR5K_SREV_RAD_5112A     0x35 
     95#define AR5K_SREV_RAD_5112B     0x36 
     96#define AR5K_SREV_RAD_2112      0x40 
     97#define AR5K_SREV_RAD_2112A     0x45 
     98#define AR5K_SREV_RAD_2112B     0x46 
     99#define AR5K_SREV_RAD_2413      0x50 
     100#define AR5K_SREV_RAD_5413      0x60 
     101#define AR5K_SREV_RAD_2316      0x70 
     102#define AR5K_SREV_RAD_2317      0x80 
     103#define AR5K_SREV_RAD_5424      0xa0 /* Mostly same as 5413 */ 
     104#define AR5K_SREV_RAD_2425      0xa2 
     105#define AR5K_SREV_RAD_5133      0xc0 
     106 
     107#define AR5K_SREV_PHY_5211      0x30 
     108#define AR5K_SREV_PHY_5212      0x41 
     109#define AR5K_SREV_PHY_2112B     0x43 
     110#define AR5K_SREV_PHY_2413      0x45 
     111#define AR5K_SREV_PHY_5413      0x61 
     112#define AR5K_SREV_PHY_2425      0x70 
    100113 
    101114static const struct ath5k_srev_name ath5k_mac_names[] = { 
    102         {"5210", AR5K_SREV_MAC_AR5210}, 
    103         {"5311", AR5K_SREV_MAC_AR5311}, 
    104         {"5311A", AR5K_SREV_MAC_AR5311A}, 
    105         {"5311B", AR5K_SREV_MAC_AR5311B}, 
    106         {"5211", AR5K_SREV_MAC_AR5211}, 
    107         {"5212", AR5K_SREV_MAC_AR5212}, 
    108         {"5213", AR5K_SREV_MAC_AR5213}, 
    109         {"5213A", AR5K_SREV_MAC_AR5213A}, 
    110         {"2413", AR5K_SREV_MAC_AR2413}, 
    111         {"2414", AR5K_SREV_MAC_AR2414}, 
    112         {"2424", AR5K_SREV_MAC_AR2424}, 
    113         {"5424", AR5K_SREV_MAC_AR5424}, 
    114         {"5413", AR5K_SREV_MAC_AR5413}, 
    115         {"5414", AR5K_SREV_MAC_AR5414}, 
    116         {"5416", AR5K_SREV_MAC_AR5416}, 
    117         {"5418", AR5K_SREV_MAC_AR5418}, 
    118         {"2425", AR5K_SREV_MAC_AR2425}, 
     115        { "5210",       AR5K_SREV_AR5210 }, 
     116        { "5311",       AR5K_SREV_AR5311 }, 
     117        { "5311A",      AR5K_SREV_AR5311A }, 
     118        { "5311B",      AR5K_SREV_AR5311B }, 
     119        { "5211",       AR5K_SREV_AR5211 }, 
     120        { "5212",       AR5K_SREV_AR5212 }, 
     121        { "5213",       AR5K_SREV_AR5213 }, 
     122        { "5213A",      AR5K_SREV_AR5213A }, 
     123        { "2413",       AR5K_SREV_AR2413 }, 
     124        { "2414",       AR5K_SREV_AR2414 }, 
     125        { "5424",       AR5K_SREV_AR5424 }, 
     126        { "5413",       AR5K_SREV_AR5413 }, 
     127        { "5414",       AR5K_SREV_AR5414 }, 
     128        { "2415",       AR5K_SREV_AR2415 }, 
     129        { "5416",       AR5K_SREV_AR5416 }, 
     130        { "5418",       AR5K_SREV_AR5418 }, 
     131        { "2425",       AR5K_SREV_AR2425 }, 
     132        { "2417",       AR5K_SREV_AR2417 }, 
     133        { "xxxxx",      AR5K_SREV_UNKNOWN }, 
    119134}; 
    120135 
    121136static const struct ath5k_srev_name ath5k_phy_names[] = { 
    122         {"5110", AR5K_SREV_PHY_5110}, 
    123         {"5111", AR5K_SREV_PHY_5111}, 
    124         {"2111", AR5K_SREV_PHY_2111}, 
    125         {"5112", AR5K_SREV_PHY_5112}, 
    126         {"5112A", AR5K_SREV_PHY_5112A}, 
    127         {"2112", AR5K_SREV_PHY_2112}, 
    128         {"2112A", AR5K_SREV_PHY_2112A}, 
    129         {"SChip", AR5K_SREV_PHY_SC0}, 
    130         {"SChip", AR5K_SREV_PHY_SC1}, 
    131         {"SChip", AR5K_SREV_PHY_SC2}, 
    132         {"5133", AR5K_SREV_PHY_5133}, 
     137        { "5110",       AR5K_SREV_RAD_5110 }, 
     138        { "5111",       AR5K_SREV_RAD_5111 }, 
     139        { "5111A",      AR5K_SREV_RAD_5111A }, 
     140        { "2111",       AR5K_SREV_RAD_2111 }, 
     141        { "5112",       AR5K_SREV_RAD_5112 }, 
     142        { "5112A",      AR5K_SREV_RAD_5112A }, 
     143        { "5112B",      AR5K_SREV_RAD_5112B }, 
     144        { "2112",       AR5K_SREV_RAD_2112 }, 
     145        { "2112A",      AR5K_SREV_RAD_2112A }, 
     146        { "2112B",      AR5K_SREV_RAD_2112B }, 
     147        { "2413",       AR5K_SREV_RAD_2413 }, 
     148        { "5413",       AR5K_SREV_RAD_5413 }, 
     149        { "2316",       AR5K_SREV_RAD_2316 }, 
     150        { "2317",       AR5K_SREV_RAD_2317 }, 
     151        { "5424",       AR5K_SREV_RAD_5424 }, 
     152        { "5133",       AR5K_SREV_RAD_5133 }, 
     153        { "xxxxx",      AR5K_SREV_UNKNOWN }, 
    133154}; 
    134155 
     
    191212 
    192213/* 
    193  * Common AR5xxx EEPROM data offsets (set these on AR5K_EEPROM_BASE) 
    194  */ 
    195 #define AR5K_EEPROM_MAGIC3              0x003d  /* EEPROM Magic number (old layout) */ 
    196 #define AR5K_EEPROM_MAGIC5              0x0000  /* EEPROM Magic number (new layout) */ 
    197 #define AR5K_EEPROM_MAGIC       (mac_revision < AR5K_SREV_MAC_AR5416 ? \ 
    198                                  AR5K_EEPROM_MAGIC3 : AR5K_EEPROM_MAGIC5) 
    199 #define AR5K_EEPROM_MAGIC_VALUE3        0x5aa5 
    200 #define AR5K_EEPROM_MAGIC_VALUE5        0xa55a 
    201 #define AR5K_EEPROM_MAGIC_VALUE (mac_revision < AR5K_SREV_MAC_AR5416 ? \ 
    202                                  AR5K_EEPROM_MAGIC_VALUE3 : AR5K_EEPROM_MAGIC_VALUE5) 
    203 #define AR5K_EEPROM_MAGIC_5212          0x0000145c      /* 5212 */ 
    204 #define AR5K_EEPROM_MAGIC_5211          0x0000145b      /* 5211 */ 
    205 #define AR5K_EEPROM_MAGIC_5210          0x0000145a      /* 5210 */ 
    206  
    207 #define AR5K_EEPROM_PROTECT             0x003f  /* EEPROM protect status */ 
    208 #define AR5K_EEPROM_PROTECT_RD_0_31     0x0001  /* Read protection bit for offsets 0x0 - 0x1f */ 
    209 #define AR5K_EEPROM_PROTECT_WR_0_31     0x0002  /* Write protection bit for offsets 0x0 - 0x1f */ 
    210 #define AR5K_EEPROM_PROTECT_RD_32_63    0x0004  /* 0x20 - 0x3f */ 
    211 #define AR5K_EEPROM_PROTECT_WR_32_63    0x0008 
    212 #define AR5K_EEPROM_PROTECT_RD_64_127   0x0010  /* 0x40 - 0x7f */ 
    213 #define AR5K_EEPROM_PROTECT_WR_64_127   0x0020 
    214 #define AR5K_EEPROM_PROTECT_RD_128_191  0x0040  /* 0x80 - 0xbf (regdom) */ 
    215 #define AR5K_EEPROM_PROTECT_WR_128_191  0x0080 
    216 #define AR5K_EEPROM_PROTECT_RD_192_207  0x0100  /* 0xc0 - 0xcf */ 
    217 #define AR5K_EEPROM_PROTECT_WR_192_207  0x0200 
    218 #define AR5K_EEPROM_PROTECT_RD_208_223  0x0400  /* 0xd0 - 0xdf */ 
    219 #define AR5K_EEPROM_PROTECT_WR_208_223  0x0800 
    220 #define AR5K_EEPROM_PROTECT_RD_224_239  0x1000  /* 0xe0 - 0xef */ 
    221 #define AR5K_EEPROM_PROTECT_WR_224_239  0x2000 
    222 #define AR5K_EEPROM_PROTECT_RD_240_255  0x4000  /* 0xf0 - 0xff */ 
    223 #define AR5K_EEPROM_PROTECT_WR_240_255  0x8000 
    224 #define AR5K_EEPROM_REG_DOMAIN          0x00bf  /* EEPROM regdom */ 
    225 #define AR5K_EEPROM_INFO_BASE           0x00c0  /* EEPROM header */ 
    226 #define AR5K_EEPROM_INFO_MAX            (0x400 - AR5K_EEPROM_INFO_BASE) 
    227 #define AR5K_EEPROM_INFO_CKSUM          0xffff 
    228 #define AR5K_EEPROM_INFO(_n)            (AR5K_EEPROM_INFO_BASE + (_n)) 
    229  
    230 #define AR5K_EEPROM_VERSION             AR5K_EEPROM_INFO(1)     /* EEPROM Version */ 
    231 #define AR5K_EEPROM_VERSION_3_0         0x3000  /* No idea what's going on before this version */ 
    232 #define AR5K_EEPROM_VERSION_3_1         0x3001  /* ob/db values for 2GHz (AR5211_rfregs) */ 
    233 #define AR5K_EEPROM_VERSION_3_2         0x3002  /* different frequency representation (eeprom_bin2freq) */ 
    234 #define AR5K_EEPROM_VERSION_3_3         0x3003  /* offsets changed, has 32 CTLs (see below) and ee_false_detect (eeprom_read_modes) */ 
    235 #define AR5K_EEPROM_VERSION_3_4         0x3004  /* has ee_i_gain ee_cck_ofdm_power_delta (eeprom_read_modes) */ 
    236 #define AR5K_EEPROM_VERSION_4_0         0x4000  /* has ee_misc*, ee_cal_pier, ee_turbo_max_power and ee_xr_power (eeprom_init) */ 
    237 #define AR5K_EEPROM_VERSION_4_1         0x4001  /* has ee_margin_tx_rx (eeprom_init) */ 
    238 #define AR5K_EEPROM_VERSION_4_2         0x4002  /* has ee_cck_ofdm_gain_delta (eeprom_init) */ 
    239 #define AR5K_EEPROM_VERSION_4_3         0x4003 
    240 #define AR5K_EEPROM_VERSION_4_4         0x4004 
    241 #define AR5K_EEPROM_VERSION_4_5         0x4005 
    242 #define AR5K_EEPROM_VERSION_4_6         0x4006  /* has ee_scaled_cck_delta */ 
    243 #define AR5K_EEPROM_VERSION_4_7         0x3007 
    244  
    245 #define AR5K_EEPROM_MODE_11A            0 
    246 #define AR5K_EEPROM_MODE_11B            1 
    247 #define AR5K_EEPROM_MODE_11G            2 
    248  
    249 #define AR5K_EEPROM_HDR                 AR5K_EEPROM_INFO(2)     /* Header that contains the device caps */ 
    250 #define AR5K_EEPROM_HDR_11A(_v)         (((_v) >> AR5K_EEPROM_MODE_11A) & 0x1) 
    251 #define AR5K_EEPROM_HDR_11B(_v)         (((_v) >> AR5K_EEPROM_MODE_11B) & 0x1) 
    252 #define AR5K_EEPROM_HDR_11G(_v)         (((_v) >> AR5K_EEPROM_MODE_11G) & 0x1) 
    253 #define AR5K_EEPROM_HDR_T_2GHZ_DIS(_v)  (((_v) >> 3) & 0x1)     /* Disable turbo for 2GHz (?) */ 
    254 #define AR5K_EEPROM_HDR_T_5GHZ_DBM(_v)  (((_v) >> 4) & 0x7f)    /* Max turbo power for a/XR mode (eeprom_init) */ 
    255 #define AR5K_EEPROM_HDR_DEVICE(_v)      (((_v) >> 11) & 0x7) 
    256 #define AR5K_EEPROM_HDR_T_5GHZ_DIS(_v)  (((_v) >> 15) & 0x1)    /* Disable turbo for 5GHz (?) */ 
    257 #define AR5K_EEPROM_HDR_RFKILL(_v)      (((_v) >> 14) & 0x1)    /* Device has RFKill support */ 
    258  
    259 /* Misc values available since EEPROM 4.0 */ 
    260 #define AR5K_EEPROM_MISC0               AR5K_EEPROM_INFO(4) 
    261 #define AR5K_EEPROM_EARSTART(_v)        ((_v) & 0xfff) 
    262 #define AR5K_EEPROM_HDR_XR2_DIS(_v)     (((_v) >> 12) & 0x1) 
    263 #define AR5K_EEPROM_HDR_XR5_DIS(_v)     (((_v) >> 13) & 0x1) 
    264 #define AR5K_EEPROM_EEMAP(_v)           (((_v) >> 14) & 0x3) 
    265 #define AR5K_EEPROM_MISC1               AR5K_EEPROM_INFO(5) 
    266 #define AR5K_EEPROM_TARGET_PWRSTART(_v) ((_v) & 0xfff) 
    267 #define AR5K_EEPROM_HAS32KHZCRYSTAL(_v) (((_v) >> 14) & 0x1) 
    268  
    269 #define AR5K_EEPROM_RFKILL_GPIO_SEL     0x0000001c 
    270 #define AR5K_EEPROM_RFKILL_GPIO_SEL_S   2 
    271 #define AR5K_EEPROM_RFKILL_POLARITY     0x00000002 
    272 #define AR5K_EEPROM_RFKILL_POLARITY_S   1 
    273  
    274 /* Newer EEPROMs are using a different offset */ 
    275 #define AR5K_EEPROM_OFF(_v, _v3_0, _v3_3) \ 
    276         (((_v) >= AR5K_EEPROM_VERSION_3_3) ? _v3_3 : _v3_0) 
    277  
    278 #define AR5K_EEPROM_ANT_GAIN(_v)        AR5K_EEPROM_OFF(_v, 0x00c4, 0x00c3) 
    279 #define AR5K_EEPROM_ANT_GAIN_5GHZ(_v)   ((int8_t)(((_v) >> 8) & 0xff)) 
    280 #define AR5K_EEPROM_ANT_GAIN_2GHZ(_v)   ((int8_t)((_v) & 0xff)) 
    281  
    282 /* calibration settings */ 
    283 #define AR5K_EEPROM_MODES_11A(_v)       AR5K_EEPROM_OFF(_v, 0x00c5, 0x00d4) 
    284 #define AR5K_EEPROM_MODES_11B(_v)       AR5K_EEPROM_OFF(_v, 0x00d0, 0x00f2) 
    285 #define AR5K_EEPROM_MODES_11G(_v)       AR5K_EEPROM_OFF(_v, 0x00da, 0x010d) 
    286 #define AR5K_EEPROM_CTL(_v)             AR5K_EEPROM_OFF(_v, 0x00e4, 0x0128)     /* Conformance test limits */ 
    287 #define AR5K_EEPROM_CHANNELS_5GHZ(_v)   AR5K_EEPROM_OFF(_v, 0x0100, 0x0150)     /* List of calibrated 5GHz chans */ 
    288 #define AR5K_EEPROM_TARGET_PWR_OFF_11A(_v)      AR5K_EEPROM_OFF(_v, AR5K_EEPROM_CHANNELS_5GHZ(_v) + 0x0055, 0x0000) 
    289 #define AR5K_EEPROM_TARGET_PWR_OFF_11B(_v)      AR5K_EEPROM_OFF(_v, AR5K_EEPROM_CHANNELS_5GHZ(_v) + 0x0065, 0x0010) 
    290 #define AR5K_EEPROM_TARGET_PWR_OFF_11G(_v)      AR5K_EEPROM_OFF(_v, AR5K_EEPROM_CHANNELS_5GHZ(_v) + 0x0069, 0x0014) 
    291  
    292 /* [3.1 - 3.3] */ 
    293 #define AR5K_EEPROM_OBDB0_2GHZ          0x00ec 
    294 #define AR5K_EEPROM_OBDB1_2GHZ          0x00ed 
    295  
    296 /* 
    297214 * EEPROM data register 
    298215 */ 
     
    326243 */ 
    327244#define AR5K_EEPROM_CFG 0x6010 
    328  
    329 /* Some EEPROM defines */ 
    330 #define AR5K_EEPROM_EEP_SCALE           100 
    331 #define AR5K_EEPROM_EEP_DELTA           10 
    332 #define AR5K_EEPROM_N_MODES             3 
    333 #define AR5K_EEPROM_N_5GHZ_CHAN         10 
    334 #define AR5K_EEPROM_N_2GHZ_CHAN         3 
    335 #define AR5K_EEPROM_MAX_CHAN            10 
    336 #define AR5K_EEPROM_N_PCDAC             11 
    337 #define AR5K_EEPROM_N_TEST_FREQ         8 
    338 #define AR5K_EEPROM_N_EDGES             8 
    339 #define AR5K_EEPROM_N_INTERCEPTS        11 
    340 #define AR5K_EEPROM_FREQ_M(_v)          AR5K_EEPROM_OFF(_v, 0x7f, 0xff) 
    341 #define AR5K_EEPROM_PCDAC_M             0x3f 
    342 #define AR5K_EEPROM_PCDAC_START         1 
    343 #define AR5K_EEPROM_PCDAC_STOP          63 
    344 #define AR5K_EEPROM_PCDAC_STEP          1 
    345 #define AR5K_EEPROM_NON_EDGE_M          0x40 
    346 #define AR5K_EEPROM_CHANNEL_POWER       8 
    347 #define AR5K_EEPROM_N_OBDB              4 
    348 #define AR5K_EEPROM_OBDB_DIS            0xffff 
    349 #define AR5K_EEPROM_CHANNEL_DIS         0xff 
    350 #define AR5K_EEPROM_SCALE_OC_DELTA(_x)  (((_x) * 2) / 10) 
    351 #define AR5K_EEPROM_N_CTLS(_v)          AR5K_EEPROM_OFF(_v, 16, 32) 
    352 #define AR5K_EEPROM_MAX_CTLS            32 
    353 #define AR5K_EEPROM_N_XPD_PER_CHANNEL   4 
    354 #define AR5K_EEPROM_N_XPD0_POINTS       4 
    355 #define AR5K_EEPROM_N_XPD3_POINTS       3 
    356 #define AR5K_EEPROM_N_INTERCEPT_10_2GHZ 35 
    357 #define AR5K_EEPROM_N_INTERCEPT_10_5GHZ 55 
    358 #define AR5K_EEPROM_POWER_M             0x3f 
    359 #define AR5K_EEPROM_POWER_MIN           0 
    360 #define AR5K_EEPROM_POWER_MAX           3150 
    361 #define AR5K_EEPROM_POWER_STEP          50 
    362 #define AR5K_EEPROM_POWER_TABLE_SIZE    64 
    363 #define AR5K_EEPROM_N_POWER_LOC_11B     4 
    364 #define AR5K_EEPROM_N_POWER_LOC_11G     6 
    365 #define AR5K_EEPROM_I_GAIN              10 
    366 #define AR5K_EEPROM_CCK_OFDM_DELTA      15 
    367 #define AR5K_EEPROM_N_IQ_CAL            2 
    368  
    369 enum ath5k_ant_setting { 
    370         AR5K_ANT_VARIABLE       = 0,    /* variable by programming */ 
    371         AR5K_ANT_FIXED_A        = 1,    /* fixed to 11a frequencies */ 
    372         AR5K_ANT_FIXED_B        = 2,    /* fixed to 11b frequencies */ 
    373         AR5K_ANT_MAX            = 3, 
    374 }; 
    375  
    376 /* Per channel calibration data, used for power table setup */ 
    377 struct ath5k_chan_pcal_info { 
    378         u_int16_t       freq; /* Frequency */ 
    379         /* Power levels in dBm * 4 units */ 
    380         int16_t         pwr_x0[AR5K_EEPROM_N_XPD0_POINTS]; 
    381         int16_t         pwr_x3[AR5K_EEPROM_N_XPD3_POINTS]; 
    382         /* PCDAC tables in dBm * 2 units */ 
    383         u_int16_t       pcdac_x0[AR5K_EEPROM_N_XPD0_POINTS]; 
    384         u_int16_t       pcdac_x3[AR5K_EEPROM_N_XPD3_POINTS]; 
    385         /* Max available power */ 
    386         u_int16_t       max_pwr; 
    387 }; 
    388  
    389 /* Per rate calibration data for each mode, used for power table setup */ 
    390 struct ath5k_rate_pcal_info { 
    391         u_int16_t       freq; /* Frequency */ 
    392         /* Power level for 6-24Mbit/s rates */ 
    393         u_int16_t       target_power_6to24; 
    394         /* Power level for 36Mbit rate */ 
    395         u_int16_t       target_power_36; 
    396         /* Power level for 48Mbit rate */ 
    397         u_int16_t       target_power_48; 
    398         /* Power level for 54Mbit rate */ 
    399         u_int16_t       target_power_54; 
    400 }; 
    401  
    402 /* EEPROM calibration data */ 
    403 struct ath5k_eeprom_info { 
    404  
    405         /* Header information */ 
    406         u_int16_t       ee_magic; 
    407         u_int16_t       ee_protect; 
    408         u_int16_t       ee_regdomain; 
    409         u_int16_t       ee_version; 
    410         u_int16_t       ee_header; 
    411         u_int16_t       ee_ant_gain; 
    412         u_int16_t       ee_misc0; 
    413         u_int16_t       ee_misc1; 
    414         u_int16_t       ee_cck_ofdm_gain_delta; 
    415         u_int16_t       ee_cck_ofdm_power_delta; 
    416         u_int16_t       ee_scaled_cck_delta; 
    417  
    418         /* Used for tx thermal adjustment (eeprom_init, rfregs) */ 
    419         u_int16_t       ee_tx_clip; 
    420         u_int16_t       ee_pwd_84; 
    421         u_int16_t       ee_pwd_90; 
    422         u_int16_t       ee_gain_select; 
    423  
    424         /* RF Calibration settings (reset, rfregs) */ 
    425         u_int16_t       ee_i_cal[AR5K_EEPROM_N_MODES]; 
    426         u_int16_t       ee_q_cal[AR5K_EEPROM_N_MODES]; 
    427         u_int16_t       ee_fixed_bias[AR5K_EEPROM_N_MODES]; 
    428         u_int16_t       ee_turbo_max_power[AR5K_EEPROM_N_MODES]; 
    429         u_int16_t       ee_xr_power[AR5K_EEPROM_N_MODES]; 
    430         u_int16_t       ee_switch_settling[AR5K_EEPROM_N_MODES]; 
    431         u_int16_t       ee_ant_tx_rx[AR5K_EEPROM_N_MODES]; 
    432         u_int16_t       ee_ant_control[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_PCDAC]; 
    433         u_int16_t       ee_ob[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_OBDB]; 
    434         u_int16_t       ee_db[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_OBDB]; 
    435         u_int16_t       ee_tx_end2xlna_enable[AR5K_EEPROM_N_MODES]; 
    436         u_int16_t       ee_tx_end2xpa_disable[AR5K_EEPROM_N_MODES]; 
    437         u_int16_t       ee_tx_frm2xpa_enable[AR5K_EEPROM_N_MODES]; 
    438         u_int16_t       ee_thr_62[AR5K_EEPROM_N_MODES]; 
    439         u_int16_t       ee_xlna_gain[AR5K_EEPROM_N_MODES]; 
    440         u_int16_t       ee_xpd[AR5K_EEPROM_N_MODES]; 
    441         u_int16_t       ee_x_gain[AR5K_EEPROM_N_MODES]; 
    442         u_int16_t       ee_i_gain[AR5K_EEPROM_N_MODES]; 
    443         u_int16_t       ee_margin_tx_rx[AR5K_EEPROM_N_MODES]; 
    444  
    445         /* Power calibration data */ 
    446         u_int16_t       ee_false_detect[AR5K_EEPROM_N_MODES]; 
    447         u_int16_t       ee_cal_piers_a; 
    448         struct ath5k_chan_pcal_info     ee_pwr_cal_a[AR5K_EEPROM_N_5GHZ_CHAN]; 
    449         u_int16_t       ee_cal_piers_b; 
    450         struct ath5k_chan_pcal_info     ee_pwr_cal_b[AR5K_EEPROM_N_2GHZ_CHAN]; 
    451         u_int16_t       ee_cal_piers_g; 
    452         struct ath5k_chan_pcal_info     ee_pwr_cal_g[AR5K_EEPROM_N_2GHZ_CHAN]; 
    453         /* Per rate target power levels */ 
    454         u_int16_t       ee_rate_target_pwr_num_a; 
    455         struct ath5k_rate_pcal_info     ee_rate_tpwr_a[AR5K_EEPROM_N_5GHZ_CHAN]; 
    456         u_int16_t       ee_rate_target_pwr_num_b; 
    457         struct ath5k_rate_pcal_info     ee_rate_tpwr_b[AR5K_EEPROM_N_2GHZ_CHAN]; 
    458         u_int16_t       ee_rate_target_pwr_num_g; 
    459         struct ath5k_rate_pcal_info     ee_rate_tpwr_g[AR5K_EEPROM_N_2GHZ_CHAN]; 
    460  
    461         /* Conformance test limits (Unused) */ 
    462         u_int16_t       ee_ctls; 
    463         u_int16_t       ee_ctl[AR5K_EEPROM_MAX_CTLS]; 
    464  
    465         /* Noise Floor Calibration settings */ 
    466         int16_t         ee_noise_floor_thr[AR5K_EEPROM_N_MODES]; 
    467         int8_t          ee_adc_desired_size[AR5K_EEPROM_N_MODES]; 
    468         int8_t          ee_pga_desired_size[AR5K_EEPROM_N_MODES]; 
    469  
    470         u_int32_t       ee_antenna[AR5K_EEPROM_N_MODES][AR5K_ANT_MAX]; 
    471 }; 
    472245 
    473246/* 
     
    581354                AR5K_REG_WRITE(AR5K_PHY(0x20), 0x00010000); 
    582355 
    583         if (mac_revision == AR5K_SREV_MAC_AR5210) { 
     356        if (mac_revision == AR5K_SREV_AR5210) { 
    584357                srev = AR5K_REG_READ(AR5K_PHY(256) >> 28) & 0xf; 
    585358 
     
    720493        AR5K_EEPROM_READ(o++, val); 
    721494        ee->ee_switch_settling[mode]    = (val >> 8) & 0x7f; 
    722         ee->ee_ant_tx_rx[mode]                = (val >> 2) & 0x3f; 
     495        ee->ee_atn_tx_rx[mode]                = (val >> 2) & 0x3f; 
    723496        ee->ee_ant_control[mode][i]     = (val << 4) & 0x3f; 
    724497 
     
    776549        int ret; 
    777550 
     551        switch (mode){ 
     552        case AR5K_EEPROM_MODE_11A: 
     553                AR5K_EEPROM_READ(o++, val); 
     554                ee->ee_adc_desired_size[mode]   = (int8_t)((val >> 8) & 0xff); 
     555                ee->ee_ob[mode][3]              = (val >> 5) & 0x7; 
     556                ee->ee_db[mode][3]              = (val >> 2) & 0x7; 
     557                ee->ee_ob[mode][2]              = (val << 1) & 0x7; 
     558 
     559                AR5K_EEPROM_READ(o++, val); 
     560                ee->ee_ob[mode][2]              |= (val >> 15) & 0x1; 
     561                ee->ee_db[mode][2]              = (val >> 12) & 0x7; 
     562                ee->ee_ob[mode][1]              = (val >> 9) & 0x7; 
     563                ee->ee_db[mode][1]              = (val >> 6) & 0x7; 
     564                ee->ee_ob[mode][0]              = (val >> 3) & 0x7; 
     565                ee->ee_db[mode][0]              = val & 0x7; 
     566                break; 
     567        case AR5K_EEPROM_MODE_11B: 
     568                AR5K_EEPROM_READ(o++, val); 
     569                ee->ee_adc_desired_size[mode]   = (int8_t)((val >> 8) & 0xff); 
     570                ee->ee_ob[mode][1]              = (val >> 4) & 0x7; 
     571                ee->ee_db[mode][1]              = val & 0x7; 
     572                break; 
     573        case AR5K_EEPROM_MODE_11G: 
     574                AR5K_EEPROM_READ(o++, val); 
     575                ee->ee_adc_desired_size[mode]   = (signed short int)((val >> 8) & 0xff); 
     576                ee->ee_ob[mode][1]              = (val >> 4) & 0x7; 
     577                ee->ee_db[mode][1]              = val & 0x7; 
     578                break; 
     579        } 
     580 
    778581        AR5K_EEPROM_READ(o++, val); 
    779582        ee->ee_tx_end2xlna_enable[mode] = (val >> 8) & 0xff; 
     
    828631                ee->ee_i_gain[mode] |= (val << 3) & 0x38; 
    829632 
    830                 if (mode == AR5K_EEPROM_MODE_11G) 
     633                if (mode == AR5K_EEPROM_MODE_11G) { 
    831634                        ee->ee_cck_ofdm_power_delta = (val >> 3) & 0xff; 
     635 
     636                        if (ee->ee_version >= AR5K_EEPROM_VERSION_4_6) 
     637                                ee->ee_scaled_cck_delta = (val >> 11) & 0x1f; 
     638                } 
    832639        } 
    833640 
     
    838645        } 
    839646 
    840         if (ee->ee_version >= AR5K_EEPROM_VERSION_4_6 && 
    841             mode == AR5K_EEPROM_MODE_11G) 
    842                 ee->ee_scaled_cck_delta = (val >> 11) & 0x1f; 
     647        if (ee->ee_version >= AR5K_EEPROM_VERSION_4_0) { 
     648                switch (mode) { 
     649                case AR5K_EEPROM_MODE_11B: 
     650                        AR5K_EEPROM_READ(o++, val); 
     651 
     652                        ee->ee_cal_piers_b = 0; 
     653 
     654                        ee->ee_pwr_cal_b[0].freq = 
     655                                ath5k_eeprom_bin2freq(ee, val & 0xff, mode); 
     656                        if (ee->ee_pwr_cal_b[0].freq != AR5K_EEPROM_CHANNEL_DIS) 
     657                                ee->ee_cal_piers_b++; 
     658 
     659                        ee->ee_pwr_cal_b[1].freq = 
     660                                ath5k_eeprom_bin2freq(ee, (val >> 8) & 0xff, mode); 
     661                        if (ee->ee_pwr_cal_b[1].freq != AR5K_EEPROM_CHANNEL_DIS) 
     662                                ee->ee_cal_piers_b++; 
     663 
     664                        AR5K_EEPROM_READ(o++, val); 
     665                        ee->ee_pwr_cal_b[2].freq = 
     666                                ath5k_eeprom_bin2freq(ee, val & 0xff, mode); 
     667                        if (ee->ee_pwr_cal_b[2].freq != AR5K_EEPROM_CHANNEL_DIS) 
     668                                ee->ee_cal_piers_b++; 
     669                        break; 
     670                case AR5K_EEPROM_MODE_11G: 
     671                        AR5K_EEPROM_READ(o++, val); 
     672 
     673                        ee->ee_cal_piers_g = 0; 
     674 
     675                        ee->ee_pwr_cal_g[0].freq = 
     676                                ath5k_eeprom_bin2freq(ee, val & 0xff, mode); 
     677                        if (ee->ee_pwr_cal_g[0].freq != AR5K_EEPROM_CHANNEL_DIS) 
     678                                ee->ee_cal_piers_g++; 
     679 
     680                        ee->ee_pwr_cal_g[1].freq = 
     681                                ath5k_eeprom_bin2freq(ee, (val >> 8) & 0xff, mode); 
     682                        if (ee->ee_pwr_cal_g[1].freq != AR5K_EEPROM_CHANNEL_DIS) 
     683                                ee->ee_cal_piers_g++; 
     684 
     685                        AR5K_EEPROM_READ(o++, val); 
     686                        ee->ee_turbo_max_power[mode] = val & 0x7f; 
     687                        ee->ee_xr_power[mode] = (val >> 7) & 0x3f; 
     688 
     689                        AR5K_EEPROM_READ(o++, val); 
     690                        ee->ee_pwr_cal_g[2].freq = 
     691                                ath5k_eeprom_bin2freq(ee, val & 0xff, mode); 
     692                        if (ee->ee_pwr_cal_g[2].freq != AR5K_EEPROM_CHANNEL_DIS) 
     693                                ee->ee_cal_piers_g++; 
     694                        break; 
     695                } 
     696        } 
     697 
     698        if (ee->ee_version >= AR5K_EEPROM_VERSION_4_1) { 
     699                switch (mode) { 
     700                case AR5K_EEPROM_MODE_11A: 
     701                        AR5K_EEPROM_READ(o++, val); 
     702                        ee->ee_margin_tx_rx[mode] = val & 0x3f; 
     703                        break; 
     704                case AR5K_EEPROM_MODE_11B: 
     705                case AR5K_EEPROM_MODE_11G: 
     706                        ee->ee_margin_tx_rx[mode] = (val >> 8) & 0x3f; 
     707                        break; 
     708                } 
     709        } 
     710 
     711        if (ee->ee_version >= AR5K_EEPROM_VERSION_4_0 && 
     712            mode == AR5K_EEPROM_MODE_11G) { 
     713                AR5K_EEPROM_READ(o++, val); 
     714                ee->ee_i_cal[mode] = (val >> 8) & 0x3f; 
     715                ee->ee_q_cal[mode] = (val >> 3) & 0x1f; 
     716 
     717                if (ee->ee_version >= AR5K_EEPROM_VERSION_4_2) { 
     718                        AR5K_EEPROM_READ(o++, val); 
     719                        ee->ee_cck_ofdm_gain_delta = val & 0xff; 
     720                } 
     721        } 
     722 
     723        /* return new offset */ 
     724        *offset = o; 
     725 
     726        return 0; 
     727
     728 
     729/* 
     730 * Read turbo mode information on newer EEPROM versions 
     731 */ 
     732static int ath5k_eeprom_read_turbo_modes(struct ath5k_eeprom_info *ee, 
     733                                   u_int32_t *offset, unsigned int mode) 
     734
     735        u_int32_t o = *offset; 
     736        u_int16_t val; 
     737        int ret; 
     738 
     739        if (ee->ee_version < AR5K_EEPROM_VERSION_5_0) 
     740                return 0; 
     741 
     742        switch (mode){ 
     743        case AR5K_EEPROM_MODE_11A: 
     744                ee->ee_switch_settling_turbo[mode] = (val >> 6) & 0x7f; 
     745 
     746                ee->ee_atn_tx_rx_turbo[mode] = (val >> 13) & 0x7; 
     747                AR5K_EEPROM_READ(o++, val); 
     748                ee->ee_atn_tx_rx_turbo[mode] |= (val & 0x7) << 3; 
     749                ee->ee_margin_tx_rx_turbo[mode] = (val >> 3) & 0x3f; 
     750 
     751                ee->ee_adc_desired_size_turbo[mode] = (val >> 9) & 0x7f; 
     752                AR5K_EEPROM_READ(o++, val); 
     753                ee->ee_adc_desired_size_turbo[mode] |= (val & 0x1) << 7; 
     754                ee->ee_pga_desired_size_turbo[mode] = (val >> 1) & 0xff; 
     755 
     756                if (AR5K_EEPROM_EEMAP(ee->ee_misc0) >=2) 
     757                        ee->ee_pd_gain_overlap = (val >> 9) & 0xf; 
     758                break; 
     759        case AR5K_EEPROM_MODE_11G: 
     760                ee->ee_switch_settling_turbo[mode] = (val >> 8) & 0x7f; 
     761 
     762                ee->ee_atn_tx_rx_turbo[mode] = (val >> 15) & 0x7; 
     763                AR5K_EEPROM_READ(o++, val); 
     764                ee->ee_atn_tx_rx_turbo[mode] |= (val & 0x1f) << 1; 
     765                ee->ee_margin_tx_rx_turbo[mode] = (val >> 5) & 0x3f; 
     766 
     767                ee->ee_adc_desired_size_turbo[mode] = (val >> 11) & 0x7f; 
     768                AR5K_EEPROM_READ(o++, val); 
     769                ee->ee_adc_desired_size_turbo[mode] |= (val & 0x7) << 5; 
     770                ee->ee_pga_desired_size_turbo[mode] = (val >> 3) & 0xff; 
     771                break; 
     772        } 
    843773 
    844774        /* return new offset */ 
     
    864794 * interpolate (in order to create the table for any channel). 
    865795 */ 
    866 static int ath5k_eeprom_read_pcal_info(struct ath5k_eeprom_info *ee, 
    867                                        u_int32_t *offset, unsigned int mode) 
    868 
    869         u_int32_t o = *offset; 
     796#if 0 
     797static int ath5k_eeprom_read_RF5112_pcal_info(struct ath5k_eeprom_info *ee, 
     798                                                        unsigned int mode) 
     799
     800        u_int32_t offset; 
    870801        unsigned int i, c; 
    871802        int ret; 
    872803        u_int16_t val; 
    873         struct ath5k_chan_pcal_info *chan_pcal_info; 
     804        struct ath5k_chan_pcal_info_rf5112 *chan_pcal_info; 
    874805        u_int16_t cal_piers; 
    875806 
    876807        switch (mode) { 
    877808        case AR5K_EEPROM_MODE_11A: 
     809                /* 
     810                 * Read 5GHz EEPROM channels 
     811                 */ 
     812                offset = AR5K_EEPROM_GROUPS_START(ee->ee_version); 
     813                ee->ee_cal_piers_a = 0; 
     814                for (i = 0; i < AR5K_EEPROM_N_5GHZ_CHAN; i++) { 
     815                        AR5K_EEPROM_READ(offset++, val); 
     816 
     817                        if ((val & 0xff) == 0) 
     818                                break; 
     819 
     820                        ee->ee_pwr_cal_a[i].freq = 
     821                                ath5k_eeprom_bin2freq(ee, val & 0xff, 
     822                                                AR5K_EEPROM_MODE_11A); 
     823                        ee->ee_cal_piers_a++; 
     824 
     825                        if (((val >> 8) & 0xff) == 0) 
     826                                break; 
     827 
     828                        ee->ee_pwr_cal_a[++i].freq = 
     829                                ath5k_eeprom_bin2freq(ee, (val >> 8) & 0xff, 
     830                                                        AR5K_EEPROM_MODE_11A); 
     831                        ee->ee_cal_piers_a++; 
     832 
     833                } 
     834                offset = AR5K_EEPROM_GROUPS_START(ee->ee_version) + 
     835                                                AR5K_EEPROM_GROUP2_OFFSET; 
    878836                chan_pcal_info = ee->ee_pwr_cal_a; 
    879837                cal_piers = ee->ee_cal_piers_a; 
    880838                break; 
    881839        case AR5K_EEPROM_MODE_11B: 
     840                offset = AR5K_EEPROM_GROUPS_START(ee->ee_version) + 
     841                                                AR5K_EEPROM_GROUP3_OFFSET; 
    882842                chan_pcal_info = ee->ee_pwr_cal_b; 
    883843                cal_piers = ee->ee_cal_piers_b; 
    884844                break; 
    885845        case AR5K_EEPROM_MODE_11G: 
     846                offset = AR5K_EEPROM_GROUPS_START(ee->ee_version) + 
     847                                                AR5K_EEPROM_GROUP4_OFFSET; 
    886848                chan_pcal_info = ee->ee_pwr_cal_g; 
    887849                cal_piers = ee->ee_cal_piers_g; 
     
    892854 
    893855        for (i = 0; i < cal_piers; i++) { 
    894                 /* Power values in dBm * 4 */ 
     856                /* Power values in dBm * 4  
     857                 * for the lower xpd gain curve 
     858                 * (0 dBm -> higher output power) */ 
    895859                for (c = 0; c < AR5K_EEPROM_N_XPD0_POINTS; c++) { 
    896                         AR5K_EEPROM_READ(o++, val); 
     860                        AR5K_EEPROM_READ(offset++, val); 
    897861                        chan_pcal_info[i].pwr_x0[c] = (val & 0xff); 
    898862                        chan_pcal_info[i].pwr_x0[++c] = ((val >> 8) & 0xff); 
    899863                } 
    900864 
    901                 /* PCDAC steps (dBm * 2) */ 
    902                 AR5K_EEPROM_READ(o++, val); 
     865                /* PCDAC steps 
     866                 * corresponding to the above power 
     867                 * measurements */ 
     868                AR5K_EEPROM_READ(offset++, val); 
    903869                chan_pcal_info[i].pcdac_x0[1] = (val & 0x1f); 
    904870                chan_pcal_info[i].pcdac_x0[2] = ((val >> 5) & 0x1f); 
    905871                chan_pcal_info[i].pcdac_x0[3] = ((val >> 10) & 0x1f); 
    906872 
    907                 /* No idea what these power levels are for (4 xpds ?) 
    908                    I got zeroes on my card and the EEPROM info 
    909                    dumps we found on the net also have weird values */ 
    910                 AR5K_EEPROM_READ(o++, val); 
     873                /* Power values in dBm * 4 
     874                 * for the higher xpd gain curve 
     875                 * (18 dBm -> lower output power) */ 
     876                AR5K_EEPROM_READ(offset++, val); 
    911877                chan_pcal_info[i].pwr_x3[0] = (val & 0xff); 
    912878                chan_pcal_info[i].pwr_x3[1] = ((val >> 8) & 0xff); 
    913879 
    914                 AR5K_EEPROM_READ(o++, val); 
     880                AR5K_EEPROM_READ(offset++, val); 
    915881                chan_pcal_info[i].pwr_x3[2] = (val & 0xff); 
    916                 /* It's weird but they put it here, that's the 
    917                    PCDAC starting step */ 
    918                 chan_pcal_info[i].pcdac_x0[0] = ((val >> 8) & 0xff); 
    919  
    920                 /* Static values seen on EEPROM info dumps */ 
     882 
     883                /* PCDAC steps 
     884                 * corresponding to the above power 
     885                 * measurements (static) */ 
    921886                chan_pcal_info[i].pcdac_x3[0] = 20; 
    922887                chan_pcal_info[i].pcdac_x3[1] = 35; 
    923888                chan_pcal_info[i].pcdac_x3[2] = 63; 
    924889 
    925                 /* Last xpd0 power level is also channel maximum */ 
    926                 chan_pcal_info[i].max_pwr = chan_pcal_info[i].pwr_x0[3]; 
     890                if (ee->ee_version >= AR5K_EEPROM_VERSION_4_3) { 
     891                        chan_pcal_info[i].pcdac_x0[0] = ((val >> 8) & 0xff); 
     892 
     893                        /* Last xpd0 power level is also channel maximum */ 
     894                        chan_pcal_info[i].max_pwr = chan_pcal_info[i].pwr_x0[3]; 
     895                } else { 
     896                        chan_pcal_info[i].pcdac_x0[0] = 1; 
     897                        chan_pcal_info[i].max_pwr = ((val >> 8) & 0xff); 
     898                } 
    927899 
    928900                /* Recreate pcdac_x0 table for this channel using pcdac steps */ 
     
    932904        } 
    933905 
    934         /* return new offset */ 
    935         (*offset) = o; 
     906        return 0; 
     907
     908#endif 
     909static int ath5k_eeprom_read_pcal_info(struct ath5k_eeprom_info *ee, 
     910                                                        unsigned int mode) 
     911
     912        u_int32_t offset, start_offset; 
     913        unsigned int i, c; 
     914        int ret; 
     915        u_int16_t val; 
     916        struct ath5k_chan_pcal_info_rf2413 *chan_pcal_info; 
     917        u_int16_t cal_piers; 
     918        u_int8_t pd_gains = 0; 
     919 
     920        if (ee->ee_x_gain[mode] & 0x1) pd_gains++; 
     921        if ((ee->ee_x_gain[mode] >> 1) & 0x1) pd_gains++; 
     922        if ((ee->ee_x_gain[mode] >> 2) & 0x1) pd_gains++; 
     923        if ((ee->ee_x_gain[mode] >> 3) & 0x1) pd_gains++; 
     924 
     925        switch (mode) { 
     926        case AR5K_EEPROM_MODE_11A: 
     927                start_offset = AR5K_EEPROM_CAL_DATA_START(ee->ee_misc4); 
     928                offset = start_offset; 
     929                ee->ee_cal_piers_a = 0; 
     930 
     931                if (!AR5K_EEPROM_HDR_11A(ee->ee_header)) 
     932                        return 0; 
     933 
     934                for (i = 0; i < AR5K_EEPROM_N_5GHZ_CHAN; i++) { 
     935                        AR5K_EEPROM_READ(offset++, val); 
     936 
     937                        if ((val & 0xff) == 0) 
     938                                break; 
     939 
     940                        ee->ee_pwr_cal_a[i].freq = 
     941                                ath5k_eeprom_bin2freq(ee, val & 0xff, 
     942                                                AR5K_EEPROM_MODE_11A); 
     943                        ee->ee_cal_piers_a++; 
     944 
     945                        if (((val >> 8) & 0xff) == 0) 
     946                                break; 
     947 
     948                        ee->ee_pwr_cal_a[++i].freq = 
     949                                ath5k_eeprom_bin2freq(ee, (val >> 8) & 0xff, 
     950                                                        AR5K_EEPROM_MODE_11A); 
     951                        ee->ee_cal_piers_a++; 
     952 
     953                } 
     954                offset = start_offset + (AR5K_EEPROM_N_5GHZ_CHAN / 2); 
     955                chan_pcal_info = ee->ee_pwr_cal_a; 
     956                cal_piers = ee->ee_cal_piers_a; 
     957                break; 
     958        case AR5K_EEPROM_MODE_11B: 
     959                start_offset = AR5K_EEPROM_CAL_DATA_START(ee->ee_misc4); 
     960 
     961                if (AR5K_EEPROM_HDR_11A(ee->ee_header)) 
     962                        start_offset += (ee->ee_cal_piers_a * (3 * ee->ee_pwr_cal_a[0].pd_gains) + 
     963                                                (ee->ee_pwr_cal_a[0].pd_gains == 1 ? 1 : 0)) + 5; 
     964 
     965                offset = start_offset; 
     966                ee->ee_cal_piers_b = 0; 
     967 
     968                if (!AR5K_EEPROM_HDR_11B(ee->ee_header)) 
     969                        return 0; 
     970 
     971                for (i = 0; i < AR5K_EEPROM_N_2GHZ_CHAN_2413; i++) { 
     972                        AR5K_EEPROM_READ(offset++, val); 
     973 
     974                        if ((val & 0xff) == 0) 
     975                                break; 
     976 
     977                        ee->ee_pwr_cal_b[i].freq = 
     978                                ath5k_eeprom_bin2freq(ee, val & 0xff, 
     979                                                AR5K_EEPROM_MODE_11B); 
     980                        ee->ee_cal_piers_b++; 
     981 
     982                        if (((val >> 8) & 0xff) == 0) 
     983                                break; 
     984 
     985                        ee->ee_pwr_cal_b[++i].freq = 
     986                                ath5k_eeprom_bin2freq(ee, (val >> 8) & 0xff, 
     987                                                        AR5K_EEPROM_MODE_11B); 
     988                        ee->ee_cal_piers_b++; 
     989 
     990                } 
     991                offset = start_offset + (AR5K_EEPROM_N_2GHZ_CHAN_2413 / 2); 
     992                chan_pcal_info = ee->ee_pwr_cal_b; 
     993                cal_piers = ee->ee_cal_piers_b; 
     994                break; 
     995        case AR5K_EEPROM_MODE_11G: 
     996                start_offset = AR5K_EEPROM_CAL_DATA_START(ee->ee_misc4); 
     997