/*
 * Copyright (c) 2005-2015 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

/*===========================================================================

				dfs.h

   OVERVIEW:

   Source code borrowed from QCA_MAIN DFS module

   DEPENDENCIES:

   Are listed for each API below.

   ===========================================================================*/

#ifndef _DFS_H_
#define _DFS_H_

/*
   *TO DO DFS- Need to include this file later on
   *#include "ath_internal.h"
 */
/*DFS New Include Start*/

#include <cdf_net_types.h>      /* CDF_NBUF_EXEMPT_NO_EXEMPTION, etc. */
#include <cdf_nbuf.h>           /* cdf_nbuf_t, etc. */
#include <cdf_util.h>           /* cdf_assert */
#include <cdf_lock.h>           /* cdf_spinlock */
#include <cds_queue.h>          /* TAILQ */
#include <cdf_time.h>
#include <cdf_softirq_timer.h>
#include <cdf_memory.h>
#include <osdep.h>
/*DFS Utility Include END*/

/* From wlan_modules/include/ */
#include "ath_dfs_structs.h"
/*DFS - Newly added File to interface cld UMAC and dfs data structures*/
#include <wma_dfs_interface.h>
/*
   *TO DO DFS- Need to include this file later on
   #include "ah.h"
 */
/* #include "ah_desc.h" */
#include "dfs_ioctl.h"
#include "dfs_ioctl_private.h"
#include "dfs_interface.h"
#include "cds_ieee80211_common.h"
#include "cds_api.h"

#define ATH_SUPPORT_DFS   1
#define CHANNEL_TURBO     0x00010
#define DFS_PRINTK(_fmt, ...) printk((_fmt), __VA_ARGS__)
#define DFS_DPRINTK(dfs, _m, _fmt, ...) do {		 \
		if (((dfs) == NULL) ||				     \
		    ((dfs) != NULL &&				       \
		     ((_m) & (dfs)->dfs_debug_mask))) {		       \
			CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_DEBUG, \
				 _fmt, __VA_ARGS__);	\
		}						     \
} while (0)

#define DFS_MIN(a, b) ((a) < (b) ? (a) : (b))
#define DFS_MAX(a, b) ((a) > (b) ? (a) : (b))
#define DFS_DIFF(a, b) (DFS_MAX(a, b) - DFS_MIN(a, b))
/*
 * Maximum number of radar events to be processed in a single iteration.
 * Allows soft watchdog to run.
 */
#define MAX_EVENTS 100

#define DFS_STATUS_SUCCESS 0
#define DFS_STATUS_FAIL 1

/*
 * Constants to use for chirping detection.
 *
 * All are unconverted as HW reports them.
 *
 * XXX Are these constants with or without fast clock 5GHz operation?
 * XXX Peregrine reports pulses in microseconds, not hardware clocks!
 */
#define MIN_BIN5_DUR  63        /* 50 * 1.25 */
#define MIN_BIN5_DUR_MICROSEC 50
#define MAYBE_BIN5_DUR 35       /* 28 * 1.25 */
#define MAYBE_BIN5_DUR_MICROSEC 28
/* #define MAX_BIN5_DUR  131 / * 105 * 1.25* / */
/* use 145 for osprey conversion is already done using dfs->dur_multiplier */
#define MAX_BIN5_DUR  145
#define MAX_BIN5_DUR_MICROSEC 105

#define DFS_MARGIN_EQUAL(a, b, margin) ((DFS_DIFF(a, b)) <= margin)
#define DFS_MAX_STAGGERED_BURSTS 3

/*
 * All filter thresholds in the radar filter tables
 * are effective at a 50% channel loading
 */
#define DFS_CHAN_LOADING_THRESH         50
#define DFS_EXT_CHAN_LOADING_THRESH     30
#define DFS_DEFAULT_PRI_MARGIN          6
#define DFS_DEFAULT_FIXEDPATTERN_PRI_MARGIN       4
#define ATH_DFSQ_LOCK(_dfs)        cdf_spin_lock_bh((&(_dfs)->dfs_radarqlock))
#define ATH_DFSQ_UNLOCK(_dfs)      cdf_spin_unlock_bh((&(_dfs)->dfs_radarqlock))
#define ATH_DFSQ_LOCK_INIT(_dfs)   cdf_spinlock_init(&(_dfs)->dfs_radarqlock)

#define ATH_ARQ_LOCK(_dfs)         cdf_spin_lock_bh((&(_dfs)->dfs_arqlock))
#define ATH_ARQ_UNLOCK(_dfs)       cdf_spin_unlock_bh((&(_dfs)->dfs_arqlock))
#define ATH_ARQ_LOCK_INIT(_dfs)    cdf_spinlock_init(&(_dfs)->dfs_arqlock)

