xref: /freebsd/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_radar.c (revision f9edb08480901b8c7d85837d72f8702008b0a773)
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, &centers);
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