]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ath/ath_hal/ar5312/ar5312_reset.c
MFS r365608:
[FreeBSD/FreeBSD.git] / sys / dev / ath / ath_hal / ar5312 / ar5312_reset.c
1 /*-
2  * SPDX-License-Identifier: ISC
3  *
4  * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
5  * Copyright (c) 2002-2008 Atheros Communications, Inc.
6  *
7  * Permission to use, copy, modify, and/or distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  *
19  * $FreeBSD$
20  */
21 #include "opt_ah.h"
22
23 #ifdef AH_SUPPORT_AR5312
24
25 #include "ah.h"
26 #include "ah_internal.h"
27 #include "ah_devid.h"
28
29 #include "ar5312/ar5312.h"
30 #include "ar5312/ar5312reg.h"
31 #include "ar5312/ar5312phy.h"
32
33 #include "ah_eeprom_v3.h"
34
35 /* Additional Time delay to wait after activiting the Base band */
36 #define BASE_ACTIVATE_DELAY     100     /* 100 usec */
37 #define PLL_SETTLE_DELAY        300     /* 300 usec */
38
39 extern int16_t ar5212GetNf(struct ath_hal *, const struct ieee80211_channel *);
40 extern void ar5212SetRateDurationTable(struct ath_hal *,
41                 const struct ieee80211_channel *);
42 extern HAL_BOOL ar5212SetTransmitPower(struct ath_hal *ah,
43                  const struct ieee80211_channel *chan, uint16_t *rfXpdGain);
44 extern void ar5212SetDeltaSlope(struct ath_hal *,
45                  const struct ieee80211_channel *);
46 extern HAL_BOOL ar5212SetBoardValues(struct ath_hal *,
47                  const struct ieee80211_channel *);
48 extern void ar5212SetIFSTiming(struct ath_hal *,
49                  const struct ieee80211_channel *);
50 extern HAL_BOOL ar5212IsSpurChannel(struct ath_hal *,
51                  const struct ieee80211_channel *);
52 extern HAL_BOOL ar5212ChannelChange(struct ath_hal *,
53                  const struct ieee80211_channel *);
54
55 static HAL_BOOL ar5312SetResetReg(struct ath_hal *, uint32_t resetMask);
56
57 static int
58 write_common(struct ath_hal *ah, const HAL_INI_ARRAY *ia,
59         HAL_BOOL bChannelChange, int writes)
60 {
61 #define IS_NO_RESET_TIMER_ADDR(x)                      \
62     ( (((x) >= AR_BEACON) && ((x) <= AR_CFP_DUR)) || \
63       (((x) >= AR_SLEEP1) && ((x) <= AR_SLEEP3)))
64 #define V(r, c) (ia)->data[((r)*(ia)->cols) + (c)]
65         int i;
66
67         /* Write Common Array Parameters */
68         for (i = 0; i < ia->rows; i++) {
69                 uint32_t reg = V(i, 0);
70                 /* XXX timer/beacon setup registers? */
71                 /* On channel change, don't reset the PCU registers */
72                 if (!(bChannelChange && IS_NO_RESET_TIMER_ADDR(reg))) {
73                         OS_REG_WRITE(ah, reg, V(i, 1));
74                         DMA_YIELD(writes);
75                 }
76         }
77         return writes;
78 #undef IS_NO_RESET_TIMER_ADDR
79 #undef V
80 }
81
82 /*
83  * Places the device in and out of reset and then places sane
84  * values in the registers based on EEPROM config, initialization
85  * vectors (as determined by the mode), and station configuration
86  *
87  * bChannelChange is used to preserve DMA/PCU registers across
88  * a HW Reset during channel change.
89  */
90 HAL_BOOL
91 ar5312Reset(struct ath_hal *ah, HAL_OPMODE opmode,
92         struct ieee80211_channel *chan,
93         HAL_BOOL bChannelChange,
94         HAL_RESET_TYPE resetType,
95         HAL_STATUS *status)
96 {
97 #define N(a)    (sizeof (a) / sizeof (a[0]))
98 #define FAIL(_code)     do { ecode = _code; goto bad; } while (0)
99         struct ath_hal_5212 *ahp = AH5212(ah);
100         HAL_CHANNEL_INTERNAL *ichan;
101         const HAL_EEPROM *ee;
102         uint32_t saveFrameSeqCount, saveDefAntenna;
103         uint32_t macStaId1, synthDelay, txFrm2TxDStart;
104         uint16_t rfXpdGain[MAX_NUM_PDGAINS_PER_CHANNEL];
105         int16_t cckOfdmPwrDelta = 0;
106         u_int modesIndex, freqIndex;
107         HAL_STATUS ecode;
108         int i, regWrites = 0;
109         uint32_t testReg;
110         uint32_t saveLedState = 0;
111
112         HALASSERT(ah->ah_magic == AR5212_MAGIC);
113         ee = AH_PRIVATE(ah)->ah_eeprom;
114
115         OS_MARK(ah, AH_MARK_RESET, bChannelChange);
116         /*
117          * Map public channel to private.
118          */
119         ichan = ath_hal_checkchannel(ah, chan);
120         if (ichan == AH_NULL) {
121                 HALDEBUG(ah, HAL_DEBUG_ANY,
122                     "%s: invalid channel %u/0x%x; no mapping\n",
123                     __func__, chan->ic_freq, chan->ic_flags);
124                 FAIL(HAL_EINVAL);
125         }
126         switch (opmode) {
127         case HAL_M_STA:
128         case HAL_M_IBSS:
129         case HAL_M_HOSTAP:
130         case HAL_M_MONITOR:
131                 break;
132         default:
133                 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid operating mode %u\n",
134                     __func__, opmode);
135                 FAIL(HAL_EINVAL);
136                 break;
137         }
138         HALASSERT(ahp->ah_eeversion >= AR_EEPROM_VER3);
139
140         /* Preserve certain DMA hardware registers on a channel change */
141         if (bChannelChange) {
142                 /*
143                  * On Venice, the TSF is almost preserved across a reset;
144                  * it requires the doubling writes to the RESET_TSF
145                  * bit in the AR_BEACON register; it also has the quirk
146                  * of the TSF going back in time on the station (station
147                  * latches onto the last beacon's tsf during a reset 50%
148                  * of the times); the latter is not a problem for adhoc
149                  * stations since as long as the TSF is behind, it will
150                  * get resynchronized on receiving the next beacon; the
151                  * TSF going backwards in time could be a problem for the
152                  * sleep operation (supported on infrastructure stations
153                  * only) - the best and most general fix for this situation
154                  * is to resynchronize the various sleep/beacon timers on
155                  * the receipt of the next beacon i.e. when the TSF itself
156                  * gets resynchronized to the AP's TSF - power save is
157                  * needed to be temporarily disabled until that time
158                  *
159                  * Need to save the sequence number to restore it after
160                  * the reset!
161                  */
162                 saveFrameSeqCount = OS_REG_READ(ah, AR_D_SEQNUM);
163         } else
164                 saveFrameSeqCount = 0;          /* NB: silence compiler */
165
166         /* If the channel change is across the same mode - perform a fast channel change */
167         if ((IS_2413(ah) || IS_5413(ah))) {
168                 /*
169                  * Channel change can only be used when:
170                  *  -channel change requested - so it's not the initial reset.
171                  *  -it's not a change to the current channel - often called when switching modes
172                  *   on a channel
173                  *  -the modes of the previous and requested channel are the same - some ugly code for XR
174                  */
175                 if (bChannelChange &&
176                     AH_PRIVATE(ah)->ah_curchan != AH_NULL &&
177                     (chan->ic_freq != AH_PRIVATE(ah)->ah_curchan->ic_freq) &&
178                     ((chan->ic_flags & IEEE80211_CHAN_ALLTURBO) ==
179                      (AH_PRIVATE(ah)->ah_curchan->ic_flags & IEEE80211_CHAN_ALLTURBO))) {
180                         if (ar5212ChannelChange(ah, chan))
181                                 /* If ChannelChange completed - skip the rest of reset */
182                                 return AH_TRUE;
183                 }
184         }
185
186         /*
187          * Preserve the antenna on a channel change
188          */
189         saveDefAntenna = OS_REG_READ(ah, AR_DEF_ANTENNA);
190         if (saveDefAntenna == 0)                /* XXX magic constants */
191                 saveDefAntenna = 1;
192
193         /* Save hardware flag before chip reset clears the register */
194         macStaId1 = OS_REG_READ(ah, AR_STA_ID1) & 
195                 (AR_STA_ID1_BASE_RATE_11B | AR_STA_ID1_USE_DEFANT);
196
197         /* Save led state from pci config register */
198         if (!IS_5315(ah))
199                 saveLedState = OS_REG_READ(ah, AR5312_PCICFG) &
200                         (AR_PCICFG_LEDCTL | AR_PCICFG_LEDMODE | AR_PCICFG_LEDBLINK |
201                          AR_PCICFG_LEDSLOW);
202
203         ar5312RestoreClock(ah, opmode);         /* move to refclk operation */
204
205         /*
206          * Adjust gain parameters before reset if
207          * there's an outstanding gain updated.
208          */
209         (void) ar5212GetRfgain(ah);
210
211         if (!ar5312ChipReset(ah, chan)) {
212                 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: chip reset failed\n", __func__);
213                 FAIL(HAL_EIO);
214         }
215
216         /* Setup the indices for the next set of register array writes */
217         if (IEEE80211_IS_CHAN_2GHZ(chan)) {
218                 freqIndex  = 2;
219                 modesIndex = IEEE80211_IS_CHAN_108G(chan) ? 5 :
220                              IEEE80211_IS_CHAN_G(chan) ? 4 : 3;
221         } else {
222                 freqIndex  = 1;
223                 modesIndex = IEEE80211_IS_CHAN_ST(chan) ? 2 : 1;
224         }
225
226         OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__);
227
228         /* Set correct Baseband to analog shift setting to access analog chips. */
229         OS_REG_WRITE(ah, AR_PHY(0), 0x00000007);
230
231         regWrites = ath_hal_ini_write(ah, &ahp->ah_ini_modes, modesIndex, 0);
232         regWrites = write_common(ah, &ahp->ah_ini_common, bChannelChange,
233                 regWrites);
234         ahp->ah_rfHal->writeRegs(ah, modesIndex, freqIndex, regWrites);
235
236         OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__);
237
238         if (IEEE80211_IS_CHAN_HALF(chan) || IEEE80211_IS_CHAN_QUARTER(chan))
239                 ar5212SetIFSTiming(ah, chan);
240
241         /* Overwrite INI values for revised chipsets */
242         if (AH_PRIVATE(ah)->ah_phyRev >= AR_PHY_CHIP_ID_REV_2) {
243                 /* ADC_CTL */
244                 OS_REG_WRITE(ah, AR_PHY_ADC_CTL,
245                              SM(2, AR_PHY_ADC_CTL_OFF_INBUFGAIN) |
246                              SM(2, AR_PHY_ADC_CTL_ON_INBUFGAIN) |
247                              AR_PHY_ADC_CTL_OFF_PWDDAC |
248                              AR_PHY_ADC_CTL_OFF_PWDADC);
249                 
250                 /* TX_PWR_ADJ */
251                 if (chan->channel == 2484) {
252                         cckOfdmPwrDelta = SCALE_OC_DELTA(ee->ee_cckOfdmPwrDelta - ee->ee_scaledCh14FilterCckDelta);
253                 } else {
254                         cckOfdmPwrDelta = SCALE_OC_DELTA(ee->ee_cckOfdmPwrDelta);
255                 }
256                 
257                 if (IEEE80211_IS_CHAN_G(chan)) {
258                         OS_REG_WRITE(ah, AR_PHY_TXPWRADJ,
259                                      SM((ee->ee_cckOfdmPwrDelta*-1), AR_PHY_TXPWRADJ_CCK_GAIN_DELTA) |
260                                      SM((cckOfdmPwrDelta*-1), AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX));
261                 } else {
262                         OS_REG_WRITE(ah, AR_PHY_TXPWRADJ, 0);
263                 }
264                 
265                 /* Add barker RSSI thresh enable as disabled */
266                 OS_REG_CLR_BIT(ah, AR_PHY_DAG_CTRLCCK,
267                                AR_PHY_DAG_CTRLCCK_EN_RSSI_THR);
268                 OS_REG_RMW_FIELD(ah, AR_PHY_DAG_CTRLCCK,
269                                  AR_PHY_DAG_CTRLCCK_RSSI_THR, 2);
270                 
271                 /* Set the mute mask to the correct default */
272                 OS_REG_WRITE(ah, AR_SEQ_MASK, 0x0000000F);
273         }
274
275         if (AH_PRIVATE(ah)->ah_phyRev >= AR_PHY_CHIP_ID_REV_3) {
276                 /* Clear reg to alllow RX_CLEAR line debug */
277                 OS_REG_WRITE(ah, AR_PHY_BLUETOOTH,  0);
278         }
279         if (AH_PRIVATE(ah)->ah_phyRev >= AR_PHY_CHIP_ID_REV_4) {
280 #ifdef notyet
281                 /* Enable burst prefetch for the data queues */
282                 OS_REG_RMW_FIELD(ah, AR_D_FPCTL, ... );
283                 /* Enable double-buffering */
284                 OS_REG_CLR_BIT(ah, AR_TXCFG, AR_TXCFG_DBL_BUF_DIS);
285 #endif
286         }
287
288         if (IS_5312_2_X(ah)) {
289                 /* ADC_CTRL */
290                 OS_REG_WRITE(ah, AR_PHY_SIGMA_DELTA,
291                              SM(2, AR_PHY_SIGMA_DELTA_ADC_SEL) |
292                              SM(4, AR_PHY_SIGMA_DELTA_FILT2) |
293                              SM(0x16, AR_PHY_SIGMA_DELTA_FILT1) |
294                              SM(0, AR_PHY_SIGMA_DELTA_ADC_CLIP));
295
296                 if (IEEE80211_IS_CHAN_2GHZ(chan))
297                         OS_REG_RMW_FIELD(ah, AR_PHY_RXGAIN, AR_PHY_RXGAIN_TXRX_RF_MAX, 0x0F);
298
299                 /* CCK Short parameter adjustment in 11B mode */
300                 if (IEEE80211_IS_CHAN_B(chan))
301                         OS_REG_RMW_FIELD(ah, AR_PHY_CCK_RXCTRL4, AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT, 12);
302
303                 /* Set ADC/DAC select values */
304                 OS_REG_WRITE(ah, AR_PHY_SLEEP_SCAL, 0x04);
305
306                 /* Increase 11A AGC Settling */
307                 if (IEEE80211_IS_CHAN_A(chan))
308                         OS_REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_AGC, 32);
309         } else {
310                 /* Set ADC/DAC select values */
311                 OS_REG_WRITE(ah, AR_PHY_SLEEP_SCAL, 0x0e);
312         }
313
314         /* Setup the transmit power values. */
315         if (!ar5212SetTransmitPower(ah, chan, rfXpdGain)) {
316                 HALDEBUG(ah, HAL_DEBUG_ANY,
317                     "%s: error init'ing transmit power\n", __func__);
318                 FAIL(HAL_EIO);
319         }
320
321         /* Write the analog registers */
322         if (!ahp->ah_rfHal->setRfRegs(ah, chan, modesIndex, rfXpdGain)) {
323                 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: ar5212SetRfRegs failed\n",
324                     __func__);
325                 FAIL(HAL_EIO);
326         }
327
328         /* Write delta slope for OFDM enabled modes (A, G, Turbo) */
329         if (IEEE80211_IS_CHAN_OFDM(chan)) {
330                 if (IS_5413(ah) ||
331                    AH_PRIVATE(ah)->ah_eeversion >= AR_EEPROM_VER5_3)
332                         ar5212SetSpurMitigation(ah, chan);
333                 ar5212SetDeltaSlope(ah, chan);
334         }
335
336         /* Setup board specific options for EEPROM version 3 */
337         if (!ar5212SetBoardValues(ah, chan)) {
338                 HALDEBUG(ah, HAL_DEBUG_ANY,
339                     "%s: error setting board options\n", __func__);
340                 FAIL(HAL_EIO);
341         }
342
343         /* Restore certain DMA hardware registers on a channel change */
344         if (bChannelChange)
345                 OS_REG_WRITE(ah, AR_D_SEQNUM, saveFrameSeqCount);
346
347         OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__);
348
349         OS_REG_WRITE(ah, AR_STA_ID0, LE_READ_4(ahp->ah_macaddr));
350         OS_REG_WRITE(ah, AR_STA_ID1, LE_READ_2(ahp->ah_macaddr + 4)
351                 | macStaId1
352                 | AR_STA_ID1_RTS_USE_DEF
353                 | ahp->ah_staId1Defaults
354         );
355         ar5212SetOperatingMode(ah, opmode);
356
357         /* Set Venice BSSID mask according to current state */
358         OS_REG_WRITE(ah, AR_BSSMSKL, LE_READ_4(ahp->ah_bssidmask));
359         OS_REG_WRITE(ah, AR_BSSMSKU, LE_READ_2(ahp->ah_bssidmask + 4));
360
361         /* Restore previous led state */
362         if (!IS_5315(ah))
363                 OS_REG_WRITE(ah, AR5312_PCICFG, OS_REG_READ(ah, AR_PCICFG) | saveLedState);
364
365         /* Restore previous antenna */
366         OS_REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
367
368         /* then our BSSID */
369         OS_REG_WRITE(ah, AR_BSS_ID0, LE_READ_4(ahp->ah_bssid));
370         OS_REG_WRITE(ah, AR_BSS_ID1, LE_READ_2(ahp->ah_bssid + 4));
371
372         /* Restore bmiss rssi & count thresholds */
373         OS_REG_WRITE(ah, AR_RSSI_THR, ahp->ah_rssiThr);
374
375         OS_REG_WRITE(ah, AR_ISR, ~0);           /* cleared on write */
376
377         if (!ar5212SetChannel(ah, chan))
378                 FAIL(HAL_EIO);
379
380         OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__);
381
382         ar5212SetCoverageClass(ah, AH_PRIVATE(ah)->ah_coverageClass, 1);
383
384         ar5212SetRateDurationTable(ah, chan);
385
386         /* Set Tx frame start to tx data start delay */
387         if (IS_RAD5112_ANY(ah) &&
388             (IEEE80211_IS_CHAN_HALF(chan) || IEEE80211_IS_CHAN_QUARTER(chan))) {
389                 txFrm2TxDStart = 
390                         IEEE80211_IS_CHAN_HALF(chan) ?
391                                         TX_FRAME_D_START_HALF_RATE:
392                                         TX_FRAME_D_START_QUARTER_RATE;
393                 OS_REG_RMW_FIELD(ah, AR_PHY_TX_CTL, 
394                         AR_PHY_TX_FRAME_TO_TX_DATA_START, txFrm2TxDStart);
395         }
396
397         /*
398          * Setup fast diversity.
399          * Fast diversity can be enabled or disabled via regadd.txt.
400          * Default is enabled.
401          * For reference,
402          *    Disable: reg        val
403          *             0x00009860 0x00009d18 (if 11a / 11g, else no change)
404          *             0x00009970 0x192bb514
405          *             0x0000a208 0xd03e4648
406          *
407          *    Enable:  0x00009860 0x00009d10 (if 11a / 11g, else no change)
408          *             0x00009970 0x192fb514
409          *             0x0000a208 0xd03e6788
410          */
411
412         /* XXX Setup pre PHY ENABLE EAR additions */
413
414         /* flush SCAL reg */
415         if (IS_5312_2_X(ah)) {
416                 (void) OS_REG_READ(ah, AR_PHY_SLEEP_SCAL);
417         }
418
419         /*
420          * Wait for the frequency synth to settle (synth goes on
421          * via AR_PHY_ACTIVE_EN).  Read the phy active delay register.
422          * Value is in 100ns increments.
423          */
424         synthDelay = OS_REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY;
425         if (IEEE80211_IS_CHAN_B(chan)) {
426                 synthDelay = (4 * synthDelay) / 22;
427         } else {
428                 synthDelay /= 10;
429         }
430
431         /* Activate the PHY (includes baseband activate and synthesizer on) */
432         OS_REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
433
434         /* 
435          * There is an issue if the AP starts the calibration before
436          * the base band timeout completes.  This could result in the
437          * rx_clear false triggering.  As a workaround we add delay an
438          * extra BASE_ACTIVATE_DELAY usecs to ensure this condition
439          * does not happen.
440          */
441         if (IEEE80211_IS_CHAN_HALF(chan)) {
442                 OS_DELAY((synthDelay << 1) + BASE_ACTIVATE_DELAY);
443         } else if (IEEE80211_IS_CHAN_QUARTER(chan)) {
444                 OS_DELAY((synthDelay << 2) + BASE_ACTIVATE_DELAY);
445         } else {
446                 OS_DELAY(synthDelay + BASE_ACTIVATE_DELAY);
447         }
448
449         /*
450          * The udelay method is not reliable with notebooks.
451          * Need to check to see if the baseband is ready
452          */
453         testReg = OS_REG_READ(ah, AR_PHY_TESTCTRL);
454         /* Selects the Tx hold */
455         OS_REG_WRITE(ah, AR_PHY_TESTCTRL, AR_PHY_TESTCTRL_TXHOLD);
456         i = 0;
457         while ((i++ < 20) &&
458                (OS_REG_READ(ah, 0x9c24) & 0x10)) /* test if baseband not ready */               OS_DELAY(200);
459         OS_REG_WRITE(ah, AR_PHY_TESTCTRL, testReg);
460
461         /* Calibrate the AGC and start a NF calculation */
462         OS_REG_WRITE(ah, AR_PHY_AGC_CONTROL,
463                   OS_REG_READ(ah, AR_PHY_AGC_CONTROL)
464                 | AR_PHY_AGC_CONTROL_CAL
465                 | AR_PHY_AGC_CONTROL_NF);
466
467         if (!IEEE80211_IS_CHAN_B(chan) && ahp->ah_bIQCalibration != IQ_CAL_DONE) {
468                 /* Start IQ calibration w/ 2^(INIT_IQCAL_LOG_COUNT_MAX+1) samples */
469                 OS_REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4, 
470                         AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX,
471                         INIT_IQCAL_LOG_COUNT_MAX);
472                 OS_REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4,
473                         AR_PHY_TIMING_CTRL4_DO_IQCAL);
474                 ahp->ah_bIQCalibration = IQ_CAL_RUNNING;
475         } else
476                 ahp->ah_bIQCalibration = IQ_CAL_INACTIVE;
477
478         /* Setup compression registers */
479         ar5212SetCompRegs(ah);
480
481         /* Set 1:1 QCU to DCU mapping for all queues */
482         for (i = 0; i < AR_NUM_DCU; i++)
483                 OS_REG_WRITE(ah, AR_DQCUMASK(i), 1 << i);
484
485         ahp->ah_intrTxqs = 0;
486         for (i = 0; i < AH_PRIVATE(ah)->ah_caps.halTotalQueues; i++)
487                 ar5212ResetTxQueue(ah, i);
488
489         /*
490          * Setup interrupt handling.  Note that ar5212ResetTxQueue
491          * manipulates the secondary IMR's as queues are enabled
492          * and disabled.  This is done with RMW ops to insure the
493          * settings we make here are preserved.
494          */
495         ahp->ah_maskReg = AR_IMR_TXOK | AR_IMR_TXERR | AR_IMR_TXURN
496                         | AR_IMR_RXOK | AR_IMR_RXERR | AR_IMR_RXORN
497                         | AR_IMR_HIUERR
498                         ;
499         if (opmode == HAL_M_HOSTAP)
500                 ahp->ah_maskReg |= AR_IMR_MIB;
501         OS_REG_WRITE(ah, AR_IMR, ahp->ah_maskReg);
502         /* Enable bus errors that are OR'd to set the HIUERR bit */
503         OS_REG_WRITE(ah, AR_IMR_S2,
504                 OS_REG_READ(ah, AR_IMR_S2)
505                 | AR_IMR_S2_MCABT | AR_IMR_S2_SSERR | AR_IMR_S2_DPERR);
506
507         if (AH_PRIVATE(ah)->ah_rfkillEnabled)
508                 ar5212EnableRfKill(ah);
509
510         if (!ath_hal_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, 0)) {
511                 HALDEBUG(ah, HAL_DEBUG_ANY,
512                     "%s: offset calibration failed to complete in 1ms;"
513                     " noisy environment?\n", __func__);
514         }
515
516         /*
517          * Set clocks back to 32kHz if they had been using refClk, then
518          * use an external 32kHz crystal when sleeping, if one exists.
519          */
520         ar5312SetupClock(ah, opmode);
521
522         /*
523          * Writing to AR_BEACON will start timers. Hence it should
524          * be the last register to be written. Do not reset tsf, do
525          * not enable beacons at this point, but preserve other values
526          * like beaconInterval.
527          */
528         OS_REG_WRITE(ah, AR_BEACON,
529                 (OS_REG_READ(ah, AR_BEACON) &~ (AR_BEACON_EN | AR_BEACON_RESET_TSF)));
530
531         /* XXX Setup post reset EAR additions */
532
533         /*  QoS support */
534         if (AH_PRIVATE(ah)->ah_macVersion > AR_SREV_VERSION_VENICE ||
535             (AH_PRIVATE(ah)->ah_macVersion == AR_SREV_VERSION_VENICE &&
536              AH_PRIVATE(ah)->ah_macRev >= AR_SREV_GRIFFIN_LITE)) {
537                 OS_REG_WRITE(ah, AR_QOS_CONTROL, 0x100aa);      /* XXX magic */
538                 OS_REG_WRITE(ah, AR_QOS_SELECT, 0x3210);        /* XXX magic */
539         }
540
541         /* Turn on NOACK Support for QoS packets */
542         OS_REG_WRITE(ah, AR_NOACK,
543                      SM(2, AR_NOACK_2BIT_VALUE) |
544                      SM(5, AR_NOACK_BIT_OFFSET) |
545                      SM(0, AR_NOACK_BYTE_OFFSET));
546
547         /* Restore user-specified settings */
548         if (ahp->ah_miscMode != 0)
549                 OS_REG_WRITE(ah, AR_MISC_MODE, ahp->ah_miscMode);
550         if (ahp->ah_slottime != (u_int) -1)
551                 ar5212SetSlotTime(ah, ahp->ah_slottime);
552         if (ahp->ah_acktimeout != (u_int) -1)
553                 ar5212SetAckTimeout(ah, ahp->ah_acktimeout);
554         if (ahp->ah_ctstimeout != (u_int) -1)
555                 ar5212SetCTSTimeout(ah, ahp->ah_ctstimeout);
556         if (ahp->ah_sifstime != (u_int) -1)
557                 ar5212SetSifsTime(ah, ahp->ah_sifstime);
558         if (AH_PRIVATE(ah)->ah_diagreg != 0)
559                 OS_REG_WRITE(ah, AR_DIAG_SW, AH_PRIVATE(ah)->ah_diagreg);
560
561         AH_PRIVATE(ah)->ah_opmode = opmode;     /* record operating mode */
562
563         if (bChannelChange && !IEEE80211_IS_CHAN_DFS(chan)) 
564                 chan->ic_state &= ~IEEE80211_CHANSTATE_CWINT;
565
566         HALDEBUG(ah, HAL_DEBUG_RESET, "%s: done\n", __func__);
567
568         OS_MARK(ah, AH_MARK_RESET_DONE, 0);
569
570         return AH_TRUE;
571 bad:
572         OS_MARK(ah, AH_MARK_RESET_DONE, ecode);
573         if (status != AH_NULL)
574                 *status = ecode;
575         return AH_FALSE;
576 #undef FAIL
577 #undef N
578 }
579
580 /*
581  * Places the PHY and Radio chips into reset.  A full reset
582  * must be called to leave this state.  The PCI/MAC/PCU are
583  * not placed into reset as we must receive interrupt to
584  * re-enable the hardware.
585  */
586 HAL_BOOL
587 ar5312PhyDisable(struct ath_hal *ah)
588 {
589     return ar5312SetResetReg(ah, AR_RC_BB);
590 }
591
592 /*
593  * Places all of hardware into reset
594  */
595 HAL_BOOL
596 ar5312Disable(struct ath_hal *ah)
597 {
598         if (!ar5312SetPowerMode(ah, HAL_PM_AWAKE, AH_TRUE))
599                 return AH_FALSE;
600         /*
601          * Reset the HW - PCI must be reset after the rest of the
602          * device has been reset.
603          */
604         return ar5312SetResetReg(ah, AR_RC_MAC | AR_RC_BB);
605 }
606
607 /*
608  * Places the hardware into reset and then pulls it out of reset
609  *
610  * TODO: Only write the PLL if we're changing to or from CCK mode
611  * 
612  * WARNING: The order of the PLL and mode registers must be correct.
613  */
614 HAL_BOOL
615 ar5312ChipReset(struct ath_hal *ah, const struct ieee80211_channel *chan)
616 {
617
618         OS_MARK(ah, AH_MARK_CHIPRESET, chan ? chan->ic_freq : 0);
619
620         /*
621          * Reset the HW 
622          */
623         if (!ar5312SetResetReg(ah, AR_RC_MAC | AR_RC_BB)) {
624                 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: ar5312SetResetReg failed\n",
625                     __func__);
626                 return AH_FALSE;
627         }
628
629         /* Bring out of sleep mode (AGAIN) */
630         if (!ar5312SetPowerMode(ah, HAL_PM_AWAKE, AH_TRUE)) {
631                 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: ar5312SetPowerMode failed\n",
632                     __func__);
633                 return AH_FALSE;
634         }
635
636         /* Clear warm reset register */
637         if (!ar5312SetResetReg(ah, 0)) {
638                 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: ar5312SetResetReg failed\n",
639                     __func__);
640                 return AH_FALSE;
641         }
642
643         /*
644          * Perform warm reset before the mode/PLL/turbo registers
645          * are changed in order to deactivate the radio.  Mode changes
646          * with an active radio can result in corrupted shifts to the
647          * radio device.
648          */
649
650         /*
651          * Set CCK and Turbo modes correctly.
652          */
653         if (chan != AH_NULL) {          /* NB: can be null during attach */
654                 uint32_t rfMode, phyPLL = 0, curPhyPLL, turbo;
655
656                 if (IS_RAD5112_ANY(ah)) {
657                         rfMode = AR_PHY_MODE_AR5112;
658                         if (!IS_5315(ah)) {
659                                 if (IEEE80211_IS_CHAN_CCK(chan)) {
660                                         phyPLL = AR_PHY_PLL_CTL_44_5312;
661                                 } else {
662                                         if (IEEE80211_IS_CHAN_HALF(chan)) {
663                                                 phyPLL = AR_PHY_PLL_CTL_40_5312_HALF;
664                                         } else if (IEEE80211_IS_CHAN_QUARTER(chan)) {
665                                                 phyPLL = AR_PHY_PLL_CTL_40_5312_QUARTER;
666                                         } else {
667                                                 phyPLL = AR_PHY_PLL_CTL_40_5312;
668                                         }
669                                 }
670                         } else {
671                                 if (IEEE80211_IS_CHAN_CCK(chan))
672                                         phyPLL = AR_PHY_PLL_CTL_44_5112;
673                                 else
674                                         phyPLL = AR_PHY_PLL_CTL_40_5112;
675                                 if (IEEE80211_IS_CHAN_HALF(chan))
676                                         phyPLL |= AR_PHY_PLL_CTL_HALF;
677                                 else if (IEEE80211_IS_CHAN_QUARTER(chan))
678                                         phyPLL |= AR_PHY_PLL_CTL_QUARTER;
679                         }
680                 } else {
681                         rfMode = AR_PHY_MODE_AR5111;
682                         if (IEEE80211_IS_CHAN_CCK(chan))
683                                 phyPLL = AR_PHY_PLL_CTL_44;
684                         else
685                                 phyPLL = AR_PHY_PLL_CTL_40;
686                         if (IEEE80211_IS_CHAN_HALF(chan))
687                                 phyPLL = AR_PHY_PLL_CTL_HALF;
688                         else if (IEEE80211_IS_CHAN_QUARTER(chan))
689                                 phyPLL = AR_PHY_PLL_CTL_QUARTER;
690                 }
691                 if (IEEE80211_IS_CHAN_G(chan))
692                         rfMode |= AR_PHY_MODE_DYNAMIC;
693                 else if (IEEE80211_IS_CHAN_OFDM(chan))
694                         rfMode |= AR_PHY_MODE_OFDM;
695                 else
696                         rfMode |= AR_PHY_MODE_CCK;
697                 if (IEEE80211_IS_CHAN_5GHZ(chan))
698                         rfMode |= AR_PHY_MODE_RF5GHZ;
699                 else
700                         rfMode |= AR_PHY_MODE_RF2GHZ;
701                 turbo = IEEE80211_IS_CHAN_TURBO(chan) ?
702                         (AR_PHY_FC_TURBO_MODE | AR_PHY_FC_TURBO_SHORT) : 0;
703                 curPhyPLL = OS_REG_READ(ah, AR_PHY_PLL_CTL);
704                 /*
705                  * PLL, Mode, and Turbo values must be written in the correct
706                  * order to ensure:
707                  * - The PLL cannot be set to 44 unless the CCK or DYNAMIC
708                  *   mode bit is set
709                  * - Turbo cannot be set at the same time as CCK or DYNAMIC
710                  */
711                 if (IEEE80211_IS_CHAN_CCK(chan)) {
712                         OS_REG_WRITE(ah, AR_PHY_TURBO, turbo);
713                         OS_REG_WRITE(ah, AR_PHY_MODE, rfMode);
714                         if (curPhyPLL != phyPLL) {
715                                 OS_REG_WRITE(ah,  AR_PHY_PLL_CTL,  phyPLL);
716                                 /* Wait for the PLL to settle */
717                                 OS_DELAY(PLL_SETTLE_DELAY);
718                         }
719                 } else {
720                         if (curPhyPLL != phyPLL) {
721                                 OS_REG_WRITE(ah,  AR_PHY_PLL_CTL,  phyPLL);
722                                 /* Wait for the PLL to settle */
723                                 OS_DELAY(PLL_SETTLE_DELAY);
724                         }
725                         OS_REG_WRITE(ah, AR_PHY_TURBO, turbo);
726                         OS_REG_WRITE(ah, AR_PHY_MODE, rfMode);
727                 }
728         }
729         return AH_TRUE;
730 }
731
732 /*
733  * Write the given reset bit mask into the reset register
734  */
735 static HAL_BOOL
736 ar5312SetResetReg(struct ath_hal *ah, uint32_t resetMask)
737 {
738         uint32_t mask = resetMask ? resetMask : ~0;
739         HAL_BOOL rt;
740
741         if ((rt = ar5312MacReset(ah, mask)) == AH_FALSE) {
742                 return rt;
743         }
744         if ((resetMask & AR_RC_MAC) == 0) {
745                 if (isBigEndian()) {
746                         /*
747                          * Set CFG, little-endian for descriptor accesses.
748                          */
749 #ifdef AH_NEED_DESC_SWAP
750                         mask = INIT_CONFIG_STATUS | AR_CFG_SWRD;
751 #else
752                         mask = INIT_CONFIG_STATUS |
753                                 AR_CFG_SWTD | AR_CFG_SWRD;
754 #endif
755                         OS_REG_WRITE(ah, AR_CFG, mask);
756                 } else
757                         OS_REG_WRITE(ah, AR_CFG, INIT_CONFIG_STATUS);
758         }
759         return rt;
760 }
761
762 /*
763  * ar5312MacReset resets (and then un-resets) the specified
764  * wireless components.
765  * Note: The RCMask cannot be zero on entering from ar5312SetResetReg.
766  */
767
768 HAL_BOOL
769 ar5312MacReset(struct ath_hal *ah, unsigned int RCMask)
770 {
771         int wlanNum = AR5312_UNIT(ah);
772         uint32_t resetBB, resetBits, regMask;
773         uint32_t reg;
774
775         if (RCMask == 0)
776                 return(AH_FALSE);
777 #if ( AH_SUPPORT_2316 || AH_SUPPORT_2317 )
778             if (IS_5315(ah)) {
779                         switch(wlanNum) {
780                         case 0:
781                                 resetBB = AR5315_RC_BB0_CRES | AR5315_RC_WBB0_RES; 
782                                 /* Warm and cold reset bits for wbb */
783                                 resetBits = AR5315_RC_WMAC0_RES;
784                                 break;
785                         case 1:
786                                 resetBB = AR5315_RC_BB1_CRES | AR5315_RC_WBB1_RES; 
787                                 /* Warm and cold reset bits for wbb */
788                                 resetBits = AR5315_RC_WMAC1_RES;
789                                 break;
790                         default:
791                                 return(AH_FALSE);
792                         }               
793                         regMask = ~(resetBB | resetBits);
794
795                         /* read before */
796                         reg = OS_REG_READ(ah, 
797                                                           (AR5315_RSTIMER_BASE - ((uint32_t) ah->ah_sh) + AR5315_RESET));
798
799                         if (RCMask == AR_RC_BB) {
800                                 /* Put baseband in reset */
801                                 reg |= resetBB;    /* Cold and warm reset the baseband bits */
802                         } else {
803                                 /*
804                                  * Reset the MAC and baseband.  This is a bit different than
805                                  * the PCI version, but holding in reset causes problems.
806                                  */
807                                 reg &= regMask;
808                                 reg |= (resetBits | resetBB) ;
809                         }
810                         OS_REG_WRITE(ah, 
811                                                  (AR5315_RSTIMER_BASE - ((uint32_t) ah->ah_sh)+AR5315_RESET),
812                                                  reg);
813                         /* read after */
814                         OS_REG_READ(ah, 
815                                                 (AR5315_RSTIMER_BASE - ((uint32_t) ah->ah_sh) +AR5315_RESET));
816                         OS_DELAY(100);
817
818                         /* Bring MAC and baseband out of reset */
819                         reg &= regMask;
820                         /* read before */
821                         OS_REG_READ(ah, 
822                                                 (AR5315_RSTIMER_BASE- ((uint32_t) ah->ah_sh) +AR5315_RESET));
823                         OS_REG_WRITE(ah, 
824                                                  (AR5315_RSTIMER_BASE - ((uint32_t) ah->ah_sh)+AR5315_RESET),
825                                                  reg);
826                         /* read after */
827                         OS_REG_READ(ah,
828                                                 (AR5315_RSTIMER_BASE- ((uint32_t) ah->ah_sh) +AR5315_RESET));
829
830                 } 
831         else 
832 #endif
833                 {
834                         switch(wlanNum) {
835                         case 0:
836                                 resetBB = AR5312_RC_BB0_CRES | AR5312_RC_WBB0_RES;
837                                 /* Warm and cold reset bits for wbb */
838                                 resetBits = AR5312_RC_WMAC0_RES;
839                                 break;
840                         case 1:
841                                 resetBB = AR5312_RC_BB1_CRES | AR5312_RC_WBB1_RES;
842                                 /* Warm and cold reset bits for wbb */
843                                 resetBits = AR5312_RC_WMAC1_RES;
844                                 break;
845                         default:
846                                 return(AH_FALSE);
847                         }
848                         regMask = ~(resetBB | resetBits);
849
850                         /* read before */
851                         reg = OS_REG_READ(ah,
852                                                           (AR5312_RSTIMER_BASE - ((uint32_t) ah->ah_sh) + AR5312_RESET));
853
854                         if (RCMask == AR_RC_BB) {
855                                 /* Put baseband in reset */
856                                 reg |= resetBB;    /* Cold and warm reset the baseband bits */
857                         } else {
858                                 /*
859                                  * Reset the MAC and baseband.  This is a bit different than
860                                  * the PCI version, but holding in reset causes problems.
861                                  */
862                                 reg &= regMask;
863                                 reg |= (resetBits | resetBB) ;
864                         }
865                         OS_REG_WRITE(ah,
866                                                  (AR5312_RSTIMER_BASE - ((uint32_t) ah->ah_sh)+AR5312_RESET),
867                                                  reg);
868                         /* read after */
869                         OS_REG_READ(ah,
870                                                 (AR5312_RSTIMER_BASE - ((uint32_t) ah->ah_sh) +AR5312_RESET));
871                         OS_DELAY(100);
872
873                         /* Bring MAC and baseband out of reset */
874                         reg &= regMask;
875                         /* read before */
876                         OS_REG_READ(ah,
877                                                 (AR5312_RSTIMER_BASE- ((uint32_t) ah->ah_sh) +AR5312_RESET));
878                         OS_REG_WRITE(ah,
879                                                  (AR5312_RSTIMER_BASE - ((uint32_t) ah->ah_sh)+AR5312_RESET),
880                                                  reg);
881                         /* read after */
882                         OS_REG_READ(ah,
883                                                 (AR5312_RSTIMER_BASE- ((uint32_t) ah->ah_sh) +AR5312_RESET));
884                 }
885         return(AH_TRUE);
886 }
887
888 #endif /* AH_SUPPORT_AR5312 */