#define ATH_DFSEVENTQ_LOCK(_dfs)   cdf_spin_lock_bh((&(_dfs)->dfs_eventqlock))
#define ATH_DFSEVENTQ_UNLOCK(_dfs) cdf_spin_unlock_bh((&(_dfs)->dfs_eventqlock))
#define ATH_DFSEVENTQ_LOCK_INIT(_dfs) \
				   cdf_spinlock_init((&(_dfs)->dfs_eventqlock))
/* Mask for time stamp from descriptor */
#define DFS_TSMASK              0xFFFFFFFF
/* Shift for time stamp from descriptor */
#define DFS_TSSHIFT             32
/* 64 bit TSF wrap value */
#define  DFS_TSF_WRAP      0xFFFFFFFFFFFFFFFFULL
/* TS mask for 64 bit value */
#define  DFS_64BIT_TSFMASK 0x0000000000007FFFULL

#define  DFS_AR_RADAR_RSSI_THR      5   /* in dB */
#define  DFS_AR_RADAR_RESET_INT     1   /* in secs */
#define  DFS_AR_RADAR_MAX_HISTORY   500
#define  DFS_AR_REGION_WIDTH     128
#define  DFS_AR_RSSI_THRESH_STRONG_PKTS   17    /* in dB */
#define  DFS_AR_RSSI_DOUBLE_THRESHOLD  15       /* in dB */
#define  DFS_AR_MAX_NUM_ACK_REGIONS 9
#define  DFS_AR_ACK_DETECT_PAR_THRESH  20
#define  DFS_AR_PKT_COUNT_THRESH    20

#define  DFS_MAX_DL_SIZE         64
#define  DFS_MAX_DL_MASK         0x3F

#define DFS_NOL_TIME       DFS_NOL_TIMEOUT_US
/* 30 minutes in usecs */

#define DFS_WAIT_TIME        (60 * 1000000)        /* 1 minute in usecs */

#define  DFS_DISABLE_TIME     (3 * 60 * 1000000)    /* 3 minutes in usecs */

#define  DFS_MAX_B5_SIZE         128
#define  DFS_MAX_B5_MASK         0x0000007F     /* 128 */

#define  DFS_MAX_RADAR_OVERLAP      16  /* Max number of overlapping filters */
/* Max number of dfs events which can be q'd */
#define  DFS_MAX_EVENTS       1024

#define DFS_RADAR_EN    0x80000000      /* Radar detect is capable */
#define DFS_AR_EN    0x40000000 /* AR detect is capable */
#define  DFS_MAX_RSSI_VALUE   0x7fffffff        /* Max rssi value */
/* max num of pulses in a burst */
#define DFS_BIN_MAX_PULSES              60
#define DFS_BIN5_PRI_LOWER_LIMIT 990    /* us */

/* to cover the single pusle burst case, change from 2010 us to 2010000 us */

/*
 * this is reverted back to 2010 as larger value causes false
 * bin5 detect (EV76432, EV76320)
 */
#define DFS_BIN5_PRI_HIGHER_LIMIT     2010      /* us */

#define DFS_BIN5_WIDTH_MARGIN       4   /* us */
#define DFS_BIN5_RSSI_MARGIN        5   /* dBm */
/*Following threshold is not specified but should be okay statistically*/
#define DFS_BIN5_BRI_LOWER_LIMIT 300000 /* us */
#define DFS_BIN5_BRI_UPPER_LIMIT 12000000       /* us */
/* Max number of pulses kept in buffer */
#define DFS_MAX_PULSE_BUFFER_SIZE 1024
#define DFS_MAX_PULSE_BUFFER_MASK 0x3ff

#define DFS_FAST_CLOCK_MULTIPLIER       (800/11)
#define DFS_NO_FAST_CLOCK_MULTIPLIER    (80)

#define DFS_WAR_PLUS_30_MHZ_SEPARATION   30
#define DFS_WAR_MINUS_30_MHZ_SEPARATION -30
#define DFS_WAR_PEAK_INDEX_ZERO 0
#define DFS_TYPE4_WAR_PULSE_DURATION_LOWER_LIMIT 11
#define DFS_TYPE4_WAR_PULSE_DURATION_UPPER_LIMIT 33
#define DFS_TYPE4_WAR_PRI_LOWER_LIMIT 200
#define DFS_TYPE4_WAR_PRI_UPPER_LIMIT 500
#define DFS_TYPE4_WAR_VALID_PULSE_DURATION 12
#define DFS_ETSI_TYPE2_TYPE3_WAR_PULSE_DUR_LOWER_LIMIT 15
#define DFS_ETSI_TYPE2_TYPE3_WAR_PULSE_DUR_UPPER_LIMIT 33
#define DFS_ETSI_TYPE2_WAR_PRI_LOWER_LIMIT 625
#define DFS_ETSI_TYPE2_WAR_PRI_UPPER_LIMIT 5000
#define DFS_ETSI_TYPE3_WAR_PRI_LOWER_LIMIT 250
#define DFS_ETSI_TYPE3_WAR_PRI_UPPER_LIMIT 435
#define DFS_ETSI_WAR_VALID_PULSE_DURATION 15

