Linux Audio

Check our new training course

Loading...
v6.8
   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 "ar9003_buffalo_initvals.h"
  21#include "ar9485_initvals.h"
  22#include "ar9340_initvals.h"
  23#include "ar9330_1p1_initvals.h"
  24#include "ar9330_1p2_initvals.h"
  25#include "ar955x_1p0_initvals.h"
  26#include "ar9580_1p0_initvals.h"
  27#include "ar9462_2p0_initvals.h"
  28#include "ar9462_2p1_initvals.h"
  29#include "ar9565_1p0_initvals.h"
  30#include "ar9565_1p1_initvals.h"
  31#include "ar953x_initvals.h"
  32#include "ar956x_initvals.h"
  33
  34/* General hardware code for the AR9003 hadware family */
  35
  36/*
  37 * The AR9003 family uses a new INI format (pre, core, post
  38 * arrays per subsystem). This provides support for the
  39 * AR9003 2.2 chipsets.
  40 */
  41static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
  42{
  43	if (AR_SREV_9330_11(ah)) {
  44		/* mac */
  45		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
  46				ar9331_1p1_mac_core);
  47		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
  48				ar9331_1p1_mac_postamble);
  49
  50		/* bb */
  51		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
  52				ar9331_1p1_baseband_core);
  53		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
  54				ar9331_1p1_baseband_postamble);
  55
  56		/* radio */
  57		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
  58				ar9331_1p1_radio_core);
  59
  60		/* soc */
  61		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
  62				ar9331_1p1_soc_preamble);
  63		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
  64				ar9331_1p1_soc_postamble);
  65
  66		/* rx/tx gain */
  67		INIT_INI_ARRAY(&ah->iniModesRxGain,
  68				ar9331_common_rx_gain_1p1);
  69		INIT_INI_ARRAY(&ah->iniModesTxGain,
  70				ar9331_modes_lowest_ob_db_tx_gain_1p1);
  71
  72		/* Japan 2484 Mhz CCK */
  73		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
  74			       ar9331_1p1_baseband_core_txfir_coeff_japan_2484);
  75
  76		/* additional clock settings */
  77		if (ah->is_clk_25mhz)
  78			INIT_INI_ARRAY(&ah->iniAdditional,
  79					ar9331_1p1_xtal_25M);
  80		else
  81			INIT_INI_ARRAY(&ah->iniAdditional,
  82					ar9331_1p1_xtal_40M);
  83	} else if (AR_SREV_9330_12(ah)) {
  84		/* mac */
  85		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
  86				ar9331_1p2_mac_core);
  87		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
  88				ar9331_1p2_mac_postamble);
  89
  90		/* bb */
  91		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
  92				ar9331_1p2_baseband_core);
  93		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
  94				ar9331_1p2_baseband_postamble);
  95
  96		/* radio */
  97		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
  98				ar9331_1p2_radio_core);
  99
 100		/* soc */
 101		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 102				ar9331_1p2_soc_preamble);
 103		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 104				ar9331_1p2_soc_postamble);
 105
 106		/* rx/tx gain */
 107		INIT_INI_ARRAY(&ah->iniModesRxGain,
 108				ar9331_common_rx_gain_1p2);
 109		INIT_INI_ARRAY(&ah->iniModesTxGain,
 110				ar9331_modes_lowest_ob_db_tx_gain_1p2);
 111
 112		/* Japan 2484 Mhz CCK */
 113		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 114			       ar9331_1p2_baseband_core_txfir_coeff_japan_2484);
 115
 116		/* additional clock settings */
 117		if (ah->is_clk_25mhz)
 118			INIT_INI_ARRAY(&ah->iniAdditional,
 119					ar9331_1p2_xtal_25M);
 120		else
 121			INIT_INI_ARRAY(&ah->iniAdditional,
 122					ar9331_1p2_xtal_40M);
 123	} else if (AR_SREV_9340(ah)) {
 124		/* mac */
 125		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 126				ar9340_1p0_mac_core);
 127		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 128				ar9340_1p0_mac_postamble);
 129
 130		/* bb */
 131		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 132				ar9340_1p0_baseband_core);
 133		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 134				ar9340_1p0_baseband_postamble);
 135
 136		/* radio */
 137		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 138				ar9340_1p0_radio_core);
 139		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 140				ar9340_1p0_radio_postamble);
 141
 142		/* soc */
 143		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 144				ar9340_1p0_soc_preamble);
 145		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 146				ar9340_1p0_soc_postamble);
 147
 148		/* rx/tx gain */
 149		INIT_INI_ARRAY(&ah->iniModesRxGain,
 150				ar9340Common_wo_xlna_rx_gain_table_1p0);
 151		INIT_INI_ARRAY(&ah->iniModesTxGain,
 152				ar9340Modes_high_ob_db_tx_gain_table_1p0);
 153
 154		INIT_INI_ARRAY(&ah->iniModesFastClock,
 155			       ar9340Modes_fast_clock_1p0);
 156		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 157			       ar9340_1p0_baseband_core_txfir_coeff_japan_2484);
 158		INIT_INI_ARRAY(&ah->ini_dfs,
 159			       ar9340_1p0_baseband_postamble_dfs_channel);
 160
 161		if (!ah->is_clk_25mhz)
 162			INIT_INI_ARRAY(&ah->iniAdditional,
 163				       ar9340_1p0_radio_core_40M);
 164	} else if (AR_SREV_9485_11_OR_LATER(ah)) {
 165		/* mac */
 166		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 167				ar9485_1_1_mac_core);
 168		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 169				ar9485_1_1_mac_postamble);
 170
 171		/* bb */
 172		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], ar9485_1_1);
 173		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 174				ar9485_1_1_baseband_core);
 175		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 176				ar9485_1_1_baseband_postamble);
 177
 178		/* radio */
 179		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 180				ar9485_1_1_radio_core);
 181		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 182				ar9485_1_1_radio_postamble);
 183
 184		/* soc */
 185		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 186				ar9485_1_1_soc_preamble);
 187
 188		/* rx/tx gain */
 189		INIT_INI_ARRAY(&ah->iniModesRxGain,
 190				ar9485Common_wo_xlna_rx_gain_1_1);
 191		INIT_INI_ARRAY(&ah->iniModesTxGain,
 192				ar9485_modes_lowest_ob_db_tx_gain_1_1);
 193
 194		/* Japan 2484 Mhz CCK */
 195		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 196			       ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
 197
 198		if (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) {
 199			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 200				       ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
 201			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 202				       ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
 203		} else {
 204			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 205				       ar9485_1_1_pcie_phy_clkreq_disable_L1);
 206			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 207				       ar9485_1_1_pcie_phy_clkreq_disable_L1);
 208		}
 209	} else if (AR_SREV_9462_21(ah)) {
 210		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 211			       ar9462_2p1_mac_core);
 212		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 213			       ar9462_2p1_mac_postamble);
 214		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 215			       ar9462_2p1_baseband_core);
 216		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 217			       ar9462_2p1_baseband_postamble);
 218		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 219			       ar9462_2p1_radio_core);
 220		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 221			       ar9462_2p1_radio_postamble);
 222		INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant,
 223			       ar9462_2p1_radio_postamble_sys2ant);
 224		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 225			       ar9462_2p1_soc_preamble);
 226		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 227			       ar9462_2p1_soc_postamble);
 228		INIT_INI_ARRAY(&ah->iniModesRxGain,
 229			       ar9462_2p1_common_rx_gain);
 230		INIT_INI_ARRAY(&ah->iniModesFastClock,
 231			       ar9462_2p1_modes_fast_clock);
 232		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 233			       ar9462_2p1_baseband_core_txfir_coeff_japan_2484);
 234
 235		/* Awake -> Sleep Setting */
 236		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 237		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
 238			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 239				       ar9462_2p1_pciephy_clkreq_disable_L1);
 240		}
 241
 242		/* Sleep -> Awake Setting */
 243		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 244		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
 245			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 246				       ar9462_2p1_pciephy_clkreq_disable_L1);
 247		}
 248	} else if (AR_SREV_9462_20(ah)) {
 249
 250		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core);
 251		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 252				ar9462_2p0_mac_postamble);
 253
 254		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 255				ar9462_2p0_baseband_core);
 256		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 257				ar9462_2p0_baseband_postamble);
 258
 259		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 260				ar9462_2p0_radio_core);
 261		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 262				ar9462_2p0_radio_postamble);
 263		INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant,
 264				ar9462_2p0_radio_postamble_sys2ant);
 265
 266		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 267				ar9462_2p0_soc_preamble);
 268		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 269				ar9462_2p0_soc_postamble);
 270
 271		INIT_INI_ARRAY(&ah->iniModesRxGain,
 272				ar9462_2p0_common_rx_gain);
 273
 274		/* Awake -> Sleep Setting */
 275		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 276		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
 277			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 278				       ar9462_2p0_pciephy_clkreq_disable_L1);
 279		}
 280
 281		/* Sleep -> Awake Setting */
 282		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 283		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
 284			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 285				       ar9462_2p0_pciephy_clkreq_disable_L1);
 286		}
 287
 288		/* Fast clock modal settings */
 289		INIT_INI_ARRAY(&ah->iniModesFastClock,
 290				ar9462_2p0_modes_fast_clock);
 291
 292		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 293			       ar9462_2p0_baseband_core_txfir_coeff_japan_2484);
 294	} else if (AR_SREV_9550(ah)) {
 295		/* mac */
 296		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 297				ar955x_1p0_mac_core);
 298		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 299				ar955x_1p0_mac_postamble);
 300
 301		/* bb */
 302		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 303				ar955x_1p0_baseband_core);
 304		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 305				ar955x_1p0_baseband_postamble);
 306
 307		/* radio */
 308		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 309				ar955x_1p0_radio_core);
 310		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 311				ar955x_1p0_radio_postamble);
 312
 313		/* soc */
 314		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 315				ar955x_1p0_soc_preamble);
 316		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 317				ar955x_1p0_soc_postamble);
 318
 319		/* rx/tx gain */
 320		INIT_INI_ARRAY(&ah->iniModesRxGain,
 321			ar955x_1p0_common_wo_xlna_rx_gain_table);
 322		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 323			ar955x_1p0_common_wo_xlna_rx_gain_bounds);
 324		INIT_INI_ARRAY(&ah->iniModesTxGain,
 325				ar955x_1p0_modes_xpa_tx_gain_table);
 326
 327		/* Fast clock modal settings */
 328		INIT_INI_ARRAY(&ah->iniModesFastClock,
 329				ar955x_1p0_modes_fast_clock);
 330	} else if (AR_SREV_9531(ah)) {
 331		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 332			       qca953x_1p0_mac_core);
 333		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 334			       qca953x_1p0_mac_postamble);
 335		if (AR_SREV_9531_20(ah)) {
 336			INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 337				       qca953x_2p0_baseband_core);
 338			INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 339				       qca953x_2p0_baseband_postamble);
 340		} else {
 341			INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 342				       qca953x_1p0_baseband_core);
 343			INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 344				       qca953x_1p0_baseband_postamble);
 345		}
 346		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 347			       qca953x_1p0_radio_core);
 348		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 349			       qca953x_1p0_radio_postamble);
 350		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 351			       qca953x_1p0_soc_preamble);
 352		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 353			       qca953x_1p0_soc_postamble);
 354
 355		if (AR_SREV_9531_20(ah)) {
 356			INIT_INI_ARRAY(&ah->iniModesRxGain,
 357				       qca953x_2p0_common_wo_xlna_rx_gain_table);
 358			INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 359				       qca953x_2p0_common_wo_xlna_rx_gain_bounds);
 360		} else {
 361			INIT_INI_ARRAY(&ah->iniModesRxGain,
 362				       qca953x_1p0_common_wo_xlna_rx_gain_table);
 363			INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 364				       qca953x_1p0_common_wo_xlna_rx_gain_bounds);
 365		}
 366
 367		if (AR_SREV_9531_20(ah))
 368			INIT_INI_ARRAY(&ah->iniModesTxGain,
 369				       qca953x_2p0_modes_no_xpa_tx_gain_table);
 370		else if (AR_SREV_9531_11(ah))
 371			INIT_INI_ARRAY(&ah->iniModesTxGain,
 372				       qca953x_1p1_modes_no_xpa_tx_gain_table);
 373		else
 374			INIT_INI_ARRAY(&ah->iniModesTxGain,
 375				       qca953x_1p0_modes_no_xpa_tx_gain_table);
 376
 377		INIT_INI_ARRAY(&ah->iniModesFastClock,
 378			       qca953x_1p0_modes_fast_clock);
 379	} else if (AR_SREV_9561(ah)) {
 380		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 381			       qca956x_1p0_mac_core);
 382		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 383			       qca956x_1p0_mac_postamble);
 384
 385		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 386			       qca956x_1p0_baseband_core);
 387		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 388			       qca956x_1p0_baseband_postamble);
 389
 390		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 391			       qca956x_1p0_radio_core);
 392		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 393			       qca956x_1p0_radio_postamble);
 394
 395		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 396			       qca956x_1p0_soc_preamble);
 397		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 398			       qca956x_1p0_soc_postamble);
 399
 400		INIT_INI_ARRAY(&ah->iniModesRxGain,
 401			       qca956x_1p0_common_wo_xlna_rx_gain_table);
 402		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 403			       qca956x_1p0_common_wo_xlna_rx_gain_bounds);
 404		INIT_INI_ARRAY(&ah->iniModesTxGain,
 405			       qca956x_1p0_modes_no_xpa_tx_gain_table);
 406
 407		INIT_INI_ARRAY(&ah->ini_dfs,
 408			       qca956x_1p0_baseband_postamble_dfs_channel);
 409		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 410			       qca956x_1p0_baseband_core_txfir_coeff_japan_2484);
 411		INIT_INI_ARRAY(&ah->iniModesFastClock,
 412			       qca956x_1p0_modes_fast_clock);
 413	} else if (AR_SREV_9580(ah)) {
 414		/* mac */
 415		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 416				ar9580_1p0_mac_core);
 417		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 418				ar9580_1p0_mac_postamble);
 419
 420		/* bb */
 421		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 422				ar9580_1p0_baseband_core);
 423		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 424				ar9580_1p0_baseband_postamble);
 425
 426		/* radio */
 427		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 428				ar9580_1p0_radio_core);
 429		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 430				ar9580_1p0_radio_postamble);
 431
 432		/* soc */
 433		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 434				ar9580_1p0_soc_preamble);
 435		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 436				ar9580_1p0_soc_postamble);
 437
 438		/* rx/tx gain */
 439		INIT_INI_ARRAY(&ah->iniModesRxGain,
 440				ar9580_1p0_rx_gain_table);
 441		INIT_INI_ARRAY(&ah->iniModesTxGain,
 442				ar9580_1p0_low_ob_db_tx_gain_table);
 443
 444		INIT_INI_ARRAY(&ah->iniModesFastClock,
 445			       ar9580_1p0_modes_fast_clock);
 446		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 447			       ar9580_1p0_baseband_core_txfir_coeff_japan_2484);
 448		INIT_INI_ARRAY(&ah->ini_dfs,
 449			       ar9580_1p0_baseband_postamble_dfs_channel);
 450	} else if (AR_SREV_9565_11_OR_LATER(ah)) {
 451		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 452			       ar9565_1p1_mac_core);
 453		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 454			       ar9565_1p1_mac_postamble);
 455
 456		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 457			       ar9565_1p1_baseband_core);
 458		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 459			       ar9565_1p1_baseband_postamble);
 460
 461		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 462			       ar9565_1p1_radio_core);
 463		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 464			       ar9565_1p1_radio_postamble);
 465
 466		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 467			       ar9565_1p1_soc_preamble);
 468		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 469			       ar9565_1p1_soc_postamble);
 470
 471		INIT_INI_ARRAY(&ah->iniModesRxGain,
 472			       ar9565_1p1_Common_rx_gain_table);
 473		INIT_INI_ARRAY(&ah->iniModesTxGain,
 474			       ar9565_1p1_Modes_lowest_ob_db_tx_gain_table);
 475
 476		/* Awake -> Sleep Setting */
 477		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 478		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
 479			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 480				       ar9565_1p1_pciephy_clkreq_disable_L1);
 481		}
 482
 483		/* Sleep -> Awake Setting */
 484		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 485		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
 486			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 487				       ar9565_1p1_pciephy_clkreq_disable_L1);
 488		}
 489
 490		INIT_INI_ARRAY(&ah->iniModesFastClock,
 491				ar9565_1p1_modes_fast_clock);
 492		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 493			       ar9565_1p1_baseband_core_txfir_coeff_japan_2484);
 494	} else if (AR_SREV_9565(ah)) {
 495		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 496			       ar9565_1p0_mac_core);
 497		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 498			       ar9565_1p0_mac_postamble);
 499
 500		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 501			       ar9565_1p0_baseband_core);
 502		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 503			       ar9565_1p0_baseband_postamble);
 504
 505		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 506			       ar9565_1p0_radio_core);
 507		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 508			       ar9565_1p0_radio_postamble);
 509
 510		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 511			       ar9565_1p0_soc_preamble);
 512		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 513			       ar9565_1p0_soc_postamble);
 514
 515		INIT_INI_ARRAY(&ah->iniModesRxGain,
 516			       ar9565_1p0_Common_rx_gain_table);
 517		INIT_INI_ARRAY(&ah->iniModesTxGain,
 518			       ar9565_1p0_Modes_lowest_ob_db_tx_gain_table);
 519
 520		/* Awake -> Sleep Setting */
 521		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 522		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
 523			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 524				       ar9565_1p0_pciephy_clkreq_disable_L1);
 525		}
 526
 527		/* Sleep -> Awake Setting */
 528		if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
 529		    (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
 530			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 531				       ar9565_1p0_pciephy_clkreq_disable_L1);
 532		}
 533
 534		INIT_INI_ARRAY(&ah->iniModesFastClock,
 535				ar9565_1p0_modes_fast_clock);
 536		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 537			       ar9565_1p0_baseband_core_txfir_coeff_japan_2484);
 538	} else {
 539		/* mac */
 540		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 541				ar9300_2p2_mac_core);
 542		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 543				ar9300_2p2_mac_postamble);
 544
 545		/* bb */
 546		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 547				ar9300_2p2_baseband_core);
 548		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 549				ar9300_2p2_baseband_postamble);
 550
 551		/* radio */
 552		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 553				ar9300_2p2_radio_core);
 554		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 555				ar9300_2p2_radio_postamble);
 556
 557		/* soc */
 558		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 559				ar9300_2p2_soc_preamble);
 560		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 561				ar9300_2p2_soc_postamble);
 562
 563		/* rx/tx gain */
 564		INIT_INI_ARRAY(&ah->iniModesRxGain,
 565				ar9300Common_rx_gain_table_2p2);
 566		INIT_INI_ARRAY(&ah->iniModesTxGain,
 567				ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
 568
 569		/* Load PCIE SERDES settings from INI */
 570
 571		/* Awake Setting */
 572
 573		INIT_INI_ARRAY(&ah->iniPcieSerdes,
 574				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
 575
 576		/* Sleep Setting */
 577
 578		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 579				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
 580
 581		/* Fast clock modal settings */
 582		INIT_INI_ARRAY(&ah->iniModesFastClock,
 583			       ar9300Modes_fast_clock_2p2);
 584		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 585			       ar9300_2p2_baseband_core_txfir_coeff_japan_2484);
 586		INIT_INI_ARRAY(&ah->ini_dfs,
 587			       ar9300_2p2_baseband_postamble_dfs_channel);
 588	}
 589}
 590
 591static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
 592{
 593	if (AR_SREV_9330_12(ah))
 594		INIT_INI_ARRAY(&ah->iniModesTxGain,
 595			ar9331_modes_lowest_ob_db_tx_gain_1p2);
 596	else if (AR_SREV_9330_11(ah))
 597		INIT_INI_ARRAY(&ah->iniModesTxGain,
 598			ar9331_modes_lowest_ob_db_tx_gain_1p1);
 599	else if (AR_SREV_9340(ah))
 600		INIT_INI_ARRAY(&ah->iniModesTxGain,
 601			ar9340Modes_lowest_ob_db_tx_gain_table_1p0);
 602	else if (AR_SREV_9485_11_OR_LATER(ah))
 603		INIT_INI_ARRAY(&ah->iniModesTxGain,
 604			ar9485_modes_lowest_ob_db_tx_gain_1_1);
 605	else if (AR_SREV_9550(ah))
 606		INIT_INI_ARRAY(&ah->iniModesTxGain,
 607			ar955x_1p0_modes_xpa_tx_gain_table);
 608	else if (AR_SREV_9531_10(ah))
 609		INIT_INI_ARRAY(&ah->iniModesTxGain,
 610			       qca953x_1p0_modes_xpa_tx_gain_table);
 611	else if (AR_SREV_9531_11(ah))
 612		INIT_INI_ARRAY(&ah->iniModesTxGain,
 613			       qca953x_1p1_modes_xpa_tx_gain_table);
 614	else if (AR_SREV_9531_20(ah))
 615		INIT_INI_ARRAY(&ah->iniModesTxGain,
 616			       qca953x_2p0_modes_xpa_tx_gain_table);
 617	else if (AR_SREV_9561(ah))
 618		INIT_INI_ARRAY(&ah->iniModesTxGain,
 619			       qca956x_1p0_modes_xpa_tx_gain_table);
 620	else if (AR_SREV_9580(ah))
 621		INIT_INI_ARRAY(&ah->iniModesTxGain,
 622			ar9580_1p0_lowest_ob_db_tx_gain_table);
 623	else if (AR_SREV_9462_21(ah))
 624		INIT_INI_ARRAY(&ah->iniModesTxGain,
 625			ar9462_2p1_modes_low_ob_db_tx_gain);
 626	else if (AR_SREV_9462_20(ah))
 627		INIT_INI_ARRAY(&ah->iniModesTxGain,
 628			ar9462_2p0_modes_low_ob_db_tx_gain);
 629	else if (AR_SREV_9565_11(ah))
 630		INIT_INI_ARRAY(&ah->iniModesTxGain,
 631			       ar9565_1p1_modes_low_ob_db_tx_gain_table);
 632	else if (AR_SREV_9565(ah))
 633		INIT_INI_ARRAY(&ah->iniModesTxGain,
 634			       ar9565_1p0_modes_low_ob_db_tx_gain_table);
 635	else
 636		INIT_INI_ARRAY(&ah->iniModesTxGain,
 637			ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
 638}
 639
 640static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
 641{
 642	if (AR_SREV_9330_12(ah))
 643		INIT_INI_ARRAY(&ah->iniModesTxGain,
 644			ar9331_modes_high_ob_db_tx_gain_1p2);
 645	else if (AR_SREV_9330_11(ah))
 646		INIT_INI_ARRAY(&ah->iniModesTxGain,
 647			ar9331_modes_high_ob_db_tx_gain_1p1);
 648	else if (AR_SREV_9340(ah))
 649		INIT_INI_ARRAY(&ah->iniModesTxGain,
 650			ar9340Modes_high_ob_db_tx_gain_table_1p0);
 651	else if (AR_SREV_9485_11_OR_LATER(ah))
 652		INIT_INI_ARRAY(&ah->iniModesTxGain,
 653			ar9485Modes_high_ob_db_tx_gain_1_1);
 654	else if (AR_SREV_9580(ah))
 655		INIT_INI_ARRAY(&ah->iniModesTxGain,
 656			ar9580_1p0_high_ob_db_tx_gain_table);
 657	else if (AR_SREV_9550(ah))
 658		INIT_INI_ARRAY(&ah->iniModesTxGain,
 659			ar955x_1p0_modes_no_xpa_tx_gain_table);
 660	else if (AR_SREV_9531(ah)) {
 661		if (AR_SREV_9531_20(ah))
 662			INIT_INI_ARRAY(&ah->iniModesTxGain,
 663				       qca953x_2p0_modes_no_xpa_tx_gain_table);
 664		else if (AR_SREV_9531_11(ah))
 665			INIT_INI_ARRAY(&ah->iniModesTxGain,
 666				       qca953x_1p1_modes_no_xpa_tx_gain_table);
 667		else
 668			INIT_INI_ARRAY(&ah->iniModesTxGain,
 669				       qca953x_1p0_modes_no_xpa_tx_gain_table);
 670	} else if (AR_SREV_9561(ah))
 671		INIT_INI_ARRAY(&ah->iniModesTxGain,
 672			       qca956x_1p0_modes_no_xpa_tx_gain_table);
 673	else if (AR_SREV_9462_21(ah))
 674		INIT_INI_ARRAY(&ah->iniModesTxGain,
 675			ar9462_2p1_modes_high_ob_db_tx_gain);
 676	else if (AR_SREV_9462_20(ah))
 677		INIT_INI_ARRAY(&ah->iniModesTxGain,
 678			ar9462_2p0_modes_high_ob_db_tx_gain);
 679	else if (AR_SREV_9565_11(ah))
 680		INIT_INI_ARRAY(&ah->iniModesTxGain,
 681			       ar9565_1p1_modes_high_ob_db_tx_gain_table);
 682	else if (AR_SREV_9565(ah))
 683		INIT_INI_ARRAY(&ah->iniModesTxGain,
 684			       ar9565_1p0_modes_high_ob_db_tx_gain_table);
 685	else
 686		INIT_INI_ARRAY(&ah->iniModesTxGain,
 687			ar9300Modes_high_ob_db_tx_gain_table_2p2);
 688}
 689
 690static void ar9003_tx_gain_table_mode2(struct ath_hw *ah)
 691{
 692	if (AR_SREV_9330_12(ah))
 693		INIT_INI_ARRAY(&ah->iniModesTxGain,
 694			ar9331_modes_low_ob_db_tx_gain_1p2);
 695	else if (AR_SREV_9330_11(ah))
 696		INIT_INI_ARRAY(&ah->iniModesTxGain,
 697			ar9331_modes_low_ob_db_tx_gain_1p1);
 698	else if (AR_SREV_9340(ah))
 699		INIT_INI_ARRAY(&ah->iniModesTxGain,
 700			ar9340Modes_low_ob_db_tx_gain_table_1p0);
 701	else if (AR_SREV_9531_11(ah))
 702		INIT_INI_ARRAY(&ah->iniModesTxGain,
 703			       qca953x_1p1_modes_no_xpa_low_power_tx_gain_table);
 704	else if (AR_SREV_9485_11_OR_LATER(ah))
 705		INIT_INI_ARRAY(&ah->iniModesTxGain,
 706			ar9485Modes_low_ob_db_tx_gain_1_1);
 707	else if (AR_SREV_9580(ah))
 708		INIT_INI_ARRAY(&ah->iniModesTxGain,
 709			ar9580_1p0_low_ob_db_tx_gain_table);
 710	else if (AR_SREV_9561(ah))
 711		INIT_INI_ARRAY(&ah->iniModesTxGain,
 712			       qca956x_1p0_modes_no_xpa_low_ob_db_tx_gain_table);
 713	else if (AR_SREV_9565_11(ah))
 714		INIT_INI_ARRAY(&ah->iniModesTxGain,
 715			       ar9565_1p1_modes_low_ob_db_tx_gain_table);
 716	else if (AR_SREV_9565(ah))
 717		INIT_INI_ARRAY(&ah->iniModesTxGain,
 718			       ar9565_1p0_modes_low_ob_db_tx_gain_table);
 719	else
 720		INIT_INI_ARRAY(&ah->iniModesTxGain,
 721			ar9300Modes_low_ob_db_tx_gain_table_2p2);
 722}
 723
 724static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)
 725{
 726	if (AR_SREV_9330_12(ah))
 727		INIT_INI_ARRAY(&ah->iniModesTxGain,
 728			ar9331_modes_high_power_tx_gain_1p2);
 729	else if (AR_SREV_9330_11(ah))
 730		INIT_INI_ARRAY(&ah->iniModesTxGain,
 731			ar9331_modes_high_power_tx_gain_1p1);
 732	else if (AR_SREV_9340(ah))
 733		INIT_INI_ARRAY(&ah->iniModesTxGain,
 734			ar9340Modes_high_power_tx_gain_table_1p0);
 735	else if (AR_SREV_9485_11_OR_LATER(ah))
 736		INIT_INI_ARRAY(&ah->iniModesTxGain,
 737			ar9485Modes_high_power_tx_gain_1_1);
 738	else if (AR_SREV_9580(ah))
 739		INIT_INI_ARRAY(&ah->iniModesTxGain,
 740			ar9580_1p0_high_power_tx_gain_table);
 741	else if (AR_SREV_9565_11(ah))
 742		INIT_INI_ARRAY(&ah->iniModesTxGain,
 743			       ar9565_1p1_modes_high_power_tx_gain_table);
 744	else if (AR_SREV_9565(ah))
 745		INIT_INI_ARRAY(&ah->iniModesTxGain,
 746			       ar9565_1p0_modes_high_power_tx_gain_table);
 747	else {
 748		if (ah->config.tx_gain_buffalo)
 749			INIT_INI_ARRAY(&ah->iniModesTxGain,
 750				       ar9300Modes_high_power_tx_gain_table_buffalo);
 751		else
 752			INIT_INI_ARRAY(&ah->iniModesTxGain,
 753				       ar9300Modes_high_power_tx_gain_table_2p2);
 754	}
 755}
 756
 757static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
 758{
 759	if (AR_SREV_9340(ah))
 760		INIT_INI_ARRAY(&ah->iniModesTxGain,
 761			ar9340Modes_mixed_ob_db_tx_gain_table_1p0);
 762	else if (AR_SREV_9580(ah))
 763		INIT_INI_ARRAY(&ah->iniModesTxGain,
 764			ar9580_1p0_mixed_ob_db_tx_gain_table);
 765	else if (AR_SREV_9462_21(ah))
 766		INIT_INI_ARRAY(&ah->iniModesTxGain,
 767		       ar9462_2p1_modes_mix_ob_db_tx_gain);
 768	else if (AR_SREV_9462_20(ah))
 769		INIT_INI_ARRAY(&ah->iniModesTxGain,
 770		       ar9462_2p0_modes_mix_ob_db_tx_gain);
 771	else
 772		INIT_INI_ARRAY(&ah->iniModesTxGain,
 773			ar9300Modes_mixed_ob_db_tx_gain_table_2p2);
 774}
 775
 776static void ar9003_tx_gain_table_mode5(struct ath_hw *ah)
 777{
 778	if (AR_SREV_9485_11_OR_LATER(ah))
 779		INIT_INI_ARRAY(&ah->iniModesTxGain,
 780			ar9485Modes_green_ob_db_tx_gain_1_1);
 
 
 
 781	else if (AR_SREV_9580(ah))
 782		INIT_INI_ARRAY(&ah->iniModesTxGain,
 783			ar9580_1p0_type5_tx_gain_table);
 784	else if (AR_SREV_9561(ah))
 785		INIT_INI_ARRAY(&ah->iniModesTxGain,
 786			       qca956x_1p0_modes_no_xpa_green_tx_gain_table);
 787	else if (AR_SREV_9300_22(ah))
 788		INIT_INI_ARRAY(&ah->iniModesTxGain,
 789			ar9300Modes_type5_tx_gain_table_2p2);
 790}
 791
 792static void ar9003_tx_gain_table_mode6(struct ath_hw *ah)
 793{
 794	if (AR_SREV_9340(ah))
 795		INIT_INI_ARRAY(&ah->iniModesTxGain,
 796			ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0);
 797	else if (AR_SREV_9485_11_OR_LATER(ah))
 798		INIT_INI_ARRAY(&ah->iniModesTxGain,
 799			ar9485Modes_green_spur_ob_db_tx_gain_1_1);
 800	else if (AR_SREV_9580(ah))
 801		INIT_INI_ARRAY(&ah->iniModesTxGain,
 802			ar9580_1p0_type6_tx_gain_table);
 803}
 804
 805static void ar9003_tx_gain_table_mode7(struct ath_hw *ah)
 806{
 807	if (AR_SREV_9340(ah))
 808		INIT_INI_ARRAY(&ah->iniModesTxGain,
 809			       ar9340_cus227_tx_gain_table_1p0);
 810}
 811
 812typedef void (*ath_txgain_tab)(struct ath_hw *ah);
 813
 814static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
 815{
 816	static const ath_txgain_tab modes[] = {
 817		ar9003_tx_gain_table_mode0,
 818		ar9003_tx_gain_table_mode1,
 819		ar9003_tx_gain_table_mode2,
 820		ar9003_tx_gain_table_mode3,
 821		ar9003_tx_gain_table_mode4,
 822		ar9003_tx_gain_table_mode5,
 823		ar9003_tx_gain_table_mode6,
 824		ar9003_tx_gain_table_mode7,
 825	};
 826	int idx = ar9003_hw_get_tx_gain_idx(ah);
 827
 828	if (idx >= ARRAY_SIZE(modes))
 829		idx = 0;
 830
 831	modes[idx](ah);
 832}
 833
 834static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
 835{
 836	if (AR_SREV_9330_12(ah))
 837		INIT_INI_ARRAY(&ah->iniModesRxGain,
 838				ar9331_common_rx_gain_1p2);
 839	else if (AR_SREV_9330_11(ah))
 840		INIT_INI_ARRAY(&ah->iniModesRxGain,
 841				ar9331_common_rx_gain_1p1);
 842	else if (AR_SREV_9340(ah))
 843		INIT_INI_ARRAY(&ah->iniModesRxGain,
 844				ar9340Common_rx_gain_table_1p0);
 845	else if (AR_SREV_9485_11_OR_LATER(ah))
 846		INIT_INI_ARRAY(&ah->iniModesRxGain,
 847			       ar9485_common_rx_gain_1_1);
 848	else if (AR_SREV_9550(ah)) {
 849		INIT_INI_ARRAY(&ah->iniModesRxGain,
 850				ar955x_1p0_common_rx_gain_table);
 851		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 852				ar955x_1p0_common_rx_gain_bounds);
 853	} else if (AR_SREV_9531(ah)) {
 854		INIT_INI_ARRAY(&ah->iniModesRxGain,
 855			       qca953x_1p0_common_rx_gain_table);
 856		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 857			       qca953x_1p0_common_rx_gain_bounds);
 858	} else if (AR_SREV_9561(ah)) {
 859		INIT_INI_ARRAY(&ah->iniModesRxGain,
 860			       qca956x_1p0_common_rx_gain_table);
 861		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 862			       qca956x_1p0_common_rx_gain_bounds);
 863		INIT_INI_ARRAY(&ah->ini_modes_rxgain_xlna,
 864			       qca956x_1p0_xlna_only);
 865	} else if (AR_SREV_9580(ah))
 866		INIT_INI_ARRAY(&ah->iniModesRxGain,
 867				ar9580_1p0_rx_gain_table);
 868	else if (AR_SREV_9462_21(ah))
 869		INIT_INI_ARRAY(&ah->iniModesRxGain,
 870				ar9462_2p1_common_rx_gain);
 871	else if (AR_SREV_9462_20(ah))
 872		INIT_INI_ARRAY(&ah->iniModesRxGain,
 873				ar9462_2p0_common_rx_gain);
 874	else if (AR_SREV_9565_11(ah))
 875		INIT_INI_ARRAY(&ah->iniModesRxGain,
 876			       ar9565_1p1_Common_rx_gain_table);
 877	else if (AR_SREV_9565(ah))
 878		INIT_INI_ARRAY(&ah->iniModesRxGain,
 879			       ar9565_1p0_Common_rx_gain_table);
 880	else
 881		INIT_INI_ARRAY(&ah->iniModesRxGain,
 882				ar9300Common_rx_gain_table_2p2);
 883}
 884
 885static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
 886{
 887	if (AR_SREV_9330_12(ah))
 888		INIT_INI_ARRAY(&ah->iniModesRxGain,
 889			ar9331_common_wo_xlna_rx_gain_1p2);
 890	else if (AR_SREV_9330_11(ah))
 891		INIT_INI_ARRAY(&ah->iniModesRxGain,
 892			ar9331_common_wo_xlna_rx_gain_1p1);
 893	else if (AR_SREV_9340(ah))
 894		INIT_INI_ARRAY(&ah->iniModesRxGain,
 895			ar9340Common_wo_xlna_rx_gain_table_1p0);
 896	else if (AR_SREV_9485_11_OR_LATER(ah))
 897		INIT_INI_ARRAY(&ah->iniModesRxGain,
 898			ar9485Common_wo_xlna_rx_gain_1_1);
 899	else if (AR_SREV_9462_21(ah))
 900		INIT_INI_ARRAY(&ah->iniModesRxGain,
 901			ar9462_2p1_common_wo_xlna_rx_gain);
 902	else if (AR_SREV_9462_20(ah))
 903		INIT_INI_ARRAY(&ah->iniModesRxGain,
 904			ar9462_2p0_common_wo_xlna_rx_gain);
 905	else if (AR_SREV_9550(ah)) {
 906		INIT_INI_ARRAY(&ah->iniModesRxGain,
 907			ar955x_1p0_common_wo_xlna_rx_gain_table);
 908		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 909			ar955x_1p0_common_wo_xlna_rx_gain_bounds);
 910	} else if (AR_SREV_9531_10(ah) || AR_SREV_9531_11(ah)) {
 911		INIT_INI_ARRAY(&ah->iniModesRxGain,
 912			       qca953x_1p0_common_wo_xlna_rx_gain_table);
 913		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 914			       qca953x_1p0_common_wo_xlna_rx_gain_bounds);
 915	} else if (AR_SREV_9531_20(ah)) {
 916		INIT_INI_ARRAY(&ah->iniModesRxGain,
 917			       qca953x_2p0_common_wo_xlna_rx_gain_table);
 918		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 919			       qca953x_2p0_common_wo_xlna_rx_gain_bounds);
 920	} else if (AR_SREV_9561(ah)) {
 921		INIT_INI_ARRAY(&ah->iniModesRxGain,
 922			       qca956x_1p0_common_wo_xlna_rx_gain_table);
 923		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 924			       qca956x_1p0_common_wo_xlna_rx_gain_bounds);
 925	} else if (AR_SREV_9580(ah))
 926		INIT_INI_ARRAY(&ah->iniModesRxGain,
 927			ar9580_1p0_wo_xlna_rx_gain_table);
 928	else if (AR_SREV_9565_11(ah))
 929		INIT_INI_ARRAY(&ah->iniModesRxGain,
 930			       ar9565_1p1_common_wo_xlna_rx_gain_table);
 931	else if (AR_SREV_9565(ah))
 932		INIT_INI_ARRAY(&ah->iniModesRxGain,
 933			       ar9565_1p0_common_wo_xlna_rx_gain_table);
 934	else
 935		INIT_INI_ARRAY(&ah->iniModesRxGain,
 936			ar9300Common_wo_xlna_rx_gain_table_2p2);
 937}
 938
 939static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)
 940{
 941	if (AR_SREV_9462_21(ah)) {
 942		INIT_INI_ARRAY(&ah->iniModesRxGain,
 943			       ar9462_2p1_common_mixed_rx_gain);
 944		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
 945			       ar9462_2p1_baseband_core_mix_rxgain);
 946		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
 947			       ar9462_2p1_baseband_postamble_mix_rxgain);
 948		INIT_INI_ARRAY(&ah->ini_modes_rxgain_xlna,
 949			       ar9462_2p1_baseband_postamble_5g_xlna);
 950	} else if (AR_SREV_9462_20(ah)) {
 951		INIT_INI_ARRAY(&ah->iniModesRxGain,
 952			       ar9462_2p0_common_mixed_rx_gain);
 953		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
 954			       ar9462_2p0_baseband_core_mix_rxgain);
 955		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
 956			       ar9462_2p0_baseband_postamble_mix_rxgain);
 957		INIT_INI_ARRAY(&ah->ini_modes_rxgain_xlna,
 958			       ar9462_2p0_baseband_postamble_5g_xlna);
 959	}
 960}
 961
 962static void ar9003_rx_gain_table_mode3(struct ath_hw *ah)
 963{
 964	if (AR_SREV_9462_21(ah)) {
 965		INIT_INI_ARRAY(&ah->iniModesRxGain,
 966			       ar9462_2p1_common_5g_xlna_only_rxgain);
 967		INIT_INI_ARRAY(&ah->ini_modes_rxgain_xlna,
 968			       ar9462_2p1_baseband_postamble_5g_xlna);
 969	} else if (AR_SREV_9462_20(ah)) {
 970		INIT_INI_ARRAY(&ah->iniModesRxGain,
 971			       ar9462_2p0_common_5g_xlna_only_rxgain);
 972		INIT_INI_ARRAY(&ah->ini_modes_rxgain_xlna,
 973			       ar9462_2p0_baseband_postamble_5g_xlna);
 974	}
 975}
 976
 977static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
 978{
 979	switch (ar9003_hw_get_rx_gain_idx(ah)) {
 980	case 0:
 981	default:
 982		ar9003_rx_gain_table_mode0(ah);
 983		break;
 984	case 1:
 985		ar9003_rx_gain_table_mode1(ah);
 986		break;
 987	case 2:
 988		ar9003_rx_gain_table_mode2(ah);
 989		break;
 990	case 3:
 991		ar9003_rx_gain_table_mode3(ah);
 992		break;
 993	}
 994}
 995
 996/* set gain table pointers according to values read from the eeprom */
 997static void ar9003_hw_init_mode_gain_regs(struct ath_hw *ah)
 998{
 999	ar9003_tx_gain_table_apply(ah);
1000	ar9003_rx_gain_table_apply(ah);
1001}
1002
1003/*
1004 * Helper for ASPM support.
1005 *
1006 * Disable PLL when in L0s as well as receiver clock when in L1.
1007 * This power saving option must be enabled through the SerDes.
1008 *
1009 * Programming the SerDes must go through the same 288 bit serial shift
1010 * register as the other analog registers.  Hence the 9 writes.
1011 */
1012static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
1013					 bool power_off)
1014{
1015	unsigned int i;
1016	struct ar5416IniArray *array;
1017
1018	/*
1019	 * Increase L1 Entry Latency. Some WB222 boards don't have
1020	 * this change in eeprom/OTP.
1021	 *
1022	 */
1023	if (AR_SREV_9462(ah)) {
1024		u32 val = ah->config.aspm_l1_fix;
1025		if ((val & 0xff000000) == 0x17000000) {
1026			val &= 0x00ffffff;
1027			val |= 0x27000000;
1028			REG_WRITE(ah, 0x570c, val);
1029		}
1030	}
1031
1032	/* Nothing to do on restore for 11N */
1033	if (!power_off /* !restore */) {
1034		/* set bit 19 to allow forcing of pcie core into L1 state */
1035		REG_SET_BIT(ah, AR_PCIE_PM_CTRL(ah), AR_PCIE_PM_CTRL_ENA);
1036		REG_WRITE(ah, AR_WA(ah), ah->WARegVal);
1037	}
1038
1039	/*
1040	 * Configure PCIE after Ini init. SERDES values now come from ini file
1041	 * This enables PCIe low power mode.
1042	 */
1043	array = power_off ? &ah->iniPcieSerdes :
1044		&ah->iniPcieSerdesLowPower;
1045
1046	for (i = 0; i < array->ia_rows; i++) {
1047		REG_WRITE(ah,
1048			  INI_RA(array, i, 0),
1049			  INI_RA(array, i, 1));
1050	}
1051}
1052
1053static void ar9003_hw_init_hang_checks(struct ath_hw *ah)
1054{
1055	/*
1056	 * All chips support detection of BB/MAC hangs.
1057	 */
1058	ah->config.hw_hang_checks |= HW_BB_WATCHDOG;
1059	ah->config.hw_hang_checks |= HW_MAC_HANG;
1060
1061	/*
1062	 * This is not required for AR9580 1.0
1063	 */
1064	if (AR_SREV_9300_22(ah))
1065		ah->config.hw_hang_checks |= HW_PHYRESTART_CLC_WAR;
1066
1067	if (AR_SREV_9330(ah))
1068		ah->bb_watchdog_timeout_ms = 85;
1069	else
1070		ah->bb_watchdog_timeout_ms = 25;
1071}
1072
1073/*
1074 * MAC HW hang check
1075 * =================
1076 *
1077 * Signature: dcu_chain_state is 0x6 and dcu_complete_state is 0x1.
1078 *
1079 * The state of each DCU chain (mapped to TX queues) is available from these
1080 * DMA debug registers:
1081 *
1082 * Chain 0 state : Bits 4:0   of AR_DMADBG_4
1083 * Chain 1 state : Bits 9:5   of AR_DMADBG_4
1084 * Chain 2 state : Bits 14:10 of AR_DMADBG_4
1085 * Chain 3 state : Bits 19:15 of AR_DMADBG_4
1086 * Chain 4 state : Bits 24:20 of AR_DMADBG_4
1087 * Chain 5 state : Bits 29:25 of AR_DMADBG_4
1088 * Chain 6 state : Bits 4:0   of AR_DMADBG_5
1089 * Chain 7 state : Bits 9:5   of AR_DMADBG_5
1090 * Chain 8 state : Bits 14:10 of AR_DMADBG_5
1091 * Chain 9 state : Bits 19:15 of AR_DMADBG_5
1092 *
1093 * The DCU chain state "0x6" means "WAIT_FRDONE" - wait for TX frame to be done.
1094 */
1095
1096#define NUM_STATUS_READS 50
1097
1098static bool ath9k_hw_verify_hang(struct ath_hw *ah, unsigned int queue)
1099{
1100	u32 dma_dbg_chain, dma_dbg_complete;
1101	u8 dcu_chain_state, dcu_complete_state;
1102	unsigned int dbg_reg, reg_offset;
1103	int i;
1104
1105	if (queue < 6) {
1106		dbg_reg = AR_DMADBG_4;
1107		reg_offset = queue * 5;
1108	} else {
1109		dbg_reg = AR_DMADBG_5;
1110		reg_offset = (queue - 6) * 5;
1111	}
1112
1113	for (i = 0; i < NUM_STATUS_READS; i++) {
1114		dma_dbg_chain = REG_READ(ah, dbg_reg);
 
 
 
 
1115		dma_dbg_complete = REG_READ(ah, AR_DMADBG_6);
1116
1117		dcu_chain_state = (dma_dbg_chain >> reg_offset) & 0x1f;
1118		dcu_complete_state = dma_dbg_complete & 0x3;
1119
1120		if ((dcu_chain_state != 0x6) || (dcu_complete_state != 0x1))
1121			return false;
1122	}
1123
1124	ath_dbg(ath9k_hw_common(ah), RESET,
1125		"MAC Hang signature found for queue: %d\n", queue);
1126
1127	return true;
1128}
1129
1130static bool ar9003_hw_detect_mac_hang(struct ath_hw *ah)
1131{
1132	u32 dma_dbg_4, dma_dbg_5, dma_dbg_6, chk_dbg;
1133	u8 dcu_chain_state, dcu_complete_state;
1134	bool dcu_wait_frdone = false;
1135	unsigned long chk_dcu = 0;
1136	unsigned int reg_offset;
1137	unsigned int i = 0;
1138
1139	dma_dbg_4 = REG_READ(ah, AR_DMADBG_4);
1140	dma_dbg_5 = REG_READ(ah, AR_DMADBG_5);
1141	dma_dbg_6 = REG_READ(ah, AR_DMADBG_6);
1142
1143	dcu_complete_state = dma_dbg_6 & 0x3;
1144	if (dcu_complete_state != 0x1)
1145		goto exit;
1146
1147	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
1148		if (i < 6) {
1149			chk_dbg = dma_dbg_4;
1150			reg_offset = i * 5;
1151		} else {
1152			chk_dbg = dma_dbg_5;
1153			reg_offset = (i - 6) * 5;
1154		}
1155
1156		dcu_chain_state = (chk_dbg >> reg_offset) & 0x1f;
1157		if (dcu_chain_state == 0x6) {
1158			dcu_wait_frdone = true;
1159			chk_dcu |= BIT(i);
1160		}
1161	}
1162
1163	if ((dcu_complete_state == 0x1) && dcu_wait_frdone) {
1164		for_each_set_bit(i, &chk_dcu, ATH9K_NUM_TX_QUEUES) {
1165			if (ath9k_hw_verify_hang(ah, i))
1166				return true;
1167		}
1168	}
1169exit:
1170	return false;
1171}
1172
1173/* Sets up the AR9003 hardware familiy callbacks */
1174void ar9003_hw_attach_ops(struct ath_hw *ah)
1175{
1176	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
1177	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
1178
1179	ar9003_hw_init_mode_regs(ah);
1180
1181	if (AR_SREV_9003_PCOEM(ah)) {
1182		WARN_ON(!ah->iniPcieSerdes.ia_array);
1183		WARN_ON(!ah->iniPcieSerdesLowPower.ia_array);
1184	}
1185
1186	priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
1187	priv_ops->init_hang_checks = ar9003_hw_init_hang_checks;
1188	priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang;
1189
1190	ops->config_pci_powersave = ar9003_hw_configpcipowersave;
1191
1192	ar9003_hw_attach_phy_ops(ah);
1193	ar9003_hw_attach_calib_ops(ah);
1194	ar9003_hw_attach_mac_ops(ah);
1195	ar9003_hw_attach_aic_ops(ah);
1196}
v3.15
   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 "ar9003_buffalo_initvals.h"
  21#include "ar9485_initvals.h"
  22#include "ar9340_initvals.h"
  23#include "ar9330_1p1_initvals.h"
  24#include "ar9330_1p2_initvals.h"
  25#include "ar955x_1p0_initvals.h"
  26#include "ar9580_1p0_initvals.h"
  27#include "ar9462_2p0_initvals.h"
  28#include "ar9462_2p1_initvals.h"
  29#include "ar9565_1p0_initvals.h"
  30#include "ar9565_1p1_initvals.h"
  31#include "ar953x_initvals.h"
 
  32
  33/* General hardware code for the AR9003 hadware family */
  34
  35/*
  36 * The AR9003 family uses a new INI format (pre, core, post
  37 * arrays per subsystem). This provides support for the
  38 * AR9003 2.2 chipsets.
  39 */
  40static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
  41{
  42	if (AR_SREV_9330_11(ah)) {
  43		/* mac */
  44		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
  45				ar9331_1p1_mac_core);
  46		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
  47				ar9331_1p1_mac_postamble);
  48
  49		/* bb */
  50		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
  51				ar9331_1p1_baseband_core);
  52		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
  53				ar9331_1p1_baseband_postamble);
  54
  55		/* radio */
  56		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
  57				ar9331_1p1_radio_core);
  58
  59		/* soc */
  60		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
  61				ar9331_1p1_soc_preamble);
  62		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
  63				ar9331_1p1_soc_postamble);
  64
  65		/* rx/tx gain */
  66		INIT_INI_ARRAY(&ah->iniModesRxGain,
  67				ar9331_common_rx_gain_1p1);
  68		INIT_INI_ARRAY(&ah->iniModesTxGain,
  69				ar9331_modes_lowest_ob_db_tx_gain_1p1);
  70
  71		/* Japan 2484 Mhz CCK */
  72		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
  73			       ar9331_1p1_baseband_core_txfir_coeff_japan_2484);
  74
  75		/* additional clock settings */
  76		if (ah->is_clk_25mhz)
  77			INIT_INI_ARRAY(&ah->iniAdditional,
  78					ar9331_1p1_xtal_25M);
  79		else
  80			INIT_INI_ARRAY(&ah->iniAdditional,
  81					ar9331_1p1_xtal_40M);
  82	} else if (AR_SREV_9330_12(ah)) {
  83		/* mac */
  84		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
  85				ar9331_1p2_mac_core);
  86		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
  87				ar9331_1p2_mac_postamble);
  88
  89		/* bb */
  90		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
  91				ar9331_1p2_baseband_core);
  92		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
  93				ar9331_1p2_baseband_postamble);
  94
  95		/* radio */
  96		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
  97				ar9331_1p2_radio_core);
  98
  99		/* soc */
 100		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 101				ar9331_1p2_soc_preamble);
 102		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 103				ar9331_1p2_soc_postamble);
 104
 105		/* rx/tx gain */
 106		INIT_INI_ARRAY(&ah->iniModesRxGain,
 107				ar9331_common_rx_gain_1p2);
 108		INIT_INI_ARRAY(&ah->iniModesTxGain,
 109				ar9331_modes_lowest_ob_db_tx_gain_1p2);
 110
 111		/* Japan 2484 Mhz CCK */
 112		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 113			       ar9331_1p2_baseband_core_txfir_coeff_japan_2484);
 114
 115		/* additional clock settings */
 116		if (ah->is_clk_25mhz)
 117			INIT_INI_ARRAY(&ah->iniAdditional,
 118					ar9331_1p2_xtal_25M);
 119		else
 120			INIT_INI_ARRAY(&ah->iniAdditional,
 121					ar9331_1p2_xtal_40M);
 122	} else if (AR_SREV_9340(ah)) {
 123		/* mac */
 124		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 125				ar9340_1p0_mac_core);
 126		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 127				ar9340_1p0_mac_postamble);
 128
 129		/* bb */
 130		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 131				ar9340_1p0_baseband_core);
 132		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 133				ar9340_1p0_baseband_postamble);
 134
 135		/* radio */
 136		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 137				ar9340_1p0_radio_core);
 138		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 139				ar9340_1p0_radio_postamble);
 140
 141		/* soc */
 142		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 143				ar9340_1p0_soc_preamble);
 144		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 145				ar9340_1p0_soc_postamble);
 146
 147		/* rx/tx gain */
 148		INIT_INI_ARRAY(&ah->iniModesRxGain,
 149				ar9340Common_wo_xlna_rx_gain_table_1p0);
 150		INIT_INI_ARRAY(&ah->iniModesTxGain,
 151				ar9340Modes_high_ob_db_tx_gain_table_1p0);
 152
 153		INIT_INI_ARRAY(&ah->iniModesFastClock,
 154			       ar9340Modes_fast_clock_1p0);
 155		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 156			       ar9340_1p0_baseband_core_txfir_coeff_japan_2484);
 157		INIT_INI_ARRAY(&ah->ini_dfs,
 158			       ar9340_1p0_baseband_postamble_dfs_channel);
 159
 160		if (!ah->is_clk_25mhz)
 161			INIT_INI_ARRAY(&ah->iniAdditional,
 162				       ar9340_1p0_radio_core_40M);
 163	} else if (AR_SREV_9485_11_OR_LATER(ah)) {
 164		/* mac */
 165		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 166				ar9485_1_1_mac_core);
 167		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 168				ar9485_1_1_mac_postamble);
 169
 170		/* bb */
 171		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], ar9485_1_1);
 172		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 173				ar9485_1_1_baseband_core);
 174		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 175				ar9485_1_1_baseband_postamble);
 176
 177		/* radio */
 178		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 179				ar9485_1_1_radio_core);
 180		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 181				ar9485_1_1_radio_postamble);
 182
 183		/* soc */
 184		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 185				ar9485_1_1_soc_preamble);
 186
 187		/* rx/tx gain */
 188		INIT_INI_ARRAY(&ah->iniModesRxGain,
 189				ar9485Common_wo_xlna_rx_gain_1_1);
 190		INIT_INI_ARRAY(&ah->iniModesTxGain,
 191				ar9485_modes_lowest_ob_db_tx_gain_1_1);
 192
 193		/* Japan 2484 Mhz CCK */
 194		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 195			       ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
 196
 197		if (ah->config.no_pll_pwrsave) {
 198			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 199				       ar9485_1_1_pcie_phy_clkreq_disable_L1);
 200			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 201				       ar9485_1_1_pcie_phy_clkreq_disable_L1);
 202		} else {
 203			INIT_INI_ARRAY(&ah->iniPcieSerdes,
 204				       ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
 205			INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 206				       ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
 207		}
 208	} else if (AR_SREV_9462_21(ah)) {
 209		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 210			       ar9462_2p1_mac_core);
 211		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 212			       ar9462_2p1_mac_postamble);
 213		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 214			       ar9462_2p1_baseband_core);
 215		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 216			       ar9462_2p1_baseband_postamble);
 217		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 218			       ar9462_2p1_radio_core);
 219		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 220			       ar9462_2p1_radio_postamble);
 221		INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant,
 222			       ar9462_2p1_radio_postamble_sys2ant);
 223		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 224			       ar9462_2p1_soc_preamble);
 225		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 226			       ar9462_2p1_soc_postamble);
 227		INIT_INI_ARRAY(&ah->iniModesRxGain,
 228			       ar9462_2p1_common_rx_gain);
 229		INIT_INI_ARRAY(&ah->iniModesFastClock,
 230			       ar9462_2p1_modes_fast_clock);
 231		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 232			       ar9462_2p1_baseband_core_txfir_coeff_japan_2484);
 233		INIT_INI_ARRAY(&ah->iniPcieSerdes,
 234			       ar9462_2p1_pciephy_clkreq_disable_L1);
 235		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 236			       ar9462_2p1_pciephy_clkreq_disable_L1);
 
 
 
 
 
 
 
 
 
 
 237	} else if (AR_SREV_9462_20(ah)) {
 238
 239		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core);
 240		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 241				ar9462_2p0_mac_postamble);
 242
 243		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 244				ar9462_2p0_baseband_core);
 245		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 246				ar9462_2p0_baseband_postamble);
 247
 248		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 249				ar9462_2p0_radio_core);
 250		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 251				ar9462_2p0_radio_postamble);
 252		INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant,
 253				ar9462_2p0_radio_postamble_sys2ant);
 254
 255		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 256				ar9462_2p0_soc_preamble);
 257		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 258				ar9462_2p0_soc_postamble);
 259
 260		INIT_INI_ARRAY(&ah->iniModesRxGain,
 261				ar9462_2p0_common_rx_gain);
 262
 263		/* Awake -> Sleep Setting */
 264		INIT_INI_ARRAY(&ah->iniPcieSerdes,
 265			       ar9462_2p0_pciephy_clkreq_disable_L1);
 
 
 
 
 266		/* Sleep -> Awake Setting */
 267		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 268			       ar9462_2p0_pciephy_clkreq_disable_L1);
 
 
 
 269
 270		/* Fast clock modal settings */
 271		INIT_INI_ARRAY(&ah->iniModesFastClock,
 272				ar9462_2p0_modes_fast_clock);
 273
 274		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 275			       ar9462_2p0_baseband_core_txfir_coeff_japan_2484);
 276	} else if (AR_SREV_9550(ah)) {
 277		/* mac */
 278		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 279				ar955x_1p0_mac_core);
 280		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 281				ar955x_1p0_mac_postamble);
 282
 283		/* bb */
 284		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 285				ar955x_1p0_baseband_core);
 286		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 287				ar955x_1p0_baseband_postamble);
 288
 289		/* radio */
 290		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 291				ar955x_1p0_radio_core);
 292		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 293				ar955x_1p0_radio_postamble);
 294
 295		/* soc */
 296		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 297				ar955x_1p0_soc_preamble);
 298		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 299				ar955x_1p0_soc_postamble);
 300
 301		/* rx/tx gain */
 302		INIT_INI_ARRAY(&ah->iniModesRxGain,
 303			ar955x_1p0_common_wo_xlna_rx_gain_table);
 304		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 305			ar955x_1p0_common_wo_xlna_rx_gain_bounds);
 306		INIT_INI_ARRAY(&ah->iniModesTxGain,
 307				ar955x_1p0_modes_xpa_tx_gain_table);
 308
 309		/* Fast clock modal settings */
 310		INIT_INI_ARRAY(&ah->iniModesFastClock,
 311				ar955x_1p0_modes_fast_clock);
 312	} else if (AR_SREV_9531(ah)) {
 313		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 314			       qca953x_1p0_mac_core);
 315		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 316			       qca953x_1p0_mac_postamble);
 317		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 318			       qca953x_1p0_baseband_core);
 319		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 320			       qca953x_1p0_baseband_postamble);
 
 
 
 
 
 
 
 321		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 322			       qca953x_1p0_radio_core);
 323		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 324			       qca953x_1p0_radio_postamble);
 325		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 326			       qca953x_1p0_soc_preamble);
 327		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 328			       qca953x_1p0_soc_postamble);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 329		INIT_INI_ARRAY(&ah->iniModesRxGain,
 330			       qca953x_1p0_common_wo_xlna_rx_gain_table);
 331		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 332			       qca953x_1p0_common_wo_xlna_rx_gain_bounds);
 333		INIT_INI_ARRAY(&ah->iniModesTxGain,
 334			       qca953x_1p0_modes_no_xpa_tx_gain_table);
 
 
 
 
 
 335		INIT_INI_ARRAY(&ah->iniModesFastClock,
 336			       qca953x_1p0_modes_fast_clock);
 337	} else if (AR_SREV_9580(ah)) {
 338		/* mac */
 339		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 340				ar9580_1p0_mac_core);
 341		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 342				ar9580_1p0_mac_postamble);
 343
 344		/* bb */
 345		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 346				ar9580_1p0_baseband_core);
 347		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 348				ar9580_1p0_baseband_postamble);
 349
 350		/* radio */
 351		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 352				ar9580_1p0_radio_core);
 353		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 354				ar9580_1p0_radio_postamble);
 355
 356		/* soc */
 357		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 358				ar9580_1p0_soc_preamble);
 359		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 360				ar9580_1p0_soc_postamble);
 361
 362		/* rx/tx gain */
 363		INIT_INI_ARRAY(&ah->iniModesRxGain,
 364				ar9580_1p0_rx_gain_table);
 365		INIT_INI_ARRAY(&ah->iniModesTxGain,
 366				ar9580_1p0_low_ob_db_tx_gain_table);
 367
 368		INIT_INI_ARRAY(&ah->iniModesFastClock,
 369			       ar9580_1p0_modes_fast_clock);
 370		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 371			       ar9580_1p0_baseband_core_txfir_coeff_japan_2484);
 372		INIT_INI_ARRAY(&ah->ini_dfs,
 373			       ar9580_1p0_baseband_postamble_dfs_channel);
 374	} else if (AR_SREV_9565_11_OR_LATER(ah)) {
 375		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 376			       ar9565_1p1_mac_core);
 377		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 378			       ar9565_1p1_mac_postamble);
 379
 380		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 381			       ar9565_1p1_baseband_core);
 382		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 383			       ar9565_1p1_baseband_postamble);
 384
 385		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 386			       ar9565_1p1_radio_core);
 387		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 388			       ar9565_1p1_radio_postamble);
 389
 390		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 391			       ar9565_1p1_soc_preamble);
 392		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 393			       ar9565_1p1_soc_postamble);
 394
 395		INIT_INI_ARRAY(&ah->iniModesRxGain,
 396			       ar9565_1p1_Common_rx_gain_table);
 397		INIT_INI_ARRAY(&ah->iniModesTxGain,
 398			       ar9565_1p1_Modes_lowest_ob_db_tx_gain_table);
 399
 400		INIT_INI_ARRAY(&ah->iniPcieSerdes,
 401			       ar9565_1p1_pciephy_clkreq_disable_L1);
 402		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 403			       ar9565_1p1_pciephy_clkreq_disable_L1);
 
 
 
 
 
 
 
 
 
 404
 405		INIT_INI_ARRAY(&ah->iniModesFastClock,
 406				ar9565_1p1_modes_fast_clock);
 407		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 408			       ar9565_1p1_baseband_core_txfir_coeff_japan_2484);
 409	} else if (AR_SREV_9565(ah)) {
 410		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 411			       ar9565_1p0_mac_core);
 412		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 413			       ar9565_1p0_mac_postamble);
 414
 415		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 416			       ar9565_1p0_baseband_core);
 417		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 418			       ar9565_1p0_baseband_postamble);
 419
 420		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 421			       ar9565_1p0_radio_core);
 422		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 423			       ar9565_1p0_radio_postamble);
 424
 425		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 426			       ar9565_1p0_soc_preamble);
 427		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 428			       ar9565_1p0_soc_postamble);
 429
 430		INIT_INI_ARRAY(&ah->iniModesRxGain,
 431			       ar9565_1p0_Common_rx_gain_table);
 432		INIT_INI_ARRAY(&ah->iniModesTxGain,
 433			       ar9565_1p0_Modes_lowest_ob_db_tx_gain_table);
 434
 435		INIT_INI_ARRAY(&ah->iniPcieSerdes,
 436			       ar9565_1p0_pciephy_clkreq_disable_L1);
 437		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 438			       ar9565_1p0_pciephy_clkreq_disable_L1);
 
 
 
 
 
 
 
 
 
 439
 440		INIT_INI_ARRAY(&ah->iniModesFastClock,
 441				ar9565_1p0_modes_fast_clock);
 442		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 443			       ar9565_1p0_baseband_core_txfir_coeff_japan_2484);
 444	} else {
 445		/* mac */
 446		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
 447				ar9300_2p2_mac_core);
 448		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
 449				ar9300_2p2_mac_postamble);
 450
 451		/* bb */
 452		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
 453				ar9300_2p2_baseband_core);
 454		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
 455				ar9300_2p2_baseband_postamble);
 456
 457		/* radio */
 458		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
 459				ar9300_2p2_radio_core);
 460		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
 461				ar9300_2p2_radio_postamble);
 462
 463		/* soc */
 464		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
 465				ar9300_2p2_soc_preamble);
 466		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
 467				ar9300_2p2_soc_postamble);
 468
 469		/* rx/tx gain */
 470		INIT_INI_ARRAY(&ah->iniModesRxGain,
 471				ar9300Common_rx_gain_table_2p2);
 472		INIT_INI_ARRAY(&ah->iniModesTxGain,
 473				ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
 474
 475		/* Load PCIE SERDES settings from INI */
 476
 477		/* Awake Setting */
 478
 479		INIT_INI_ARRAY(&ah->iniPcieSerdes,
 480				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
 481
 482		/* Sleep Setting */
 483
 484		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
 485				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
 486
 487		/* Fast clock modal settings */
 488		INIT_INI_ARRAY(&ah->iniModesFastClock,
 489			       ar9300Modes_fast_clock_2p2);
 490		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
 491			       ar9300_2p2_baseband_core_txfir_coeff_japan_2484);
 492		INIT_INI_ARRAY(&ah->ini_dfs,
 493			       ar9300_2p2_baseband_postamble_dfs_channel);
 494	}
 495}
 496
 497static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
 498{
 499	if (AR_SREV_9330_12(ah))
 500		INIT_INI_ARRAY(&ah->iniModesTxGain,
 501			ar9331_modes_lowest_ob_db_tx_gain_1p2);
 502	else if (AR_SREV_9330_11(ah))
 503		INIT_INI_ARRAY(&ah->iniModesTxGain,
 504			ar9331_modes_lowest_ob_db_tx_gain_1p1);
 505	else if (AR_SREV_9340(ah))
 506		INIT_INI_ARRAY(&ah->iniModesTxGain,
 507			ar9340Modes_lowest_ob_db_tx_gain_table_1p0);
 508	else if (AR_SREV_9485_11_OR_LATER(ah))
 509		INIT_INI_ARRAY(&ah->iniModesTxGain,
 510			ar9485_modes_lowest_ob_db_tx_gain_1_1);
 511	else if (AR_SREV_9550(ah))
 512		INIT_INI_ARRAY(&ah->iniModesTxGain,
 513			ar955x_1p0_modes_xpa_tx_gain_table);
 514	else if (AR_SREV_9531(ah))
 
 
 
 
 
 
 
 
 
 515		INIT_INI_ARRAY(&ah->iniModesTxGain,
 516			qca953x_1p0_modes_xpa_tx_gain_table);
 517	else if (AR_SREV_9580(ah))
 518		INIT_INI_ARRAY(&ah->iniModesTxGain,
 519			ar9580_1p0_lowest_ob_db_tx_gain_table);
 520	else if (AR_SREV_9462_21(ah))
 521		INIT_INI_ARRAY(&ah->iniModesTxGain,
 522			ar9462_2p1_modes_low_ob_db_tx_gain);
 523	else if (AR_SREV_9462_20(ah))
 524		INIT_INI_ARRAY(&ah->iniModesTxGain,
 525			ar9462_2p0_modes_low_ob_db_tx_gain);
 526	else if (AR_SREV_9565_11(ah))
 527		INIT_INI_ARRAY(&ah->iniModesTxGain,
 528			       ar9565_1p1_modes_low_ob_db_tx_gain_table);
 529	else if (AR_SREV_9565(ah))
 530		INIT_INI_ARRAY(&ah->iniModesTxGain,
 531			       ar9565_1p0_modes_low_ob_db_tx_gain_table);
 532	else
 533		INIT_INI_ARRAY(&ah->iniModesTxGain,
 534			ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
 535}
 536
 537static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
 538{
 539	if (AR_SREV_9330_12(ah))
 540		INIT_INI_ARRAY(&ah->iniModesTxGain,
 541			ar9331_modes_high_ob_db_tx_gain_1p2);
 542	else if (AR_SREV_9330_11(ah))
 543		INIT_INI_ARRAY(&ah->iniModesTxGain,
 544			ar9331_modes_high_ob_db_tx_gain_1p1);
 545	else if (AR_SREV_9340(ah))
 546		INIT_INI_ARRAY(&ah->iniModesTxGain,
 547			ar9340Modes_high_ob_db_tx_gain_table_1p0);
 548	else if (AR_SREV_9485_11_OR_LATER(ah))
 549		INIT_INI_ARRAY(&ah->iniModesTxGain,
 550			ar9485Modes_high_ob_db_tx_gain_1_1);
 551	else if (AR_SREV_9580(ah))
 552		INIT_INI_ARRAY(&ah->iniModesTxGain,
 553			ar9580_1p0_high_ob_db_tx_gain_table);
 554	else if (AR_SREV_9550(ah))
 555		INIT_INI_ARRAY(&ah->iniModesTxGain,
 556			ar955x_1p0_modes_no_xpa_tx_gain_table);
 557	else if (AR_SREV_9531(ah)) {
 558		if (AR_SREV_9531_11(ah))
 
 
 
 559			INIT_INI_ARRAY(&ah->iniModesTxGain,
 560				       qca953x_1p1_modes_no_xpa_tx_gain_table);
 561		else
 562			INIT_INI_ARRAY(&ah->iniModesTxGain,
 563				       qca953x_1p0_modes_no_xpa_tx_gain_table);
 564	} else if (AR_SREV_9462_21(ah))
 
 
 
 565		INIT_INI_ARRAY(&ah->iniModesTxGain,
 566			ar9462_2p1_modes_high_ob_db_tx_gain);
 567	else if (AR_SREV_9462_20(ah))
 568		INIT_INI_ARRAY(&ah->iniModesTxGain,
 569			ar9462_2p0_modes_high_ob_db_tx_gain);
 570	else if (AR_SREV_9565_11(ah))
 571		INIT_INI_ARRAY(&ah->iniModesTxGain,
 572			       ar9565_1p1_modes_high_ob_db_tx_gain_table);
 573	else if (AR_SREV_9565(ah))
 574		INIT_INI_ARRAY(&ah->iniModesTxGain,
 575			       ar9565_1p0_modes_high_ob_db_tx_gain_table);
 576	else
 577		INIT_INI_ARRAY(&ah->iniModesTxGain,
 578			ar9300Modes_high_ob_db_tx_gain_table_2p2);
 579}
 580
 581static void ar9003_tx_gain_table_mode2(struct ath_hw *ah)
 582{
 583	if (AR_SREV_9330_12(ah))
 584		INIT_INI_ARRAY(&ah->iniModesTxGain,
 585			ar9331_modes_low_ob_db_tx_gain_1p2);
 586	else if (AR_SREV_9330_11(ah))
 587		INIT_INI_ARRAY(&ah->iniModesTxGain,
 588			ar9331_modes_low_ob_db_tx_gain_1p1);
 589	else if (AR_SREV_9340(ah))
 590		INIT_INI_ARRAY(&ah->iniModesTxGain,
 591			ar9340Modes_low_ob_db_tx_gain_table_1p0);
 
 
 
 592	else if (AR_SREV_9485_11_OR_LATER(ah))
 593		INIT_INI_ARRAY(&ah->iniModesTxGain,
 594			ar9485Modes_low_ob_db_tx_gain_1_1);
 595	else if (AR_SREV_9580(ah))
 596		INIT_INI_ARRAY(&ah->iniModesTxGain,
 597			ar9580_1p0_low_ob_db_tx_gain_table);
 
 
 
 598	else if (AR_SREV_9565_11(ah))
 599		INIT_INI_ARRAY(&ah->iniModesTxGain,
 600			       ar9565_1p1_modes_low_ob_db_tx_gain_table);
 601	else if (AR_SREV_9565(ah))
 602		INIT_INI_ARRAY(&ah->iniModesTxGain,
 603			       ar9565_1p0_modes_low_ob_db_tx_gain_table);
 604	else
 605		INIT_INI_ARRAY(&ah->iniModesTxGain,
 606			ar9300Modes_low_ob_db_tx_gain_table_2p2);
 607}
 608
 609static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)
 610{
 611	if (AR_SREV_9330_12(ah))
 612		INIT_INI_ARRAY(&ah->iniModesTxGain,
 613			ar9331_modes_high_power_tx_gain_1p2);
 614	else if (AR_SREV_9330_11(ah))
 615		INIT_INI_ARRAY(&ah->iniModesTxGain,
 616			ar9331_modes_high_power_tx_gain_1p1);
 617	else if (AR_SREV_9340(ah))
 618		INIT_INI_ARRAY(&ah->iniModesTxGain,
 619			ar9340Modes_high_power_tx_gain_table_1p0);
 620	else if (AR_SREV_9485_11_OR_LATER(ah))
 621		INIT_INI_ARRAY(&ah->iniModesTxGain,
 622			ar9485Modes_high_power_tx_gain_1_1);
 623	else if (AR_SREV_9580(ah))
 624		INIT_INI_ARRAY(&ah->iniModesTxGain,
 625			ar9580_1p0_high_power_tx_gain_table);
 626	else if (AR_SREV_9565_11(ah))
 627		INIT_INI_ARRAY(&ah->iniModesTxGain,
 628			       ar9565_1p1_modes_high_power_tx_gain_table);
 629	else if (AR_SREV_9565(ah))
 630		INIT_INI_ARRAY(&ah->iniModesTxGain,
 631			       ar9565_1p0_modes_high_power_tx_gain_table);
 632	else {
 633		if (ah->config.tx_gain_buffalo)
 634			INIT_INI_ARRAY(&ah->iniModesTxGain,
 635				       ar9300Modes_high_power_tx_gain_table_buffalo);
 636		else
 637			INIT_INI_ARRAY(&ah->iniModesTxGain,
 638				       ar9300Modes_high_power_tx_gain_table_2p2);
 639	}
 640}
 641
 642static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
 643{
 644	if (AR_SREV_9340(ah))
 645		INIT_INI_ARRAY(&ah->iniModesTxGain,
 646			ar9340Modes_mixed_ob_db_tx_gain_table_1p0);
 647	else if (AR_SREV_9580(ah))
 648		INIT_INI_ARRAY(&ah->iniModesTxGain,
 649			ar9580_1p0_mixed_ob_db_tx_gain_table);
 650	else if (AR_SREV_9462_21(ah))
 651		INIT_INI_ARRAY(&ah->iniModesTxGain,
 652		       ar9462_2p1_modes_mix_ob_db_tx_gain);
 653	else if (AR_SREV_9462_20(ah))
 654		INIT_INI_ARRAY(&ah->iniModesTxGain,
 655		       ar9462_2p0_modes_mix_ob_db_tx_gain);
 656	else
 657		INIT_INI_ARRAY(&ah->iniModesTxGain,
 658			ar9300Modes_mixed_ob_db_tx_gain_table_2p2);
 659}
 660
 661static void ar9003_tx_gain_table_mode5(struct ath_hw *ah)
 662{
 663	if (AR_SREV_9485_11_OR_LATER(ah))
 664		INIT_INI_ARRAY(&ah->iniModesTxGain,
 665			ar9485Modes_green_ob_db_tx_gain_1_1);
 666	else if (AR_SREV_9340(ah))
 667		INIT_INI_ARRAY(&ah->iniModesTxGain,
 668			ar9340Modes_ub124_tx_gain_table_1p0);
 669	else if (AR_SREV_9580(ah))
 670		INIT_INI_ARRAY(&ah->iniModesTxGain,
 671			ar9580_1p0_type5_tx_gain_table);
 
 
 
 672	else if (AR_SREV_9300_22(ah))
 673		INIT_INI_ARRAY(&ah->iniModesTxGain,
 674			ar9300Modes_type5_tx_gain_table_2p2);
 675}
 676
 677static void ar9003_tx_gain_table_mode6(struct ath_hw *ah)
 678{
 679	if (AR_SREV_9340(ah))
 680		INIT_INI_ARRAY(&ah->iniModesTxGain,
 681			ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0);
 682	else if (AR_SREV_9485_11_OR_LATER(ah))
 683		INIT_INI_ARRAY(&ah->iniModesTxGain,
 684			ar9485Modes_green_spur_ob_db_tx_gain_1_1);
 685	else if (AR_SREV_9580(ah))
 686		INIT_INI_ARRAY(&ah->iniModesTxGain,
 687			ar9580_1p0_type6_tx_gain_table);
 688}
 689
 690static void ar9003_tx_gain_table_mode7(struct ath_hw *ah)
 691{
 692	if (AR_SREV_9340(ah))
 693		INIT_INI_ARRAY(&ah->iniModesTxGain,
 694			       ar9340_cus227_tx_gain_table_1p0);
 695}
 696
 697typedef void (*ath_txgain_tab)(struct ath_hw *ah);
 698
 699static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
 700{
 701	static const ath_txgain_tab modes[] = {
 702		ar9003_tx_gain_table_mode0,
 703		ar9003_tx_gain_table_mode1,
 704		ar9003_tx_gain_table_mode2,
 705		ar9003_tx_gain_table_mode3,
 706		ar9003_tx_gain_table_mode4,
 707		ar9003_tx_gain_table_mode5,
 708		ar9003_tx_gain_table_mode6,
 709		ar9003_tx_gain_table_mode7,
 710	};
 711	int idx = ar9003_hw_get_tx_gain_idx(ah);
 712
 713	if (idx >= ARRAY_SIZE(modes))
 714		idx = 0;
 715
 716	modes[idx](ah);
 717}
 718
 719static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
 720{
 721	if (AR_SREV_9330_12(ah))
 722		INIT_INI_ARRAY(&ah->iniModesRxGain,
 723				ar9331_common_rx_gain_1p2);
 724	else if (AR_SREV_9330_11(ah))
 725		INIT_INI_ARRAY(&ah->iniModesRxGain,
 726				ar9331_common_rx_gain_1p1);
 727	else if (AR_SREV_9340(ah))
 728		INIT_INI_ARRAY(&ah->iniModesRxGain,
 729				ar9340Common_rx_gain_table_1p0);
 730	else if (AR_SREV_9485_11_OR_LATER(ah))
 731		INIT_INI_ARRAY(&ah->iniModesRxGain,
 732			       ar9485_common_rx_gain_1_1);
 733	else if (AR_SREV_9550(ah)) {
 734		INIT_INI_ARRAY(&ah->iniModesRxGain,
 735				ar955x_1p0_common_rx_gain_table);
 736		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 737				ar955x_1p0_common_rx_gain_bounds);
 738	} else if (AR_SREV_9531(ah)) {
 739		INIT_INI_ARRAY(&ah->iniModesRxGain,
 740			       qca953x_1p0_common_rx_gain_table);
 741		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 742			       qca953x_1p0_common_rx_gain_bounds);
 
 
 
 
 
 
 
 743	} else if (AR_SREV_9580(ah))
 744		INIT_INI_ARRAY(&ah->iniModesRxGain,
 745				ar9580_1p0_rx_gain_table);
 746	else if (AR_SREV_9462_21(ah))
 747		INIT_INI_ARRAY(&ah->iniModesRxGain,
 748				ar9462_2p1_common_rx_gain);
 749	else if (AR_SREV_9462_20(ah))
 750		INIT_INI_ARRAY(&ah->iniModesRxGain,
 751				ar9462_2p0_common_rx_gain);
 752	else if (AR_SREV_9565_11(ah))
 753		INIT_INI_ARRAY(&ah->iniModesRxGain,
 754			       ar9565_1p1_Common_rx_gain_table);
 755	else if (AR_SREV_9565(ah))
 756		INIT_INI_ARRAY(&ah->iniModesRxGain,
 757			       ar9565_1p0_Common_rx_gain_table);
 758	else
 759		INIT_INI_ARRAY(&ah->iniModesRxGain,
 760				ar9300Common_rx_gain_table_2p2);
 761}
 762
 763static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
 764{
 765	if (AR_SREV_9330_12(ah))
 766		INIT_INI_ARRAY(&ah->iniModesRxGain,
 767			ar9331_common_wo_xlna_rx_gain_1p2);
 768	else if (AR_SREV_9330_11(ah))
 769		INIT_INI_ARRAY(&ah->iniModesRxGain,
 770			ar9331_common_wo_xlna_rx_gain_1p1);
 771	else if (AR_SREV_9340(ah))
 772		INIT_INI_ARRAY(&ah->iniModesRxGain,
 773			ar9340Common_wo_xlna_rx_gain_table_1p0);
 774	else if (AR_SREV_9485_11_OR_LATER(ah))
 775		INIT_INI_ARRAY(&ah->iniModesRxGain,
 776			ar9485Common_wo_xlna_rx_gain_1_1);
 777	else if (AR_SREV_9462_21(ah))
 778		INIT_INI_ARRAY(&ah->iniModesRxGain,
 779			ar9462_2p1_common_wo_xlna_rx_gain);
 780	else if (AR_SREV_9462_20(ah))
 781		INIT_INI_ARRAY(&ah->iniModesRxGain,
 782			ar9462_2p0_common_wo_xlna_rx_gain);
 783	else if (AR_SREV_9550(ah)) {
 784		INIT_INI_ARRAY(&ah->iniModesRxGain,
 785			ar955x_1p0_common_wo_xlna_rx_gain_table);
 786		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 787			ar955x_1p0_common_wo_xlna_rx_gain_bounds);
 788	} else if (AR_SREV_9531(ah)) {
 789		INIT_INI_ARRAY(&ah->iniModesRxGain,
 790			       qca953x_1p0_common_wo_xlna_rx_gain_table);
 791		INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
 792			       qca953x_1p0_common_wo_xlna_rx_gain_bounds);
 
 
 
 
 
 
 
 
 
 
 793	} else if (AR_SREV_9580(ah))
 794		INIT_INI_ARRAY(&ah->iniModesRxGain,
 795			ar9580_1p0_wo_xlna_rx_gain_table);
 796	else if (AR_SREV_9565_11(ah))
 797		INIT_INI_ARRAY(&ah->iniModesRxGain,
 798			       ar9565_1p1_common_wo_xlna_rx_gain_table);
 799	else if (AR_SREV_9565(ah))
 800		INIT_INI_ARRAY(&ah->iniModesRxGain,
 801			       ar9565_1p0_common_wo_xlna_rx_gain_table);
 802	else
 803		INIT_INI_ARRAY(&ah->iniModesRxGain,
 804			ar9300Common_wo_xlna_rx_gain_table_2p2);
 805}
 806
 807static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)
 808{
 809	if (AR_SREV_9462_21(ah)) {
 810		INIT_INI_ARRAY(&ah->iniModesRxGain,
 811			       ar9462_2p1_common_mixed_rx_gain);
 812		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
 813			       ar9462_2p1_baseband_core_mix_rxgain);
 814		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
 815			       ar9462_2p1_baseband_postamble_mix_rxgain);
 816		INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
 817			       ar9462_2p1_baseband_postamble_5g_xlna);
 818	} else if (AR_SREV_9462_20(ah)) {
 819		INIT_INI_ARRAY(&ah->iniModesRxGain,
 820			       ar9462_2p0_common_mixed_rx_gain);
 821		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
 822			       ar9462_2p0_baseband_core_mix_rxgain);
 823		INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
 824			       ar9462_2p0_baseband_postamble_mix_rxgain);
 825		INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
 826			       ar9462_2p0_baseband_postamble_5g_xlna);
 827	}
 828}
 829
 830static void ar9003_rx_gain_table_mode3(struct ath_hw *ah)
 831{
 832	if (AR_SREV_9462_21(ah)) {
 833		INIT_INI_ARRAY(&ah->iniModesRxGain,
 834			       ar9462_2p1_common_5g_xlna_only_rxgain);
 835		INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
 836			       ar9462_2p1_baseband_postamble_5g_xlna);
 837	} else if (AR_SREV_9462_20(ah)) {
 838		INIT_INI_ARRAY(&ah->iniModesRxGain,
 839			       ar9462_2p0_common_5g_xlna_only_rxgain);
 840		INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
 841			       ar9462_2p0_baseband_postamble_5g_xlna);
 842	}
 843}
 844
 845static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
 846{
 847	switch (ar9003_hw_get_rx_gain_idx(ah)) {
 848	case 0:
 849	default:
 850		ar9003_rx_gain_table_mode0(ah);
 851		break;
 852	case 1:
 853		ar9003_rx_gain_table_mode1(ah);
 854		break;
 855	case 2:
 856		ar9003_rx_gain_table_mode2(ah);
 857		break;
 858	case 3:
 859		ar9003_rx_gain_table_mode3(ah);
 860		break;
 861	}
 862}
 863
 864/* set gain table pointers according to values read from the eeprom */
 865static void ar9003_hw_init_mode_gain_regs(struct ath_hw *ah)
 866{
 867	ar9003_tx_gain_table_apply(ah);
 868	ar9003_rx_gain_table_apply(ah);
 869}
 870
 871/*
 872 * Helper for ASPM support.
 873 *
 874 * Disable PLL when in L0s as well as receiver clock when in L1.
 875 * This power saving option must be enabled through the SerDes.
 876 *
 877 * Programming the SerDes must go through the same 288 bit serial shift
 878 * register as the other analog registers.  Hence the 9 writes.
 879 */
 880static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
 881					 bool power_off)
 882{
 883	unsigned int i;
 884	struct ar5416IniArray *array;
 885
 886	/*
 887	 * Increase L1 Entry Latency. Some WB222 boards don't have
 888	 * this change in eeprom/OTP.
 889	 *
 890	 */
 891	if (AR_SREV_9462(ah)) {
 892		u32 val = ah->config.aspm_l1_fix;
 893		if ((val & 0xff000000) == 0x17000000) {
 894			val &= 0x00ffffff;
 895			val |= 0x27000000;
 896			REG_WRITE(ah, 0x570c, val);
 897		}
 898	}
 899
 900	/* Nothing to do on restore for 11N */
 901	if (!power_off /* !restore */) {
 902		/* set bit 19 to allow forcing of pcie core into L1 state */
 903		REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
 904		REG_WRITE(ah, AR_WA, ah->WARegVal);
 905	}
 906
 907	/*
 908	 * Configire PCIE after Ini init. SERDES values now come from ini file
 909	 * This enables PCIe low power mode.
 910	 */
 911	array = power_off ? &ah->iniPcieSerdes :
 912		&ah->iniPcieSerdesLowPower;
 913
 914	for (i = 0; i < array->ia_rows; i++) {
 915		REG_WRITE(ah,
 916			  INI_RA(array, i, 0),
 917			  INI_RA(array, i, 1));
 918	}
 919}
 920
 921static void ar9003_hw_init_hang_checks(struct ath_hw *ah)
 922{
 923	/*
 924	 * All chips support detection of BB/MAC hangs.
 925	 */
 926	ah->config.hw_hang_checks |= HW_BB_WATCHDOG;
 927	ah->config.hw_hang_checks |= HW_MAC_HANG;
 928
 929	/*
 930	 * This is not required for AR9580 1.0
 931	 */
 932	if (AR_SREV_9300_22(ah))
 933		ah->config.hw_hang_checks |= HW_PHYRESTART_CLC_WAR;
 934
 935	if (AR_SREV_9330(ah))
 936		ah->bb_watchdog_timeout_ms = 85;
 937	else
 938		ah->bb_watchdog_timeout_ms = 25;
 939}
 940
 941/*
 942 * MAC HW hang check
 943 * =================
 944 *
 945 * Signature: dcu_chain_state is 0x6 and dcu_complete_state is 0x1.
 946 *
 947 * The state of each DCU chain (mapped to TX queues) is available from these
 948 * DMA debug registers:
 949 *
 950 * Chain 0 state : Bits 4:0   of AR_DMADBG_4
 951 * Chain 1 state : Bits 9:5   of AR_DMADBG_4
 952 * Chain 2 state : Bits 14:10 of AR_DMADBG_4
 953 * Chain 3 state : Bits 19:15 of AR_DMADBG_4
 954 * Chain 4 state : Bits 24:20 of AR_DMADBG_4
 955 * Chain 5 state : Bits 29:25 of AR_DMADBG_4
 956 * Chain 6 state : Bits 4:0   of AR_DMADBG_5
 957 * Chain 7 state : Bits 9:5   of AR_DMADBG_5
 958 * Chain 8 state : Bits 14:10 of AR_DMADBG_5
 959 * Chain 9 state : Bits 19:15 of AR_DMADBG_5
 960 *
 961 * The DCU chain state "0x6" means "WAIT_FRDONE" - wait for TX frame to be done.
 962 */
 963
 964#define NUM_STATUS_READS 50
 965
 966static bool ath9k_hw_verify_hang(struct ath_hw *ah, unsigned int queue)
 967{
 968	u32 dma_dbg_chain, dma_dbg_complete;
 969	u8 dcu_chain_state, dcu_complete_state;
 
 970	int i;
 971
 
 
 
 
 
 
 
 
 972	for (i = 0; i < NUM_STATUS_READS; i++) {
 973		if (queue < 6)
 974			dma_dbg_chain = REG_READ(ah, AR_DMADBG_4);
 975		else
 976			dma_dbg_chain = REG_READ(ah, AR_DMADBG_5);
 977
 978		dma_dbg_complete = REG_READ(ah, AR_DMADBG_6);
 979
 980		dcu_chain_state = (dma_dbg_chain >> (5 * queue)) & 0x1f;
 981		dcu_complete_state = dma_dbg_complete & 0x3;
 982
 983		if ((dcu_chain_state != 0x6) || (dcu_complete_state != 0x1))
 984			return false;
 985	}
 986
 987	ath_dbg(ath9k_hw_common(ah), RESET,
 988		"MAC Hang signature found for queue: %d\n", queue);
 989
 990	return true;
 991}
 992
 993static bool ar9003_hw_detect_mac_hang(struct ath_hw *ah)
 994{
 995	u32 dma_dbg_4, dma_dbg_5, dma_dbg_6, chk_dbg;
 996	u8 dcu_chain_state, dcu_complete_state;
 997	bool dcu_wait_frdone = false;
 998	unsigned long chk_dcu = 0;
 
 999	unsigned int i = 0;
1000
1001	dma_dbg_4 = REG_READ(ah, AR_DMADBG_4);
1002	dma_dbg_5 = REG_READ(ah, AR_DMADBG_5);
1003	dma_dbg_6 = REG_READ(ah, AR_DMADBG_6);
1004
1005	dcu_complete_state = dma_dbg_6 & 0x3;
1006	if (dcu_complete_state != 0x1)
1007		goto exit;
1008
1009	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
1010		if (i < 6)
1011			chk_dbg = dma_dbg_4;
1012		else
 
1013			chk_dbg = dma_dbg_5;
 
 
1014
1015		dcu_chain_state = (chk_dbg >> (5 * i)) & 0x1f;
1016		if (dcu_chain_state == 0x6) {
1017			dcu_wait_frdone = true;
1018			chk_dcu |= BIT(i);
1019		}
1020	}
1021
1022	if ((dcu_complete_state == 0x1) && dcu_wait_frdone) {
1023		for_each_set_bit(i, &chk_dcu, ATH9K_NUM_TX_QUEUES) {
1024			if (ath9k_hw_verify_hang(ah, i))
1025				return true;
1026		}
1027	}
1028exit:
1029	return false;
1030}
1031
1032/* Sets up the AR9003 hardware familiy callbacks */
1033void ar9003_hw_attach_ops(struct ath_hw *ah)
1034{
1035	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
1036	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
1037
1038	ar9003_hw_init_mode_regs(ah);
 
 
 
 
 
 
1039	priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
1040	priv_ops->init_hang_checks = ar9003_hw_init_hang_checks;
1041	priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang;
1042
1043	ops->config_pci_powersave = ar9003_hw_configpcipowersave;
1044
1045	ar9003_hw_attach_phy_ops(ah);
1046	ar9003_hw_attach_calib_ops(ah);
1047	ar9003_hw_attach_mac_ops(ah);
 
1048}