linux/drivers/net/wireless/ath/ath9k/ar9003_hw.c
<<
>>
Prefs
   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}
1188