typedef cdf_spinlock_t dfsq_lock_t;

#ifdef WIN32
#pragma pack(push, dfs_pulseparams, 1)
#endif
struct dfs_pulseparams {
	uint64_t p_time;        /* time for start of pulse in usecs */
	uint8_t p_dur;          /* Duration of pulse in usecs */
	uint8_t p_rssi;         /* Duration of pulse in usecs */
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_pulseparams)
#endif

#ifdef WIN32
#pragma pack(push, dfs_pulseline, 1)
#endif
struct dfs_pulseline {
	/* pl_elems - array of pulses in delay line */
	struct dfs_pulseparams pl_elems[DFS_MAX_PULSE_BUFFER_SIZE];
	uint32_t pl_firstelem;  /* Index of the first element */
	uint32_t pl_lastelem;   /* Index of the last element */
	uint32_t pl_numelems;   /* Number of elements in the delay line */
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_pulseline)
#endif

#ifdef WIN32
#pragma pack(push, dfs_event, 1)
#endif

#define  DFS_EVENT_CHECKCHIRP 0x01      /* Whether to check the chirp flag */
#define  DFS_EVENT_HW_CHIRP   0x02      /* hardware chirp */
#define  DFS_EVENT_SW_CHIRP   0x04      /* software chirp */

/*
 * Use this only if the event has CHECKCHIRP set.
 */
#define  DFS_EVENT_ISCHIRP(e)	       \
	((e)->re_flags & (DFS_EVENT_HW_CHIRP | DFS_EVENT_SW_CHIRP))

/*
 * Check if the given event is to be rejected as not possibly
 * a chirp.  This means:
 *   (a) it's a hardware or software checked chirp, and
 *   (b) the HW/SW chirp bits are both 0.
 */
#define  DFS_EVENT_NOTCHIRP(e)	       \
	(((e)->re_flags & (DFS_EVENT_CHECKCHIRP)) && \
	 (!DFS_EVENT_ISCHIRP((e))))

struct dfs_event {
	uint64_t re_full_ts;    /* 64-bit full timestamp from interrupt time */
	uint32_t re_ts;         /* Original 15 bit recv timestamp */
	uint8_t re_rssi;        /* rssi of radar event */
	uint8_t re_dur;         /* duration of radar pulse */
	uint8_t re_chanindex;   /* Channel of event */
	uint8_t re_flags;       /* Event flags */
	uint32_t re_freq;       /* Centre frequency of event, KHz */
	uint32_t re_freq_lo;    /* Lower bounds of frequency, KHz */
	uint32_t re_freq_hi;    /* Upper bounds of frequency, KHz */
	int sidx;               /* Pulse Index as in radar summary report */
	STAILQ_ENTRY(dfs_event) re_list;        /* List of radar events */
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_event)
#endif

#define DFS_AR_MAX_ACK_RADAR_DUR 511
#define DFS_AR_MAX_NUM_PEAKS     3
#define DFS_AR_ARQ_SIZE       2048      /* 8K AR events for buffer size */
#define DFS_AR_ARQ_SEQSIZE    2049      /* Sequence counter wrap for AR */

#define DFS_RADARQ_SIZE    512  /* 1K radar events for buffer size */
#define DFS_RADARQ_SEQSIZE 513  /* Sequence counter wrap for radar */
/* Number of radar channels we keep state for */
#define DFS_NUM_RADAR_STATES  64
/* Max number radar filters for each type */
#define DFS_MAX_NUM_RADAR_FILTERS 10
/* Number of different radar types */
#define DFS_MAX_RADAR_TYPES   32

struct dfs_ar_state {
	uint32_t ar_prevwidth;
	uint32_t ar_phyerrcount[DFS_AR_MAX_ACK_RADAR_DUR];
	uint32_t ar_acksum;
	uint32_t ar_packetthreshold;    /* Thresh to determine traffic load */
	uint32_t ar_parthreshold;       /* Thresh to determine peak */
	uint32_t ar_radarrssi;  /* Rssi threshold for AR event */
	uint16_t ar_prevtimestamp;
	uint16_t ar_peaklist[DFS_AR_MAX_NUM_PEAKS];
};

