1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
28fc8598eSJerry Chuang #ifndef __INC_DOT11D_H
38fc8598eSJerry Chuang #define __INC_DOT11D_H
48fc8598eSJerry Chuang 
58fc8598eSJerry Chuang #include "ieee80211.h"
68fc8598eSJerry Chuang 
71f1590f2SJohn Whitmore struct chnl_txpower_triple {
885f24df0SJohn Whitmore 	u8  first_channel;
98fc8598eSJerry Chuang 	u8  NumChnls;
108fc8598eSJerry Chuang 	u8  MaxTxPowerInDbm;
111f1590f2SJohn Whitmore };
128fc8598eSJerry Chuang 
138fc8598eSJerry Chuang typedef enum _DOT11D_STATE {
148fc8598eSJerry Chuang 	DOT11D_STATE_NONE = 0,
158fc8598eSJerry Chuang 	DOT11D_STATE_LEARNED,
168fc8598eSJerry Chuang 	DOT11D_STATE_DONE,
178fc8598eSJerry Chuang } DOT11D_STATE;
188fc8598eSJerry Chuang 
198fc8598eSJerry Chuang typedef struct _RT_DOT11D_INFO {
209f627100SXenia Ragiadakou 	/* DECLARE_RT_OBJECT(RT_DOT11D_INFO); */
218fc8598eSJerry Chuang 
229f627100SXenia Ragiadakou 	bool bEnabled; /* dot11MultiDomainCapabilityEnabled */
238fc8598eSJerry Chuang 
249f627100SXenia Ragiadakou 	u16 CountryIeLen; /* > 0 if CountryIeBuf[] contains valid country information element. */
258fc8598eSJerry Chuang 	u8  CountryIeBuf[MAX_IE_LEN];
269f627100SXenia Ragiadakou 	u8  CountryIeSrcAddr[6]; /* Source AP of the country IE. */
278fc8598eSJerry Chuang 	u8  CountryIeWatchdog;
288fc8598eSJerry Chuang 
299f627100SXenia Ragiadakou 	u8  channel_map[MAX_CHANNEL_NUMBER+1];  /* !Value 0: Invalid, 1: Valid (active scan), 2: Valid (passive scan) */
308fc8598eSJerry Chuang 	u8  MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
318fc8598eSJerry Chuang 
328fc8598eSJerry Chuang 	DOT11D_STATE State;
338fc8598eSJerry Chuang } RT_DOT11D_INFO, *PRT_DOT11D_INFO;
349f627100SXenia Ragiadakou #define eqMacAddr(a, b)		(((a)[0] == (b)[0] && \
359f627100SXenia Ragiadakou 	(a)[1] == (b)[1] && (a)[2] == (b)[2] && (a)[3] == (b)[3] && \
369f627100SXenia Ragiadakou 	(a)[4] == (b)[4] && (a)[5] == (b)[5]) ? 1 : 0)
379f627100SXenia Ragiadakou #define cpMacAddr(des, src)	      ((des)[0] = (src)[0], \
389f627100SXenia Ragiadakou 	(des)[1] = (src)[1], (des)[2] = (src)[2], \
399f627100SXenia Ragiadakou 	(des)[3] = (src)[3], (des)[4] = (src)[4], \
409f627100SXenia Ragiadakou 	(des)[5] = (src)[5])
418fc8598eSJerry Chuang #define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO)((__pIeeeDev)->pDot11dInfo))
428fc8598eSJerry Chuang 
439f627100SXenia Ragiadakou #define IS_DOT11D_ENABLE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->bEnabled)
448fc8598eSJerry Chuang #define IS_COUNTRY_IE_VALID(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
458fc8598eSJerry Chuang 
468fc8598eSJerry Chuang #define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
478fc8598eSJerry Chuang #define UPDATE_CIE_SRC(__pIeeeDev, __pTa) cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
488fc8598eSJerry Chuang 
498fc8598eSJerry Chuang #define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
508fc8598eSJerry Chuang 	(((__Ie).Length == 0 || (__Ie).Length != GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? \
518fc8598eSJerry Chuang 	FALSE : \
528fc8598eSJerry Chuang 	(!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, (__Ie).Octet, (__Ie).Length)))
538fc8598eSJerry Chuang 
548fc8598eSJerry Chuang #define CIE_WATCHDOG_TH 1
559f627100SXenia Ragiadakou #define GET_CIE_WATCHDOG(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog)
565877ecc3STolga Ceylan #define RESET_CIE_WATCHDOG(__pIeeeDev) (GET_CIE_WATCHDOG(__pIeeeDev) = 0)
579f627100SXenia Ragiadakou #define UPDATE_CIE_WATCHDOG(__pIeeeDev) (++GET_CIE_WATCHDOG(__pIeeeDev))
588fc8598eSJerry Chuang 
598fc8598eSJerry Chuang #define IS_DOT11D_STATE_DONE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
608fc8598eSJerry Chuang 
618fc8598eSJerry Chuang void
628fc8598eSJerry Chuang Dot11d_Init(
638fc8598eSJerry Chuang 	struct ieee80211_device *dev
648fc8598eSJerry Chuang 	);
658fc8598eSJerry Chuang 
668fc8598eSJerry Chuang void
678fc8598eSJerry Chuang Dot11d_Reset(
688fc8598eSJerry Chuang 	struct ieee80211_device *dev
698fc8598eSJerry Chuang 	);
708fc8598eSJerry Chuang 
718fc8598eSJerry Chuang void
728fc8598eSJerry Chuang Dot11d_UpdateCountryIe(
738fc8598eSJerry Chuang 	struct ieee80211_device *dev,
748fc8598eSJerry Chuang 	u8 *pTaddr,
758fc8598eSJerry Chuang 	u16 CoutryIeLen,
768fc8598eSJerry Chuang 	u8 *pCoutryIe
778fc8598eSJerry Chuang 	);
788fc8598eSJerry Chuang 
798fc8598eSJerry Chuang u8
808fc8598eSJerry Chuang DOT11D_GetMaxTxPwrInDbm(
818fc8598eSJerry Chuang 	struct ieee80211_device *dev,
828fc8598eSJerry Chuang 	u8 Channel
838fc8598eSJerry Chuang 	);
848fc8598eSJerry Chuang 
858fc8598eSJerry Chuang void
868fc8598eSJerry Chuang DOT11D_ScanComplete(
878fc8598eSJerry Chuang 	struct ieee80211_device *dev
888fc8598eSJerry Chuang 	);
898fc8598eSJerry Chuang 
908fc8598eSJerry Chuang int IsLegalChannel(
918fc8598eSJerry Chuang 	struct ieee80211_device *dev,
928fc8598eSJerry Chuang 	u8 channel
938fc8598eSJerry Chuang );
948fc8598eSJerry Chuang 
958fc8598eSJerry Chuang int ToLegalChannel(
968fc8598eSJerry Chuang 	struct ieee80211_device *dev,
978fc8598eSJerry Chuang 	u8 channel
988fc8598eSJerry Chuang );
999f627100SXenia Ragiadakou #endif /* #ifndef __INC_DOT11D_H */
100