/*
  * Copyright (c) 2016 MediaTek Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
  * General Public License (GPL) Version 2, available from the file
  * COPYING in the main directory of this source tree, or the
  * BSD license below:
  *
  *     Redistribution and use in source and binary forms, with or
  *     without modification, are permitted provided that the following
  *     conditions are met:
  *
  *      - Redistributions of source code must retain the above
  *        copyright notice, this list of conditions and the following
  *        disclaimer.
  *
  *      - Redistributions in binary form must reproduce the above
  *        copyright notice, this list of conditions and the following
  *        disclaimer in the documentation and/or other materials
  *        provided with the distribution.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */

#ifndef __RADAR_H__
#define __RADAR_H__

#define DEFAULT_CAL_BUF_TIME	60
#define DEFAULT_CAL_BUF_TIME_MAX	0x10000

/* RESTRICTION_BAND_1: 5600MHz ~ 5650MHz */
#define RESTRICTION_BAND_1(_pAd) \
	((_pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 || \
	  _pAd->CommonCfg.RegTransmitSetting.field.BW == BW_80) ? \
	((_pAd->CommonCfg.Channel >= 116) && (_pAd->CommonCfg.Channel <= 128)) :	\
	((_pAd->CommonCfg.Channel >= 120) && (_pAd->CommonCfg.Channel <= 128)))

#define IS_DOT11_H_RADAR_STATE(_pAd, _RadarState)		\
		((_pAd->CommonCfg.Channel > 14)	\
		&& (_pAd->CommonCfg.bIEEE80211H == 1)	\
		&& RadarChannelCheck(_pAd, _pAd->CommonCfg.Channel)	\
		&& _pAd->Dot11_H.RDMode == _RadarState)

/* 802.11H */
typedef struct _DOT11_H {
	/* 802.11H and DFS related params */
	UCHAR CSCount;		/*Channel switch counter */
	UCHAR CSPeriod;		/*Channel switch period (beacon count) */
	USHORT RDCount;		/*Radar detection counter, if RDCount >  ChMovingTime, start to send beacons */
	UCHAR RDMode;		/*Radar Detection mode */
	UCHAR org_ch;
	UCHAR new_channel;
	USHORT ChMovingTime;
	BOOLEAN bDFSIndoor;
	ULONG InServiceMonitorCount;	/* unit: sec */
	ULONG CalBufTime;	/* A Timing buffer for befroe calibrations which generates Tx signals */
} DOT11_H, *PDOT11_H;

BOOLEAN RadarChannelCheck(IN PRTMP_ADAPTER pAd, IN UCHAR Ch);

VOID RadarStateCheck(IN PRTMP_ADAPTER pAd);

ULONG JapRadarType(IN PRTMP_ADAPTER pAd);

UCHAR get_channel_by_reference(IN PRTMP_ADAPTER pAd, IN UINT8 mode);

#ifdef CONFIG_AP_SUPPORT
VOID ChannelSwitchingCountDownProc(IN PRTMP_ADAPTER pAd);
#endif /* CONFIG_AP_SUPPORT */

VOID RadarDetectPeriodic(IN PRTMP_ADAPTER pAd);

INT Set_CSPeriod_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg);

INT Set_ChMovingTime_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);

INT Set_BlockChReset_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);

#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)
INT Set_RadarShow_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);

VOID CckMrcStatusCtrl(IN PRTMP_ADAPTER pAd);

VOID RadarGLRTCompensate(IN PRTMP_ADAPTER pAd);

#endif /*defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */

#endif /* __RADAR_H__ */