#ifdef WIN32
#pragma pack(push, dfs_delayelem, 1)
#endif
struct dfs_delayelem {
	/* Current "filter" time for start of pulse in usecs */
	uint32_t de_time;
	/* Duration of pulse in usecs */
	uint8_t de_dur;
	/* rssi of pulse in dB */
	uint8_t de_rssi;
	/* time stamp for this delay element */
	uint64_t de_ts;
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_delayelem)
#endif

/* NB: The first element in the circular buffer is the oldest element */

#ifdef WIN32
#pragma pack(push, dfs_delayline, 1)
#endif
struct dfs_delayline {
	/* Array of pulses in delay line */
	struct dfs_delayelem dl_elems[DFS_MAX_DL_SIZE];
	/* Last timestamp the delay line was used (in usecs) */
	uint64_t dl_last_ts;
	/* Index of the first element */
	uint32_t dl_firstelem;
	/* Index of the last element */
	uint32_t dl_lastelem;
	/* Number of elements in the delay line */
	uint32_t dl_numelems;
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_delayline)
#endif

#ifdef WIN32
#pragma pack(push, dfs_filter, 1)
#endif
struct dfs_filter {
	/* Delay line of pulses for this filter */
	struct dfs_delayline rf_dl;
	/* Number of pulses in the filter */
	uint32_t rf_numpulses;
	/* min pri to be considered for this filter */
	uint32_t rf_minpri;
	/* max pri to be considered for this filter */
	uint32_t rf_maxpri;
	/* match filter output threshold for radar detect */
	uint32_t rf_threshold;
	/* Length (in usecs) of the filter */
	uint32_t rf_filterlen;
	/* fixed or variable pattern type */
	uint32_t rf_patterntype;
	/* indicates if it is a fixed pri pulse */
	uint32_t rf_fixed_pri_radar_pulse;
	/* Min duration for this radar filter */
	uint32_t rf_mindur;
	/* Max duration for this radar filter */
	uint32_t rf_maxdur;
	uint32_t rf_ignore_pri_window;
	/* Unique ID corresponding to the original filter ID */
	uint32_t rf_pulseid;
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_filter)
#endif

struct dfs_filtertype {
	struct dfs_filter ft_filters[DFS_MAX_NUM_RADAR_FILTERS];
	/* Duration of pulse which specifies filter type */
	uint32_t ft_filterdur;
	/* Num filters of this type */
	uint32_t ft_numfilters;
	/* Last timestamp this filtertype was used(in usecs) */
	uint64_t ft_last_ts;
	/* min pulse duration to be considered for this filter type */
	uint32_t ft_mindur;
	/* max pulse duration to be considered for this filter type */
	uint32_t ft_maxdur;
	/* min rssi to be considered for this filter type */
	uint32_t ft_rssithresh;
	/* Num pulses in each filter of this type */
	uint32_t ft_numpulses;
	/* fixed or variable pattern type */
	uint32_t ft_patterntype;
	/* min pri to be considered for this type */
	uint32_t ft_minpri;
	/* rssi threshold margin. In Turbo Mode HW
	 * reports rssi 3dB lower than in non TURBO
	 * mode. This will offset that diff.
	 */
	uint32_t ft_rssimargin;
};

struct dfs_state {
	struct ieee80211_channel rs_chan;       /* Channel info */
	uint8_t rs_chanindex;   /* Channel index in radar structure */
	uint32_t rs_numradarevents;     /* Number of radar events */

	struct ath_dfs_phyerr_param rs_param;
};

/* 30 minutes in seconds */
#define DFS_NOL_TIMEOUT_S  (30*60)
/* 5 minutes in seconds - debugging */
/* #define DFS_NOL_TIMEOUT_S  (5*60)     */
#define DFS_NOL_TIMEOUT_MS (DFS_NOL_TIMEOUT_S * 1000)
#define DFS_NOL_TIMEOUT_US (DFS_NOL_TIMEOUT_MS * 1000)

#ifdef WIN32
#pragma pack(push, dfs_nolelem, 1)
#endif
struct dfs_nolelem {
	uint32_t nol_freq;      /* centre frequency */
	uint32_t nol_chwidth;   /* event width (MHz) */
	unsigned long nol_start_ticks;  /* NOL start time in OS ticks */
	uint32_t nol_timeout_ms;        /* NOL timeout value in msec */
	os_timer_t nol_timer;   /* per element NOL timer */
	struct dfs_nolelem *nol_next;   /* next element pointer */
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_nolelem)
#endif

/* Pass structure to DFS NOL timer */
struct dfs_nol_timer_arg {
	struct ath_dfs *dfs;
	uint16_t delfreq;
	uint16_t delchwidth;
};

