root/drivers/net/wireless/ath/ath5k/reset.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ath5k_hw_register_timeout
  2. ath5k_hw_htoclock
  3. ath5k_hw_clocktoh
  4. ath5k_hw_init_core_clock
  5. ath5k_hw_set_sleep_clock
  6. ath5k_hw_nic_reset
  7. ath5k_hw_wisoc_reset
  8. ath5k_hw_set_power_mode
  9. ath5k_hw_on_hold
  10. ath5k_hw_nic_wakeup
  11. ath5k_hw_tweak_initval_settings
  12. ath5k_hw_commit_eeprom_settings
  13. ath5k_hw_reset

   1 /*
   2  * Copyright (c) 2004-2008 Reyk Floeter <reyk@openbsd.org>
   3  * Copyright (c) 2006-2008 Nick Kossifidis <mickflemm@gmail.com>
   4  * Copyright (c) 2007-2008 Luis Rodriguez <mcgrof@winlab.rutgers.edu>
   5  * Copyright (c) 2007-2008 Pavel Roskin <proski@gnu.org>
   6  * Copyright (c) 2007-2008 Jiri Slaby <jirislaby@gmail.com>
   7  *
   8  * Permission to use, copy, modify, and distribute this software for any
   9  * purpose with or without fee is hereby granted, provided that the above
  10  * copyright notice and this permission notice appear in all copies.
  11  *
  12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19  *
  20  */
  21 
  22 /****************************\
  23   Reset function and helpers
  24 \****************************/
  25 
  26 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  27 
  28 #include <asm/unaligned.h>
  29 
  30 #include <linux/pci.h>          /* To determine if a card is pci-e */
  31 #include <linux/log2.h>
  32 #include <linux/platform_device.h>
  33 #include "ath5k.h"
  34 #include "reg.h"
  35 #include "debug.h"
  36 
  37 
  38 /**
  39  * DOC: Reset function and helpers
  40  *
  41  * Here we implement the main reset routine, used to bring the card
  42  * to a working state and ready to receive. We also handle routines
  43  * that don't fit on other places such as clock, sleep and power control
  44  */
  45 
  46 
  47 /******************\
  48 * Helper functions *
  49 \******************/
  50 
  51 /**
  52  * ath5k_hw_register_timeout() - Poll a register for a flag/field change
  53  * @ah: The &struct ath5k_hw
  54  * @reg: The register to read
  55  * @flag: The flag/field to check on the register
  56  * @val: The field value we expect (if we check a field)
  57  * @is_set: Instead of checking if the flag got cleared, check if it got set
  58  *
  59  * Some registers contain flags that indicate that an operation is
  60  * running. We use this function to poll these registers and check
  61  * if these flags get cleared. We also use it to poll a register
  62  * field (containing multiple flags) until it gets a specific value.
  63  *
  64  * Returns -EAGAIN if we exceeded AR5K_TUNE_REGISTER_TIMEOUT * 15us or 0
  65  */
  66 int
  67 ath5k_hw_register_timeout(struct ath5k_hw *ah, u32 reg, u32 flag, u32 val,
  68                               bool is_set)
  69 {
  70         int i;
  71         u32 data;
  72 
  73         for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
  74                 data = ath5k_hw_reg_read(ah, reg);
  75                 if (is_set && (data & flag))
  76                         break;
  77                 else if ((data & flag) == val)
  78                         break;
  79                 udelay(15);
  80         }
  81 
  82         return (i <= 0) ? -EAGAIN : 0;
  83 }
  84 
  85 
  86 /*************************\
  87 * Clock related functions *
  88 \*************************/
  89 
  90 /**
  91  * ath5k_hw_htoclock() - Translate usec to hw clock units
  92  * @ah: The &struct ath5k_hw
  93  * @usec: value in microseconds
  94  *
  95  * Translate usecs to hw clock units based on the current
  96  * hw clock rate.
  97  *
  98  * Returns number of clock units
  99  */
 100 unsigned int
 101 ath5k_hw_htoclock(struct ath5k_hw *ah, unsigned int usec)
 102 {
 103         struct ath_common *common = ath5k_hw_common(ah);
 104         return usec * common->clockrate;
 105 }
 106 
 107 /**
 108  * ath5k_hw_clocktoh() - Translate hw clock units to usec
 109  * @ah: The &struct ath5k_hw
 110  * @clock: value in hw clock units
 111  *
 112  * Translate hw clock units to usecs based on the current
 113  * hw clock rate.
 114  *
 115  * Returns number of usecs
 116  */
 117 unsigned int
 118 ath5k_hw_clocktoh(struct ath5k_hw *ah, unsigned int clock)
 119 {
 120         struct ath_common *common = ath5k_hw_common(ah);
 121         return clock / common->clockrate;
 122 }
 123 
 124 /**
 125  * ath5k_hw_init_core_clock() - Initialize core clock
 126  * @ah: The &struct ath5k_hw
 127  *
 128  * Initialize core clock parameters (usec, usec32, latencies etc),
 129  * based on current bwmode and chipset properties.
 130  */
 131 static void
 132 ath5k_hw_init_core_clock(struct ath5k_hw *ah)
 133 {
 134         struct ieee80211_channel *channel = ah->ah_current_channel;
 135         struct ath_common *common = ath5k_hw_common(ah);
 136         u32 usec_reg, txlat, rxlat, usec, clock, sclock, txf2txs;
 137 
 138         /*
 139          * Set core clock frequency
 140          */
 141         switch (channel->hw_value) {
 142         case AR5K_MODE_11A:
 143                 clock = 40;
 144                 break;
 145         case AR5K_MODE_11B:
 146                 clock = 22;
 147                 break;
 148         case AR5K_MODE_11G:
 149         default:
 150                 clock = 44;
 151                 break;
 152         }
 153 
 154         /* Use clock multiplier for non-default
 155          * bwmode */
 156         switch (ah->ah_bwmode) {
 157         case AR5K_BWMODE_40MHZ:
 158                 clock *= 2;
 159                 break;
 160         case AR5K_BWMODE_10MHZ:
 161                 clock /= 2;
 162                 break;
 163         case AR5K_BWMODE_5MHZ:
 164                 clock /= 4;
 165                 break;
 166         default:
 167                 break;
 168         }
 169 
 170         common->clockrate = clock;
 171 
 172         /*
 173          * Set USEC parameters
 174          */
 175         /* Set USEC counter on PCU*/
 176         usec = clock - 1;
 177         usec = AR5K_REG_SM(usec, AR5K_USEC_1);
 178 
 179         /* Set usec duration on DCU */
 180         if (ah->ah_version != AR5K_AR5210)
 181                 AR5K_REG_WRITE_BITS(ah, AR5K_DCU_GBL_IFS_MISC,
 182                                         AR5K_DCU_GBL_IFS_MISC_USEC_DUR,
 183                                         clock);
 184 
 185         /* Set 32MHz USEC counter */
 186         if ((ah->ah_radio == AR5K_RF5112) ||
 187             (ah->ah_radio == AR5K_RF2413) ||
 188             (ah->ah_radio == AR5K_RF5413) ||
 189             (ah->ah_radio == AR5K_RF2316) ||
 190             (ah->ah_radio == AR5K_RF2317))
 191                 /* Remain on 40MHz clock ? */
 192                 sclock = 40 - 1;
 193         else
 194                 sclock = 32 - 1;
 195         sclock = AR5K_REG_SM(sclock, AR5K_USEC_32);
 196 
 197         /*
 198          * Set tx/rx latencies
 199          */
 200         usec_reg = ath5k_hw_reg_read(ah, AR5K_USEC_5211);
 201         txlat = AR5K_REG_MS(usec_reg, AR5K_USEC_TX_LATENCY_5211);
 202         rxlat = AR5K_REG_MS(usec_reg, AR5K_USEC_RX_LATENCY_5211);
 203 
 204         /*
 205          * Set default Tx frame to Tx data start delay
 206          */
 207         txf2txs = AR5K_INIT_TXF2TXD_START_DEFAULT;
 208 
 209         /*
 210          * 5210 initvals don't include usec settings
 211          * so we need to use magic values here for
 212          * tx/rx latencies
 213          */
 214         if (ah->ah_version == AR5K_AR5210) {
 215                 /* same for turbo */
 216                 txlat = AR5K_INIT_TX_LATENCY_5210;
 217                 rxlat = AR5K_INIT_RX_LATENCY_5210;
 218         }
 219 
 220         if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
 221                 /* 5311 has different tx/rx latency masks
 222                  * from 5211, since we deal 5311 the same
 223                  * as 5211 when setting initvals, shift
 224                  * values here to their proper locations
 225                  *
 226                  * Note: Initvals indicate tx/rx/ latencies
 227                  * are the same for turbo mode */
 228                 txlat = AR5K_REG_SM(txlat, AR5K_USEC_TX_LATENCY_5210);
 229                 rxlat = AR5K_REG_SM(rxlat, AR5K_USEC_RX_LATENCY_5210);
 230         } else
 231         switch (ah->ah_bwmode) {
 232         case AR5K_BWMODE_10MHZ:
 233                 txlat = AR5K_REG_SM(txlat * 2,
 234                                 AR5K_USEC_TX_LATENCY_5211);
 235                 rxlat = AR5K_REG_SM(AR5K_INIT_RX_LAT_MAX,
 236                                 AR5K_USEC_RX_LATENCY_5211);
 237                 txf2txs = AR5K_INIT_TXF2TXD_START_DELAY_10MHZ;
 238                 break;
 239         case AR5K_BWMODE_5MHZ:
 240                 txlat = AR5K_REG_SM(txlat * 4,
 241                                 AR5K_USEC_TX_LATENCY_5211);
 242                 rxlat = AR5K_REG_SM(AR5K_INIT_RX_LAT_MAX,
 243                                 AR5K_USEC_RX_LATENCY_5211);
 244                 txf2txs = AR5K_INIT_TXF2TXD_START_DELAY_5MHZ;
 245                 break;
 246         case AR5K_BWMODE_40MHZ:
 247                 txlat = AR5K_INIT_TX_LAT_MIN;
 248                 rxlat = AR5K_REG_SM(rxlat / 2,
 249                                 AR5K_USEC_RX_LATENCY_5211);
 250                 txf2txs = AR5K_INIT_TXF2TXD_START_DEFAULT;
 251                 break;
 252         default:
 253                 break;
 254         }
 255 
 256         usec_reg = (usec | sclock | txlat | rxlat);
 257         ath5k_hw_reg_write(ah, usec_reg, AR5K_USEC);
 258 
 259         /* On 5112 set tx frame to tx data start delay */
 260         if (ah->ah_radio == AR5K_RF5112) {
 261                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_RF_CTL2,
 262                                         AR5K_PHY_RF_CTL2_TXF2TXD_START,
 263                                         txf2txs);
 264         }
 265 }
 266 
 267 /**
 268  * ath5k_hw_set_sleep_clock() - Setup sleep clock operation
 269  * @ah: The &struct ath5k_hw
 270  * @enable: Enable sleep clock operation (false to disable)
 271  *
 272  * If there is an external 32KHz crystal available, use it
 273  * as ref. clock instead of 32/40MHz clock and baseband clocks
 274  * to save power during sleep or restore normal 32/40MHz
 275  * operation.
 276  *
 277  * NOTE: When operating on 32KHz certain PHY registers (27 - 31,
 278  * 123 - 127) require delay on access.
 279  */
 280 static void
 281 ath5k_hw_set_sleep_clock(struct ath5k_hw *ah, bool enable)
 282 {
 283         struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
 284         u32 scal, spending, sclock;
 285 
 286         /* Only set 32KHz settings if we have an external
 287          * 32KHz crystal present */
 288         if ((AR5K_EEPROM_HAS32KHZCRYSTAL(ee->ee_misc1) ||
 289         AR5K_EEPROM_HAS32KHZCRYSTAL_OLD(ee->ee_misc1)) &&
 290         enable) {
 291 
 292                 /* 1 usec/cycle */
 293                 AR5K_REG_WRITE_BITS(ah, AR5K_USEC_5211, AR5K_USEC_32, 1);
 294                 /* Set up tsf increment on each cycle */
 295                 AR5K_REG_WRITE_BITS(ah, AR5K_TSF_PARM, AR5K_TSF_PARM_INC, 61);
 296 
 297                 /* Set baseband sleep control registers
 298                  * and sleep control rate */
 299                 ath5k_hw_reg_write(ah, 0x1f, AR5K_PHY_SCR);
 300 
 301                 if ((ah->ah_radio == AR5K_RF5112) ||
 302                 (ah->ah_radio == AR5K_RF5413) ||
 303                 (ah->ah_radio == AR5K_RF2316) ||
 304                 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4)))
 305                         spending = 0x14;
 306                 else
 307                         spending = 0x18;
 308                 ath5k_hw_reg_write(ah, spending, AR5K_PHY_SPENDING);
 309 
 310                 if ((ah->ah_radio == AR5K_RF5112) ||
 311                 (ah->ah_radio == AR5K_RF5413) ||
 312                 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))) {
 313                         ath5k_hw_reg_write(ah, 0x26, AR5K_PHY_SLMT);
 314                         ath5k_hw_reg_write(ah, 0x0d, AR5K_PHY_SCAL);
 315                         ath5k_hw_reg_write(ah, 0x07, AR5K_PHY_SCLOCK);
 316                         ath5k_hw_reg_write(ah, 0x3f, AR5K_PHY_SDELAY);
 317                         AR5K_REG_WRITE_BITS(ah, AR5K_PCICFG,
 318                                 AR5K_PCICFG_SLEEP_CLOCK_RATE, 0x02);
 319                 } else {
 320                         ath5k_hw_reg_write(ah, 0x0a, AR5K_PHY_SLMT);
 321                         ath5k_hw_reg_write(ah, 0x0c, AR5K_PHY_SCAL);
 322                         ath5k_hw_reg_write(ah, 0x03, AR5K_PHY_SCLOCK);
 323                         ath5k_hw_reg_write(ah, 0x20, AR5K_PHY_SDELAY);
 324                         AR5K_REG_WRITE_BITS(ah, AR5K_PCICFG,
 325                                 AR5K_PCICFG_SLEEP_CLOCK_RATE, 0x03);
 326                 }
 327 
 328                 /* Enable sleep clock operation */
 329                 AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG,
 330                                 AR5K_PCICFG_SLEEP_CLOCK_EN);
 331 
 332         } else {
 333 
 334                 /* Disable sleep clock operation and
 335                  * restore default parameters */
 336                 AR5K_REG_DISABLE_BITS(ah, AR5K_PCICFG,
 337                                 AR5K_PCICFG_SLEEP_CLOCK_EN);
 338 
 339                 AR5K_REG_WRITE_BITS(ah, AR5K_PCICFG,
 340                                 AR5K_PCICFG_SLEEP_CLOCK_RATE, 0);
 341 
 342                 /* Set DAC/ADC delays */
 343                 ath5k_hw_reg_write(ah, 0x1f, AR5K_PHY_SCR);
 344                 ath5k_hw_reg_write(ah, AR5K_PHY_SLMT_32MHZ, AR5K_PHY_SLMT);
 345 
 346                 if (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))
 347                         scal = AR5K_PHY_SCAL_32MHZ_2417;
 348                 else if (ee->ee_is_hb63)
 349                         scal = AR5K_PHY_SCAL_32MHZ_HB63;
 350                 else
 351                         scal = AR5K_PHY_SCAL_32MHZ;
 352                 ath5k_hw_reg_write(ah, scal, AR5K_PHY_SCAL);
 353 
 354                 ath5k_hw_reg_write(ah, AR5K_PHY_SCLOCK_32MHZ, AR5K_PHY_SCLOCK);
 355                 ath5k_hw_reg_write(ah, AR5K_PHY_SDELAY_32MHZ, AR5K_PHY_SDELAY);
 356 
 357                 if ((ah->ah_radio == AR5K_RF5112) ||
 358                 (ah->ah_radio == AR5K_RF5413) ||
 359                 (ah->ah_radio == AR5K_RF2316) ||
 360                 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4)))
 361                         spending = 0x14;
 362                 else
 363                         spending = 0x18;
 364                 ath5k_hw_reg_write(ah, spending, AR5K_PHY_SPENDING);
 365 
 366                 /* Set up tsf increment on each cycle */
 367                 AR5K_REG_WRITE_BITS(ah, AR5K_TSF_PARM, AR5K_TSF_PARM_INC, 1);
 368 
 369                 if ((ah->ah_radio == AR5K_RF5112) ||
 370                         (ah->ah_radio == AR5K_RF5413) ||
 371                         (ah->ah_radio == AR5K_RF2316) ||
 372                         (ah->ah_radio == AR5K_RF2317))
 373                         sclock = 40 - 1;
 374                 else
 375                         sclock = 32 - 1;
 376                 AR5K_REG_WRITE_BITS(ah, AR5K_USEC_5211, AR5K_USEC_32, sclock);
 377         }
 378 }
 379 
 380 
 381 /*********************\
 382 * Reset/Sleep control *
 383 \*********************/
 384 
 385 /**
 386  * ath5k_hw_nic_reset() - Reset the various chipset units
 387  * @ah: The &struct ath5k_hw
 388  * @val: Mask to indicate what units to reset
 389  *
 390  * To reset the various chipset units we need to write
 391  * the mask to AR5K_RESET_CTL and poll the register until
 392  * all flags are cleared.
 393  *
 394  * Returns 0 if we are O.K. or -EAGAIN (from athk5_hw_register_timeout)
 395  */
 396 static int
 397 ath5k_hw_nic_reset(struct ath5k_hw *ah, u32 val)
 398 {
 399         int ret;
 400         u32 mask = val ? val : ~0U;
 401 
 402         /* Read-and-clear RX Descriptor Pointer*/
 403         ath5k_hw_reg_read(ah, AR5K_RXDP);
 404 
 405         /*
 406          * Reset the device and wait until success
 407          */
 408         ath5k_hw_reg_write(ah, val, AR5K_RESET_CTL);
 409 
 410         /* Wait at least 128 PCI clocks */
 411         usleep_range(15, 20);
 412 
 413         if (ah->ah_version == AR5K_AR5210) {
 414                 val &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_DMA
 415                         | AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_PHY;
 416                 mask &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_DMA
 417                         | AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_PHY;
 418         } else {
 419                 val &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_BASEBAND;
 420                 mask &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_BASEBAND;
 421         }
 422 
 423         ret = ath5k_hw_register_timeout(ah, AR5K_RESET_CTL, mask, val, false);
 424 
 425         /*
 426          * Reset configuration register (for hw byte-swap). Note that this
 427          * is only set for big endian. We do the necessary magic in
 428          * AR5K_INIT_CFG.
 429          */
 430         if ((val & AR5K_RESET_CTL_PCU) == 0)
 431                 ath5k_hw_reg_write(ah, AR5K_INIT_CFG, AR5K_CFG);
 432 
 433         return ret;
 434 }
 435 
 436 /**
 437  * ath5k_hw_wisoc_reset() -  Reset AHB chipset
 438  * @ah: The &struct ath5k_hw
 439  * @flags: Mask to indicate what units to reset
 440  *
 441  * Same as ath5k_hw_nic_reset but for AHB based devices
 442  *
 443  * Returns 0 if we are O.K. or -EAGAIN (from athk5_hw_register_timeout)
 444  */
 445 static int
 446 ath5k_hw_wisoc_reset(struct ath5k_hw *ah, u32 flags)
 447 {
 448         u32 mask = flags ? flags : ~0U;
 449         u32 __iomem *reg;
 450         u32 regval;
 451         u32 val = 0;
 452 
 453         /* ah->ah_mac_srev is not available at this point yet */
 454         if (ah->devid >= AR5K_SREV_AR2315_R6) {
 455                 reg = (u32 __iomem *) AR5K_AR2315_RESET;
 456                 if (mask & AR5K_RESET_CTL_PCU)
 457                         val |= AR5K_AR2315_RESET_WMAC;
 458                 if (mask & AR5K_RESET_CTL_BASEBAND)
 459                         val |= AR5K_AR2315_RESET_BB_WARM;
 460         } else {
 461                 reg = (u32 __iomem *) AR5K_AR5312_RESET;
 462                 if (to_platform_device(ah->dev)->id == 0) {
 463                         if (mask & AR5K_RESET_CTL_PCU)
 464                                 val |= AR5K_AR5312_RESET_WMAC0;
 465                         if (mask & AR5K_RESET_CTL_BASEBAND)
 466                                 val |= AR5K_AR5312_RESET_BB0_COLD |
 467                                        AR5K_AR5312_RESET_BB0_WARM;
 468                 } else {
 469                         if (mask & AR5K_RESET_CTL_PCU)
 470                                 val |= AR5K_AR5312_RESET_WMAC1;
 471                         if (mask & AR5K_RESET_CTL_BASEBAND)
 472                                 val |= AR5K_AR5312_RESET_BB1_COLD |
 473                                        AR5K_AR5312_RESET_BB1_WARM;
 474                 }
 475         }
 476 
 477         /* Put BB/MAC into reset */
 478         regval = ioread32(reg);
 479         iowrite32(regval | val, reg);
 480         regval = ioread32(reg);
 481         udelay(100);    /* NB: should be atomic */
 482 
 483         /* Bring BB/MAC out of reset */
 484         iowrite32(regval & ~val, reg);
 485         regval = ioread32(reg);
 486 
 487         /*
 488          * Reset configuration register (for hw byte-swap). Note that this
 489          * is only set for big endian. We do the necessary magic in
 490          * AR5K_INIT_CFG.
 491          */
 492         if ((flags & AR5K_RESET_CTL_PCU) == 0)
 493                 ath5k_hw_reg_write(ah, AR5K_INIT_CFG, AR5K_CFG);
 494 
 495         return 0;
 496 }
 497 
 498 /**
 499  * ath5k_hw_set_power_mode() - Set power mode
 500  * @ah: The &struct ath5k_hw
 501  * @mode: One of enum ath5k_power_mode
 502  * @set_chip: Set to true to write sleep control register
 503  * @sleep_duration: How much time the device is allowed to sleep
 504  * when sleep logic is enabled (in 128 microsecond increments).
 505  *
 506  * This function is used to configure sleep policy and allowed
 507  * sleep modes. For more information check out the sleep control
 508  * register on reg.h and STA_ID1.
 509  *
 510  * Returns 0 on success, -EIO if chip didn't wake up or -EINVAL if an invalid
 511  * mode is requested.
 512  */
 513 static int
 514 ath5k_hw_set_power_mode(struct ath5k_hw *ah, enum ath5k_power_mode mode,
 515                               bool set_chip, u16 sleep_duration)
 516 {
 517         unsigned int i;
 518         u32 staid, data;
 519 
 520         staid = ath5k_hw_reg_read(ah, AR5K_STA_ID1);
 521 
 522         switch (mode) {
 523         case AR5K_PM_AUTO:
 524                 staid &= ~AR5K_STA_ID1_DEFAULT_ANTENNA;
 525                 /* fallthrough */
 526         case AR5K_PM_NETWORK_SLEEP:
 527                 if (set_chip)
 528                         ath5k_hw_reg_write(ah,
 529                                 AR5K_SLEEP_CTL_SLE_ALLOW |
 530                                 sleep_duration,
 531                                 AR5K_SLEEP_CTL);
 532 
 533                 staid |= AR5K_STA_ID1_PWR_SV;
 534                 break;
 535 
 536         case AR5K_PM_FULL_SLEEP:
 537                 if (set_chip)
 538                         ath5k_hw_reg_write(ah, AR5K_SLEEP_CTL_SLE_SLP,
 539                                 AR5K_SLEEP_CTL);
 540 
 541                 staid |= AR5K_STA_ID1_PWR_SV;
 542                 break;
 543 
 544         case AR5K_PM_AWAKE:
 545 
 546                 staid &= ~AR5K_STA_ID1_PWR_SV;
 547 
 548                 if (!set_chip)
 549                         goto commit;
 550 
 551                 data = ath5k_hw_reg_read(ah, AR5K_SLEEP_CTL);
 552 
 553                 /* If card is down we 'll get 0xffff... so we
 554                  * need to clean this up before we write the register
 555                  */
 556                 if (data & 0xffc00000)
 557                         data = 0;
 558                 else
 559                         /* Preserve sleep duration etc */
 560                         data = data & ~AR5K_SLEEP_CTL_SLE;
 561 
 562                 ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE,
 563                                                         AR5K_SLEEP_CTL);
 564                 usleep_range(15, 20);
 565 
 566                 for (i = 200; i > 0; i--) {
 567                         /* Check if the chip did wake up */
 568                         if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) &
 569                                         AR5K_PCICFG_SPWR_DN) == 0)
 570                                 break;
 571 
 572                         /* Wait a bit and retry */
 573                         usleep_range(50, 75);
 574                         ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE,
 575                                                         AR5K_SLEEP_CTL);
 576                 }
 577 
 578                 /* Fail if the chip didn't wake up */
 579                 if (i == 0)
 580                         return -EIO;
 581 
 582                 break;
 583 
 584         default:
 585                 return -EINVAL;
 586         }
 587 
 588 commit:
 589         ath5k_hw_reg_write(ah, staid, AR5K_STA_ID1);
 590 
 591         return 0;
 592 }
 593 
 594 /**
 595  * ath5k_hw_on_hold() - Put device on hold
 596  * @ah: The &struct ath5k_hw
 597  *
 598  * Put MAC and Baseband on warm reset and keep that state
 599  * (don't clean sleep control register). After this MAC
 600  * and Baseband are disabled and a full reset is needed
 601  * to come back. This way we save as much power as possible
 602  * without putting the card on full sleep.
 603  *
 604  * Returns 0 on success or -EIO on error
 605  */
 606 int
 607 ath5k_hw_on_hold(struct ath5k_hw *ah)
 608 {
 609         struct pci_dev *pdev = ah->pdev;
 610         u32 bus_flags;
 611         int ret;
 612 
 613         if (ath5k_get_bus_type(ah) == ATH_AHB)
 614                 return 0;
 615 
 616         /* Make sure device is awake */
 617         ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
 618         if (ret) {
 619                 ATH5K_ERR(ah, "failed to wakeup the MAC Chip\n");
 620                 return ret;
 621         }
 622 
 623         /*
 624          * Put chipset on warm reset...
 625          *
 626          * Note: putting PCI core on warm reset on PCI-E cards
 627          * results card to hang and always return 0xffff... so
 628          * we ignore that flag for PCI-E cards. On PCI cards
 629          * this flag gets cleared after 64 PCI clocks.
 630          */
 631         bus_flags = (pdev && pci_is_pcie(pdev)) ? 0 : AR5K_RESET_CTL_PCI;
 632 
 633         if (ah->ah_version == AR5K_AR5210) {
 634                 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
 635                         AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
 636                         AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
 637                 usleep_range(2000, 2500);
 638         } else {
 639                 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
 640                         AR5K_RESET_CTL_BASEBAND | bus_flags);
 641         }
 642 
 643         if (ret) {
 644                 ATH5K_ERR(ah, "failed to put device on warm reset\n");
 645                 return -EIO;
 646         }
 647 
 648         /* ...wakeup again!*/
 649         ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
 650         if (ret) {
 651                 ATH5K_ERR(ah, "failed to put device on hold\n");
 652                 return ret;
 653         }
 654 
 655         return ret;
 656 }
 657 
 658 /**
 659  * ath5k_hw_nic_wakeup() - Force card out of sleep
 660  * @ah: The &struct ath5k_hw
 661  * @channel: The &struct ieee80211_channel
 662  *
 663  * Bring up MAC + PHY Chips and program PLL
 664  * NOTE: Channel is NULL for the initial wakeup.
 665  *
 666  * Returns 0 on success, -EIO on hw failure or -EINVAL for false channel infos
 667  */
 668 int
 669 ath5k_hw_nic_wakeup(struct ath5k_hw *ah, struct ieee80211_channel *channel)
 670 {
 671         struct pci_dev *pdev = ah->pdev;
 672         u32 turbo, mode, clock, bus_flags;
 673         int ret;
 674 
 675         turbo = 0;
 676         mode = 0;
 677         clock = 0;
 678 
 679         if ((ath5k_get_bus_type(ah) != ATH_AHB) || channel) {
 680                 /* Wakeup the device */
 681                 ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
 682                 if (ret) {
 683                         ATH5K_ERR(ah, "failed to wakeup the MAC Chip\n");
 684                         return ret;
 685                 }
 686         }
 687 
 688         /*
 689          * Put chipset on warm reset...
 690          *
 691          * Note: putting PCI core on warm reset on PCI-E cards
 692          * results card to hang and always return 0xffff... so
 693          * we ignore that flag for PCI-E cards. On PCI cards
 694          * this flag gets cleared after 64 PCI clocks.
 695          */
 696         bus_flags = (pdev && pci_is_pcie(pdev)) ? 0 : AR5K_RESET_CTL_PCI;
 697 
 698         if (ah->ah_version == AR5K_AR5210) {
 699                 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
 700                         AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
 701                         AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
 702                 usleep_range(2000, 2500);
 703         } else {
 704                 if (ath5k_get_bus_type(ah) == ATH_AHB)
 705                         ret = ath5k_hw_wisoc_reset(ah, AR5K_RESET_CTL_PCU |
 706                                 AR5K_RESET_CTL_BASEBAND);
 707                 else
 708                         ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
 709                                 AR5K_RESET_CTL_BASEBAND | bus_flags);
 710         }
 711 
 712         if (ret) {
 713                 ATH5K_ERR(ah, "failed to reset the MAC Chip\n");
 714                 return -EIO;
 715         }
 716 
 717         /* ...wakeup again!...*/
 718         ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
 719         if (ret) {
 720                 ATH5K_ERR(ah, "failed to resume the MAC Chip\n");
 721                 return ret;
 722         }
 723 
 724         /* ...reset configuration register on Wisoc ...
 725          * ...clear reset control register and pull device out of
 726          * warm reset on others */
 727         if (ath5k_get_bus_type(ah) == ATH_AHB)
 728                 ret = ath5k_hw_wisoc_reset(ah, 0);
 729         else
 730                 ret = ath5k_hw_nic_reset(ah, 0);
 731 
 732         if (ret) {
 733                 ATH5K_ERR(ah, "failed to warm reset the MAC Chip\n");
 734                 return -EIO;
 735         }
 736 
 737         /* On initialization skip PLL programming since we don't have
 738          * a channel / mode set yet */
 739         if (!channel)
 740                 return 0;
 741 
 742         if (ah->ah_version != AR5K_AR5210) {
 743                 /*
 744                  * Get channel mode flags
 745                  */
 746 
 747                 if (ah->ah_radio >= AR5K_RF5112) {
 748                         mode = AR5K_PHY_MODE_RAD_RF5112;
 749                         clock = AR5K_PHY_PLL_RF5112;
 750                 } else {
 751                         mode = AR5K_PHY_MODE_RAD_RF5111;        /*Zero*/
 752                         clock = AR5K_PHY_PLL_RF5111;            /*Zero*/
 753                 }
 754 
 755                 if (channel->band == NL80211_BAND_2GHZ) {
 756                         mode |= AR5K_PHY_MODE_FREQ_2GHZ;
 757                         clock |= AR5K_PHY_PLL_44MHZ;
 758 
 759                         if (channel->hw_value == AR5K_MODE_11B) {
 760                                 mode |= AR5K_PHY_MODE_MOD_CCK;
 761                         } else {
 762                                 /* XXX Dynamic OFDM/CCK is not supported by the
 763                                  * AR5211 so we set MOD_OFDM for plain g (no
 764                                  * CCK headers) operation. We need to test
 765                                  * this, 5211 might support ofdm-only g after
 766                                  * all, there are also initial register values
 767                                  * in the code for g mode (see initvals.c).
 768                                  */
 769                                 if (ah->ah_version == AR5K_AR5211)
 770                                         mode |= AR5K_PHY_MODE_MOD_OFDM;
 771                                 else
 772                                         mode |= AR5K_PHY_MODE_MOD_DYN;
 773                         }
 774                 } else if (channel->band == NL80211_BAND_5GHZ) {
 775                         mode |= (AR5K_PHY_MODE_FREQ_5GHZ |
 776                                  AR5K_PHY_MODE_MOD_OFDM);
 777 
 778                         /* Different PLL setting for 5413 */
 779                         if (ah->ah_radio == AR5K_RF5413)
 780                                 clock = AR5K_PHY_PLL_40MHZ_5413;
 781                         else
 782                                 clock |= AR5K_PHY_PLL_40MHZ;
 783                 } else {
 784                         ATH5K_ERR(ah, "invalid radio frequency mode\n");
 785                         return -EINVAL;
 786                 }
 787 
 788                 /*XXX: Can bwmode be used with dynamic mode ?
 789                  * (I don't think it supports 44MHz) */
 790                 /* On 2425 initvals TURBO_SHORT is not present */
 791                 if (ah->ah_bwmode == AR5K_BWMODE_40MHZ) {
 792                         turbo = AR5K_PHY_TURBO_MODE;
 793                         if (ah->ah_radio != AR5K_RF2425)
 794                                 turbo |= AR5K_PHY_TURBO_SHORT;
 795                 } else if (ah->ah_bwmode != AR5K_BWMODE_DEFAULT) {
 796                         if (ah->ah_radio == AR5K_RF5413) {
 797                                 mode |= (ah->ah_bwmode == AR5K_BWMODE_10MHZ) ?
 798                                         AR5K_PHY_MODE_HALF_RATE :
 799                                         AR5K_PHY_MODE_QUARTER_RATE;
 800                         } else if (ah->ah_version == AR5K_AR5212) {
 801                                 clock |= (ah->ah_bwmode == AR5K_BWMODE_10MHZ) ?
 802                                         AR5K_PHY_PLL_HALF_RATE :
 803                                         AR5K_PHY_PLL_QUARTER_RATE;
 804                         }
 805                 }
 806 
 807         } else { /* Reset the device */
 808 
 809                 /* ...enable Atheros turbo mode if requested */
 810                 if (ah->ah_bwmode == AR5K_BWMODE_40MHZ)
 811                         ath5k_hw_reg_write(ah, AR5K_PHY_TURBO_MODE,
 812                                         AR5K_PHY_TURBO);
 813         }
 814 
 815         if (ah->ah_version != AR5K_AR5210) {
 816 
 817                 /* ...update PLL if needed */
 818                 if (ath5k_hw_reg_read(ah, AR5K_PHY_PLL) != clock) {
 819                         ath5k_hw_reg_write(ah, clock, AR5K_PHY_PLL);
 820                         usleep_range(300, 350);
 821                 }
 822 
 823                 /* ...set the PHY operating mode */
 824                 ath5k_hw_reg_write(ah, mode, AR5K_PHY_MODE);
 825                 ath5k_hw_reg_write(ah, turbo, AR5K_PHY_TURBO);
 826         }
 827 
 828         return 0;
 829 }
 830 
 831 
 832 /**************************************\
 833 * Post-initvals register modifications *
 834 \**************************************/
 835 
 836 /**
 837  * ath5k_hw_tweak_initval_settings() - Tweak initial settings
 838  * @ah: The &struct ath5k_hw
 839  * @channel: The &struct ieee80211_channel
 840  *
 841  * Some settings are not handled on initvals, e.g. bwmode
 842  * settings, some phy settings, workarounds etc that in general
 843  * don't fit anywhere else or are too small to introduce a separate
 844  * function for each one. So we have this function to handle
 845  * them all during reset and complete card's initialization.
 846  */
 847 static void
 848 ath5k_hw_tweak_initval_settings(struct ath5k_hw *ah,
 849                                 struct ieee80211_channel *channel)
 850 {
 851         if (ah->ah_version == AR5K_AR5212 &&
 852             ah->ah_phy_revision >= AR5K_SREV_PHY_5212A) {
 853 
 854                 /* Setup ADC control */
 855                 ath5k_hw_reg_write(ah,
 856                                 (AR5K_REG_SM(2,
 857                                 AR5K_PHY_ADC_CTL_INBUFGAIN_OFF) |
 858                                 AR5K_REG_SM(2,
 859                                 AR5K_PHY_ADC_CTL_INBUFGAIN_ON) |
 860                                 AR5K_PHY_ADC_CTL_PWD_DAC_OFF |
 861                                 AR5K_PHY_ADC_CTL_PWD_ADC_OFF),
 862                                 AR5K_PHY_ADC_CTL);
 863 
 864 
 865 
 866                 /* Disable barker RSSI threshold */
 867                 AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_DAG_CCK_CTL,
 868                                 AR5K_PHY_DAG_CCK_CTL_EN_RSSI_THR);
 869 
 870                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DAG_CCK_CTL,
 871                         AR5K_PHY_DAG_CCK_CTL_RSSI_THR, 2);
 872 
 873                 /* Set the mute mask */
 874                 ath5k_hw_reg_write(ah, 0x0000000f, AR5K_SEQ_MASK);
 875         }
 876 
 877         /* Clear PHY_BLUETOOTH to allow RX_CLEAR line debug */
 878         if (ah->ah_phy_revision >= AR5K_SREV_PHY_5212B)
 879                 ath5k_hw_reg_write(ah, 0, AR5K_PHY_BLUETOOTH);
 880 
 881         /* Enable DCU double buffering */
 882         if (ah->ah_phy_revision > AR5K_SREV_PHY_5212B)
 883                 AR5K_REG_DISABLE_BITS(ah, AR5K_TXCFG,
 884                                 AR5K_TXCFG_DCU_DBL_BUF_DIS);
 885 
 886         /* Set fast ADC */
 887         if ((ah->ah_radio == AR5K_RF5413) ||
 888                 (ah->ah_radio == AR5K_RF2317) ||
 889                 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))) {
 890                 u32 fast_adc = true;
 891 
 892                 if (channel->center_freq == 2462 ||
 893                 channel->center_freq == 2467)
 894                         fast_adc = 0;
 895 
 896                 /* Only update if needed */
 897                 if (ath5k_hw_reg_read(ah, AR5K_PHY_FAST_ADC) != fast_adc)
 898                                 ath5k_hw_reg_write(ah, fast_adc,
 899                                                 AR5K_PHY_FAST_ADC);
 900         }
 901 
 902         /* Fix for first revision of the RF5112 RF chipset */
 903         if (ah->ah_radio == AR5K_RF5112 &&
 904                         ah->ah_radio_5ghz_revision <
 905                         AR5K_SREV_RAD_5112A) {
 906                 u32 data;
 907                 ath5k_hw_reg_write(ah, AR5K_PHY_CCKTXCTL_WORLD,
 908                                 AR5K_PHY_CCKTXCTL);
 909                 if (channel->band == NL80211_BAND_5GHZ)
 910                         data = 0xffb81020;
 911                 else
 912                         data = 0xffb80d20;
 913                 ath5k_hw_reg_write(ah, data, AR5K_PHY_FRAME_CTL);
 914         }
 915 
 916         if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
 917                 /* Clear QCU/DCU clock gating register */
 918                 ath5k_hw_reg_write(ah, 0, AR5K_QCUDCU_CLKGT);
 919                 /* Set DAC/ADC delays */
 920                 ath5k_hw_reg_write(ah, AR5K_PHY_SCAL_32MHZ_5311,
 921                                                 AR5K_PHY_SCAL);
 922                 /* Enable PCU FIFO corruption ECO */
 923                 AR5K_REG_ENABLE_BITS(ah, AR5K_DIAG_SW_5211,
 924                                         AR5K_DIAG_SW_ECO_ENABLE);
 925         }
 926 
 927         if (ah->ah_bwmode) {
 928                 /* Increase PHY switch and AGC settling time
 929                  * on turbo mode (ath5k_hw_commit_eeprom_settings
 930                  * will override settling time if available) */
 931                 if (ah->ah_bwmode == AR5K_BWMODE_40MHZ) {
 932 
 933                         AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
 934                                                 AR5K_PHY_SETTLING_AGC,
 935                                                 AR5K_AGC_SETTLING_TURBO);
 936 
 937                         /* XXX: Initvals indicate we only increase
 938                          * switch time on AR5212, 5211 and 5210
 939                          * only change agc time (bug?) */
 940                         if (ah->ah_version == AR5K_AR5212)
 941                                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
 942                                                 AR5K_PHY_SETTLING_SWITCH,
 943                                                 AR5K_SWITCH_SETTLING_TURBO);
 944 
 945                         if (ah->ah_version == AR5K_AR5210) {
 946                                 /* Set Frame Control Register */
 947                                 ath5k_hw_reg_write(ah,
 948                                         (AR5K_PHY_FRAME_CTL_INI |
 949                                         AR5K_PHY_TURBO_MODE |
 950                                         AR5K_PHY_TURBO_SHORT | 0x2020),
 951                                         AR5K_PHY_FRAME_CTL_5210);
 952                         }
 953                 /* On 5413 PHY force window length for half/quarter rate*/
 954                 } else if ((ah->ah_mac_srev >= AR5K_SREV_AR5424) &&
 955                 (ah->ah_mac_srev <= AR5K_SREV_AR5414)) {
 956                         AR5K_REG_WRITE_BITS(ah, AR5K_PHY_FRAME_CTL_5211,
 957                                                 AR5K_PHY_FRAME_CTL_WIN_LEN,
 958                                                 3);
 959                 }
 960         } else if (ah->ah_version == AR5K_AR5210) {
 961                 /* Set Frame Control Register for normal operation */
 962                 ath5k_hw_reg_write(ah, (AR5K_PHY_FRAME_CTL_INI | 0x1020),
 963                                                 AR5K_PHY_FRAME_CTL_5210);
 964         }
 965 }
 966 
 967 /**
 968  * ath5k_hw_commit_eeprom_settings() - Commit settings from EEPROM
 969  * @ah: The &struct ath5k_hw
 970  * @channel: The &struct ieee80211_channel
 971  *
 972  * Use settings stored on EEPROM to properly initialize the card
 973  * based on various infos and per-mode calibration data.
 974  */
 975 static void
 976 ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
 977                 struct ieee80211_channel *channel)
 978 {
 979         struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
 980         s16 cck_ofdm_pwr_delta;
 981         u8 ee_mode;
 982 
 983         /* TODO: Add support for AR5210 EEPROM */
 984         if (ah->ah_version == AR5K_AR5210)
 985                 return;
 986 
 987         ee_mode = ath5k_eeprom_mode_from_channel(ah, channel);
 988 
 989         /* Adjust power delta for channel 14 */
 990         if (channel->center_freq == 2484)
 991                 cck_ofdm_pwr_delta =
 992                         ((ee->ee_cck_ofdm_power_delta -
 993                         ee->ee_scaled_cck_delta) * 2) / 10;
 994         else
 995                 cck_ofdm_pwr_delta =
 996                         (ee->ee_cck_ofdm_power_delta * 2) / 10;
 997 
 998         /* Set CCK to OFDM power delta on tx power
 999          * adjustment register */
1000         if (ah->ah_phy_revision >= AR5K_SREV_PHY_5212A) {
1001                 if (channel->hw_value == AR5K_MODE_11G)
1002                         ath5k_hw_reg_write(ah,
1003                         AR5K_REG_SM((ee->ee_cck_ofdm_gain_delta * -1),
1004                                 AR5K_PHY_TX_PWR_ADJ_CCK_GAIN_DELTA) |
1005                         AR5K_REG_SM((cck_ofdm_pwr_delta * -1),
1006                                 AR5K_PHY_TX_PWR_ADJ_CCK_PCDAC_INDEX),
1007                                 AR5K_PHY_TX_PWR_ADJ);
1008                 else
1009                         ath5k_hw_reg_write(ah, 0, AR5K_PHY_TX_PWR_ADJ);
1010         } else {
1011                 /* For older revs we scale power on sw during tx power
1012                  * setup */
1013                 ah->ah_txpower.txp_cck_ofdm_pwr_delta = cck_ofdm_pwr_delta;
1014                 ah->ah_txpower.txp_cck_ofdm_gainf_delta =
1015                                                 ee->ee_cck_ofdm_gain_delta;
1016         }
1017 
1018         /* XXX: necessary here? is called from ath5k_hw_set_antenna_mode()
1019          * too */
1020         ath5k_hw_set_antenna_switch(ah, ee_mode);
1021 
1022         /* Noise floor threshold */
1023         ath5k_hw_reg_write(ah,
1024                 AR5K_PHY_NF_SVAL(ee->ee_noise_floor_thr[ee_mode]),
1025                 AR5K_PHY_NFTHRES);
1026 
1027         if ((ah->ah_bwmode == AR5K_BWMODE_40MHZ) &&
1028         (ah->ah_ee_version >= AR5K_EEPROM_VERSION_5_0)) {
1029                 /* Switch settling time (Turbo) */
1030                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
1031                                 AR5K_PHY_SETTLING_SWITCH,
1032                                 ee->ee_switch_settling_turbo[ee_mode]);
1033 
1034                 /* Tx/Rx attenuation (Turbo) */
1035                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN,
1036                                 AR5K_PHY_GAIN_TXRX_ATTEN,
1037                                 ee->ee_atn_tx_rx_turbo[ee_mode]);
1038 
1039                 /* ADC/PGA desired size (Turbo) */
1040                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1041                                 AR5K_PHY_DESIRED_SIZE_ADC,
1042                                 ee->ee_adc_desired_size_turbo[ee_mode]);
1043 
1044                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1045                                 AR5K_PHY_DESIRED_SIZE_PGA,
1046                                 ee->ee_pga_desired_size_turbo[ee_mode]);
1047 
1048                 /* Tx/Rx margin (Turbo) */
1049                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN_2GHZ,
1050                                 AR5K_PHY_GAIN_2GHZ_MARGIN_TXRX,
1051                                 ee->ee_margin_tx_rx_turbo[ee_mode]);
1052 
1053         } else {
1054                 /* Switch settling time */
1055                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
1056                                 AR5K_PHY_SETTLING_SWITCH,
1057                                 ee->ee_switch_settling[ee_mode]);
1058 
1059                 /* Tx/Rx attenuation */
1060                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN,
1061                                 AR5K_PHY_GAIN_TXRX_ATTEN,
1062                                 ee->ee_atn_tx_rx[ee_mode]);
1063 
1064                 /* ADC/PGA desired size */
1065                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1066                                 AR5K_PHY_DESIRED_SIZE_ADC,
1067                                 ee->ee_adc_desired_size[ee_mode]);
1068 
1069                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1070                                 AR5K_PHY_DESIRED_SIZE_PGA,
1071                                 ee->ee_pga_desired_size[ee_mode]);
1072 
1073                 /* Tx/Rx margin */
1074                 if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_1)
1075                         AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN_2GHZ,
1076                                 AR5K_PHY_GAIN_2GHZ_MARGIN_TXRX,
1077                                 ee->ee_margin_tx_rx[ee_mode]);
1078         }
1079 
1080         /* XPA delays */
1081         ath5k_hw_reg_write(ah,
1082                 (ee->ee_tx_end2xpa_disable[ee_mode] << 24) |
1083                 (ee->ee_tx_end2xpa_disable[ee_mode] << 16) |
1084                 (ee->ee_tx_frm2xpa_enable[ee_mode] << 8) |
1085                 (ee->ee_tx_frm2xpa_enable[ee_mode]), AR5K_PHY_RF_CTL4);
1086 
1087         /* XLNA delay */
1088         AR5K_REG_WRITE_BITS(ah, AR5K_PHY_RF_CTL3,
1089                         AR5K_PHY_RF_CTL3_TXE2XLNA_ON,
1090                         ee->ee_tx_end2xlna_enable[ee_mode]);
1091 
1092         /* Thresh64 (ANI) */
1093         AR5K_REG_WRITE_BITS(ah, AR5K_PHY_NF,
1094                         AR5K_PHY_NF_THRESH62,
1095                         ee->ee_thr_62[ee_mode]);
1096 
1097         /* False detect backoff for channels
1098          * that have spur noise. Write the new
1099          * cyclic power RSSI threshold. */
1100         if (ath5k_hw_chan_has_spur_noise(ah, channel))
1101                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_OFDM_SELFCORR,
1102                                 AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1,
1103                                 AR5K_INIT_CYCRSSI_THR1 +
1104                                 ee->ee_false_detect[ee_mode]);
1105         else
1106                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_OFDM_SELFCORR,
1107                                 AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1,
1108                                 AR5K_INIT_CYCRSSI_THR1);
1109 
1110         /* I/Q correction (set enable bit last to match HAL sources) */
1111         /* TODO: Per channel i/q infos ? */
1112         if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_0) {
1113                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_I_COFF,
1114                             ee->ee_i_cal[ee_mode]);
1115                 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_Q_COFF,
1116                             ee->ee_q_cal[ee_mode]);
1117                 AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE);
1118         }
1119 
1120         /* Heavy clipping -disable for now */
1121         if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_5_1)
1122                 ath5k_hw_reg_write(ah, 0, AR5K_PHY_HEAVY_CLIP_ENABLE);
1123 }
1124 
1125 
1126 /*********************\
1127 * Main reset function *
1128 \*********************/
1129 
1130 /**
1131  * ath5k_hw_reset() - The main reset function
1132  * @ah: The &struct ath5k_hw
1133  * @op_mode: One of enum nl80211_iftype
1134  * @channel: The &struct ieee80211_channel
1135  * @fast: Enable fast channel switching
1136  * @skip_pcu: Skip pcu initialization
1137  *
1138  * This is the function we call each time we want to (re)initialize the
1139  * card and pass new settings to hw. We also call it when hw runs into
1140  * trouble to make it come back to a working state.
1141  *
1142  * Returns 0 on success, -EINVAL on false op_mode or channel infos, or -EIO
1143  * on failure.
1144  */
1145 int
1146 ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
1147                 struct ieee80211_channel *channel, bool fast, bool skip_pcu)
1148 {
1149         u32 s_seq[10], s_led[3], tsf_up, tsf_lo;
1150         u8 mode;
1151         int i, ret;
1152 
1153         tsf_up = 0;
1154         tsf_lo = 0;
1155         mode = 0;
1156 
1157         /*
1158          * Sanity check for fast flag
1159          * Fast channel change only available
1160          * on AR2413/AR5413.
1161          */
1162         if (fast && (ah->ah_radio != AR5K_RF2413) &&
1163         (ah->ah_radio != AR5K_RF5413))
1164                 fast = false;
1165 
1166         /* Disable sleep clock operation
1167          * to avoid register access delay on certain
1168          * PHY registers */
1169         if (ah->ah_version == AR5K_AR5212)
1170                 ath5k_hw_set_sleep_clock(ah, false);
1171 
1172         mode = channel->hw_value;
1173         switch (mode) {
1174         case AR5K_MODE_11A:
1175                 break;
1176         case AR5K_MODE_11G:
1177                 if (ah->ah_version <= AR5K_AR5211) {
1178                         ATH5K_ERR(ah,
1179                                 "G mode not available on 5210/5211");
1180                         return -EINVAL;
1181                 }
1182                 break;
1183         case AR5K_MODE_11B:
1184                 if (ah->ah_version < AR5K_AR5211) {
1185                         ATH5K_ERR(ah,
1186                                 "B mode not available on 5210");
1187                         return -EINVAL;
1188                 }
1189                 break;
1190         default:
1191                 ATH5K_ERR(ah,
1192                         "invalid channel: %d\n", channel->center_freq);
1193                 return -EINVAL;
1194         }
1195 
1196         /*
1197          * If driver requested fast channel change and DMA has stopped
1198          * go on. If it fails continue with a normal reset.
1199          */
1200         if (fast) {
1201                 ret = ath5k_hw_phy_init(ah, channel, mode, true);
1202                 if (ret) {
1203                         ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
1204                                 "fast chan change failed, falling back to normal reset\n");
1205                         /* Non fatal, can happen eg.
1206                          * on mode change */
1207                         ret = 0;
1208                 } else {
1209                         ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
1210                                 "fast chan change successful\n");
1211                         return 0;
1212                 }
1213         }
1214 
1215         /*
1216          * Save some registers before a reset
1217          */
1218         if (ah->ah_version != AR5K_AR5210) {
1219                 /*
1220                  * Save frame sequence count
1221                  * For revs. after Oahu, only save
1222                  * seq num for DCU 0 (Global seq num)
1223                  */
1224                 if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
1225 
1226                         for (i = 0; i < 10; i++)
1227                                 s_seq[i] = ath5k_hw_reg_read(ah,
1228                                         AR5K_QUEUE_DCU_SEQNUM(i));
1229 
1230                 } else {
1231                         s_seq[0] = ath5k_hw_reg_read(ah,
1232                                         AR5K_QUEUE_DCU_SEQNUM(0));
1233                 }
1234 
1235                 /* TSF accelerates on AR5211 during reset
1236                  * As a workaround save it here and restore
1237                  * it later so that it's back in time after
1238                  * reset. This way it'll get re-synced on the
1239                  * next beacon without breaking ad-hoc.
1240                  *
1241                  * On AR5212 TSF is almost preserved across a
1242                  * reset so it stays back in time anyway and
1243                  * we don't have to save/restore it.
1244                  *
1245                  * XXX: Since this breaks power saving we have
1246                  * to disable power saving until we receive the
1247                  * next beacon, so we can resync beacon timers */
1248                 if (ah->ah_version == AR5K_AR5211) {
1249                         tsf_up = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
1250                         tsf_lo = ath5k_hw_reg_read(ah, AR5K_TSF_L32);
1251                 }
1252         }
1253 
1254 
1255         /*GPIOs*/
1256         s_led[0] = ath5k_hw_reg_read(ah, AR5K_PCICFG) &
1257                                         AR5K_PCICFG_LEDSTATE;
1258         s_led[1] = ath5k_hw_reg_read(ah, AR5K_GPIOCR);
1259         s_led[2] = ath5k_hw_reg_read(ah, AR5K_GPIODO);
1260 
1261 
1262         /*
1263          * Since we are going to write rf buffer
1264          * check if we have any pending gain_F
1265          * optimization settings
1266          */
1267         if (ah->ah_version == AR5K_AR5212 &&
1268         (ah->ah_radio <= AR5K_RF5112)) {
1269                 if (!fast && ah->ah_rf_banks != NULL)
1270                                 ath5k_hw_gainf_calibrate(ah);
1271         }
1272 
1273         /* Wakeup the device */
1274         ret = ath5k_hw_nic_wakeup(ah, channel);
1275         if (ret)
1276                 return ret;
1277 
1278         /* PHY access enable */
1279         if (ah->ah_mac_srev >= AR5K_SREV_AR5211)
1280                 ath5k_hw_reg_write(ah, AR5K_PHY_SHIFT_5GHZ, AR5K_PHY(0));
1281         else
1282                 ath5k_hw_reg_write(ah, AR5K_PHY_SHIFT_5GHZ | 0x40,
1283                                                         AR5K_PHY(0));
1284 
1285         /* Write initial settings */
1286         ret = ath5k_hw_write_initvals(ah, mode, skip_pcu);
1287         if (ret)
1288                 return ret;
1289 
1290         /* Initialize core clock settings */
1291         ath5k_hw_init_core_clock(ah);
1292 
1293         /*
1294          * Tweak initval settings for revised
1295          * chipsets and add some more config
1296          * bits
1297          */
1298         ath5k_hw_tweak_initval_settings(ah, channel);
1299 
1300         /* Commit values from EEPROM */
1301         ath5k_hw_commit_eeprom_settings(ah, channel);
1302 
1303 
1304         /*
1305          * Restore saved values
1306          */
1307 
1308         /* Seqnum, TSF */
1309         if (ah->ah_version != AR5K_AR5210) {
1310                 if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
1311                         for (i = 0; i < 10; i++)
1312                                 ath5k_hw_reg_write(ah, s_seq[i],
1313                                         AR5K_QUEUE_DCU_SEQNUM(i));
1314                 } else {
1315                         ath5k_hw_reg_write(ah, s_seq[0],
1316                                 AR5K_QUEUE_DCU_SEQNUM(0));
1317                 }
1318 
1319                 if (ah->ah_version == AR5K_AR5211) {
1320                         ath5k_hw_reg_write(ah, tsf_up, AR5K_TSF_U32);
1321                         ath5k_hw_reg_write(ah, tsf_lo, AR5K_TSF_L32);
1322                 }
1323         }
1324 
1325         /* Ledstate */
1326         AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG, s_led[0]);
1327 
1328         /* Gpio settings */
1329         ath5k_hw_reg_write(ah, s_led[1], AR5K_GPIOCR);
1330         ath5k_hw_reg_write(ah, s_led[2], AR5K_GPIODO);
1331 
1332         /*
1333          * Initialize PCU
1334          */
1335         ath5k_hw_pcu_init(ah, op_mode);
1336 
1337         /*
1338          * Initialize PHY
1339          */
1340         ret = ath5k_hw_phy_init(ah, channel, mode, false);
1341         if (ret) {
1342                 ATH5K_ERR(ah,
1343                         "failed to initialize PHY (%i) !\n", ret);
1344                 return ret;
1345         }
1346 
1347         /*
1348          * Configure QCUs/DCUs
1349          */
1350         ret = ath5k_hw_init_queues(ah);
1351         if (ret)
1352                 return ret;
1353 
1354 
1355         /*
1356          * Initialize DMA/Interrupts
1357          */
1358         ath5k_hw_dma_init(ah);
1359 
1360 
1361         /*
1362          * Enable 32KHz clock function for AR5212+ chips
1363          * Set clocks to 32KHz operation and use an
1364          * external 32KHz crystal when sleeping if one
1365          * exists.
1366          * Disabled by default because it is also disabled in
1367          * other drivers and it is known to cause stability
1368          * issues on some devices
1369          */
1370         if (ah->ah_use_32khz_clock && ah->ah_version == AR5K_AR5212 &&
1371             op_mode != NL80211_IFTYPE_AP)
1372                 ath5k_hw_set_sleep_clock(ah, true);
1373 
1374         /*
1375          * Disable beacons and reset the TSF
1376          */
1377         AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE);
1378         ath5k_hw_reset_tsf(ah);
1379         return 0;
1380 }

/* [<][>][^][v][top][bottom][index][help] */