| 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 |
|---|
| 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 }, |
|---|
| 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 }, |
|---|
| 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 | | /* |
|---|
| 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 | | }; |
|---|
| | 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 | |
|---|
| 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 | */ |
|---|
| | 732 | static 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 | } |
|---|
| 934 | | /* return new offset */ |
|---|
| 935 | | (*offset) = o; |
|---|
| | 906 | return 0; |
|---|
| | 907 | } |
|---|
| | 908 | #endif |
|---|
| | 909 | static 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 | |
|---|
| |
|---|