#ifdef WIN32
#pragma pack(push, dfs_info, 1)
#endif
struct dfs_info {
	/* Use the NOL when radar found (default: true) */
	int rn_use_nol;
	/* Number of different types of radars */
	uint32_t rn_numradars;
	/* Last 64 bit timstamp from recv interrupt */
	uint64_t rn_lastfull_ts;
	/* last 15 bit ts from recv descriptor */
	uint16_t rn_last_ts;
	/* last unique 32 bit ts from recv descriptor */
	uint32_t rn_last_unique_ts;
	/* Prefix to prepend to 15 bit recv ts */
	uint64_t rn_ts_prefix;
	/* Number of bin5 radar pulses to search for */
	uint32_t rn_numbin5radars;
	/* Value of fast diversity gc limit from init file */
	uint32_t rn_fastdivGCval;
	/* Min rssi for all radar types */
	int32_t rn_minrssithresh;
	/* Max pulse width in TSF ticks */
	uint32_t rn_maxpulsedur;

	uint8_t dfs_ext_chan_busy;
	uint64_t ext_chan_busy_ts;

	uint64_t dfs_bin5_chirp_ts;
	uint8_t dfs_last_bin5_dur;
} cdf_packed;
#ifdef WIN32
#pragma pack(pop, dfs_info)
#endif

struct dfs_bin5elem {
	uint64_t be_ts;         /* Timestamp for the bin5 element */
	uint32_t be_rssi;       /* Rssi for the bin5 element */
	uint32_t be_dur;        /* Duration of bin5 element */
};

struct dfs_bin5radars {
	/* List of bin5 elems that fall within the time window */
	struct dfs_bin5elem br_elems[DFS_MAX_B5_SIZE];
	/* Index of the first element */
	uint32_t br_firstelem;
	/* Index of the last element */
	uint32_t br_lastelem;
	/* Number of elements in the delay line */
	uint32_t br_numelems;
	/* Original info about bin5 pulse */
	struct dfs_bin5pulse br_pulse;
};

struct dfs_stats {
	uint32_t num_radar_detects;     /* total num. of radar detects */
	uint32_t total_phy_errors;
	uint32_t owl_phy_errors;
	uint32_t pri_phy_errors;
	uint32_t ext_phy_errors;
	uint32_t dc_phy_errors;
	uint32_t early_ext_phy_errors;
	uint32_t bwinfo_errors;
	uint32_t datalen_discards;
	uint32_t rssi_discards;
	uint64_t last_reset_tstamp;
};

/*
 * This is for debuggin DFS as console log interferes with (helps)
 * radar detection
 */

#define DFS_EVENT_LOG_SIZE      256
struct dfs_event_log {
	uint64_t ts;            /* 64-bit full timestamp from interrupt time */
	uint32_t diff_ts;       /* diff timestamp */
	uint8_t rssi;           /* rssi of radar event */
	uint8_t dur;            /* duration of radar pulse */
};

#define ATH_DFS_RESET_TIME_S 7
#define ATH_DFS_WAIT (60 + ATH_DFS_RESET_TIME_S)        /* 60 seconds */
#define ATH_DFS_WAIT_MS ((ATH_DFS_WAIT) * 1000) /*in MS */

#define ATH_DFS_WEATHER_CHANNEL_WAIT_MIN 10     /*10 minutes */
#define ATH_DFS_WEATHER_CHANNEL_WAIT_S (ATH_DFS_WEATHER_CHANNEL_WAIT_MIN * 60)
#define ATH_DFS_WEATHER_CHANNEL_WAIT_MS \
	((ATH_DFS_WEATHER_CHANNEL_WAIT_S) * 1000)       /*in MS */

#define ATH_DFS_WAIT_POLL_PERIOD 2      /* 2 seconds */
/*in MS */
#define ATH_DFS_WAIT_POLL_PERIOD_MS ((ATH_DFS_WAIT_POLL_PERIOD) * 1000)
#define  ATH_DFS_TEST_RETURN_PERIOD 2   /* 2 seconds */
/* n MS */
#define  ATH_DFS_TEST_RETURN_PERIOD_MS ((ATH_DFS_TEST_RETURN_PERIOD) * 1000)
#define IS_CHANNEL_WEATHER_RADAR(chan) ((chan->ic_freq >= 5600) && \
	 (chan->ic_freq <= 5650))

#define DFS_DEBUG_TIMEOUT_S     30      /* debug timeout is 30 seconds */
#define DFS_DEBUG_TIMEOUT_MS    (DFS_DEBUG_TIMEOUT_S * 1000)

