cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ar9003_hw.c (37747B)


      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, AR_PCIE_PM_CTRL_ENA);
   1036		REG_WRITE(ah, AR_WA, 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	int i;
   1103
   1104	for (i = 0; i < NUM_STATUS_READS; i++) {
   1105		if (queue < 6)
   1106			dma_dbg_chain = REG_READ(ah, AR_DMADBG_4);
   1107		else
   1108			dma_dbg_chain = REG_READ(ah, AR_DMADBG_5);
   1109
   1110		dma_dbg_complete = REG_READ(ah, AR_DMADBG_6);
   1111
   1112		dcu_chain_state = (dma_dbg_chain >> (5 * queue)) & 0x1f;
   1113		dcu_complete_state = dma_dbg_complete & 0x3;
   1114
   1115		if ((dcu_chain_state != 0x6) || (dcu_complete_state != 0x1))
   1116			return false;
   1117	}
   1118
   1119	ath_dbg(ath9k_hw_common(ah), RESET,
   1120		"MAC Hang signature found for queue: %d\n", queue);
   1121
   1122	return true;
   1123}
   1124
   1125static bool ar9003_hw_detect_mac_hang(struct ath_hw *ah)
   1126{
   1127	u32 dma_dbg_4, dma_dbg_5, dma_dbg_6, chk_dbg;
   1128	u8 dcu_chain_state, dcu_complete_state;
   1129	bool dcu_wait_frdone = false;
   1130	unsigned long chk_dcu = 0;
   1131	unsigned int i = 0;
   1132
   1133	dma_dbg_4 = REG_READ(ah, AR_DMADBG_4);
   1134	dma_dbg_5 = REG_READ(ah, AR_DMADBG_5);
   1135	dma_dbg_6 = REG_READ(ah, AR_DMADBG_6);
   1136
   1137	dcu_complete_state = dma_dbg_6 & 0x3;
   1138	if (dcu_complete_state != 0x1)
   1139		goto exit;
   1140
   1141	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
   1142		if (i < 6)
   1143			chk_dbg = dma_dbg_4;
   1144		else
   1145			chk_dbg = dma_dbg_5;
   1146
   1147		dcu_chain_state = (chk_dbg >> (5 * i)) & 0x1f;
   1148		if (dcu_chain_state == 0x6) {
   1149			dcu_wait_frdone = true;
   1150			chk_dcu |= BIT(i);
   1151		}
   1152	}
   1153
   1154	if ((dcu_complete_state == 0x1) && dcu_wait_frdone) {
   1155		for_each_set_bit(i, &chk_dcu, ATH9K_NUM_TX_QUEUES) {
   1156			if (ath9k_hw_verify_hang(ah, i))
   1157				return true;
   1158		}
   1159	}
   1160exit:
   1161	return false;
   1162}
   1163
   1164/* Sets up the AR9003 hardware familiy callbacks */
   1165void ar9003_hw_attach_ops(struct ath_hw *ah)
   1166{
   1167	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
   1168	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
   1169
   1170	ar9003_hw_init_mode_regs(ah);
   1171
   1172	if (AR_SREV_9003_PCOEM(ah)) {
   1173		WARN_ON(!ah->iniPcieSerdes.ia_array);
   1174		WARN_ON(!ah->iniPcieSerdesLowPower.ia_array);
   1175	}
   1176
   1177	priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
   1178	priv_ops->init_hang_checks = ar9003_hw_init_hang_checks;
   1179	priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang;
   1180
   1181	ops->config_pci_powersave = ar9003_hw_configpcipowersave;
   1182
   1183	ar9003_hw_attach_phy_ops(ah);
   1184	ar9003_hw_attach_calib_ops(ah);
   1185	ar9003_hw_attach_mac_ops(ah);
   1186	ar9003_hw_attach_aic_ops(ah);
   1187}