176bd547bSAdrian Chadd /*
276bd547bSAdrian Chadd * Copyright (c) 2013 Qualcomm Atheros, Inc.
376bd547bSAdrian Chadd *
476bd547bSAdrian Chadd * Permission to use, copy, modify, and/or distribute this software for any
576bd547bSAdrian Chadd * purpose with or without fee is hereby granted, provided that the above
676bd547bSAdrian Chadd * copyright notice and this permission notice appear in all copies.
776bd547bSAdrian Chadd *
876bd547bSAdrian Chadd * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
976bd547bSAdrian Chadd * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1076bd547bSAdrian Chadd * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1176bd547bSAdrian Chadd * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1276bd547bSAdrian Chadd * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1376bd547bSAdrian Chadd * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1476bd547bSAdrian Chadd * PERFORMANCE OF THIS SOFTWARE.
1576bd547bSAdrian Chadd */
1676bd547bSAdrian Chadd
1776bd547bSAdrian Chadd
1876bd547bSAdrian Chadd #include "opt_ah.h"
1976bd547bSAdrian Chadd
2076bd547bSAdrian Chadd #include "ah.h"
2176bd547bSAdrian Chadd #include "ah_desc.h"
2276bd547bSAdrian Chadd #include "ah_internal.h"
2376bd547bSAdrian Chadd
2476bd547bSAdrian Chadd #include "ar9300/ar9300.h"
2576bd547bSAdrian Chadd #include "ar9300/ar9300phy.h"
2676bd547bSAdrian Chadd #include "ar9300/ar9300reg.h"
2776bd547bSAdrian Chadd
2876bd547bSAdrian Chadd /*
2976bd547bSAdrian Chadd * Default 5413/9300 radar phy parameters
3076bd547bSAdrian Chadd * Values adjusted to fix EV76432/EV76320
3176bd547bSAdrian Chadd */
3276bd547bSAdrian Chadd #define AR9300_DFS_FIRPWR -28
3376bd547bSAdrian Chadd #define AR9300_DFS_RRSSI 0
3476bd547bSAdrian Chadd #define AR9300_DFS_HEIGHT 10
3576bd547bSAdrian Chadd #define AR9300_DFS_PRSSI 6
3676bd547bSAdrian Chadd #define AR9300_DFS_INBAND 8
3776bd547bSAdrian Chadd #define AR9300_DFS_RELPWR 8
3876bd547bSAdrian Chadd #define AR9300_DFS_RELSTEP 12
3976bd547bSAdrian Chadd #define AR9300_DFS_MAXLEN 255
4076bd547bSAdrian Chadd
41e113789bSAdrian Chadd /*
42e113789bSAdrian Chadd * This PRSSI value should be used during CAC.
43e113789bSAdrian Chadd */
44e113789bSAdrian Chadd #define AR9300_DFS_PRSSI_CAC 10
4576bd547bSAdrian Chadd
4676bd547bSAdrian Chadd /*
4776bd547bSAdrian Chadd * make sure that value matches value in ar9300_osprey_2p2_mac_core[][2]
4876bd547bSAdrian Chadd * for register 0x1040 to 0x104c
4976bd547bSAdrian Chadd */
5076bd547bSAdrian Chadd #define AR9300_DEFAULT_DIFS 0x002ffc0f
5176bd547bSAdrian Chadd #define AR9300_FCC_RADARS_FCC_OFFSET 4
5276bd547bSAdrian Chadd
5376bd547bSAdrian Chadd struct dfs_pulse ar9300_etsi_radars[] = {
5476bd547bSAdrian Chadd
5576bd547bSAdrian Chadd /* for short pulses, RSSI threshold should be smaller than
5676bd547bSAdrian Chadd * Kquick-drop. The chip has only one chance to drop the gain which
5776bd547bSAdrian Chadd * will be reported as the estimated RSSI */
5876bd547bSAdrian Chadd
5976bd547bSAdrian Chadd /* TYPE staggered pulse */
6076bd547bSAdrian Chadd /* 0.8-2us, 2-3 bursts,300-400 PRF, 10 pulses each */
6176bd547bSAdrian Chadd {30, 2, 300, 400, 2, 30, 3, 0, 5, 15, 0, 0, 1, 31}, /* Type 5*/
6276bd547bSAdrian Chadd /* 0.8-2us, 2-3 bursts, 400-1200 PRF, 15 pulses each */
6376bd547bSAdrian Chadd {30, 2, 400, 1200, 2, 30, 7, 0, 5, 15, 0, 0, 0, 32}, /* Type 6 */
6476bd547bSAdrian Chadd
6576bd547bSAdrian Chadd /* constant PRF based */
6676bd547bSAdrian Chadd /* 0.8-5us, 200 300 PRF, 10 pulses */
6776bd547bSAdrian Chadd {10, 5, 200, 400, 0, 24, 5, 0, 8, 15, 0, 0, 2, 33}, /* Type 1 */
6876bd547bSAdrian Chadd {10, 5, 400, 600, 0, 24, 5, 0, 8, 15, 0, 0, 2, 37}, /* Type 1 */
6976bd547bSAdrian Chadd {10, 5, 600, 800, 0, 24, 5, 0, 8, 15, 0, 0, 2, 38}, /* Type 1 */
7076bd547bSAdrian Chadd {10, 5, 800, 1000, 0, 24, 5, 0, 8, 15, 0, 0, 2, 39}, /* Type 1 */
7176bd547bSAdrian Chadd // {10, 5, 200, 1000, 0, 24, 5, 0, 8, 15, 0, 0, 2, 33},
7276bd547bSAdrian Chadd
7376bd547bSAdrian Chadd /* 0.8-15us, 200-1600 PRF, 15 pulses */
7476bd547bSAdrian Chadd {15, 15, 200, 1600, 0, 24, 8, 0, 18, 24, 0, 0, 0, 34}, /* Type 2 */
7576bd547bSAdrian Chadd
7676bd547bSAdrian Chadd /* 0.8-15us, 2300-4000 PRF, 25 pulses*/
7776bd547bSAdrian Chadd {25, 15, 2300, 4000, 0, 24, 10, 0, 18, 24, 0, 0, 0, 35}, /* Type 3 */
7876bd547bSAdrian Chadd
7976bd547bSAdrian Chadd /* 20-30us, 2000-4000 PRF, 20 pulses*/
8076bd547bSAdrian Chadd {20, 30, 2000, 4000, 0, 24, 8, 19, 33, 24, 0, 0, 0, 36}, /* Type 4 */
8176bd547bSAdrian Chadd };
8276bd547bSAdrian Chadd
8376bd547bSAdrian Chadd
8476bd547bSAdrian Chadd /* The following are for FCC Bin 1-4 pulses */
8576bd547bSAdrian Chadd struct dfs_pulse ar9300_fcc_radars[] = {
8676bd547bSAdrian Chadd
8776bd547bSAdrian Chadd /* following two filters are specific to Japan/MKK4 */
8876bd547bSAdrian Chadd // {18, 1, 720, 720, 1, 6, 6, 0, 1, 18, 0, 3, 0, 17}, // 1389 +/- 6 us
8976bd547bSAdrian Chadd // {18, 4, 250, 250, 1, 10, 5, 1, 6, 18, 0, 3, 0, 18}, // 4000 +/- 6 us
9076bd547bSAdrian Chadd // {18, 5, 260, 260, 1, 10, 6, 1, 6, 18, 0, 3, 0, 19}, // 3846 +/- 7 us
9176bd547bSAdrian Chadd {18, 1, 720, 720, 0, 6, 6, 0, 1, 18, 0, 3, 0, 17}, // 1389 +/- 6 us
9276bd547bSAdrian Chadd {18, 4, 250, 250, 0, 10, 5, 1, 6, 18, 0, 3, 0, 18}, // 4000 +/- 6 us
9376bd547bSAdrian Chadd {18, 5, 260, 260, 0, 10, 6, 1, 6, 18, 0, 3, 1, 19}, // 3846 +/- 7 us
9476bd547bSAdrian Chadd // {18, 5, 260, 260, 1, 10, 6, 1, 6, 18, 0, 3, 1, 20}, // 3846 +/- 7 us
9576bd547bSAdrian Chadd
9676bd547bSAdrian Chadd {18, 5, 260, 260, 1, 10, 6, 1, 6, 18, 0, 3, 1, 20}, // 3846 +/- 7 us
9776bd547bSAdrian Chadd
9876bd547bSAdrian Chadd
9976bd547bSAdrian Chadd /* following filters are common to both FCC and JAPAN */
10076bd547bSAdrian Chadd
10176bd547bSAdrian Chadd // FCC TYPE 1
10276bd547bSAdrian Chadd // {18, 1, 325, 1930, 0, 6, 7, 0, 1, 18, 0, 3, 0, 0}, // 518 to 3066
10376bd547bSAdrian Chadd {18, 1, 700, 700, 0, 6, 5, 0, 1, 18, 0, 3, 1, 8},
10476bd547bSAdrian Chadd {18, 1, 350, 350, 0, 6, 5, 0, 1, 18, 0, 3, 0, 0},
10576bd547bSAdrian Chadd
10676bd547bSAdrian Chadd
10776bd547bSAdrian Chadd // FCC TYPE 6
10876bd547bSAdrian Chadd // {9, 1, 3003, 3003, 1, 7, 5, 0, 1, 18, 0, 0, 0, 1}, // 333 +/- 7 us
10976bd547bSAdrian Chadd //{9, 1, 3003, 3003, 1, 7, 5, 0, 1, 18, 0, 0, 0, 1},
11076bd547bSAdrian Chadd {9, 1, 3003, 3003, 0, 7, 5, 0, 1, 18, 0, 0, 1, 1},
11176bd547bSAdrian Chadd
11276bd547bSAdrian Chadd // FCC TYPE 2
11376bd547bSAdrian Chadd {23, 5, 4347, 6666, 0, 18, 11, 0, 7, 22, 0, 3, 0, 2},
11476bd547bSAdrian Chadd
11576bd547bSAdrian Chadd // FCC TYPE 3
11676bd547bSAdrian Chadd {18, 10, 2000, 5000, 0, 23, 8, 6, 13, 22, 0, 3, 0, 5},
11776bd547bSAdrian Chadd
11876bd547bSAdrian Chadd // FCC TYPE 4
11976bd547bSAdrian Chadd {16, 15, 2000, 5000, 0, 25, 7, 11, 23, 22, 0, 3, 0, 11},
12076bd547bSAdrian Chadd
12176bd547bSAdrian Chadd };
12276bd547bSAdrian Chadd
12376bd547bSAdrian Chadd struct dfs_bin5pulse ar9300_bin5pulses[] = {
12476bd547bSAdrian Chadd {2, 28, 105, 12, 22, 5},
12576bd547bSAdrian Chadd };
12676bd547bSAdrian Chadd
12776bd547bSAdrian Chadd
128e113789bSAdrian Chadd #if 0
12976bd547bSAdrian Chadd /*
13076bd547bSAdrian Chadd * Find the internal HAL channel corresponding to the
13176bd547bSAdrian Chadd * public HAL channel specified in c
13276bd547bSAdrian Chadd */
13376bd547bSAdrian Chadd
13476bd547bSAdrian Chadd static HAL_CHANNEL_INTERNAL *
135e113789bSAdrian Chadd getchannel(struct ath_hal *ah, const struct ieee80211_channel *c)
13676bd547bSAdrian Chadd {
13776bd547bSAdrian Chadd #define CHAN_FLAGS (CHANNEL_ALL | CHANNEL_HALF | CHANNEL_QUARTER)
13876bd547bSAdrian Chadd HAL_CHANNEL_INTERNAL *base, *cc;
13976bd547bSAdrian Chadd int flags = c->channel_flags & CHAN_FLAGS;
14076bd547bSAdrian Chadd int n, lim;
14176bd547bSAdrian Chadd
14276bd547bSAdrian Chadd /*
14376bd547bSAdrian Chadd * Check current channel to avoid the lookup.
14476bd547bSAdrian Chadd */
14576bd547bSAdrian Chadd cc = AH_PRIVATE(ah)->ah_curchan;
14676bd547bSAdrian Chadd if (cc != AH_NULL && cc->channel == c->channel &&
14776bd547bSAdrian Chadd (cc->channel_flags & CHAN_FLAGS) == flags) {
14876bd547bSAdrian Chadd return cc;
14976bd547bSAdrian Chadd }
15076bd547bSAdrian Chadd
15176bd547bSAdrian Chadd /* binary search based on known sorting order */
15276bd547bSAdrian Chadd base = AH_TABLES(ah)->ah_channels;
15376bd547bSAdrian Chadd n = AH_PRIVATE(ah)->ah_nchan;
15476bd547bSAdrian Chadd /* binary search based on known sorting order */
15576bd547bSAdrian Chadd for (lim = n; lim != 0; lim >>= 1) {
15676bd547bSAdrian Chadd int d;
15776bd547bSAdrian Chadd cc = &base[lim >> 1];
15876bd547bSAdrian Chadd d = c->channel - cc->channel;
15976bd547bSAdrian Chadd if (d == 0) {
16076bd547bSAdrian Chadd if ((cc->channel_flags & CHAN_FLAGS) == flags) {
16176bd547bSAdrian Chadd return cc;
16276bd547bSAdrian Chadd }
16376bd547bSAdrian Chadd d = flags - (cc->channel_flags & CHAN_FLAGS);
16476bd547bSAdrian Chadd }
16576bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: channel %u/0x%x d %d\n", __func__,
16676bd547bSAdrian Chadd cc->channel, cc->channel_flags, d);
16776bd547bSAdrian Chadd if (d > 0) {
16876bd547bSAdrian Chadd base = cc + 1;
16976bd547bSAdrian Chadd lim--;
17076bd547bSAdrian Chadd }
17176bd547bSAdrian Chadd }
17276bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: no match for %u/0x%x\n",
17376bd547bSAdrian Chadd __func__, c->channel, c->channel_flags);
17476bd547bSAdrian Chadd return AH_NULL;
17576bd547bSAdrian Chadd #undef CHAN_FLAGS
17676bd547bSAdrian Chadd }
17776bd547bSAdrian Chadd
17876bd547bSAdrian Chadd /*
17976bd547bSAdrian Chadd * Check the internal channel list to see if the desired channel
18076bd547bSAdrian Chadd * is ok to release from the NOL. If not, then do nothing. If so,
18176bd547bSAdrian Chadd * mark the channel as clear and reset the internal tsf time
18276bd547bSAdrian Chadd */
18376bd547bSAdrian Chadd void
184e113789bSAdrian Chadd ar9300_check_dfs(struct ath_hal *ah, struct ieee80211_channel *chan)
18576bd547bSAdrian Chadd {
18676bd547bSAdrian Chadd HAL_CHANNEL_INTERNAL *ichan = AH_NULL;
18776bd547bSAdrian Chadd
18876bd547bSAdrian Chadd ichan = getchannel(ah, chan);
18976bd547bSAdrian Chadd if (ichan == AH_NULL) {
19076bd547bSAdrian Chadd return;
19176bd547bSAdrian Chadd }
19276bd547bSAdrian Chadd if (!(ichan->priv_flags & CHANNEL_INTERFERENCE)) {
19376bd547bSAdrian Chadd return;
19476bd547bSAdrian Chadd }
19576bd547bSAdrian Chadd
19676bd547bSAdrian Chadd ichan->priv_flags &= ~CHANNEL_INTERFERENCE;
19776bd547bSAdrian Chadd ichan->dfs_tsf = 0;
19876bd547bSAdrian Chadd }
19976bd547bSAdrian Chadd
20076bd547bSAdrian Chadd /*
20176bd547bSAdrian Chadd * This function marks the channel as having found a dfs event
20276bd547bSAdrian Chadd * It also marks the end time that the dfs event should be cleared
20376bd547bSAdrian Chadd * If the channel is already marked, then tsf end time can only
20476bd547bSAdrian Chadd * be increased
20576bd547bSAdrian Chadd */
20676bd547bSAdrian Chadd void
207e113789bSAdrian Chadd ar9300_dfs_found(struct ath_hal *ah, struct ieee80211_channel *chan, u_int64_t nol_time)
20876bd547bSAdrian Chadd {
20976bd547bSAdrian Chadd HAL_CHANNEL_INTERNAL *ichan;
21076bd547bSAdrian Chadd
21176bd547bSAdrian Chadd ichan = getchannel(ah, chan);
21276bd547bSAdrian Chadd if (ichan == AH_NULL) {
21376bd547bSAdrian Chadd return;
21476bd547bSAdrian Chadd }
21576bd547bSAdrian Chadd if (!(ichan->priv_flags & CHANNEL_INTERFERENCE)) {
21676bd547bSAdrian Chadd ichan->dfs_tsf = ar9300_get_tsf64(ah);
21776bd547bSAdrian Chadd }
21876bd547bSAdrian Chadd ichan->dfs_tsf += nol_time;
21976bd547bSAdrian Chadd ichan->priv_flags |= CHANNEL_INTERFERENCE;
22076bd547bSAdrian Chadd chan->priv_flags |= CHANNEL_INTERFERENCE;
22176bd547bSAdrian Chadd }
222e113789bSAdrian Chadd #endif
22376bd547bSAdrian Chadd
22476bd547bSAdrian Chadd /*
22576bd547bSAdrian Chadd * Enable radar detection and set the radar parameters per the
22676bd547bSAdrian Chadd * values in pe
22776bd547bSAdrian Chadd */
22876bd547bSAdrian Chadd void
ar9300_enable_dfs(struct ath_hal * ah,HAL_PHYERR_PARAM * pe)22976bd547bSAdrian Chadd ar9300_enable_dfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe)
23076bd547bSAdrian Chadd {
23176bd547bSAdrian Chadd u_int32_t val;
23276bd547bSAdrian Chadd struct ath_hal_private *ahp = AH_PRIVATE(ah);
233e113789bSAdrian Chadd const struct ieee80211_channel *chan = ahp->ah_curchan;
23476bd547bSAdrian Chadd struct ath_hal_9300 *ah9300 = AH9300(ah);
23576bd547bSAdrian Chadd int reg_writes = 0;
23676bd547bSAdrian Chadd
23776bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
238*66c73f1dSAdrian Chadd val |= AR_PHY_RADAR_0_FFT_ENA;
239*66c73f1dSAdrian Chadd
240*66c73f1dSAdrian Chadd
241*66c73f1dSAdrian Chadd if (pe->pe_enabled != HAL_PHYERR_PARAM_NOVAL) {
242*66c73f1dSAdrian Chadd val &= ~AR_PHY_RADAR_0_ENA;
243*66c73f1dSAdrian Chadd val |= SM(pe->pe_enabled, AR_PHY_RADAR_0_ENA);
244*66c73f1dSAdrian Chadd }
245*66c73f1dSAdrian Chadd
24676bd547bSAdrian Chadd if (pe->pe_firpwr != HAL_PHYERR_PARAM_NOVAL) {
24776bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_FIRPWR;
24876bd547bSAdrian Chadd val |= SM(pe->pe_firpwr, AR_PHY_RADAR_0_FIRPWR);
24976bd547bSAdrian Chadd }
25076bd547bSAdrian Chadd if (pe->pe_rrssi != HAL_PHYERR_PARAM_NOVAL) {
25176bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_RRSSI;
25276bd547bSAdrian Chadd val |= SM(pe->pe_rrssi, AR_PHY_RADAR_0_RRSSI);
25376bd547bSAdrian Chadd }
25476bd547bSAdrian Chadd if (pe->pe_height != HAL_PHYERR_PARAM_NOVAL) {
25576bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_HEIGHT;
25676bd547bSAdrian Chadd val |= SM(pe->pe_height, AR_PHY_RADAR_0_HEIGHT);
25776bd547bSAdrian Chadd }
25876bd547bSAdrian Chadd if (pe->pe_prssi != HAL_PHYERR_PARAM_NOVAL) {
25976bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_PRSSI;
26076bd547bSAdrian Chadd if (AR_SREV_AR9580(ah) || AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
261e113789bSAdrian Chadd #if 0
26276bd547bSAdrian Chadd if (ah->ah_use_cac_prssi) {
26376bd547bSAdrian Chadd val |= SM(AR9300_DFS_PRSSI_CAC, AR_PHY_RADAR_0_PRSSI);
26476bd547bSAdrian Chadd } else {
265e113789bSAdrian Chadd #endif
26676bd547bSAdrian Chadd val |= SM(pe->pe_prssi, AR_PHY_RADAR_0_PRSSI);
267e113789bSAdrian Chadd // }
26876bd547bSAdrian Chadd } else {
26976bd547bSAdrian Chadd val |= SM(pe->pe_prssi, AR_PHY_RADAR_0_PRSSI);
27076bd547bSAdrian Chadd }
27176bd547bSAdrian Chadd }
27276bd547bSAdrian Chadd if (pe->pe_inband != HAL_PHYERR_PARAM_NOVAL) {
27376bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_INBAND;
27476bd547bSAdrian Chadd val |= SM(pe->pe_inband, AR_PHY_RADAR_0_INBAND);
27576bd547bSAdrian Chadd }
27676bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_0, val);
27776bd547bSAdrian Chadd
27876bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_1);
27976bd547bSAdrian Chadd val |= AR_PHY_RADAR_1_MAX_RRSSI | AR_PHY_RADAR_1_BLOCK_CHECK;
28076bd547bSAdrian Chadd if (pe->pe_maxlen != HAL_PHYERR_PARAM_NOVAL) {
28176bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_1_MAXLEN;
28276bd547bSAdrian Chadd val |= SM(pe->pe_maxlen, AR_PHY_RADAR_1_MAXLEN);
28376bd547bSAdrian Chadd }
28476bd547bSAdrian Chadd if (pe->pe_relstep != HAL_PHYERR_PARAM_NOVAL) {
28576bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_1_RELSTEP_THRESH;
28676bd547bSAdrian Chadd val |= SM(pe->pe_relstep, AR_PHY_RADAR_1_RELSTEP_THRESH);
28776bd547bSAdrian Chadd }
28876bd547bSAdrian Chadd if (pe->pe_relpwr != HAL_PHYERR_PARAM_NOVAL) {
28976bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_1_RELPWR_THRESH;
29076bd547bSAdrian Chadd val |= SM(pe->pe_relpwr, AR_PHY_RADAR_1_RELPWR_THRESH);
29176bd547bSAdrian Chadd }
29276bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_1, val);
29376bd547bSAdrian Chadd
29476bd547bSAdrian Chadd if (ath_hal_getcapability(ah, HAL_CAP_EXT_CHAN_DFS, 0, 0) == HAL_OK) {
29576bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_EXT);
296e113789bSAdrian Chadd if (IEEE80211_IS_CHAN_HT40(chan)) {
29776bd547bSAdrian Chadd /* Enable extension channel radar detection */
29876bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_EXT, val | AR_PHY_RADAR_EXT_ENA);
29976bd547bSAdrian Chadd } else {
30076bd547bSAdrian Chadd /* HT20 mode, disable extension channel radar detect */
30176bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_EXT, val & ~AR_PHY_RADAR_EXT_ENA);
30276bd547bSAdrian Chadd }
30376bd547bSAdrian Chadd }
30476bd547bSAdrian Chadd /*
30576bd547bSAdrian Chadd apply DFS postamble array from INI
30676bd547bSAdrian Chadd column 0 is register ID, column 1 is HT20 value, colum2 is HT40 value
30776bd547bSAdrian Chadd */
30876bd547bSAdrian Chadd
30976bd547bSAdrian Chadd if (AR_SREV_AR9580(ah) || AR_SREV_WASP(ah) || AR_SREV_OSPREY_22(ah) || AR_SREV_SCORPION(ah)) {
310e113789bSAdrian Chadd REG_WRITE_ARRAY(&ah9300->ah_ini_dfs, IEEE80211_IS_CHAN_HT40(chan)? 2:1, reg_writes);
31176bd547bSAdrian Chadd }
31276bd547bSAdrian Chadd #ifdef ATH_HAL_DFS_CHIRPING_FIX_APH128
313e113789bSAdrian Chadd ath_hal_printf(ah, "DFS change the timing value\n");
314e113789bSAdrian Chadd if (AR_SREV_AR9580(ah) && IEEE80211_IS_CHAN_HT40(chan)) {
31576bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_TIMING6, 0x3140c00a);
31676bd547bSAdrian Chadd }
31776bd547bSAdrian Chadd #endif
31876bd547bSAdrian Chadd
31976bd547bSAdrian Chadd }
32076bd547bSAdrian Chadd
32176bd547bSAdrian Chadd /*
32276bd547bSAdrian Chadd * Get the radar parameter values and return them in the pe
32376bd547bSAdrian Chadd * structure
32476bd547bSAdrian Chadd */
32576bd547bSAdrian Chadd void
32676bd547bSAdrian Chadd ar9300_get_dfs_thresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe)
32776bd547bSAdrian Chadd {
32876bd547bSAdrian Chadd u_int32_t val, temp;
32976bd547bSAdrian Chadd
33076bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
33176bd547bSAdrian Chadd temp = MS(val, AR_PHY_RADAR_0_FIRPWR);
33276bd547bSAdrian Chadd temp |= ~(AR_PHY_RADAR_0_FIRPWR >> AR_PHY_RADAR_0_FIRPWR_S);
33376bd547bSAdrian Chadd pe->pe_firpwr = temp;
33476bd547bSAdrian Chadd pe->pe_rrssi = MS(val, AR_PHY_RADAR_0_RRSSI);
33576bd547bSAdrian Chadd pe->pe_height = MS(val, AR_PHY_RADAR_0_HEIGHT);
33676bd547bSAdrian Chadd pe->pe_prssi = MS(val, AR_PHY_RADAR_0_PRSSI);
33776bd547bSAdrian Chadd pe->pe_inband = MS(val, AR_PHY_RADAR_0_INBAND);
338*66c73f1dSAdrian Chadd pe->pe_enabled = !! MS(val, AR_PHY_RADAR_0_ENA);
33976bd547bSAdrian Chadd
34076bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_1);
34176bd547bSAdrian Chadd
34276bd547bSAdrian Chadd pe->pe_relpwr = MS(val, AR_PHY_RADAR_1_RELPWR_THRESH);
343e113789bSAdrian Chadd pe->pe_enrelpwr = !! (val & AR_PHY_RADAR_1_RELPWR_ENA);
344e113789bSAdrian Chadd
34576bd547bSAdrian Chadd pe->pe_relstep = MS(val, AR_PHY_RADAR_1_RELSTEP_THRESH);
346e113789bSAdrian Chadd pe->pe_en_relstep_check = !! (val & AR_PHY_RADAR_1_RELSTEP_CHECK);
347e113789bSAdrian Chadd
34876bd547bSAdrian Chadd pe->pe_maxlen = MS(val, AR_PHY_RADAR_1_MAXLEN);
34976bd547bSAdrian Chadd }
35076bd547bSAdrian Chadd
351e113789bSAdrian Chadd #if 0
35276bd547bSAdrian Chadd HAL_BOOL
353e113789bSAdrian Chadd ar9300_radar_wait(struct ath_hal *ah, struct ieee80211_channel *chan)
35476bd547bSAdrian Chadd {
35576bd547bSAdrian Chadd struct ath_hal_private *ahp = AH_PRIVATE(ah);
35676bd547bSAdrian Chadd
35776bd547bSAdrian Chadd if (!ahp->ah_curchan) {
35876bd547bSAdrian Chadd return AH_TRUE;
35976bd547bSAdrian Chadd }
36076bd547bSAdrian Chadd
36176bd547bSAdrian Chadd /*
36276bd547bSAdrian Chadd * Rely on the upper layers to determine that we have spent
36376bd547bSAdrian Chadd * enough time waiting.
36476bd547bSAdrian Chadd */
36576bd547bSAdrian Chadd chan->channel = ahp->ah_curchan->channel;
36676bd547bSAdrian Chadd chan->channel_flags = ahp->ah_curchan->channel_flags;
36776bd547bSAdrian Chadd chan->max_reg_tx_power = ahp->ah_curchan->max_reg_tx_power;
36876bd547bSAdrian Chadd
36976bd547bSAdrian Chadd ahp->ah_curchan->priv_flags |= CHANNEL_DFS_CLEAR;
37076bd547bSAdrian Chadd chan->priv_flags = ahp->ah_curchan->priv_flags;
37176bd547bSAdrian Chadd return AH_FALSE;
37276bd547bSAdrian Chadd
37376bd547bSAdrian Chadd }
374e113789bSAdrian Chadd #endif
37576bd547bSAdrian Chadd
37676bd547bSAdrian Chadd struct dfs_pulse *
37776bd547bSAdrian Chadd ar9300_get_dfs_radars(
37876bd547bSAdrian Chadd struct ath_hal *ah,
37976bd547bSAdrian Chadd u_int32_t dfsdomain,
38076bd547bSAdrian Chadd int *numradars,
38176bd547bSAdrian Chadd struct dfs_bin5pulse **bin5pulses,
38276bd547bSAdrian Chadd int *numb5radars,
38376bd547bSAdrian Chadd HAL_PHYERR_PARAM *pe)
38476bd547bSAdrian Chadd {
38576bd547bSAdrian Chadd struct dfs_pulse *dfs_radars = AH_NULL;
38676bd547bSAdrian Chadd switch (dfsdomain) {
387e113789bSAdrian Chadd case HAL_DFS_FCC_DOMAIN:
38876bd547bSAdrian Chadd dfs_radars = &ar9300_fcc_radars[AR9300_FCC_RADARS_FCC_OFFSET];
38976bd547bSAdrian Chadd *numradars =
39076bd547bSAdrian Chadd ARRAY_LENGTH(ar9300_fcc_radars) - AR9300_FCC_RADARS_FCC_OFFSET;
39176bd547bSAdrian Chadd *bin5pulses = &ar9300_bin5pulses[0];
39276bd547bSAdrian Chadd *numb5radars = ARRAY_LENGTH(ar9300_bin5pulses);
39376bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: DFS_FCC_DOMAIN_9300\n", __func__);
39476bd547bSAdrian Chadd break;
395e113789bSAdrian Chadd case HAL_DFS_ETSI_DOMAIN:
39676bd547bSAdrian Chadd dfs_radars = &ar9300_etsi_radars[0];
39776bd547bSAdrian Chadd *numradars = ARRAY_LENGTH(ar9300_etsi_radars);
39876bd547bSAdrian Chadd *bin5pulses = &ar9300_bin5pulses[0];
39976bd547bSAdrian Chadd *numb5radars = ARRAY_LENGTH(ar9300_bin5pulses);
40076bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: DFS_ETSI_DOMAIN_9300\n", __func__);
40176bd547bSAdrian Chadd break;
402e113789bSAdrian Chadd case HAL_DFS_MKK4_DOMAIN:
40376bd547bSAdrian Chadd dfs_radars = &ar9300_fcc_radars[0];
40476bd547bSAdrian Chadd *numradars = ARRAY_LENGTH(ar9300_fcc_radars);
40576bd547bSAdrian Chadd *bin5pulses = &ar9300_bin5pulses[0];
40676bd547bSAdrian Chadd *numb5radars = ARRAY_LENGTH(ar9300_bin5pulses);
40776bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: DFS_MKK4_DOMAIN_9300\n", __func__);
40876bd547bSAdrian Chadd break;
40976bd547bSAdrian Chadd default:
41076bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: no domain\n", __func__);
41176bd547bSAdrian Chadd return AH_NULL;
41276bd547bSAdrian Chadd }
41376bd547bSAdrian Chadd /* Set the default phy parameters per chip */
41476bd547bSAdrian Chadd pe->pe_firpwr = AR9300_DFS_FIRPWR;
41576bd547bSAdrian Chadd pe->pe_rrssi = AR9300_DFS_RRSSI;
41676bd547bSAdrian Chadd pe->pe_height = AR9300_DFS_HEIGHT;
41776bd547bSAdrian Chadd pe->pe_prssi = AR9300_DFS_PRSSI;
41876bd547bSAdrian Chadd /*
41976bd547bSAdrian Chadd we have an issue with PRSSI.
42076bd547bSAdrian Chadd For normal operation we use AR9300_DFS_PRSSI, which is set to 6.
42176bd547bSAdrian Chadd Please refer to EV91563, 94164.
42276bd547bSAdrian Chadd However, this causes problem during CAC as no radar is detected
42376bd547bSAdrian Chadd during that period with PRSSI=6. Only PRSSI= 10 seems to fix this.
42476bd547bSAdrian Chadd We use this flag to keep track of change in PRSSI.
42576bd547bSAdrian Chadd */
42676bd547bSAdrian Chadd
427e113789bSAdrian Chadd // ah->ah_use_cac_prssi = 0;
42876bd547bSAdrian Chadd
42976bd547bSAdrian Chadd pe->pe_inband = AR9300_DFS_INBAND;
43076bd547bSAdrian Chadd pe->pe_relpwr = AR9300_DFS_RELPWR;
43176bd547bSAdrian Chadd pe->pe_relstep = AR9300_DFS_RELSTEP;
43276bd547bSAdrian Chadd pe->pe_maxlen = AR9300_DFS_MAXLEN;
43376bd547bSAdrian Chadd return dfs_radars;
43476bd547bSAdrian Chadd }
43576bd547bSAdrian Chadd
436*66c73f1dSAdrian Chadd HAL_BOOL
437*66c73f1dSAdrian Chadd ar9300_get_default_dfs_thresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe)
438*66c73f1dSAdrian Chadd {
439*66c73f1dSAdrian Chadd
440*66c73f1dSAdrian Chadd pe->pe_firpwr = AR9300_DFS_FIRPWR;
441*66c73f1dSAdrian Chadd pe->pe_rrssi = AR9300_DFS_RRSSI;
442*66c73f1dSAdrian Chadd pe->pe_height = AR9300_DFS_HEIGHT;
443*66c73f1dSAdrian Chadd pe->pe_prssi = AR9300_DFS_PRSSI;
444*66c73f1dSAdrian Chadd /* see prssi comment above */
445*66c73f1dSAdrian Chadd
446*66c73f1dSAdrian Chadd pe->pe_inband = AR9300_DFS_INBAND;
447*66c73f1dSAdrian Chadd pe->pe_relpwr = AR9300_DFS_RELPWR;
448*66c73f1dSAdrian Chadd pe->pe_relstep = AR9300_DFS_RELSTEP;
449*66c73f1dSAdrian Chadd pe->pe_maxlen = AR9300_DFS_MAXLEN;
450*66c73f1dSAdrian Chadd return (AH_TRUE);
451*66c73f1dSAdrian Chadd }
452*66c73f1dSAdrian Chadd
45376bd547bSAdrian Chadd void ar9300_adjust_difs(struct ath_hal *ah, u_int32_t val)
45476bd547bSAdrian Chadd {
45576bd547bSAdrian Chadd if (val == 0) {
45676bd547bSAdrian Chadd /*
45776bd547bSAdrian Chadd * EV 116936:
45876bd547bSAdrian Chadd * Restore the register values with that of the HAL structure.
45976bd547bSAdrian Chadd * Do not assume and overwrite these values to whatever
46076bd547bSAdrian Chadd * is in ar9300_osprey22.ini.
46176bd547bSAdrian Chadd */
46276bd547bSAdrian Chadd struct ath_hal_9300 *ahp = AH9300(ah);
46376bd547bSAdrian Chadd HAL_TX_QUEUE_INFO *qi;
46476bd547bSAdrian Chadd int q;
46576bd547bSAdrian Chadd
466e113789bSAdrian Chadd AH9300(ah)->ah_fccaifs = 0;
46776bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: restore DIFS \n", __func__);
46876bd547bSAdrian Chadd for (q = 0; q < 4; q++) {
46976bd547bSAdrian Chadd qi = &ahp->ah_txq[q];
47076bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_DLCL_IFS(q),
47176bd547bSAdrian Chadd SM(qi->tqi_cwmin, AR_D_LCL_IFS_CWMIN)
47276bd547bSAdrian Chadd | SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX)
47376bd547bSAdrian Chadd | SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS));
47476bd547bSAdrian Chadd }
47576bd547bSAdrian Chadd } else {
47676bd547bSAdrian Chadd /*
47776bd547bSAdrian Chadd * These are values from George Lai and are specific to
47876bd547bSAdrian Chadd * FCC domain. They are yet to be determined for other domains.
47976bd547bSAdrian Chadd */
48076bd547bSAdrian Chadd
481e113789bSAdrian Chadd AH9300(ah)->ah_fccaifs = 1;
48276bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: set DIFS to default\n", __func__);
48376bd547bSAdrian Chadd /*printk("%s: modify DIFS\n", __func__);*/
48476bd547bSAdrian Chadd
48576bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_DLCL_IFS(0), 0x05fffc0f);
48676bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_DLCL_IFS(1), 0x05f0fc0f);
48776bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_DLCL_IFS(2), 0x05f03c07);
48876bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_DLCL_IFS(3), 0x05f01c03);
48976bd547bSAdrian Chadd }
49076bd547bSAdrian Chadd }
49176bd547bSAdrian Chadd
49276bd547bSAdrian Chadd u_int32_t ar9300_dfs_config_fft(struct ath_hal *ah, HAL_BOOL is_enable)
49376bd547bSAdrian Chadd {
49476bd547bSAdrian Chadd u_int32_t val;
49576bd547bSAdrian Chadd
49676bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
49776bd547bSAdrian Chadd
49876bd547bSAdrian Chadd if (is_enable) {
49976bd547bSAdrian Chadd val |= AR_PHY_RADAR_0_FFT_ENA;
50076bd547bSAdrian Chadd } else {
50176bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_FFT_ENA;
50276bd547bSAdrian Chadd }
50376bd547bSAdrian Chadd
50476bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_0, val);
50576bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
50676bd547bSAdrian Chadd return val;
50776bd547bSAdrian Chadd }
50876bd547bSAdrian Chadd /*
50976bd547bSAdrian Chadd function to adjust PRSSI value for CAC problem
51076bd547bSAdrian Chadd
51176bd547bSAdrian Chadd */
51276bd547bSAdrian Chadd void
51376bd547bSAdrian Chadd ar9300_dfs_cac_war(struct ath_hal *ah, u_int32_t start)
51476bd547bSAdrian Chadd {
51576bd547bSAdrian Chadd u_int32_t val;
51676bd547bSAdrian Chadd
51776bd547bSAdrian Chadd if (AR_SREV_AR9580(ah) || AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
51876bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
51976bd547bSAdrian Chadd if (start) {
52076bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_PRSSI;
52176bd547bSAdrian Chadd val |= SM(AR9300_DFS_PRSSI_CAC, AR_PHY_RADAR_0_PRSSI);
52276bd547bSAdrian Chadd } else {
52376bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_PRSSI;
52476bd547bSAdrian Chadd val |= SM(AR9300_DFS_PRSSI, AR_PHY_RADAR_0_PRSSI);
52576bd547bSAdrian Chadd }
52676bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_0, val | AR_PHY_RADAR_0_ENA);
527e113789bSAdrian Chadd // ah->ah_use_cac_prssi = start;
52876bd547bSAdrian Chadd }
52976bd547bSAdrian Chadd }
53076bd547bSAdrian Chadd
531e113789bSAdrian Chadd #if 0
532e113789bSAdrian Chadd struct ieee80211_channel *
53376bd547bSAdrian Chadd ar9300_get_extension_channel(struct ath_hal *ah)
53476bd547bSAdrian Chadd {
53576bd547bSAdrian Chadd struct ath_hal_private *ahp = AH_PRIVATE(ah);
53676bd547bSAdrian Chadd struct ath_hal_private_tables *aht = AH_TABLES(ah);
53776bd547bSAdrian Chadd int i = 0;
53876bd547bSAdrian Chadd
53976bd547bSAdrian Chadd HAL_CHANNEL_INTERNAL *ichan = AH_NULL;
54076bd547bSAdrian Chadd CHAN_CENTERS centers;
54176bd547bSAdrian Chadd
54276bd547bSAdrian Chadd ichan = ahp->ah_curchan;
54376bd547bSAdrian Chadd ar9300_get_channel_centers(ah, ichan, ¢ers);
54476bd547bSAdrian Chadd if (centers.ctl_center == centers.ext_center) {
54576bd547bSAdrian Chadd return AH_NULL;
54676bd547bSAdrian Chadd }
54776bd547bSAdrian Chadd for (i = 0; i < ahp->ah_nchan; i++) {
54876bd547bSAdrian Chadd ichan = &aht->ah_channels[i];
54976bd547bSAdrian Chadd if (ichan->channel == centers.ext_center) {
550e113789bSAdrian Chadd return (struct ieee80211_channel*)ichan;
55176bd547bSAdrian Chadd }
55276bd547bSAdrian Chadd }
55376bd547bSAdrian Chadd return AH_NULL;
55476bd547bSAdrian Chadd }
555e113789bSAdrian Chadd #endif
55676bd547bSAdrian Chadd
55776bd547bSAdrian Chadd HAL_BOOL
55876bd547bSAdrian Chadd ar9300_is_fast_clock_enabled(struct ath_hal *ah)
55976bd547bSAdrian Chadd {
56076bd547bSAdrian Chadd struct ath_hal_private *ahp = AH_PRIVATE(ah);
56176bd547bSAdrian Chadd
56276bd547bSAdrian Chadd if (IS_5GHZ_FAST_CLOCK_EN(ah, ahp->ah_curchan)) {
56376bd547bSAdrian Chadd return AH_TRUE;
56476bd547bSAdrian Chadd }
56576bd547bSAdrian Chadd return AH_FALSE;
56676bd547bSAdrian Chadd }
56776bd547bSAdrian Chadd
568e113789bSAdrian Chadd /*
569e113789bSAdrian Chadd * This should be enabled and linked into the build once
570e113789bSAdrian Chadd * radar support is enabled.
571e113789bSAdrian Chadd */
572e113789bSAdrian Chadd #if 0
57376bd547bSAdrian Chadd HAL_BOOL
57476bd547bSAdrian Chadd ar9300_handle_radar_bb_panic(struct ath_hal *ah)
57576bd547bSAdrian Chadd {
57676bd547bSAdrian Chadd u_int32_t status;
57776bd547bSAdrian Chadd u_int32_t val;
57876bd547bSAdrian Chadd #ifdef AH_DEBUG
57976bd547bSAdrian Chadd struct ath_hal_9300 *ahp = AH9300(ah);
58076bd547bSAdrian Chadd #endif
58176bd547bSAdrian Chadd
58276bd547bSAdrian Chadd status = AH_PRIVATE(ah)->ah_bb_panic_last_status;
58376bd547bSAdrian Chadd
58476bd547bSAdrian Chadd if ( status == 0x04000539 ) {
58576bd547bSAdrian Chadd /* recover from this BB panic without reset*/
58676bd547bSAdrian Chadd /* set AR9300_DFS_FIRPWR to -1 */
58776bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
58876bd547bSAdrian Chadd val &= (~AR_PHY_RADAR_0_FIRPWR);
58976bd547bSAdrian Chadd val |= SM( 0x7f, AR_PHY_RADAR_0_FIRPWR);
59076bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_0, val);
59176bd547bSAdrian Chadd OS_DELAY(1);
59276bd547bSAdrian Chadd /* set AR9300_DFS_FIRPWR to its default value */
59376bd547bSAdrian Chadd val = OS_REG_READ(ah, AR_PHY_RADAR_0);
59476bd547bSAdrian Chadd val &= ~AR_PHY_RADAR_0_FIRPWR;
59576bd547bSAdrian Chadd val |= SM( AR9300_DFS_FIRPWR, AR_PHY_RADAR_0_FIRPWR);
59676bd547bSAdrian Chadd OS_REG_WRITE(ah, AR_PHY_RADAR_0, val);
59776bd547bSAdrian Chadd return AH_TRUE;
59876bd547bSAdrian Chadd } else if (status == 0x0400000a) {
59976bd547bSAdrian Chadd /* EV 92527 : reset required if we see this signature */
60076bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: BB Panic -- 0x0400000a\n", __func__);
60176bd547bSAdrian Chadd return AH_FALSE;
60276bd547bSAdrian Chadd } else if (status == 0x1300000a) {
60376bd547bSAdrian Chadd /* EV92527: we do not need a reset if we see this signature */
60476bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_DFS, "%s: BB Panic -- 0x1300000a\n", __func__);
60576bd547bSAdrian Chadd return AH_TRUE;
60627e2ad46SAdrian Chadd } else if ((AR_SREV_WASP(ah) || AR_SREV_HONEYBEE(ah)) && (status == 0x04000409)) {
60776bd547bSAdrian Chadd return AH_TRUE;
60876bd547bSAdrian Chadd } else {
60976bd547bSAdrian Chadd if (ar9300_get_capability(ah, HAL_CAP_LDPCWAR, 0, AH_NULL) == HAL_OK &&
61076bd547bSAdrian Chadd (status & 0xff00000f) == 0x04000009 &&
61176bd547bSAdrian Chadd status != 0x04000409 &&
61276bd547bSAdrian Chadd status != 0x04000b09 &&
61376bd547bSAdrian Chadd status != 0x04000e09 &&
61476bd547bSAdrian Chadd (status & 0x0000ff00))
61576bd547bSAdrian Chadd {
61676bd547bSAdrian Chadd /* disable RIFS Rx */
61776bd547bSAdrian Chadd #ifdef AH_DEBUG
61876bd547bSAdrian Chadd HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, "%s: BB status=0x%08x rifs=%d - disable\n",
61976bd547bSAdrian Chadd __func__, status, ahp->ah_rifs_enabled);
62076bd547bSAdrian Chadd ar9300_set_rifs_delay(ah, AH_FALSE);
62176bd547bSAdrian Chadd }
62276bd547bSAdrian Chadd return AH_FALSE;
62376bd547bSAdrian Chadd }
62476bd547bSAdrian Chadd }
625e113789bSAdrian Chadd #endif
62676bd547bSAdrian Chadd #endif
627