#define RSSI_POSSIBLY_FALSE              50
#define SEARCH_FFT_REPORT_PEAK_MAG_THRSH 40

struct ath_dfs {
	uint32_t dfs_debug_mask;        /* current debug bitmask */
	int16_t dfs_curchan_radindex;   /* cur. channel radar index */
	int16_t dfs_extchan_radindex;   /* extension channel radar index */
	uint32_t dfsdomain;     /* cur. DFS domain */
	uint32_t dfs_proc_phyerr;       /* Flags for Phy Errs to process */
	struct ieee80211com *ic;
	STAILQ_HEAD(, dfs_event) dfs_eventq;   /* Q of free dfs event objects */
	dfsq_lock_t dfs_eventqlock;     /* Lock for free dfs event list */
	STAILQ_HEAD(, dfs_event) dfs_radarq;    /* Q of radar events */
	dfsq_lock_t dfs_radarqlock;     /* Lock for dfs q */
	STAILQ_HEAD(, dfs_event) dfs_arq;       /* Q of AR events */
	dfsq_lock_t dfs_arqlock;        /* Lock for AR q */

	struct dfs_ar_state dfs_ar_state;       /* AR state */

	/* dfs_radar - Per-Channel Radar detector state */
	struct dfs_state dfs_radar[DFS_NUM_RADAR_STATES];

	/* dfs_radarf - One filter for each radar pulse type */
	struct dfs_filtertype *dfs_radarf[DFS_MAX_RADAR_TYPES];

	struct dfs_info dfs_rinfo;      /* State vars for radar processing */
	struct dfs_bin5radars *dfs_b5radars;    /* array of bin5 radar events */
	int8_t **dfs_radartable;        /* map of radar durs to filter types */
#ifndef ATH_DFS_RADAR_DETECTION_ONLY
	struct dfs_nolelem *dfs_nol;    /* Non occupancy list for radar */
	int dfs_nol_count;      /* How many items? */
#endif
	/* Default phy params per radar state */
	struct ath_dfs_phyerr_param dfs_defaultparams;
	struct dfs_stats ath_dfs_stats; /* DFS related stats */
	struct dfs_pulseline *pulses;   /* pulse history */
	struct dfs_event *events;       /* Events structure */

	uint32_t ath_radar_tasksched:1,       /* radar task is scheduled */
		 ath_dfswait:1, /* waiting on channel for radar detect */
		 ath_dfstest:1; /* Test timer in progress */
	struct ath_dfs_caps dfs_caps;
	/* IEEE chan num to return to after
	 * a dfs mute test
	 */
	uint8_t ath_dfstest_ieeechan;
#ifndef ATH_DFS_RADAR_DETECTION_ONLY
	uint32_t ath_dfs_cac_time; /* CAC period */
	uint32_t ath_dfstesttime; /* Time to stay off chan during dfs test */
	os_timer_t ath_dfswaittimer; /* dfs wait timer */
	os_timer_t ath_dfstesttimer; /* dfs mute test timer */
	os_timer_t ath_dfs_debug_timer; /* dfs debug timer */
	uint8_t dfs_bangradar;
#endif
	os_timer_t ath_dfs_task_timer; /* dfs wait timer */
	int dur_multiplier;

	uint16_t ath_dfs_isdfsregdomain; /* true when we are DFS domain */
	int ath_dfs_false_rssi_thres;
	int ath_dfs_peak_mag;

	struct dfs_event_log radar_log[DFS_EVENT_LOG_SIZE];
	int dfs_event_log_count;
	int dfs_event_log_on;
	int dfs_phyerr_count;   /* same as number of PHY radar interrupts */
	/*
	 * when TLV is supported, # of radar events ignored after TLV is parsed
	 */
	int dfs_phyerr_reject_count;
	/* number of radar events queued for matching the filters */
	int dfs_phyerr_queued_count;
	int dfs_phyerr_freq_min;
	int dfs_phyerr_freq_max;
	int dfs_phyerr_w53_counter;
	/* allow pulse if they are within multiple of PRI for the radar type */
	int dfs_pri_multiplier;
	int ath_dfs_nol_timeout;
	int dfs_pri_multiplier_ini;     /* dfs pri configuration from ini */
	/*
	 * Flag to indicate if DFS test mode is enabled and
	 * channel switch is disabled.
	 */
	int8_t     disable_dfs_ch_switch;
};

/* This should match the table from if_ath.c */
enum {
	ATH_DEBUG_DFS = 0x00000100,     /* Minimal DFS debug */
	ATH_DEBUG_DFS1 = 0x00000200,    /* Normal DFS debug */
	ATH_DEBUG_DFS2 = 0x00000400,    /* Maximal DFS debug */
	ATH_DEBUG_DFS3 = 0x00000800,    /* matched filterID display */

