1 /* 2 * Copyright (c) 2008-2011 Atheros Communications Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include "hw.h" 18 #include "ar9003_mac.h" 19 #include "ar9003_2p2_initvals.h" 20 #include "ar9485_initvals.h" 21 #include "ar9340_initvals.h" 22 #include "ar9330_1p1_initvals.h" 23 #include "ar9330_1p2_initvals.h" 24 #include "ar955x_1p0_initvals.h" 25 #include "ar9580_1p0_initvals.h" 26 #include "ar9462_2p0_initvals.h" 27 #include "ar9565_1p0_initvals.h" 28 29 /* General hardware code for the AR9003 hadware family */ 30 31 /* 32 * The AR9003 family uses a new INI format (pre, core, post 33 * arrays per subsystem). This provides support for the 34 * AR9003 2.2 chipsets. 35 */ 36 static void ar9003_hw_init_mode_regs(struct ath_hw *ah) 37 { 38 if (AR_SREV_9330_11(ah)) { 39 /* mac */ 40 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 41 ar9331_1p1_mac_core); 42 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 43 ar9331_1p1_mac_postamble); 44 45 /* bb */ 46 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 47 ar9331_1p1_baseband_core); 48 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 49 ar9331_1p1_baseband_postamble); 50 51 /* radio */ 52 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 53 ar9331_1p1_radio_core); 54 55 /* soc */ 56 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 57 ar9331_1p1_soc_preamble); 58 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 59 ar9331_1p1_soc_postamble); 60 61 /* rx/tx gain */ 62 INIT_INI_ARRAY(&ah->iniModesRxGain, 63 ar9331_common_rx_gain_1p1); 64 INIT_INI_ARRAY(&ah->iniModesTxGain, 65 ar9331_modes_lowest_ob_db_tx_gain_1p1); 66 67 /* Japan 2484 Mhz CCK */ 68 INIT_INI_ARRAY(&ah->iniCckfirJapan2484, 69 ar9331_1p1_baseband_core_txfir_coeff_japan_2484); 70 71 /* additional clock settings */ 72 if (ah->is_clk_25mhz) 73 INIT_INI_ARRAY(&ah->iniAdditional, 74 ar9331_1p1_xtal_25M); 75 else 76 INIT_INI_ARRAY(&ah->iniAdditional, 77 ar9331_1p1_xtal_40M); 78 } else if (AR_SREV_9330_12(ah)) { 79 /* mac */ 80 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 81 ar9331_1p2_mac_core); 82 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 83 ar9331_1p2_mac_postamble); 84 85 /* bb */ 86 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 87 ar9331_1p2_baseband_core); 88 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 89 ar9331_1p2_baseband_postamble); 90 91 /* radio */ 92 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 93 ar9331_1p2_radio_core); 94 95 /* soc */ 96 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 97 ar9331_1p2_soc_preamble); 98 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 99 ar9331_1p2_soc_postamble); 100 101 /* rx/tx gain */ 102 INIT_INI_ARRAY(&ah->iniModesRxGain, 103 ar9331_common_rx_gain_1p2); 104 INIT_INI_ARRAY(&ah->iniModesTxGain, 105 ar9331_modes_lowest_ob_db_tx_gain_1p2); 106 107 /* Japan 2484 Mhz CCK */ 108 INIT_INI_ARRAY(&ah->iniCckfirJapan2484, 109 ar9331_1p2_baseband_core_txfir_coeff_japan_2484); 110 111 /* additional clock settings */ 112 if (ah->is_clk_25mhz) 113 INIT_INI_ARRAY(&ah->iniAdditional, 114 ar9331_1p2_xtal_25M); 115 else 116 INIT_INI_ARRAY(&ah->iniAdditional, 117 ar9331_1p2_xtal_40M); 118 } else if (AR_SREV_9340(ah)) { 119 /* mac */ 120 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 121 ar9340_1p0_mac_core); 122 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 123 ar9340_1p0_mac_postamble); 124 125 /* bb */ 126 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 127 ar9340_1p0_baseband_core); 128 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 129 ar9340_1p0_baseband_postamble); 130 131 /* radio */ 132 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 133 ar9340_1p0_radio_core); 134 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 135 ar9340_1p0_radio_postamble); 136 137 /* soc */ 138 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 139 ar9340_1p0_soc_preamble); 140 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 141 ar9340_1p0_soc_postamble); 142 143 /* rx/tx gain */ 144 INIT_INI_ARRAY(&ah->iniModesRxGain, 145 ar9340Common_wo_xlna_rx_gain_table_1p0); 146 INIT_INI_ARRAY(&ah->iniModesTxGain, 147 ar9340Modes_high_ob_db_tx_gain_table_1p0); 148 149 INIT_INI_ARRAY(&ah->iniModesFastClock, 150 ar9340Modes_fast_clock_1p0); 151 152 if (!ah->is_clk_25mhz) 153 INIT_INI_ARRAY(&ah->iniAdditional, 154 ar9340_1p0_radio_core_40M); 155 } else if (AR_SREV_9485_11(ah)) { 156 /* mac */ 157 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 158 ar9485_1_1_mac_core); 159 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 160 ar9485_1_1_mac_postamble); 161 162 /* bb */ 163 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], ar9485_1_1); 164 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 165 ar9485_1_1_baseband_core); 166 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 167 ar9485_1_1_baseband_postamble); 168 169 /* radio */ 170 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 171 ar9485_1_1_radio_core); 172 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 173 ar9485_1_1_radio_postamble); 174 175 /* soc */ 176 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 177 ar9485_1_1_soc_preamble); 178 179 /* rx/tx gain */ 180 INIT_INI_ARRAY(&ah->iniModesRxGain, 181 ar9485Common_wo_xlna_rx_gain_1_1); 182 INIT_INI_ARRAY(&ah->iniModesTxGain, 183 ar9485_modes_lowest_ob_db_tx_gain_1_1); 184 185 /* Japan 2484 Mhz CCK */ 186 INIT_INI_ARRAY(&ah->iniCckfirJapan2484, 187 ar9485_1_1_baseband_core_txfir_coeff_japan_2484); 188 189 /* Load PCIE SERDES settings from INI */ 190 191 /* Awake Setting */ 192 193 INIT_INI_ARRAY(&ah->iniPcieSerdes, 194 ar9485_1_1_pcie_phy_clkreq_disable_L1); 195 196 /* Sleep Setting */ 197 198 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 199 ar9485_1_1_pcie_phy_clkreq_disable_L1); 200 } else if (AR_SREV_9462_20(ah)) { 201 202 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core); 203 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 204 ar9462_2p0_mac_postamble); 205 206 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 207 ar9462_2p0_baseband_core); 208 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 209 ar9462_2p0_baseband_postamble); 210 211 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 212 ar9462_2p0_radio_core); 213 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 214 ar9462_2p0_radio_postamble); 215 INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant, 216 ar9462_2p0_radio_postamble_sys2ant); 217 218 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 219 ar9462_2p0_soc_preamble); 220 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 221 ar9462_2p0_soc_postamble); 222 223 INIT_INI_ARRAY(&ah->iniModesRxGain, 224 ar9462_common_rx_gain_table_2p0); 225 226 /* Awake -> Sleep Setting */ 227 INIT_INI_ARRAY(&ah->iniPcieSerdes, 228 ar9462_pciephy_clkreq_disable_L1_2p0); 229 /* Sleep -> Awake Setting */ 230 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 231 ar9462_pciephy_clkreq_disable_L1_2p0); 232 233 /* Fast clock modal settings */ 234 INIT_INI_ARRAY(&ah->iniModesFastClock, 235 ar9462_modes_fast_clock_2p0); 236 237 INIT_INI_ARRAY(&ah->iniCckfirJapan2484, 238 ar9462_2p0_baseband_core_txfir_coeff_japan_2484); 239 } else if (AR_SREV_9550(ah)) { 240 /* mac */ 241 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 242 ar955x_1p0_mac_core); 243 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 244 ar955x_1p0_mac_postamble); 245 246 /* bb */ 247 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 248 ar955x_1p0_baseband_core); 249 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 250 ar955x_1p0_baseband_postamble); 251 252 /* radio */ 253 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 254 ar955x_1p0_radio_core); 255 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 256 ar955x_1p0_radio_postamble); 257 258 /* soc */ 259 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 260 ar955x_1p0_soc_preamble); 261 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 262 ar955x_1p0_soc_postamble); 263 264 /* rx/tx gain */ 265 INIT_INI_ARRAY(&ah->iniModesRxGain, 266 ar955x_1p0_common_wo_xlna_rx_gain_table); 267 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds, 268 ar955x_1p0_common_wo_xlna_rx_gain_bounds); 269 INIT_INI_ARRAY(&ah->iniModesTxGain, 270 ar955x_1p0_modes_xpa_tx_gain_table); 271 272 /* Fast clock modal settings */ 273 INIT_INI_ARRAY(&ah->iniModesFastClock, 274 ar955x_1p0_modes_fast_clock); 275 } else if (AR_SREV_9580(ah)) { 276 /* mac */ 277 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 278 ar9580_1p0_mac_core); 279 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 280 ar9580_1p0_mac_postamble); 281 282 /* bb */ 283 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 284 ar9580_1p0_baseband_core); 285 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 286 ar9580_1p0_baseband_postamble); 287 288 /* radio */ 289 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 290 ar9580_1p0_radio_core); 291 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 292 ar9580_1p0_radio_postamble); 293 294 /* soc */ 295 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 296 ar9580_1p0_soc_preamble); 297 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 298 ar9580_1p0_soc_postamble); 299 300 /* rx/tx gain */ 301 INIT_INI_ARRAY(&ah->iniModesRxGain, 302 ar9580_1p0_rx_gain_table); 303 INIT_INI_ARRAY(&ah->iniModesTxGain, 304 ar9580_1p0_low_ob_db_tx_gain_table); 305 306 INIT_INI_ARRAY(&ah->iniModesFastClock, 307 ar9580_1p0_modes_fast_clock); 308 } else if (AR_SREV_9565(ah)) { 309 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 310 ar9565_1p0_mac_core); 311 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 312 ar9565_1p0_mac_postamble); 313 314 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 315 ar9565_1p0_baseband_core); 316 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 317 ar9565_1p0_baseband_postamble); 318 319 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 320 ar9565_1p0_radio_core); 321 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 322 ar9565_1p0_radio_postamble); 323 324 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 325 ar9565_1p0_soc_preamble); 326 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 327 ar9565_1p0_soc_postamble); 328 329 INIT_INI_ARRAY(&ah->iniModesRxGain, 330 ar9565_1p0_Common_rx_gain_table); 331 INIT_INI_ARRAY(&ah->iniModesTxGain, 332 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table); 333 334 INIT_INI_ARRAY(&ah->iniPcieSerdes, 335 ar9565_1p0_pciephy_clkreq_disable_L1); 336 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 337 ar9565_1p0_pciephy_clkreq_disable_L1); 338 339 INIT_INI_ARRAY(&ah->iniModesFastClock, 340 ar9565_1p0_modes_fast_clock); 341 } else { 342 /* mac */ 343 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 344 ar9300_2p2_mac_core); 345 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], 346 ar9300_2p2_mac_postamble); 347 348 /* bb */ 349 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], 350 ar9300_2p2_baseband_core); 351 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], 352 ar9300_2p2_baseband_postamble); 353 354 /* radio */ 355 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], 356 ar9300_2p2_radio_core); 357 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], 358 ar9300_2p2_radio_postamble); 359 360 /* soc */ 361 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], 362 ar9300_2p2_soc_preamble); 363 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], 364 ar9300_2p2_soc_postamble); 365 366 /* rx/tx gain */ 367 INIT_INI_ARRAY(&ah->iniModesRxGain, 368 ar9300Common_rx_gain_table_2p2); 369 INIT_INI_ARRAY(&ah->iniModesTxGain, 370 ar9300Modes_lowest_ob_db_tx_gain_table_2p2); 371 372 /* Load PCIE SERDES settings from INI */ 373 374 /* Awake Setting */ 375 376 INIT_INI_ARRAY(&ah->iniPcieSerdes, 377 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2); 378 379 /* Sleep Setting */ 380 381 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 382 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2); 383 384 /* Fast clock modal settings */ 385 INIT_INI_ARRAY(&ah->iniModesFastClock, 386 ar9300Modes_fast_clock_2p2); 387 } 388 } 389 390 static void ar9003_tx_gain_table_mode0(struct ath_hw *ah) 391 { 392 if (AR_SREV_9330_12(ah)) 393 INIT_INI_ARRAY(&ah->iniModesTxGain, 394 ar9331_modes_lowest_ob_db_tx_gain_1p2); 395 else if (AR_SREV_9330_11(ah)) 396 INIT_INI_ARRAY(&ah->iniModesTxGain, 397 ar9331_modes_lowest_ob_db_tx_gain_1p1); 398 else if (AR_SREV_9340(ah)) 399 INIT_INI_ARRAY(&ah->iniModesTxGain, 400 ar9340Modes_lowest_ob_db_tx_gain_table_1p0); 401 else if (AR_SREV_9485_11(ah)) 402 INIT_INI_ARRAY(&ah->iniModesTxGain, 403 ar9485_modes_lowest_ob_db_tx_gain_1_1); 404 else if (AR_SREV_9550(ah)) 405 INIT_INI_ARRAY(&ah->iniModesTxGain, 406 ar955x_1p0_modes_xpa_tx_gain_table); 407 else if (AR_SREV_9580(ah)) 408 INIT_INI_ARRAY(&ah->iniModesTxGain, 409 ar9580_1p0_lowest_ob_db_tx_gain_table); 410 else if (AR_SREV_9462_20(ah)) 411 INIT_INI_ARRAY(&ah->iniModesTxGain, 412 ar9462_modes_low_ob_db_tx_gain_table_2p0); 413 else if (AR_SREV_9565(ah)) 414 INIT_INI_ARRAY(&ah->iniModesTxGain, 415 ar9565_1p0_modes_low_ob_db_tx_gain_table); 416 else 417 INIT_INI_ARRAY(&ah->iniModesTxGain, 418 ar9300Modes_lowest_ob_db_tx_gain_table_2p2); 419 } 420 421 static void ar9003_tx_gain_table_mode1(struct ath_hw *ah) 422 { 423 if (AR_SREV_9330_12(ah)) 424 INIT_INI_ARRAY(&ah->iniModesTxGain, 425 ar9331_modes_high_ob_db_tx_gain_1p2); 426 else if (AR_SREV_9330_11(ah)) 427 INIT_INI_ARRAY(&ah->iniModesTxGain, 428 ar9331_modes_high_ob_db_tx_gain_1p1); 429 else if (AR_SREV_9340(ah)) 430 INIT_INI_ARRAY(&ah->iniModesTxGain, 431 ar9340Modes_high_ob_db_tx_gain_table_1p0); 432 else if (AR_SREV_9485_11(ah)) 433 INIT_INI_ARRAY(&ah->iniModesTxGain, 434 ar9485Modes_high_ob_db_tx_gain_1_1); 435 else if (AR_SREV_9580(ah)) 436 INIT_INI_ARRAY(&ah->iniModesTxGain, 437 ar9580_1p0_high_ob_db_tx_gain_table); 438 else if (AR_SREV_9550(ah)) 439 INIT_INI_ARRAY(&ah->iniModesTxGain, 440 ar955x_1p0_modes_no_xpa_tx_gain_table); 441 else if (AR_SREV_9462_20(ah)) 442 INIT_INI_ARRAY(&ah->iniModesTxGain, 443 ar9462_modes_high_ob_db_tx_gain_table_2p0); 444 else if (AR_SREV_9565(ah)) 445 INIT_INI_ARRAY(&ah->iniModesTxGain, 446 ar9565_1p0_modes_high_ob_db_tx_gain_table); 447 else 448 INIT_INI_ARRAY(&ah->iniModesTxGain, 449 ar9300Modes_high_ob_db_tx_gain_table_2p2); 450 } 451 452 static void ar9003_tx_gain_table_mode2(struct ath_hw *ah) 453 { 454 if (AR_SREV_9330_12(ah)) 455 INIT_INI_ARRAY(&ah->iniModesTxGain, 456 ar9331_modes_low_ob_db_tx_gain_1p2); 457 else if (AR_SREV_9330_11(ah)) 458 INIT_INI_ARRAY(&ah->iniModesTxGain, 459 ar9331_modes_low_ob_db_tx_gain_1p1); 460 else if (AR_SREV_9340(ah)) 461 INIT_INI_ARRAY(&ah->iniModesTxGain, 462 ar9340Modes_low_ob_db_tx_gain_table_1p0); 463 else if (AR_SREV_9485_11(ah)) 464 INIT_INI_ARRAY(&ah->iniModesTxGain, 465 ar9485Modes_low_ob_db_tx_gain_1_1); 466 else if (AR_SREV_9580(ah)) 467 INIT_INI_ARRAY(&ah->iniModesTxGain, 468 ar9580_1p0_low_ob_db_tx_gain_table); 469 else if (AR_SREV_9565(ah)) 470 INIT_INI_ARRAY(&ah->iniModesTxGain, 471 ar9565_1p0_modes_low_ob_db_tx_gain_table); 472 else 473 INIT_INI_ARRAY(&ah->iniModesTxGain, 474 ar9300Modes_low_ob_db_tx_gain_table_2p2); 475 } 476 477 static void ar9003_tx_gain_table_mode3(struct ath_hw *ah) 478 { 479 if (AR_SREV_9330_12(ah)) 480 INIT_INI_ARRAY(&ah->iniModesTxGain, 481 ar9331_modes_high_power_tx_gain_1p2); 482 else if (AR_SREV_9330_11(ah)) 483 INIT_INI_ARRAY(&ah->iniModesTxGain, 484 ar9331_modes_high_power_tx_gain_1p1); 485 else if (AR_SREV_9340(ah)) 486 INIT_INI_ARRAY(&ah->iniModesTxGain, 487 ar9340Modes_high_power_tx_gain_table_1p0); 488 else if (AR_SREV_9485_11(ah)) 489 INIT_INI_ARRAY(&ah->iniModesTxGain, 490 ar9485Modes_high_power_tx_gain_1_1); 491 else if (AR_SREV_9580(ah)) 492 INIT_INI_ARRAY(&ah->iniModesTxGain, 493 ar9580_1p0_high_power_tx_gain_table); 494 else if (AR_SREV_9565(ah)) 495 INIT_INI_ARRAY(&ah->iniModesTxGain, 496 ar9565_1p0_modes_high_power_tx_gain_table); 497 else 498 INIT_INI_ARRAY(&ah->iniModesTxGain, 499 ar9300Modes_high_power_tx_gain_table_2p2); 500 } 501 502 static void ar9003_tx_gain_table_mode4(struct ath_hw *ah) 503 { 504 if (AR_SREV_9340(ah)) 505 INIT_INI_ARRAY(&ah->iniModesTxGain, 506 ar9340Modes_mixed_ob_db_tx_gain_table_1p0); 507 else if (AR_SREV_9580(ah)) 508 INIT_INI_ARRAY(&ah->iniModesTxGain, 509 ar9580_1p0_mixed_ob_db_tx_gain_table); 510 else 511 INIT_INI_ARRAY(&ah->iniModesTxGain, 512 ar9300Modes_mixed_ob_db_tx_gain_table_2p2); 513 } 514 515 static void ar9003_tx_gain_table_mode5(struct ath_hw *ah) 516 { 517 if (AR_SREV_9485_11(ah)) 518 INIT_INI_ARRAY(&ah->iniModesTxGain, 519 ar9485Modes_green_ob_db_tx_gain_1_1); 520 else if (AR_SREV_9340(ah)) 521 INIT_INI_ARRAY(&ah->iniModesTxGain, 522 ar9340Modes_ub124_tx_gain_table_1p0); 523 else if (AR_SREV_9580(ah)) 524 INIT_INI_ARRAY(&ah->iniModesTxGain, 525 ar9580_1p0_type5_tx_gain_table); 526 else if (AR_SREV_9300_22(ah)) 527 INIT_INI_ARRAY(&ah->iniModesTxGain, 528 ar9300Modes_type5_tx_gain_table_2p2); 529 } 530 531 static void ar9003_tx_gain_table_mode6(struct ath_hw *ah) 532 { 533 if (AR_SREV_9340(ah)) 534 INIT_INI_ARRAY(&ah->iniModesTxGain, 535 ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0); 536 else if (AR_SREV_9485_11(ah)) 537 INIT_INI_ARRAY(&ah->iniModesTxGain, 538 ar9485Modes_green_spur_ob_db_tx_gain_1_1); 539 else if (AR_SREV_9580(ah)) 540 INIT_INI_ARRAY(&ah->iniModesTxGain, 541 ar9580_1p0_type6_tx_gain_table); 542 } 543 544 typedef void (*ath_txgain_tab)(struct ath_hw *ah); 545 546 static void ar9003_tx_gain_table_apply(struct ath_hw *ah) 547 { 548 static const ath_txgain_tab modes[] = { 549 ar9003_tx_gain_table_mode0, 550 ar9003_tx_gain_table_mode1, 551 ar9003_tx_gain_table_mode2, 552 ar9003_tx_gain_table_mode3, 553 ar9003_tx_gain_table_mode4, 554 ar9003_tx_gain_table_mode5, 555 ar9003_tx_gain_table_mode6, 556 }; 557 int idx = ar9003_hw_get_tx_gain_idx(ah); 558 559 if (idx >= ARRAY_SIZE(modes)) 560 idx = 0; 561 562 modes[idx](ah); 563 } 564 565 static void ar9003_rx_gain_table_mode0(struct ath_hw *ah) 566 { 567 if (AR_SREV_9330_12(ah)) 568 INIT_INI_ARRAY(&ah->iniModesRxGain, 569 ar9331_common_rx_gain_1p2); 570 else if (AR_SREV_9330_11(ah)) 571 INIT_INI_ARRAY(&ah->iniModesRxGain, 572 ar9331_common_rx_gain_1p1); 573 else if (AR_SREV_9340(ah)) 574 INIT_INI_ARRAY(&ah->iniModesRxGain, 575 ar9340Common_rx_gain_table_1p0); 576 else if (AR_SREV_9485_11(ah)) 577 INIT_INI_ARRAY(&ah->iniModesRxGain, 578 ar9485_common_rx_gain_1_1); 579 else if (AR_SREV_9550(ah)) { 580 INIT_INI_ARRAY(&ah->iniModesRxGain, 581 ar955x_1p0_common_rx_gain_table); 582 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds, 583 ar955x_1p0_common_rx_gain_bounds); 584 } else if (AR_SREV_9580(ah)) 585 INIT_INI_ARRAY(&ah->iniModesRxGain, 586 ar9580_1p0_rx_gain_table); 587 else if (AR_SREV_9462_20(ah)) 588 INIT_INI_ARRAY(&ah->iniModesRxGain, 589 ar9462_common_rx_gain_table_2p0); 590 else 591 INIT_INI_ARRAY(&ah->iniModesRxGain, 592 ar9300Common_rx_gain_table_2p2); 593 } 594 595 static void ar9003_rx_gain_table_mode1(struct ath_hw *ah) 596 { 597 if (AR_SREV_9330_12(ah)) 598 INIT_INI_ARRAY(&ah->iniModesRxGain, 599 ar9331_common_wo_xlna_rx_gain_1p2); 600 else if (AR_SREV_9330_11(ah)) 601 INIT_INI_ARRAY(&ah->iniModesRxGain, 602 ar9331_common_wo_xlna_rx_gain_1p1); 603 else if (AR_SREV_9340(ah)) 604 INIT_INI_ARRAY(&ah->iniModesRxGain, 605 ar9340Common_wo_xlna_rx_gain_table_1p0); 606 else if (AR_SREV_9485_11(ah)) 607 INIT_INI_ARRAY(&ah->iniModesRxGain, 608 ar9485Common_wo_xlna_rx_gain_1_1); 609 else if (AR_SREV_9462_20(ah)) 610 INIT_INI_ARRAY(&ah->iniModesRxGain, 611 ar9462_common_wo_xlna_rx_gain_table_2p0); 612 else if (AR_SREV_9550(ah)) { 613 INIT_INI_ARRAY(&ah->iniModesRxGain, 614 ar955x_1p0_common_wo_xlna_rx_gain_table); 615 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds, 616 ar955x_1p0_common_wo_xlna_rx_gain_bounds); 617 } else if (AR_SREV_9580(ah)) 618 INIT_INI_ARRAY(&ah->iniModesRxGain, 619 ar9580_1p0_wo_xlna_rx_gain_table); 620 else if (AR_SREV_9565(ah)) 621 INIT_INI_ARRAY(&ah->iniModesRxGain, 622 ar9565_1p0_common_wo_xlna_rx_gain_table); 623 else 624 INIT_INI_ARRAY(&ah->iniModesRxGain, 625 ar9300Common_wo_xlna_rx_gain_table_2p2); 626 } 627 628 static void ar9003_rx_gain_table_mode2(struct ath_hw *ah) 629 { 630 if (AR_SREV_9462_20(ah)) 631 INIT_INI_ARRAY(&ah->iniModesRxGain, 632 ar9462_common_mixed_rx_gain_table_2p0); 633 } 634 635 static void ar9003_rx_gain_table_apply(struct ath_hw *ah) 636 { 637 switch (ar9003_hw_get_rx_gain_idx(ah)) { 638 case 0: 639 default: 640 ar9003_rx_gain_table_mode0(ah); 641 break; 642 case 1: 643 ar9003_rx_gain_table_mode1(ah); 644 break; 645 case 2: 646 ar9003_rx_gain_table_mode2(ah); 647 break; 648 } 649 } 650 651 /* set gain table pointers according to values read from the eeprom */ 652 static void ar9003_hw_init_mode_gain_regs(struct ath_hw *ah) 653 { 654 ar9003_tx_gain_table_apply(ah); 655 ar9003_rx_gain_table_apply(ah); 656 } 657 658 /* 659 * Helper for ASPM support. 660 * 661 * Disable PLL when in L0s as well as receiver clock when in L1. 662 * This power saving option must be enabled through the SerDes. 663 * 664 * Programming the SerDes must go through the same 288 bit serial shift 665 * register as the other analog registers. Hence the 9 writes. 666 */ 667 static void ar9003_hw_configpcipowersave(struct ath_hw *ah, 668 bool power_off) 669 { 670 /* Nothing to do on restore for 11N */ 671 if (!power_off /* !restore */) { 672 /* set bit 19 to allow forcing of pcie core into L1 state */ 673 REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); 674 675 /* Several PCIe massages to ensure proper behaviour */ 676 if (ah->config.pcie_waen) 677 REG_WRITE(ah, AR_WA, ah->config.pcie_waen); 678 else 679 REG_WRITE(ah, AR_WA, ah->WARegVal); 680 } 681 682 /* 683 * Configire PCIE after Ini init. SERDES values now come from ini file 684 * This enables PCIe low power mode. 685 */ 686 if (ah->config.pcieSerDesWrite) { 687 unsigned int i; 688 struct ar5416IniArray *array; 689 690 array = power_off ? &ah->iniPcieSerdes : 691 &ah->iniPcieSerdesLowPower; 692 693 for (i = 0; i < array->ia_rows; i++) { 694 REG_WRITE(ah, 695 INI_RA(array, i, 0), 696 INI_RA(array, i, 1)); 697 } 698 } 699 } 700 701 /* Sets up the AR9003 hardware familiy callbacks */ 702 void ar9003_hw_attach_ops(struct ath_hw *ah) 703 { 704 struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); 705 struct ath_hw_ops *ops = ath9k_hw_ops(ah); 706 707 ar9003_hw_init_mode_regs(ah); 708 priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs; 709 710 ops->config_pci_powersave = ar9003_hw_configpcipowersave; 711 712 ar9003_hw_attach_phy_ops(ah); 713 ar9003_hw_attach_calib_ops(ah); 714 ar9003_hw_attach_mac_ops(ah); 715 } 716