	ATH_DEBUG_DFS_PHYERR = 0x00001000,      /* phy error parsing */
	ATH_DEBUG_DFS_NOL = 0x00002000, /* NOL related entries */
	ATH_DEBUG_DFS_PHYERR_SUM = 0x00004000,  /* PHY error summary */
	ATH_DEBUG_DFS_PHYERR_PKT = 0x00008000,  /* PHY error payload */

	ATH_DEBUG_DFS_BIN5 = 0x00010000,        /* bin5 checks */
	ATH_DEBUG_DFS_BIN5_FFT = 0x00020000,    /* bin5 FFT check */
	ATH_DEBUG_DFS_BIN5_PULSE = 0x00040000,  /* bin5 pulse check */
};

#define IS_CHAN_HT40(_c)        IEEE80211_IS_CHAN_11N_HT40(_c)
#define IS_CHAN_HT40_PLUS(_c)   IEEE80211_IS_CHAN_11N_HT40PLUS(_c)
#define IS_CHAN_HT40_MINUS(_c)  IEEE80211_IS_CHAN_11N_HT40MINUS(_c)

/*
 * chirp notes!
 *
 * Pre-Sowl chips don't do FFT reports, so chirp pulses simply show up
 * as long duration pulses.
 *
 * The bin5 checking code would simply look for a chirp pulse of the correct
 * duration (within MIN_BIN5_DUR and MAX_BIN5_DUR) and add it to the "chirp"
 * pattern.
 *
 * For Sowl and later, an FFT was done on longer duration frames.  If those
 * frames looked like a chirp, their duration was adjusted to fall within
 * the chirp duration limits.  If the pulse failed the chirp test (it had
 * no FFT data or the FFT didn't meet the chirping requirements) then the
 * pulse duration was adjusted to be greater than MAX_BIN5_DUR, so it
 * would always fail chirp detection.
 *
 * This is pretty horrible.
 *
 * The eventual goal for chirp handling is thus:
 *
 * + In case someone ever wants to do chirp detection with this code on
 *   chips that don't support chirp detection, you can still do it based
 *   on pulse duration.  That's your problem to solve.
 *
 * + For chips that do hardware chirp detection or FFT, the "do_check_chirp"
 *   bit should be set.
 *
 * + Then, either is_hw_chirp or is_sw_chirp is set, indicating that
 *   the hardware or software post-processing of the chirp event found
 *   that indeed it was a chirp.
 *
 * + Finally, the bin5 code should just check whether the chirp bits are
 *   set and behave appropriately, falling back onto the duration checks
 *   if someone wishes to use this on older hardware (or with disabled
 *   FFTs, for whatever reason.)
 */
/*
 * XXX TODO:
 *
 * + add duration in uS and raw duration, so the PHY error parsing
 *   code is responsible for doing the duration calculation;
 * + add ts in raw and corrected, so the PHY error parsing
 *   code is responsible for doing the offsetting, not the radar
 *   event code.
 */
struct dfs_phy_err {
	uint64_t fulltsf;       /* 64-bit TSF as read from MAC */

	uint32_t is_pri:1,      /* detected on primary channel */
		 is_ext:1,    /* detected on extension channel */
		 is_dc:1,     /* detected at DC */
		 is_early:1,  /* early detect */
		 do_check_chirp:1, /* whether to check hw_chirp/sw_chirp */
		 is_hw_chirp:1, /* hardware-detected chirp */
		 is_sw_chirp:1; /* software detected chirp */

	uint32_t rs_tstamp;     /* 32 bit TSF from RX descriptor (event) */
	uint32_t freq;          /* Centre frequency of event - KHz */
	uint32_t freq_lo;       /* Lower bounds of frequency - KHz */
	uint32_t freq_hi;       /* Upper bounds of frequency - KHz */

	uint8_t rssi;           /* pulse RSSI */
	uint8_t dur;            /* pulse duration, raw (not uS) */
	int sidx;               /* Pulse Index as in radar summary report */
};

/* Attach, detach, handle ioctl prototypes */

int dfs_get_thresholds(struct ieee80211com *ic,
		       struct ath_dfs_phyerr_param *param);
int dfs_set_thresholds(struct ieee80211com *ic,
		       const uint32_t threshtype, const uint32_t value);

/* PHY error and radar event handling */
int dfs_process_radarevent(struct ath_dfs *dfs, struct ieee80211_channel *chan);

/* Non occupancy (NOL) handling prototypes */
void dfs_nol_addchan(struct ath_dfs *dfs, struct ieee80211_channel *chan,
		     uint32_t dfs_nol_timeout);
void dfs_get_nol(struct ath_dfs *dfs, struct dfsreq_nolelem *dfs_nol,
		 int *nchan);
void dfs_set_nol(struct ath_dfs *dfs, struct dfsreq_nolelem *dfs_nol,
		 int nchan);
void dfs_nol_update(struct ath_dfs *dfs);
void dfs_nol_timer_cleanup(struct ath_dfs *dfs);

/* FCC Bin5 detection prototypes */
int dfs_bin5_check_pulse(struct ath_dfs *dfs, struct dfs_event *re,
			 struct dfs_bin5radars *br);
int dfs_bin5_addpulse(struct ath_dfs *dfs, struct dfs_bin5radars *br,
		      struct dfs_event *re, uint64_t thists);
int dfs_bin5_check(struct ath_dfs *dfs);
int dfs_check_chirping(struct ath_dfs *dfs, void *buf,
		       uint16_t datalen, int is_ctl,
		       int is_ext, int *slope, int *is_dc);
uint8_t dfs_retain_bin5_burst_pattern(struct ath_dfs *dfs, uint32_t diff_ts,
				      uint8_t old_dur);
uint8_t dfs_retain_bin5_burst_pattern(struct ath_dfs *dfs, uint32_t diff_ts,
				      uint8_t old_dur);
int dfs_get_random_bin5_dur(struct ath_dfs *dfs, uint64_t tstamp);

/* Debug prototypes */
void dfs_print_delayline(struct ath_dfs *dfs, struct dfs_delayline *dl);
void dfs_print_nol(struct ath_dfs *dfs);
void dfs_print_filters(struct ath_dfs *dfs);
void dfs_print_activity(struct ath_dfs *dfs);
os_timer_func(dfs_debug_timeout);
void dfs_print_filter(struct ath_dfs *dfs, struct dfs_filter *rf);

/* Misc prototypes */
uint32_t dfs_round(int32_t val);
struct dfs_state *dfs_getchanstate(struct ath_dfs *dfs, uint8_t *index,
				   int ext_ch_flag);

/* Reset and init data structures */

int dfs_init_radar_filters(struct ieee80211com *ic,
			   struct ath_dfs_radar_tab_info *radar_info);
void dfs_reset_alldelaylines(struct ath_dfs *dfs);
void dfs_reset_delayline(struct dfs_delayline *dl);
void dfs_reset_filter_delaylines(struct dfs_filtertype *dft);
void dfs_reset_radarq(struct ath_dfs *dfs);

/* Detection algorithm prototypes */
void dfs_add_pulse(struct ath_dfs *dfs, struct dfs_filter *rf,
		   struct dfs_event *re, uint32_t deltaT, uint64_t this_ts);

int dfs_bin_fixedpattern_check(struct ath_dfs *dfs, struct dfs_filter *rf,
			       uint32_t dur, int ext_chan_flag);
int dfs_bin_check(struct ath_dfs *dfs, struct dfs_filter *rf,
		  uint32_t deltaT, uint32_t dur, int ext_chan_flag);

int dfs_bin_pri_check(struct ath_dfs *dfs, struct dfs_filter *rf,
		      struct dfs_delayline *dl, uint32_t score,
		      uint32_t refpri, uint32_t refdur, int ext_chan_flag,
		      int fundamentalpri);
int dfs_staggered_check(struct ath_dfs *dfs, struct dfs_filter *rf,
			uint32_t deltaT, uint32_t width);
/* False detection reduction */
int dfs_get_pri_margin(struct ath_dfs *dfs, int is_extchan_detect,
		       int is_fixed_pattern);
int dfs_get_filter_threshold(struct ath_dfs *dfs, struct dfs_filter *rf,
			     int is_extchan_detect);

/* AR related prototypes */

/* Commenting out since all the ar functions are obsolete and
 * the function definition has been removed as part of dfs_ar.c
 * void dfs_process_ar_event(struct ath_dfs *dfs,
 *	struct ieee80211_channel *chan);
 */
/* Commenting out since all the ar functions are obsolete and
 * the function definition has been removed as part of dfs_ar.c
 * void        ath_ar_disable(struct ath_dfs *dfs);
 */
/* Commenting out since all the ar functions are obsolete and
 * the function definition has been removed as part of dfs_ar.c
 * void        ath_ar_enable(struct ath_dfs *dfs);
 */
void dfs_reset_ar(struct ath_dfs *dfs);
/* Commenting out since all the ar functions are obsolete and
 * the function definition has been removed as part of dfs_ar.c
 * void        dfs_reset_arq(struct ath_dfs *dfs);
 */

struct ieee80211_channel *ieee80211_get_extchan(struct ieee80211com *ic);

#endif /* _DFS_H_ */
