xref: /onnv-gate/usr/src/uts/common/io/arn/arn_hw.h (revision 11729:8922e660c576)
19999SWang.Lin@Sun.COM /*
2*11729SWang.Lin@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
39999SWang.Lin@Sun.COM  * Use is subject to license terms.
49999SWang.Lin@Sun.COM  */
59999SWang.Lin@Sun.COM 
69999SWang.Lin@Sun.COM /*
79999SWang.Lin@Sun.COM  * Copyright (c) 2008 Atheros Communications Inc.
89999SWang.Lin@Sun.COM  *
99999SWang.Lin@Sun.COM  * Permission to use, copy, modify, and/or distribute this software for any
109999SWang.Lin@Sun.COM  * purpose with or without fee is hereby granted, provided that the above
119999SWang.Lin@Sun.COM  * copyright notice and this permission notice appear in all copies.
129999SWang.Lin@Sun.COM  *
139999SWang.Lin@Sun.COM  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
149999SWang.Lin@Sun.COM  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
159999SWang.Lin@Sun.COM  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
169999SWang.Lin@Sun.COM  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
179999SWang.Lin@Sun.COM  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
189999SWang.Lin@Sun.COM  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
199999SWang.Lin@Sun.COM  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
209999SWang.Lin@Sun.COM  */
219999SWang.Lin@Sun.COM 
229999SWang.Lin@Sun.COM #ifndef	_ARN_HW_H
239999SWang.Lin@Sun.COM #define	_ARN_HW_H
249999SWang.Lin@Sun.COM 
259999SWang.Lin@Sun.COM #ifdef __cplusplus
269999SWang.Lin@Sun.COM extern "C" {
279999SWang.Lin@Sun.COM #endif
289999SWang.Lin@Sun.COM 
299999SWang.Lin@Sun.COM #pragma pack(1)
309999SWang.Lin@Sun.COM struct ar5416_desc {
319999SWang.Lin@Sun.COM 	uint32_t ds_link;
329999SWang.Lin@Sun.COM 	uint32_t ds_data;
339999SWang.Lin@Sun.COM 	uint32_t ds_ctl0;
349999SWang.Lin@Sun.COM 	uint32_t ds_ctl1;
359999SWang.Lin@Sun.COM 	union {
369999SWang.Lin@Sun.COM 		struct {
379999SWang.Lin@Sun.COM 			uint32_t ctl2;
389999SWang.Lin@Sun.COM 			uint32_t ctl3;
399999SWang.Lin@Sun.COM 			uint32_t ctl4;
409999SWang.Lin@Sun.COM 			uint32_t ctl5;
419999SWang.Lin@Sun.COM 			uint32_t ctl6;
429999SWang.Lin@Sun.COM 			uint32_t ctl7;
439999SWang.Lin@Sun.COM 			uint32_t ctl8;
449999SWang.Lin@Sun.COM 			uint32_t ctl9;
459999SWang.Lin@Sun.COM 			uint32_t ctl10;
469999SWang.Lin@Sun.COM 			uint32_t ctl11;
479999SWang.Lin@Sun.COM 			uint32_t status0;
489999SWang.Lin@Sun.COM 			uint32_t status1;
499999SWang.Lin@Sun.COM 			uint32_t status2;
509999SWang.Lin@Sun.COM 			uint32_t status3;
519999SWang.Lin@Sun.COM 			uint32_t status4;
529999SWang.Lin@Sun.COM 			uint32_t status5;
539999SWang.Lin@Sun.COM 			uint32_t status6;
549999SWang.Lin@Sun.COM 			uint32_t status7;
559999SWang.Lin@Sun.COM 			uint32_t status8;
569999SWang.Lin@Sun.COM 			uint32_t status9;
579999SWang.Lin@Sun.COM 		} tx;
589999SWang.Lin@Sun.COM 		struct {
599999SWang.Lin@Sun.COM 			uint32_t status0;
609999SWang.Lin@Sun.COM 			uint32_t status1;
619999SWang.Lin@Sun.COM 			uint32_t status2;
629999SWang.Lin@Sun.COM 			uint32_t status3;
639999SWang.Lin@Sun.COM 			uint32_t status4;
649999SWang.Lin@Sun.COM 			uint32_t status5;
659999SWang.Lin@Sun.COM 			uint32_t status6;
669999SWang.Lin@Sun.COM 			uint32_t status7;
679999SWang.Lin@Sun.COM 			uint32_t status8;
689999SWang.Lin@Sun.COM 		} rx;
699999SWang.Lin@Sun.COM 	} u;
709999SWang.Lin@Sun.COM };
719999SWang.Lin@Sun.COM #pragma pack()
729999SWang.Lin@Sun.COM 
739999SWang.Lin@Sun.COM #define	AR5416DESC(_ds)		((struct ar5416_desc *)(_ds))
749999SWang.Lin@Sun.COM #define	AR5416DESC_CONST(_ds)	((const struct ar5416_desc *)(_ds))
759999SWang.Lin@Sun.COM 
769999SWang.Lin@Sun.COM #define	ds_ctl2		u.tx.ctl2
779999SWang.Lin@Sun.COM #define	ds_ctl3		u.tx.ctl3
789999SWang.Lin@Sun.COM #define	ds_ctl4		u.tx.ctl4
799999SWang.Lin@Sun.COM #define	ds_ctl5		u.tx.ctl5
809999SWang.Lin@Sun.COM #define	ds_ctl6		u.tx.ctl6
819999SWang.Lin@Sun.COM #define	ds_ctl7		u.tx.ctl7
829999SWang.Lin@Sun.COM #define	ds_ctl8		u.tx.ctl8
839999SWang.Lin@Sun.COM #define	ds_ctl9		u.tx.ctl9
849999SWang.Lin@Sun.COM #define	ds_ctl10	u.tx.ctl10
859999SWang.Lin@Sun.COM #define	ds_ctl11	u.tx.ctl11
869999SWang.Lin@Sun.COM 
879999SWang.Lin@Sun.COM #define	ds_txstatus0	u.tx.status0
889999SWang.Lin@Sun.COM #define	ds_txstatus1	u.tx.status1
899999SWang.Lin@Sun.COM #define	ds_txstatus2	u.tx.status2
909999SWang.Lin@Sun.COM #define	ds_txstatus3	u.tx.status3
919999SWang.Lin@Sun.COM #define	ds_txstatus4	u.tx.status4
929999SWang.Lin@Sun.COM #define	ds_txstatus5	u.tx.status5
939999SWang.Lin@Sun.COM #define	ds_txstatus6	u.tx.status6
949999SWang.Lin@Sun.COM #define	ds_txstatus7	u.tx.status7
959999SWang.Lin@Sun.COM #define	ds_txstatus8	u.tx.status8
969999SWang.Lin@Sun.COM #define	ds_txstatus9	u.tx.status9
979999SWang.Lin@Sun.COM 
989999SWang.Lin@Sun.COM #define	ds_rxstatus0	u.rx.status0
999999SWang.Lin@Sun.COM #define	ds_rxstatus1	u.rx.status1
1009999SWang.Lin@Sun.COM #define	ds_rxstatus2	u.rx.status2
1019999SWang.Lin@Sun.COM #define	ds_rxstatus3	u.rx.status3
1029999SWang.Lin@Sun.COM #define	ds_rxstatus4	u.rx.status4
1039999SWang.Lin@Sun.COM #define	ds_rxstatus5	u.rx.status5
1049999SWang.Lin@Sun.COM #define	ds_rxstatus6	u.rx.status6
1059999SWang.Lin@Sun.COM #define	ds_rxstatus7	u.rx.status7
1069999SWang.Lin@Sun.COM #define	ds_rxstatus8	u.rx.status8
1079999SWang.Lin@Sun.COM 
1089999SWang.Lin@Sun.COM #define	AR_FrameLen	0x00000fff
1099999SWang.Lin@Sun.COM #define	AR_VirtMoreFrag	0x00001000
1109999SWang.Lin@Sun.COM #define	AR_TxCtlRsvd00	0x0000e000
1119999SWang.Lin@Sun.COM #define	AR_XmitPower	0x003f0000
1129999SWang.Lin@Sun.COM #define	AR_XmitPower_S	16
1139999SWang.Lin@Sun.COM #define	AR_RTSEnable	0x00400000
1149999SWang.Lin@Sun.COM #define	AR_VEOL		0x00800000
1159999SWang.Lin@Sun.COM #define	AR_ClrDestMask	0x01000000
1169999SWang.Lin@Sun.COM #define	AR_TxCtlRsvd01	0x1e000000
1179999SWang.Lin@Sun.COM #define	AR_TxIntrReq	0x20000000
1189999SWang.Lin@Sun.COM #define	AR_DestIdxValid	0x40000000
1199999SWang.Lin@Sun.COM #define	AR_CTSEnable	0x80000000
1209999SWang.Lin@Sun.COM 
1219999SWang.Lin@Sun.COM #define	AR_BufLen		0x00000fff
1229999SWang.Lin@Sun.COM #define	AR_TxMore		0x00001000
1239999SWang.Lin@Sun.COM #define	AR_DestIdx		0x000fe000
1249999SWang.Lin@Sun.COM #define	AR_DestIdx_S		13
1259999SWang.Lin@Sun.COM #define	AR_FrameType		0x00f00000
1269999SWang.Lin@Sun.COM #define	AR_FrameType_S		20
1279999SWang.Lin@Sun.COM #define	AR_NoAck		0x01000000
1289999SWang.Lin@Sun.COM #define	AR_InsertTS		0x02000000
1299999SWang.Lin@Sun.COM #define	AR_CorruptFCS		0x04000000
1309999SWang.Lin@Sun.COM #define	AR_ExtOnly		0x08000000
1319999SWang.Lin@Sun.COM #define	AR_ExtAndCtl		0x10000000
1329999SWang.Lin@Sun.COM #define	AR_MoreAggr		0x20000000
1339999SWang.Lin@Sun.COM #define	AR_IsAggr		0x40000000
1349999SWang.Lin@Sun.COM 
1359999SWang.Lin@Sun.COM #define	AR_BurstDur		0x00007fff
1369999SWang.Lin@Sun.COM #define	AR_BurstDur_S		0
1379999SWang.Lin@Sun.COM #define	AR_DurUpdateEna		0x00008000
1389999SWang.Lin@Sun.COM #define	AR_XmitDataTries0	0x000f0000
1399999SWang.Lin@Sun.COM #define	AR_XmitDataTries0_S	16
1409999SWang.Lin@Sun.COM #define	AR_XmitDataTries1	0x00f00000
1419999SWang.Lin@Sun.COM #define	AR_XmitDataTries1_S	20
1429999SWang.Lin@Sun.COM #define	AR_XmitDataTries2	0x0f000000
1439999SWang.Lin@Sun.COM #define	AR_XmitDataTries2_S	24
1449999SWang.Lin@Sun.COM #define	AR_XmitDataTries3	0xf0000000
1459999SWang.Lin@Sun.COM #define	AR_XmitDataTries3_S	28
1469999SWang.Lin@Sun.COM 
1479999SWang.Lin@Sun.COM #define	AR_XmitRate0		0x000000ff
1489999SWang.Lin@Sun.COM #define	AR_XmitRate0_S		0
1499999SWang.Lin@Sun.COM #define	AR_XmitRate1		0x0000ff00
1509999SWang.Lin@Sun.COM #define	AR_XmitRate1_S		8
1519999SWang.Lin@Sun.COM #define	AR_XmitRate2		0x00ff0000
1529999SWang.Lin@Sun.COM #define	AR_XmitRate2_S		16
1539999SWang.Lin@Sun.COM #define	AR_XmitRate3		0xff000000
1549999SWang.Lin@Sun.COM #define	AR_XmitRate3_S		24
1559999SWang.Lin@Sun.COM 
1569999SWang.Lin@Sun.COM #define	AR_PacketDur0		0x00007fff
1579999SWang.Lin@Sun.COM #define	AR_PacketDur0_S		0
1589999SWang.Lin@Sun.COM #define	AR_RTSCTSQual0		0x00008000
1599999SWang.Lin@Sun.COM #define	AR_PacketDur1		0x7fff0000
1609999SWang.Lin@Sun.COM #define	AR_PacketDur1_S		16
1619999SWang.Lin@Sun.COM #define	AR_RTSCTSQual1		0x80000000
1629999SWang.Lin@Sun.COM 
1639999SWang.Lin@Sun.COM #define	AR_PacketDur2		0x00007fff
1649999SWang.Lin@Sun.COM #define	AR_PacketDur2_S		0
1659999SWang.Lin@Sun.COM #define	AR_RTSCTSQual2		0x00008000
1669999SWang.Lin@Sun.COM #define	AR_PacketDur3		0x7fff0000
1679999SWang.Lin@Sun.COM #define	AR_PacketDur3_S		16
1689999SWang.Lin@Sun.COM #define	AR_RTSCTSQual3		0x80000000
1699999SWang.Lin@Sun.COM 
1709999SWang.Lin@Sun.COM #define	AR_AggrLen		0x0000ffff
1719999SWang.Lin@Sun.COM #define	AR_AggrLen_S		0
1729999SWang.Lin@Sun.COM #define	AR_TxCtlRsvd60		0x00030000
1739999SWang.Lin@Sun.COM #define	AR_PadDelim		0x03fc0000
1749999SWang.Lin@Sun.COM #define	AR_PadDelim_S		18
1759999SWang.Lin@Sun.COM #define	AR_EncrType		0x0c000000
1769999SWang.Lin@Sun.COM #define	AR_EncrType_S		26
1779999SWang.Lin@Sun.COM #define	AR_TxCtlRsvd61		0xf0000000
1789999SWang.Lin@Sun.COM 
1799999SWang.Lin@Sun.COM #define	AR_2040_0		0x00000001
1809999SWang.Lin@Sun.COM #define	AR_GI0			0x00000002
1819999SWang.Lin@Sun.COM #define	AR_ChainSel0		0x0000001c
1829999SWang.Lin@Sun.COM #define	AR_ChainSel0_S		2
1839999SWang.Lin@Sun.COM #define	AR_2040_1		0x00000020
1849999SWang.Lin@Sun.COM #define	AR_GI1			0x00000040
1859999SWang.Lin@Sun.COM #define	AR_ChainSel1		0x00000380
1869999SWang.Lin@Sun.COM #define	AR_ChainSel1_S		7
1879999SWang.Lin@Sun.COM #define	AR_2040_2		0x00000400
1889999SWang.Lin@Sun.COM #define	AR_GI2			0x00000800
1899999SWang.Lin@Sun.COM #define	AR_ChainSel2		0x00007000
1909999SWang.Lin@Sun.COM #define	AR_ChainSel2_S		12
1919999SWang.Lin@Sun.COM #define	AR_2040_3		0x00008000
1929999SWang.Lin@Sun.COM #define	AR_GI3			0x00010000
1939999SWang.Lin@Sun.COM #define	AR_ChainSel3		0x000e0000
1949999SWang.Lin@Sun.COM #define	AR_ChainSel3_S		17
1959999SWang.Lin@Sun.COM #define	AR_RTSCTSRate		0x0ff00000
1969999SWang.Lin@Sun.COM #define	AR_RTSCTSRate_S		20
1979999SWang.Lin@Sun.COM #define	AR_TxCtlRsvd70		0xf0000000
1989999SWang.Lin@Sun.COM 
1999999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt00		0x000000ff
2009999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt00_S	0
2019999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt01		0x0000ff00
2029999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt01_S	8
2039999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt02		0x00ff0000
2049999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt02_S	16
2059999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd00	0x3f000000
2069999SWang.Lin@Sun.COM #define	AR_TxBaStatus		0x40000000
2079999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd01	0x80000000
2089999SWang.Lin@Sun.COM 
2099999SWang.Lin@Sun.COM #define	AR_FrmXmitOK		0x00000001
2109999SWang.Lin@Sun.COM #define	AR_ExcessiveRetries	0x00000002
2119999SWang.Lin@Sun.COM #define	AR_FIFOUnderrun		0x00000004
2129999SWang.Lin@Sun.COM #define	AR_Filtered		0x00000008
2139999SWang.Lin@Sun.COM #define	AR_RTSFailCnt		0x000000f0
2149999SWang.Lin@Sun.COM #define	AR_RTSFailCnt_S		4
2159999SWang.Lin@Sun.COM #define	AR_DataFailCnt		0x00000f00
2169999SWang.Lin@Sun.COM #define	AR_DataFailCnt_S	8
2179999SWang.Lin@Sun.COM #define	AR_VirtRetryCnt		0x0000f000
2189999SWang.Lin@Sun.COM #define	AR_VirtRetryCnt_S	12
2199999SWang.Lin@Sun.COM #define	AR_TxDelimUnderrun	0x00010000
2209999SWang.Lin@Sun.COM #define	AR_TxDataUnderrun	0x00020000
2219999SWang.Lin@Sun.COM #define	AR_DescCfgErr		0x00040000
2229999SWang.Lin@Sun.COM #define	AR_TxTimerExpired	0x00080000
2239999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd10	0xfff00000
2249999SWang.Lin@Sun.COM 
2259999SWang.Lin@Sun.COM #define	AR_SendTimestamp	ds_txstatus2
2269999SWang.Lin@Sun.COM #define	AR_BaBitmapLow		ds_txstatus3
2279999SWang.Lin@Sun.COM #define	AR_BaBitmapHigh		ds_txstatus4
2289999SWang.Lin@Sun.COM 
2299999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt10		0x000000ff
2309999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt10_S	0
2319999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt11		0x0000ff00
2329999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt11_S	8
2339999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt12		0x00ff0000
2349999SWang.Lin@Sun.COM #define	AR_TxRSSIAnt12_S	16
2359999SWang.Lin@Sun.COM #define	AR_TxRSSICombined	0xff000000
2369999SWang.Lin@Sun.COM #define	AR_TxRSSICombined_S	24
2379999SWang.Lin@Sun.COM 
2389999SWang.Lin@Sun.COM #define	AR_TxEVM0		ds_txstatus5
2399999SWang.Lin@Sun.COM #define	AR_TxEVM1		ds_txstatus6
2409999SWang.Lin@Sun.COM #define	AR_TxEVM2		ds_txstatus7
2419999SWang.Lin@Sun.COM 
2429999SWang.Lin@Sun.COM #define	AR_TxDone		0x00000001
2439999SWang.Lin@Sun.COM #define	AR_SeqNum		0x00001ffe
2449999SWang.Lin@Sun.COM #define	AR_SeqNum_S		1
2459999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd80	0x0001e000
2469999SWang.Lin@Sun.COM #define	AR_TxOpExceeded		0x00020000
2479999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd81	0x001c0000
2489999SWang.Lin@Sun.COM #define	AR_FinalTxIdx		0x00600000
2499999SWang.Lin@Sun.COM #define	AR_FinalTxIdx_S		21
2509999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd82	0x01800000
2519999SWang.Lin@Sun.COM #define	AR_PowerMgmt		0x02000000
2529999SWang.Lin@Sun.COM #define	AR_TxStatusRsvd83	0xfc000000
2539999SWang.Lin@Sun.COM 
2549999SWang.Lin@Sun.COM #define	AR_RxCTLRsvd00		0xffffffff
2559999SWang.Lin@Sun.COM 
2569999SWang.Lin@Sun.COM #define	AR_BufLen		0x00000fff
2579999SWang.Lin@Sun.COM #define	AR_RxCtlRsvd00		0x00001000
2589999SWang.Lin@Sun.COM #define	AR_RxIntrReq		0x00002000
2599999SWang.Lin@Sun.COM #define	AR_RxCtlRsvd01		0xffffc000
2609999SWang.Lin@Sun.COM 
2619999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt00		0x000000ff
2629999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt00_S	0
2639999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt01		0x0000ff00
2649999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt01_S	8
2659999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt02		0x00ff0000
2669999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt02_S	16
2679999SWang.Lin@Sun.COM #define	AR_RxRate		0xff000000
2689999SWang.Lin@Sun.COM #define	AR_RxRate_S		24
2699999SWang.Lin@Sun.COM #define	AR_RxStatusRsvd00	0xff000000
2709999SWang.Lin@Sun.COM 
2719999SWang.Lin@Sun.COM #define	AR_DataLen		0x00000fff
2729999SWang.Lin@Sun.COM #define	AR_RxMore		0x00001000
2739999SWang.Lin@Sun.COM #define	AR_NumDelim		0x003fc000
2749999SWang.Lin@Sun.COM #define	AR_NumDelim_S		14
2759999SWang.Lin@Sun.COM #define	AR_RxStatusRsvd10	0xff800000
2769999SWang.Lin@Sun.COM 
2779999SWang.Lin@Sun.COM #define	AR_RcvTimestamp		ds_rxstatus2
2789999SWang.Lin@Sun.COM 
2799999SWang.Lin@Sun.COM #define	AR_GI			0x00000001
2809999SWang.Lin@Sun.COM #define	AR_2040			0x00000002
2819999SWang.Lin@Sun.COM #define	AR_Parallel40		0x00000004
2829999SWang.Lin@Sun.COM #define	AR_Parallel40_S		2
2839999SWang.Lin@Sun.COM #define	AR_RxStatusRsvd30	0x000000f8
2849999SWang.Lin@Sun.COM #define	AR_RxAntenna		0xffffff00
2859999SWang.Lin@Sun.COM #define	AR_RxAntenna_S		8
2869999SWang.Lin@Sun.COM 
2879999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt10		0x000000ff
2889999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt10_S	0
2899999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt11		0x0000ff00
2909999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt11_S	8
2919999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt12		0x00ff0000
2929999SWang.Lin@Sun.COM #define	AR_RxRSSIAnt12_S	16
2939999SWang.Lin@Sun.COM #define	AR_RxRSSICombined	0xff000000
2949999SWang.Lin@Sun.COM #define	AR_RxRSSICombined_S	24
2959999SWang.Lin@Sun.COM 
2969999SWang.Lin@Sun.COM #define	AR_RxEVM0		ds_rxstatus4
2979999SWang.Lin@Sun.COM #define	AR_RxEVM1		ds_rxstatus5
2989999SWang.Lin@Sun.COM #define	AR_RxEVM2		ds_rxstatus6
2999999SWang.Lin@Sun.COM 
3009999SWang.Lin@Sun.COM #define	AR_RxDone		0x00000001
3019999SWang.Lin@Sun.COM #define	AR_RxFrameOK		0x00000002
3029999SWang.Lin@Sun.COM #define	AR_CRCErr		0x00000004
3039999SWang.Lin@Sun.COM #define	AR_DecryptCRCErr	0x00000008
3049999SWang.Lin@Sun.COM #define	AR_PHYErr		0x00000010
3059999SWang.Lin@Sun.COM #define	AR_MichaelErr		0x00000020
3069999SWang.Lin@Sun.COM #define	AR_PreDelimCRCErr	0x00000040
3079999SWang.Lin@Sun.COM #define	AR_RxStatusRsvd70	0x00000080
3089999SWang.Lin@Sun.COM #define	AR_RxKeyIdxValid	0x00000100
3099999SWang.Lin@Sun.COM #define	AR_KeyIdx		0x0000fe00
3109999SWang.Lin@Sun.COM #define	AR_KeyIdx_S		9
3119999SWang.Lin@Sun.COM #define	AR_PHYErrCode		0x0000ff00
3129999SWang.Lin@Sun.COM #define	AR_PHYErrCode_S		8
3139999SWang.Lin@Sun.COM #define	AR_RxMoreAggr		0x00010000
3149999SWang.Lin@Sun.COM #define	AR_RxAggr		0x00020000
3159999SWang.Lin@Sun.COM #define	AR_PostDelimCRCErr	0x00040000
3169999SWang.Lin@Sun.COM #define	AR_RxStatusRsvd71	0x3ff80000
3179999SWang.Lin@Sun.COM #define	AR_DecryptBusyErr	0x40000000
3189999SWang.Lin@Sun.COM #define	AR_KeyMiss		0x80000000
3199999SWang.Lin@Sun.COM 
3209999SWang.Lin@Sun.COM #define	AR5416_MAGIC	0x19641014
3219999SWang.Lin@Sun.COM 
3229999SWang.Lin@Sun.COM #define	RXSTATUS_RATE(ah, ads)	(AR_SREV_5416_V20_OR_LATER(ah) ?	\
3239999SWang.Lin@Sun.COM 	MS(ads->ds_rxstatus0, AR_RxRate) :				\
3249999SWang.Lin@Sun.COM 	(ads->ds_rxstatus3 >> 2) & 0xFF)
3259999SWang.Lin@Sun.COM 
3269999SWang.Lin@Sun.COM #define	set11nTries(_series, _index)	\
3279999SWang.Lin@Sun.COM 	(SM((_series)[_index].Tries, AR_XmitDataTries##_index))
3289999SWang.Lin@Sun.COM 
3299999SWang.Lin@Sun.COM #define	set11nRate(_series, _index)	\
3309999SWang.Lin@Sun.COM 	(SM((_series)[_index].Rate, AR_XmitRate##_index))
3319999SWang.Lin@Sun.COM 
3329999SWang.Lin@Sun.COM #define	set11nPktDurRTSCTS(_series, _index)				\
3339999SWang.Lin@Sun.COM 	(SM((_series)[_index].PktDuration, AR_PacketDur##_index) |	\
3349999SWang.Lin@Sun.COM 	((_series)[_index].RateFlags & ATH9K_RATESERIES_RTS_CTS   ?	\
3359999SWang.Lin@Sun.COM 	    AR_RTSCTSQual##_index : 0))
3369999SWang.Lin@Sun.COM 
3379999SWang.Lin@Sun.COM #define	set11nRateFlags(_series, _index)				\
3389999SWang.Lin@Sun.COM 	(((_series)[_index].RateFlags & ATH9K_RATESERIES_2040 ?		\
3399999SWang.Lin@Sun.COM 	    AR_2040_##_index : 0)					\
3409999SWang.Lin@Sun.COM 	|((_series)[_index].RateFlags & ATH9K_RATESERIES_HALFGI ?	\
3419999SWang.Lin@Sun.COM 	    AR_GI##_index : 0)						\
3429999SWang.Lin@Sun.COM 	|SM((_series)[_index].ChSel, AR_ChainSel##_index))
3439999SWang.Lin@Sun.COM 
3449999SWang.Lin@Sun.COM #define	AR_SREV_9100(ah)	((ah->ah_macVersion) == AR_SREV_VERSION_9100)
3459999SWang.Lin@Sun.COM 
3469999SWang.Lin@Sun.COM #define	INIT_CONFIG_STATUS	0x00000000
3479999SWang.Lin@Sun.COM #define	INIT_RSSI_THR		0x00000700
3489999SWang.Lin@Sun.COM #define	INIT_BCON_CNTRL_REG	0x00000000
3499999SWang.Lin@Sun.COM 
3509999SWang.Lin@Sun.COM #define	MIN_TX_FIFO_THRESHOLD	0x1
3519999SWang.Lin@Sun.COM #define	MAX_TX_FIFO_THRESHOLD	((4096 / 64) - 1)
3529999SWang.Lin@Sun.COM #define	INIT_TX_FIFO_THRESHOLD	MIN_TX_FIFO_THRESHOLD
3539999SWang.Lin@Sun.COM 
3549999SWang.Lin@Sun.COM struct ar5416AniState {
3559999SWang.Lin@Sun.COM 	struct ath9k_channel c;
3569999SWang.Lin@Sun.COM 	uint8_t noiseImmunityLevel;
3579999SWang.Lin@Sun.COM 	uint8_t spurImmunityLevel;
3589999SWang.Lin@Sun.COM 	uint8_t firstepLevel;
3599999SWang.Lin@Sun.COM 	uint8_t ofdmWeakSigDetectOff;
3609999SWang.Lin@Sun.COM 	uint8_t cckWeakSigThreshold;
3619999SWang.Lin@Sun.COM 	uint32_t listenTime;
3629999SWang.Lin@Sun.COM 	uint32_t ofdmTrigHigh;
3639999SWang.Lin@Sun.COM 	uint32_t ofdmTrigLow;
3649999SWang.Lin@Sun.COM 	int32_t cckTrigHigh;
3659999SWang.Lin@Sun.COM 	int32_t cckTrigLow;
3669999SWang.Lin@Sun.COM 	int32_t rssiThrLow;
3679999SWang.Lin@Sun.COM 	int32_t rssiThrHigh;
3689999SWang.Lin@Sun.COM 	uint32_t noiseFloor;
3699999SWang.Lin@Sun.COM 	uint32_t txFrameCount;
3709999SWang.Lin@Sun.COM 	uint32_t rxFrameCount;
3719999SWang.Lin@Sun.COM 	uint32_t cycleCount;
3729999SWang.Lin@Sun.COM 	uint32_t ofdmPhyErrCount;
3739999SWang.Lin@Sun.COM 	uint32_t cckPhyErrCount;
3749999SWang.Lin@Sun.COM 	uint32_t ofdmPhyErrBase;
3759999SWang.Lin@Sun.COM 	uint32_t cckPhyErrBase;
3769999SWang.Lin@Sun.COM 	int16_t pktRssi[2];
3779999SWang.Lin@Sun.COM 	int16_t ofdmErrRssi[2];
3789999SWang.Lin@Sun.COM 	int16_t cckErrRssi[2];
3799999SWang.Lin@Sun.COM };
3809999SWang.Lin@Sun.COM 
3819999SWang.Lin@Sun.COM #define	HAL_PROCESS_ANI	0x00000001
3829999SWang.Lin@Sun.COM #define	DO_ANI(ah) \
3839999SWang.Lin@Sun.COM 	((AH5416(ah)->ah_procPhyErr & HAL_PROCESS_ANI))
3849999SWang.Lin@Sun.COM 
3859999SWang.Lin@Sun.COM struct ar5416Stats {
3869999SWang.Lin@Sun.COM 	uint32_t ast_ani_niup;
3879999SWang.Lin@Sun.COM 	uint32_t ast_ani_nidown;
3889999SWang.Lin@Sun.COM 	uint32_t ast_ani_spurup;
3899999SWang.Lin@Sun.COM 	uint32_t ast_ani_spurdown;
3909999SWang.Lin@Sun.COM 	uint32_t ast_ani_ofdmon;
3919999SWang.Lin@Sun.COM 	uint32_t ast_ani_ofdmoff;
3929999SWang.Lin@Sun.COM 	uint32_t ast_ani_cckhigh;
3939999SWang.Lin@Sun.COM 	uint32_t ast_ani_ccklow;
3949999SWang.Lin@Sun.COM 	uint32_t ast_ani_stepup;
3959999SWang.Lin@Sun.COM 	uint32_t ast_ani_stepdown;
3969999SWang.Lin@Sun.COM 	uint32_t ast_ani_ofdmerrs;
3979999SWang.Lin@Sun.COM 	uint32_t ast_ani_cckerrs;
3989999SWang.Lin@Sun.COM 	uint32_t ast_ani_reset;
3999999SWang.Lin@Sun.COM 	uint32_t ast_ani_lzero;
4009999SWang.Lin@Sun.COM 	uint32_t ast_ani_lneg;
4019999SWang.Lin@Sun.COM 	struct ath9k_mib_stats ast_mibstats;
4029999SWang.Lin@Sun.COM 	struct ath9k_node_stats ast_nodestats;
4039999SWang.Lin@Sun.COM };
4049999SWang.Lin@Sun.COM 
4059999SWang.Lin@Sun.COM #define	AR5416_OPFLAGS_11A		0x01
4069999SWang.Lin@Sun.COM #define	AR5416_OPFLAGS_11G		0x02
4079999SWang.Lin@Sun.COM #define	AR5416_OPFLAGS_N_5G_HT40	0x04
4089999SWang.Lin@Sun.COM #define	AR5416_OPFLAGS_N_2G_HT40	0x08
4099999SWang.Lin@Sun.COM #define	AR5416_OPFLAGS_N_5G_HT20	0x10
4109999SWang.Lin@Sun.COM #define	AR5416_OPFLAGS_N_2G_HT20	0x20
4119999SWang.Lin@Sun.COM 
4129999SWang.Lin@Sun.COM #define	EEP_RFSILENT_ENABLED		0x0001
4139999SWang.Lin@Sun.COM #define	EEP_RFSILENT_ENABLED_S		0
4149999SWang.Lin@Sun.COM #define	EEP_RFSILENT_POLARITY		0x0002
4159999SWang.Lin@Sun.COM #define	EEP_RFSILENT_POLARITY_S		1
4169999SWang.Lin@Sun.COM #define	EEP_RFSILENT_GPIO_SEL		0x001c
4179999SWang.Lin@Sun.COM #define	EEP_RFSILENT_GPIO_SEL_S		2
4189999SWang.Lin@Sun.COM 
4199999SWang.Lin@Sun.COM #define	AR5416_EEP_NO_BACK_VER		0x1
4209999SWang.Lin@Sun.COM #define	AR5416_EEP_VER			0xE
4219999SWang.Lin@Sun.COM #define	AR5416_EEP_VER_MINOR_MASK	0x0FFF
4229999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_2		0x2
4239999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_3		0x3
4249999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_7		0x7
4259999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_9		0x9
4269999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_16		0x10
4279999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_17		0x11
4289999SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_19		0x13
429*11729SWang.Lin@Sun.COM /* 2.6.30 */
430*11729SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_20		0x14
431*11729SWang.Lin@Sun.COM #define	AR5416_EEP_MINOR_VER_22		0x16
4329999SWang.Lin@Sun.COM 
4339999SWang.Lin@Sun.COM #define	AR5416_NUM_5G_CAL_PIERS		8
4349999SWang.Lin@Sun.COM #define	AR5416_NUM_2G_CAL_PIERS		4
4359999SWang.Lin@Sun.COM #define	AR5416_NUM_5G_20_TARGET_POWERS	8
4369999SWang.Lin@Sun.COM #define	AR5416_NUM_5G_40_TARGET_POWERS	8
4379999SWang.Lin@Sun.COM #define	AR5416_NUM_2G_CCK_TARGET_POWERS	3
4389999SWang.Lin@Sun.COM #define	AR5416_NUM_2G_20_TARGET_POWERS	4
4399999SWang.Lin@Sun.COM #define	AR5416_NUM_2G_40_TARGET_POWERS	4
4409999SWang.Lin@Sun.COM #define	AR5416_NUM_CTLS			24
4419999SWang.Lin@Sun.COM #define	AR5416_NUM_BAND_EDGES		8
4429999SWang.Lin@Sun.COM #define	AR5416_NUM_PD_GAINS		4
4439999SWang.Lin@Sun.COM #define	AR5416_PD_GAINS_IN_MASK		4
4449999SWang.Lin@Sun.COM #define	AR5416_PD_GAIN_ICEPTS		5
4459999SWang.Lin@Sun.COM #define	AR5416_EEPROM_MODAL_SPURS	5
4469999SWang.Lin@Sun.COM #define	AR5416_MAX_RATE_POWER		63
4479999SWang.Lin@Sun.COM #define	AR5416_NUM_PDADC_VALUES		128
4489999SWang.Lin@Sun.COM #define	AR5416_BCHAN_UNUSED		0xFF
4499999SWang.Lin@Sun.COM #define	AR5416_MAX_PWR_RANGE_IN_HALF_DB	64
4509999SWang.Lin@Sun.COM #define	AR5416_MAX_CHAINS		3
4519999SWang.Lin@Sun.COM #define	AR5416_PWR_TABLE_OFFSET		-5
4529999SWang.Lin@Sun.COM 
4539999SWang.Lin@Sun.COM /* Rx gain type values */
4549999SWang.Lin@Sun.COM #define	AR5416_EEP_RXGAIN_23DB_BACKOFF	0
4559999SWang.Lin@Sun.COM #define	AR5416_EEP_RXGAIN_13DB_BACKOFF	1
4569999SWang.Lin@Sun.COM #define	AR5416_EEP_RXGAIN_ORIG		2
4579999SWang.Lin@Sun.COM 
4589999SWang.Lin@Sun.COM /* Tx gain type values */
4599999SWang.Lin@Sun.COM #define	AR5416_EEP_TXGAIN_ORIGINAL	0
4609999SWang.Lin@Sun.COM #define	AR5416_EEP_TXGAIN_HIGH_POWER	1
4619999SWang.Lin@Sun.COM 
4629999SWang.Lin@Sun.COM #define	AR5416_EEP4K_START_LOC					64
4639999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_2G_CAL_PIERS			3
4649999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS	3
4659999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_2G_20_TARGET_POWERS	3
4669999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_2G_40_TARGET_POWERS	3
4679999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_CTLS					12
4689999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_BAND_EDGES				4
4699999SWang.Lin@Sun.COM #define	AR5416_EEP4K_NUM_PD_GAINS				2
4709999SWang.Lin@Sun.COM #define	AR5416_EEP4K_PD_GAINS_IN_MASK			4
4719999SWang.Lin@Sun.COM #define	AR5416_EEP4K_PD_GAIN_ICEPTS				5
4729999SWang.Lin@Sun.COM #define	AR5416_EEP4K_MAX_CHAINS					1
4739999SWang.Lin@Sun.COM 
4749999SWang.Lin@Sun.COM enum eeprom_param {
4759999SWang.Lin@Sun.COM 	EEP_NFTHRESH_5,
4769999SWang.Lin@Sun.COM 	EEP_NFTHRESH_2,
4779999SWang.Lin@Sun.COM 	EEP_MAC_MSW,
4789999SWang.Lin@Sun.COM 	EEP_MAC_MID,
4799999SWang.Lin@Sun.COM 	EEP_MAC_LSW,
4809999SWang.Lin@Sun.COM 	EEP_REG_0,
4819999SWang.Lin@Sun.COM 	EEP_REG_1,
4829999SWang.Lin@Sun.COM 	EEP_OP_CAP,
4839999SWang.Lin@Sun.COM 	EEP_OP_MODE,
4849999SWang.Lin@Sun.COM 	EEP_RF_SILENT,
4859999SWang.Lin@Sun.COM 	EEP_OB_5,
4869999SWang.Lin@Sun.COM 	EEP_DB_5,
4879999SWang.Lin@Sun.COM 	EEP_OB_2,
4889999SWang.Lin@Sun.COM 	EEP_DB_2,
4899999SWang.Lin@Sun.COM 	EEP_MINOR_REV,
4909999SWang.Lin@Sun.COM 	EEP_TX_MASK,
4919999SWang.Lin@Sun.COM 	EEP_RX_MASK,
4929999SWang.Lin@Sun.COM 	EEP_RXGAIN_TYPE,
4939999SWang.Lin@Sun.COM 	EEP_TXGAIN_TYPE,
494*11729SWang.Lin@Sun.COM 	EEP_OL_PWRCTRL,
495*11729SWang.Lin@Sun.COM 	EEP_RC_CHAIN_MASK,
496*11729SWang.Lin@Sun.COM 	EEP_DAC_HPWR_5G,
497*11729SWang.Lin@Sun.COM 	EEP_FRAC_N_5G
4989999SWang.Lin@Sun.COM };
4999999SWang.Lin@Sun.COM 
5009999SWang.Lin@Sun.COM enum ar5416_rates {
5019999SWang.Lin@Sun.COM 	rate6mb, rate9mb, rate12mb, rate18mb,
5029999SWang.Lin@Sun.COM 	rate24mb, rate36mb, rate48mb, rate54mb,
5039999SWang.Lin@Sun.COM 	rate1l, rate2l, rate2s, rate5_5l,
5049999SWang.Lin@Sun.COM 	rate5_5s, rate11l, rate11s, rateXr,
5059999SWang.Lin@Sun.COM 	rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3,
5069999SWang.Lin@Sun.COM 	rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7,
5079999SWang.Lin@Sun.COM 	rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3,
5089999SWang.Lin@Sun.COM 	rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7,
5099999SWang.Lin@Sun.COM 	rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm,
5109999SWang.Lin@Sun.COM 	Ar5416RateSize
5119999SWang.Lin@Sun.COM };
5129999SWang.Lin@Sun.COM 
5139999SWang.Lin@Sun.COM enum ath9k_hal_freq_band {
5149999SWang.Lin@Sun.COM 	ATH9K_HAL_FREQ_BAND_5GHZ = 0,
5159999SWang.Lin@Sun.COM 	ATH9K_HAL_FREQ_BAND_2GHZ = 1
5169999SWang.Lin@Sun.COM };
5179999SWang.Lin@Sun.COM 
5189999SWang.Lin@Sun.COM #pragma pack(1)
519*11729SWang.Lin@Sun.COM /* 2.6.30 */
5209999SWang.Lin@Sun.COM struct base_eep_header {
5219999SWang.Lin@Sun.COM 	uint16_t length;
5229999SWang.Lin@Sun.COM 	uint16_t checksum;
5239999SWang.Lin@Sun.COM 	uint16_t version;
5249999SWang.Lin@Sun.COM 	uint8_t opCapFlags;
5259999SWang.Lin@Sun.COM 	uint8_t eepMisc;
5269999SWang.Lin@Sun.COM 	uint16_t regDmn[2];
5279999SWang.Lin@Sun.COM 	uint8_t macAddr[6];
5289999SWang.Lin@Sun.COM 	uint8_t rxMask;
5299999SWang.Lin@Sun.COM 	uint8_t txMask;
5309999SWang.Lin@Sun.COM 	uint16_t rfSilent;
5319999SWang.Lin@Sun.COM 	uint16_t blueToothOptions;
5329999SWang.Lin@Sun.COM 	uint16_t deviceCap;
5339999SWang.Lin@Sun.COM 	uint32_t binBuildNumber;
5349999SWang.Lin@Sun.COM 	uint8_t deviceType;
5359999SWang.Lin@Sun.COM 	uint8_t pwdclkind;
5369999SWang.Lin@Sun.COM 	uint8_t futureBase_1[2];
5379999SWang.Lin@Sun.COM 	uint8_t rxGainType;
538*11729SWang.Lin@Sun.COM 	uint8_t dacHiPwrMode_5G;
539*11729SWang.Lin@Sun.COM 	uint8_t openLoopPwrCntl;
540*11729SWang.Lin@Sun.COM 	uint8_t dacLpMode;
5419999SWang.Lin@Sun.COM 	uint8_t txGainType;
542*11729SWang.Lin@Sun.COM 	uint8_t rcChainMask;
543*11729SWang.Lin@Sun.COM 	uint8_t desiredScaleCCK;
544*11729SWang.Lin@Sun.COM 	uint8_t power_table_offset;
545*11729SWang.Lin@Sun.COM 	uint8_t frac_n_5g;
546*11729SWang.Lin@Sun.COM 	uint8_t futureBase_3[21];
5479999SWang.Lin@Sun.COM };
5489999SWang.Lin@Sun.COM 
5499999SWang.Lin@Sun.COM struct base_eep_header_4k {
5509999SWang.Lin@Sun.COM 	uint16_t length;
5519999SWang.Lin@Sun.COM 	uint16_t checksum;
5529999SWang.Lin@Sun.COM 	uint16_t version;
5539999SWang.Lin@Sun.COM 	uint8_t opCapFlags;
5549999SWang.Lin@Sun.COM 	uint8_t eepMisc;
5559999SWang.Lin@Sun.COM 	uint16_t regDmn[2];
5569999SWang.Lin@Sun.COM 	uint8_t macAddr[6];
5579999SWang.Lin@Sun.COM 	uint8_t rxMask;
5589999SWang.Lin@Sun.COM 	uint8_t txMask;
5599999SWang.Lin@Sun.COM 	uint16_t rfSilent;
5609999SWang.Lin@Sun.COM 	uint16_t blueToothOptions;
5619999SWang.Lin@Sun.COM 	uint16_t deviceCap;
5629999SWang.Lin@Sun.COM 	uint32_t binBuildNumber;
5639999SWang.Lin@Sun.COM 	uint8_t deviceType;
5649999SWang.Lin@Sun.COM 	uint8_t futureBase[1];
5659999SWang.Lin@Sun.COM };
5669999SWang.Lin@Sun.COM 
5679999SWang.Lin@Sun.COM struct spur_chan {
5689999SWang.Lin@Sun.COM 	uint16_t spurChan;
5699999SWang.Lin@Sun.COM 	uint8_t spurRangeLow;
5709999SWang.Lin@Sun.COM 	uint8_t spurRangeHigh;
5719999SWang.Lin@Sun.COM };
5729999SWang.Lin@Sun.COM 
5739999SWang.Lin@Sun.COM struct modal_eep_header {
5749999SWang.Lin@Sun.COM 	uint32_t antCtrlChain[AR5416_MAX_CHAINS];
5759999SWang.Lin@Sun.COM 	uint32_t antCtrlCommon;
5769999SWang.Lin@Sun.COM 	uint8_t antennaGainCh[AR5416_MAX_CHAINS];
5779999SWang.Lin@Sun.COM 	uint8_t switchSettling;
5789999SWang.Lin@Sun.COM 	uint8_t txRxAttenCh[AR5416_MAX_CHAINS];
5799999SWang.Lin@Sun.COM 	uint8_t rxTxMarginCh[AR5416_MAX_CHAINS];
5809999SWang.Lin@Sun.COM 	uint8_t adcDesiredSize;
5819999SWang.Lin@Sun.COM 	uint8_t pgaDesiredSize;
5829999SWang.Lin@Sun.COM 	uint8_t xlnaGainCh[AR5416_MAX_CHAINS];
5839999SWang.Lin@Sun.COM 	uint8_t txEndToXpaOff;
5849999SWang.Lin@Sun.COM 	uint8_t txEndToRxOn;
5859999SWang.Lin@Sun.COM 	uint8_t txFrameToXpaOn;
5869999SWang.Lin@Sun.COM 	uint8_t thresh62;
5879999SWang.Lin@Sun.COM 	uint8_t noiseFloorThreshCh[AR5416_MAX_CHAINS];
5889999SWang.Lin@Sun.COM 	uint8_t xpdGain;
5899999SWang.Lin@Sun.COM 	uint8_t xpd;
5909999SWang.Lin@Sun.COM 	uint8_t iqCalICh[AR5416_MAX_CHAINS];
5919999SWang.Lin@Sun.COM 	uint8_t iqCalQCh[AR5416_MAX_CHAINS];
5929999SWang.Lin@Sun.COM 	uint8_t pdGainOverlap;
5939999SWang.Lin@Sun.COM 	uint8_t ob;
5949999SWang.Lin@Sun.COM 	uint8_t db;
5959999SWang.Lin@Sun.COM 	uint8_t xpaBiasLvl;
5969999SWang.Lin@Sun.COM 	uint8_t pwrDecreaseFor2Chain;
5979999SWang.Lin@Sun.COM 	uint8_t pwrDecreaseFor3Chain;
5989999SWang.Lin@Sun.COM 	uint8_t txFrameToDataStart;
5999999SWang.Lin@Sun.COM 	uint8_t txFrameToPaOn;
6009999SWang.Lin@Sun.COM 	uint8_t ht40PowerIncForPdadc;
6019999SWang.Lin@Sun.COM 	uint8_t bswAtten[AR5416_MAX_CHAINS];
6029999SWang.Lin@Sun.COM 	uint8_t bswMargin[AR5416_MAX_CHAINS];
6039999SWang.Lin@Sun.COM 	uint8_t swSettleHt40;
6049999SWang.Lin@Sun.COM 	uint8_t xatten2Db[AR5416_MAX_CHAINS];
6059999SWang.Lin@Sun.COM 	uint8_t xatten2Margin[AR5416_MAX_CHAINS];
6069999SWang.Lin@Sun.COM 	uint8_t ob_ch1;
6079999SWang.Lin@Sun.COM 	uint8_t db_ch1;
6089999SWang.Lin@Sun.COM 	uint8_t useAnt1:1,
6099999SWang.Lin@Sun.COM 	    force_xpaon:1,
6109999SWang.Lin@Sun.COM 	    local_bias:1,
6119999SWang.Lin@Sun.COM 	    femBandSelectUsed:1, xlnabufin:1, xlnaisel:2, xlnabufmode:1;
6129999SWang.Lin@Sun.COM 	uint8_t futureModalar9280;
6139999SWang.Lin@Sun.COM 	uint16_t xpaBiasLvlFreq[3];
6149999SWang.Lin@Sun.COM 	uint8_t futureModal[6];
6159999SWang.Lin@Sun.COM 
6169999SWang.Lin@Sun.COM 	struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS];
6179999SWang.Lin@Sun.COM };
6189999SWang.Lin@Sun.COM 
6199999SWang.Lin@Sun.COM struct modal_eep_4k_header {
6209999SWang.Lin@Sun.COM     uint32_t  antCtrlChain[AR5416_EEP4K_MAX_CHAINS];
6219999SWang.Lin@Sun.COM     uint32_t  antCtrlCommon;
6229999SWang.Lin@Sun.COM     uint8_t   antennaGainCh[AR5416_EEP4K_MAX_CHAINS];
6239999SWang.Lin@Sun.COM     uint8_t   switchSettling;
6249999SWang.Lin@Sun.COM     uint8_t   txRxAttenCh[AR5416_EEP4K_MAX_CHAINS];
6259999SWang.Lin@Sun.COM     uint8_t   rxTxMarginCh[AR5416_EEP4K_MAX_CHAINS];
6269999SWang.Lin@Sun.COM     uint8_t   adcDesiredSize;
6279999SWang.Lin@Sun.COM     uint8_t   pgaDesiredSize;
6289999SWang.Lin@Sun.COM     uint8_t   xlnaGainCh[AR5416_EEP4K_MAX_CHAINS];
6299999SWang.Lin@Sun.COM     uint8_t   txEndToXpaOff;
6309999SWang.Lin@Sun.COM     uint8_t   txEndToRxOn;
6319999SWang.Lin@Sun.COM     uint8_t   txFrameToXpaOn;
6329999SWang.Lin@Sun.COM     uint8_t   thresh62;
6339999SWang.Lin@Sun.COM     uint8_t   noiseFloorThreshCh[AR5416_EEP4K_MAX_CHAINS];
6349999SWang.Lin@Sun.COM     uint8_t   xpdGain;
6359999SWang.Lin@Sun.COM     uint8_t   xpd;
6369999SWang.Lin@Sun.COM     uint8_t   iqCalICh[AR5416_EEP4K_MAX_CHAINS];
6379999SWang.Lin@Sun.COM     uint8_t   iqCalQCh[AR5416_EEP4K_MAX_CHAINS];
6389999SWang.Lin@Sun.COM     uint8_t   pdGainOverlap;
6399999SWang.Lin@Sun.COM     uint8_t   ob_01;
6409999SWang.Lin@Sun.COM     uint8_t   db1_01;
6419999SWang.Lin@Sun.COM     uint8_t   xpaBiasLvl;
6429999SWang.Lin@Sun.COM     uint8_t   txFrameToDataStart;
6439999SWang.Lin@Sun.COM     uint8_t   txFrameToPaOn;
6449999SWang.Lin@Sun.COM     uint8_t   ht40PowerIncForPdadc;
6459999SWang.Lin@Sun.COM     uint8_t   bswAtten[AR5416_EEP4K_MAX_CHAINS];
6469999SWang.Lin@Sun.COM     uint8_t   bswMargin[AR5416_EEP4K_MAX_CHAINS];
6479999SWang.Lin@Sun.COM     uint8_t   swSettleHt40;
6489999SWang.Lin@Sun.COM     uint8_t   xatten2Db[AR5416_EEP4K_MAX_CHAINS];
6499999SWang.Lin@Sun.COM     uint8_t   xatten2Margin[AR5416_EEP4K_MAX_CHAINS];
6509999SWang.Lin@Sun.COM     uint8_t   db2_01;
6519999SWang.Lin@Sun.COM     uint8_t   version;
6529999SWang.Lin@Sun.COM     uint16_t  ob_234;
6539999SWang.Lin@Sun.COM     uint16_t  db1_234;
6549999SWang.Lin@Sun.COM     uint16_t  db2_234;
6559999SWang.Lin@Sun.COM     uint8_t   futureModal[4];
6569999SWang.Lin@Sun.COM 
6579999SWang.Lin@Sun.COM     struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS];
6589999SWang.Lin@Sun.COM };
6599999SWang.Lin@Sun.COM 
6609999SWang.Lin@Sun.COM struct cal_data_per_freq {
6619999SWang.Lin@Sun.COM 	uint8_t pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
6629999SWang.Lin@Sun.COM 	uint8_t vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
6639999SWang.Lin@Sun.COM };
6649999SWang.Lin@Sun.COM 
6659999SWang.Lin@Sun.COM struct cal_data_per_freq_4k {
6669999SWang.Lin@Sun.COM 	uint8_t pwrPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS];
6679999SWang.Lin@Sun.COM 	uint8_t vpdPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS];
6689999SWang.Lin@Sun.COM };
6699999SWang.Lin@Sun.COM 
6709999SWang.Lin@Sun.COM struct cal_target_power_leg {
6719999SWang.Lin@Sun.COM 	uint8_t bChannel;
6729999SWang.Lin@Sun.COM 	uint8_t tPow2x[4];
6739999SWang.Lin@Sun.COM };
6749999SWang.Lin@Sun.COM 
6759999SWang.Lin@Sun.COM struct cal_target_power_ht {
6769999SWang.Lin@Sun.COM 	uint8_t bChannel;
6779999SWang.Lin@Sun.COM 	uint8_t tPow2x[8];
6789999SWang.Lin@Sun.COM };
6799999SWang.Lin@Sun.COM 
6809999SWang.Lin@Sun.COM #ifdef __BIG_ENDIAN_BITFIELD
6819999SWang.Lin@Sun.COM struct cal_ctl_edges {
6829999SWang.Lin@Sun.COM 	uint8_t bChannel;
6839999SWang.Lin@Sun.COM 	uint8_t flag:2, tPower:6;
6849999SWang.Lin@Sun.COM };
6859999SWang.Lin@Sun.COM #else
6869999SWang.Lin@Sun.COM struct cal_ctl_edges {
6879999SWang.Lin@Sun.COM 	uint8_t bChannel;
6889999SWang.Lin@Sun.COM 	uint8_t tPower:6, flag:2;
6899999SWang.Lin@Sun.COM };
6909999SWang.Lin@Sun.COM #endif
6919999SWang.Lin@Sun.COM 
6929999SWang.Lin@Sun.COM struct cal_ctl_data {
6939999SWang.Lin@Sun.COM 	struct cal_ctl_edges
6949999SWang.Lin@Sun.COM 	    ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
6959999SWang.Lin@Sun.COM };
6969999SWang.Lin@Sun.COM 
6979999SWang.Lin@Sun.COM struct cal_ctl_data_4k {
6989999SWang.Lin@Sun.COM 	struct cal_ctl_edges
6999999SWang.Lin@Sun.COM 	ctlEdges[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_BAND_EDGES];
7009999SWang.Lin@Sun.COM };
7019999SWang.Lin@Sun.COM 
7029999SWang.Lin@Sun.COM struct ar5416_eeprom_def {
7039999SWang.Lin@Sun.COM 	struct base_eep_header baseEepHeader;
7049999SWang.Lin@Sun.COM 	uint8_t custData[64];
7059999SWang.Lin@Sun.COM 	struct modal_eep_header modalHeader[2];
7069999SWang.Lin@Sun.COM 	uint8_t calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
7079999SWang.Lin@Sun.COM 	uint8_t calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
7089999SWang.Lin@Sun.COM 	struct cal_data_per_freq
7099999SWang.Lin@Sun.COM 	    calPierData5G[AR5416_MAX_CHAINS][AR5416_NUM_5G_CAL_PIERS];
7109999SWang.Lin@Sun.COM 	struct cal_data_per_freq
7119999SWang.Lin@Sun.COM 	    calPierData2G[AR5416_MAX_CHAINS][AR5416_NUM_2G_CAL_PIERS];
7129999SWang.Lin@Sun.COM 	struct cal_target_power_leg
7139999SWang.Lin@Sun.COM 	    calTargetPower5G[AR5416_NUM_5G_20_TARGET_POWERS];
7149999SWang.Lin@Sun.COM 	struct cal_target_power_ht
7159999SWang.Lin@Sun.COM 	    calTargetPower5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
7169999SWang.Lin@Sun.COM 	struct cal_target_power_ht
7179999SWang.Lin@Sun.COM 	    calTargetPower5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
7189999SWang.Lin@Sun.COM 	struct cal_target_power_leg
7199999SWang.Lin@Sun.COM 	    calTargetPowerCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
7209999SWang.Lin@Sun.COM 	struct cal_target_power_leg
7219999SWang.Lin@Sun.COM 	    calTargetPower2G[AR5416_NUM_2G_20_TARGET_POWERS];
7229999SWang.Lin@Sun.COM 	struct cal_target_power_ht
7239999SWang.Lin@Sun.COM 	    calTargetPower2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
7249999SWang.Lin@Sun.COM 	struct cal_target_power_ht
7259999SWang.Lin@Sun.COM 	    calTargetPower2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
7269999SWang.Lin@Sun.COM 	uint8_t ctlIndex[AR5416_NUM_CTLS];
7279999SWang.Lin@Sun.COM 	struct cal_ctl_data ctlData[AR5416_NUM_CTLS];
7289999SWang.Lin@Sun.COM 	uint8_t padding;
7299999SWang.Lin@Sun.COM };
7309999SWang.Lin@Sun.COM 
7319999SWang.Lin@Sun.COM struct ar5416_eeprom_4k {
7329999SWang.Lin@Sun.COM 	struct base_eep_header_4k baseEepHeader;
7339999SWang.Lin@Sun.COM 	uint8_t custData[20];
7349999SWang.Lin@Sun.COM 	struct modal_eep_4k_header modalHeader;
7359999SWang.Lin@Sun.COM 	uint8_t calFreqPier2G[AR5416_EEP4K_NUM_2G_CAL_PIERS];
7369999SWang.Lin@Sun.COM 	struct cal_data_per_freq_4k
7379999SWang.Lin@Sun.COM 	calPierData2G[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_2G_CAL_PIERS];
7389999SWang.Lin@Sun.COM 	struct cal_target_power_leg
7399999SWang.Lin@Sun.COM 	calTargetPowerCck[AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS];
7409999SWang.Lin@Sun.COM 	struct cal_target_power_leg
7419999SWang.Lin@Sun.COM 	calTargetPower2G[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS];
7429999SWang.Lin@Sun.COM 	struct cal_target_power_ht
7439999SWang.Lin@Sun.COM 	calTargetPower2GHT20[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS];
7449999SWang.Lin@Sun.COM 	struct cal_target_power_ht
7459999SWang.Lin@Sun.COM 	calTargetPower2GHT40[AR5416_EEP4K_NUM_2G_40_TARGET_POWERS];
7469999SWang.Lin@Sun.COM 	uint8_t ctlIndex[AR5416_EEP4K_NUM_CTLS];
7479999SWang.Lin@Sun.COM 	struct cal_ctl_data_4k ctlData[AR5416_EEP4K_NUM_CTLS];
7489999SWang.Lin@Sun.COM 	uint8_t padding;
7499999SWang.Lin@Sun.COM };
7509999SWang.Lin@Sun.COM #pragma pack()
7519999SWang.Lin@Sun.COM 
7529999SWang.Lin@Sun.COM struct ar5416IniArray {
7539999SWang.Lin@Sun.COM 	uint32_t *ia_array;
7549999SWang.Lin@Sun.COM 	uint32_t ia_rows;
7559999SWang.Lin@Sun.COM 	uint32_t ia_columns;
7569999SWang.Lin@Sun.COM };
7579999SWang.Lin@Sun.COM 
7589999SWang.Lin@Sun.COM #define	INIT_INI_ARRAY(iniarray, array, rows, columns) do {	\
7599999SWang.Lin@Sun.COM 		(iniarray)->ia_array = (uint32_t *)(array);		\
7609999SWang.Lin@Sun.COM 		(iniarray)->ia_rows = (rows);			\
7619999SWang.Lin@Sun.COM 		(iniarray)->ia_columns = (columns);		\
7629999SWang.Lin@Sun.COM 		_NOTE(CONSTCOND) \
7639999SWang.Lin@Sun.COM 	} while (0)
7649999SWang.Lin@Sun.COM 
7659999SWang.Lin@Sun.COM #define	INI_RA(iniarray, row, column) \
7669999SWang.Lin@Sun.COM 	(((iniarray)->ia_array)[(row) *	((iniarray)->ia_columns) + (column)])
7679999SWang.Lin@Sun.COM 
7689999SWang.Lin@Sun.COM #define	INIT_CAL(_perCal) do {				\
7699999SWang.Lin@Sun.COM 		(_perCal)->calState = CAL_WAITING;	\
7709999SWang.Lin@Sun.COM 		(_perCal)->calNext = NULL;		\
7719999SWang.Lin@Sun.COM 	} while (0)
7729999SWang.Lin@Sun.COM 
7739999SWang.Lin@Sun.COM #define	INSERT_CAL(_ahp, _perCal)					\
7749999SWang.Lin@Sun.COM 	do {								\
7759999SWang.Lin@Sun.COM 		if ((_ahp)->ah_cal_list_last == NULL) {			\
7769999SWang.Lin@Sun.COM 			(_ahp)->ah_cal_list =				\
7779999SWang.Lin@Sun.COM 				(_ahp)->ah_cal_list_last = (_perCal);	\
7789999SWang.Lin@Sun.COM 			((_ahp)->ah_cal_list_last)->calNext = (_perCal); \
7799999SWang.Lin@Sun.COM 		} else {						\
7809999SWang.Lin@Sun.COM 			((_ahp)->ah_cal_list_last)->calNext = (_perCal); \
7819999SWang.Lin@Sun.COM 			(_ahp)->ah_cal_list_last = (_perCal);		\
7829999SWang.Lin@Sun.COM 			(_perCal)->calNext = (_ahp)->ah_cal_list;	\
7839999SWang.Lin@Sun.COM 		}							\
7849999SWang.Lin@Sun.COM 	} while (0)
7859999SWang.Lin@Sun.COM 
7869999SWang.Lin@Sun.COM enum hal_cal_types {
7879999SWang.Lin@Sun.COM 	ADC_DC_INIT_CAL = 0x1,
7889999SWang.Lin@Sun.COM 	ADC_GAIN_CAL = 0x2,
7899999SWang.Lin@Sun.COM 	ADC_DC_CAL = 0x4,
7909999SWang.Lin@Sun.COM 	IQ_MISMATCH_CAL = 0x8
7919999SWang.Lin@Sun.COM };
7929999SWang.Lin@Sun.COM 
7939999SWang.Lin@Sun.COM enum hal_cal_state {
7949999SWang.Lin@Sun.COM 	CAL_INACTIVE,
7959999SWang.Lin@Sun.COM 	CAL_WAITING,
7969999SWang.Lin@Sun.COM 	CAL_RUNNING,
7979999SWang.Lin@Sun.COM 	CAL_DONE
7989999SWang.Lin@Sun.COM };
7999999SWang.Lin@Sun.COM 
8009999SWang.Lin@Sun.COM #define	MIN_CAL_SAMPLES		1
8019999SWang.Lin@Sun.COM #define	MAX_CAL_SAMPLES		64
8029999SWang.Lin@Sun.COM #define	INIT_LOG_COUNT		5
8039999SWang.Lin@Sun.COM #define	PER_MIN_LOG_COUNT	2
8049999SWang.Lin@Sun.COM #define	PER_MAX_LOG_COUNT	10
8059999SWang.Lin@Sun.COM 
8069999SWang.Lin@Sun.COM struct hal_percal_data {
8079999SWang.Lin@Sun.COM 	enum hal_cal_types calType;
8089999SWang.Lin@Sun.COM 	uint32_t calNumSamples;
8099999SWang.Lin@Sun.COM 	uint32_t calCountMax;
8109999SWang.Lin@Sun.COM 	void (*calCollect) (struct ath_hal *);
8119999SWang.Lin@Sun.COM 	void (*calPostProc) (struct ath_hal *, uint8_t);
8129999SWang.Lin@Sun.COM };
8139999SWang.Lin@Sun.COM 
8149999SWang.Lin@Sun.COM struct hal_cal_list {
8159999SWang.Lin@Sun.COM 	const struct hal_percal_data *calData;
8169999SWang.Lin@Sun.COM 	enum hal_cal_state calState;
8179999SWang.Lin@Sun.COM 	struct hal_cal_list *calNext;
8189999SWang.Lin@Sun.COM };
8199999SWang.Lin@Sun.COM 
8209999SWang.Lin@Sun.COM /*
8219999SWang.Lin@Sun.COM  * Enum to indentify the eeprom mappings
8229999SWang.Lin@Sun.COM  */
8239999SWang.Lin@Sun.COM enum hal_eep_map {
8249999SWang.Lin@Sun.COM 	EEP_MAP_DEFAULT = 0x0,
8259999SWang.Lin@Sun.COM 	EEP_MAP_4KBITS,
8269999SWang.Lin@Sun.COM 	EEP_MAP_MAX
8279999SWang.Lin@Sun.COM };
8289999SWang.Lin@Sun.COM 
8299999SWang.Lin@Sun.COM struct ath_hal_5416 {
8309999SWang.Lin@Sun.COM 	struct ath_hal ah;
8319999SWang.Lin@Sun.COM 	union {
8329999SWang.Lin@Sun.COM 		struct ar5416_eeprom_def def;
8339999SWang.Lin@Sun.COM 		struct ar5416_eeprom_4k map4k;
8349999SWang.Lin@Sun.COM 	} ah_eeprom;
8359999SWang.Lin@Sun.COM 	struct ar5416Stats ah_stats;
8369999SWang.Lin@Sun.COM 	struct ath9k_tx_queue_info ah_txq[ATH9K_NUM_TX_QUEUES];
8379999SWang.Lin@Sun.COM 
8389999SWang.Lin@Sun.COM 	uint8_t ah_macaddr[IEEE80211_ADDR_LEN];
8399999SWang.Lin@Sun.COM 	uint8_t ah_bssid[IEEE80211_ADDR_LEN];
8409999SWang.Lin@Sun.COM 	uint8_t ah_bssidmask[IEEE80211_ADDR_LEN];
8419999SWang.Lin@Sun.COM 	uint16_t ah_assocId;
8429999SWang.Lin@Sun.COM 
8439999SWang.Lin@Sun.COM 	int16_t ah_curchanRadIndex;
8449999SWang.Lin@Sun.COM 	uint32_t ah_maskReg;
8459999SWang.Lin@Sun.COM 	uint32_t ah_txOkInterruptMask;
8469999SWang.Lin@Sun.COM 	uint32_t ah_txErrInterruptMask;
8479999SWang.Lin@Sun.COM 	uint32_t ah_txDescInterruptMask;
8489999SWang.Lin@Sun.COM 	uint32_t ah_txEolInterruptMask;
8499999SWang.Lin@Sun.COM 	uint32_t ah_txUrnInterruptMask;
8509999SWang.Lin@Sun.COM 	boolean_t ah_chipFullSleep;
8519999SWang.Lin@Sun.COM 	uint32_t ah_atimWindow;
8529999SWang.Lin@Sun.COM 	uint16_t ah_antennaSwitchSwap;
8539999SWang.Lin@Sun.COM 	enum ath9k_power_mode ah_powerMode;
8549999SWang.Lin@Sun.COM 	enum ath9k_ant_setting ah_diversityControl;
8559999SWang.Lin@Sun.COM 
8569999SWang.Lin@Sun.COM 	/* Calibration */
8579999SWang.Lin@Sun.COM 	enum hal_cal_types ah_suppCals;
8589999SWang.Lin@Sun.COM 	struct hal_cal_list ah_iqCalData;
8599999SWang.Lin@Sun.COM 	struct hal_cal_list ah_adcGainCalData;
8609999SWang.Lin@Sun.COM 	struct hal_cal_list ah_adcDcCalInitData;
8619999SWang.Lin@Sun.COM 	struct hal_cal_list ah_adcDcCalData;
8629999SWang.Lin@Sun.COM 	struct hal_cal_list *ah_cal_list;
8639999SWang.Lin@Sun.COM 	struct hal_cal_list *ah_cal_list_last;
8649999SWang.Lin@Sun.COM 	struct hal_cal_list *ah_cal_list_curr;
8659999SWang.Lin@Sun.COM #define	ah_totalPowerMeasI ah_Meas0.unsign
8669999SWang.Lin@Sun.COM #define	ah_totalPowerMeasQ ah_Meas1.unsign
8679999SWang.Lin@Sun.COM #define	ah_totalIqCorrMeas ah_Meas2.sign
8689999SWang.Lin@Sun.COM #define	ah_totalAdcIOddPhase  ah_Meas0.unsign
8699999SWang.Lin@Sun.COM #define	ah_totalAdcIEvenPhase ah_Meas1.unsign
8709999SWang.Lin@Sun.COM #define	ah_totalAdcQOddPhase  ah_Meas2.unsign
8719999SWang.Lin@Sun.COM #define	ah_totalAdcQEvenPhase ah_Meas3.unsign
8729999SWang.Lin@Sun.COM #define	ah_totalAdcDcOffsetIOddPhase  ah_Meas0.sign
8739999SWang.Lin@Sun.COM #define	ah_totalAdcDcOffsetIEvenPhase ah_Meas1.sign
8749999SWang.Lin@Sun.COM #define	ah_totalAdcDcOffsetQOddPhase  ah_Meas2.sign
8759999SWang.Lin@Sun.COM #define	ah_totalAdcDcOffsetQEvenPhase ah_Meas3.sign
8769999SWang.Lin@Sun.COM 	union {
8779999SWang.Lin@Sun.COM 		uint32_t unsign[AR5416_MAX_CHAINS];
8789999SWang.Lin@Sun.COM 		int32_t sign[AR5416_MAX_CHAINS];
8799999SWang.Lin@Sun.COM 	} ah_Meas0;
8809999SWang.Lin@Sun.COM 	union {
8819999SWang.Lin@Sun.COM 		uint32_t unsign[AR5416_MAX_CHAINS];
8829999SWang.Lin@Sun.COM 		int32_t sign[AR5416_MAX_CHAINS];
8839999SWang.Lin@Sun.COM 	} ah_Meas1;
8849999SWang.Lin@Sun.COM 	union {
8859999SWang.Lin@Sun.COM 		uint32_t unsign[AR5416_MAX_CHAINS];
8869999SWang.Lin@Sun.COM 		int32_t sign[AR5416_MAX_CHAINS];
8879999SWang.Lin@Sun.COM 	} ah_Meas2;
8889999SWang.Lin@Sun.COM 	union {
8899999SWang.Lin@Sun.COM 		uint32_t unsign[AR5416_MAX_CHAINS];
8909999SWang.Lin@Sun.COM 		int32_t sign[AR5416_MAX_CHAINS];
8919999SWang.Lin@Sun.COM 	} ah_Meas3;
8929999SWang.Lin@Sun.COM 	uint16_t ah_CalSamples;
8939999SWang.Lin@Sun.COM 
8949999SWang.Lin@Sun.COM 	uint32_t ah_staId1Defaults;
8959999SWang.Lin@Sun.COM 	uint32_t ah_miscMode;
8969999SWang.Lin@Sun.COM 	enum {
8979999SWang.Lin@Sun.COM 		AUTO_32KHZ,
8989999SWang.Lin@Sun.COM 		USE_32KHZ,
8999999SWang.Lin@Sun.COM 		DONT_USE_32KHZ,
9009999SWang.Lin@Sun.COM 	} ah_enable32kHzClock;
9019999SWang.Lin@Sun.COM 
9029999SWang.Lin@Sun.COM 	/* RF */
9039999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank0Data;
9049999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank1Data;
9059999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank2Data;
9069999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank3Data;
9079999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank6Data;
9089999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank6TPCData;
9099999SWang.Lin@Sun.COM 	uint32_t *ah_analogBank7Data;
9109999SWang.Lin@Sun.COM 	uint32_t *ah_addac5416_21;
9119999SWang.Lin@Sun.COM 	uint32_t *ah_bank6Temp;
9129999SWang.Lin@Sun.COM 
9139999SWang.Lin@Sun.COM 	int16_t ah_txPowerIndexOffset;
9149999SWang.Lin@Sun.COM 	uint32_t ah_beaconInterval;
9159999SWang.Lin@Sun.COM 	uint32_t ah_slottime;
9169999SWang.Lin@Sun.COM 	uint32_t ah_acktimeout;
9179999SWang.Lin@Sun.COM 	uint32_t ah_ctstimeout;
9189999SWang.Lin@Sun.COM 	uint32_t ah_globaltxtimeout;
9199999SWang.Lin@Sun.COM 	uint8_t ah_gBeaconRate;
9209999SWang.Lin@Sun.COM 	uint32_t ah_gpioSelect;
9219999SWang.Lin@Sun.COM 	uint32_t ah_polarity;
9229999SWang.Lin@Sun.COM 	uint32_t ah_gpioBit;
9239999SWang.Lin@Sun.COM 
9249999SWang.Lin@Sun.COM 	/* ANI */
9259999SWang.Lin@Sun.COM 	uint32_t ah_procPhyErr;
9269999SWang.Lin@Sun.COM 	boolean_t ah_hasHwPhyCounters;
9279999SWang.Lin@Sun.COM 	uint32_t ah_aniPeriod;
9289999SWang.Lin@Sun.COM 	struct ar5416AniState *ah_curani;
9299999SWang.Lin@Sun.COM 	struct ar5416AniState ah_ani[255];
9309999SWang.Lin@Sun.COM 	int ah_totalSizeDesired[5];
9319999SWang.Lin@Sun.COM 	int ah_coarseHigh[5];
9329999SWang.Lin@Sun.COM 	int ah_coarseLow[5];
9339999SWang.Lin@Sun.COM 	int ah_firpwr[5];
9349999SWang.Lin@Sun.COM 	enum ath9k_ani_cmd ah_ani_function;
9359999SWang.Lin@Sun.COM 
9369999SWang.Lin@Sun.COM 	uint32_t ah_intrTxqs;
9379999SWang.Lin@Sun.COM 	boolean_t ah_intrMitigation;
9389999SWang.Lin@Sun.COM 	enum ath9k_ht_extprotspacing ah_extprotspacing;
9399999SWang.Lin@Sun.COM 	uint8_t ah_txchainmask;
9409999SWang.Lin@Sun.COM 	uint8_t ah_rxchainmask;
9419999SWang.Lin@Sun.COM 
9429999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniModes;
9439999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniCommon;
9449999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank0;
9459999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBB_RfGain;
9469999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank1;
9479999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank2;
9489999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank3;
9499999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank6;
9509999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank6TPC;
9519999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniBank7;
9529999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniAddac;
9539999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniPcieSerdes;
9549999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniModesAdditional;
9559999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniModesRxGain;
9569999SWang.Lin@Sun.COM 	struct ar5416IniArray ah_iniModesTxGain;
9579999SWang.Lin@Sun.COM 	/* To indicate EEPROM mapping used */
9589999SWang.Lin@Sun.COM 	enum hal_eep_map ah_eep_map;
9599999SWang.Lin@Sun.COM };
9609999SWang.Lin@Sun.COM #define	AH5416(_ah) ((struct ath_hal_5416 *)(_ah))
9619999SWang.Lin@Sun.COM 
9629999SWang.Lin@Sun.COM #define	FREQ2FBIN(x, y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5))
9639999SWang.Lin@Sun.COM 
9649999SWang.Lin@Sun.COM #define	ar5416RfDetach(ah) do {					\
9659999SWang.Lin@Sun.COM 		if (AH5416(ah)->ah_rfHal.rfDetach != NULL)	\
9669999SWang.Lin@Sun.COM 			AH5416(ah)->ah_rfHal.rfDetach(ah);	\
9679999SWang.Lin@Sun.COM 	} while (0)
9689999SWang.Lin@Sun.COM 
9699999SWang.Lin@Sun.COM #define	ath9k_hw_use_flash(_ah)	\
9709999SWang.Lin@Sun.COM 	(!(_ah->ah_flags & AH_USE_EEPROM))
9719999SWang.Lin@Sun.COM 
972*11729SWang.Lin@Sun.COM /* 2.6.30 */
973*11729SWang.Lin@Sun.COM #define	AR5416_VER_MASK	(eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK)
974*11729SWang.Lin@Sun.COM #define	OLC_FOR_AR9280_20_LATER	(AR_SREV_9280_20_OR_LATER(ah) && \
975*11729SWang.Lin@Sun.COM 	ath9k_hw_get_eeprom(ah, EEP_OL_PWRCTRL))
9769999SWang.Lin@Sun.COM 
9779999SWang.Lin@Sun.COM #define	DO_DELAY(x) do {			\
9789999SWang.Lin@Sun.COM 		if ((++(x) % 64) == 0)          \
9799999SWang.Lin@Sun.COM 			drv_usecwait(1);	\
9809999SWang.Lin@Sun.COM 	} while (0)
9819999SWang.Lin@Sun.COM 
9829999SWang.Lin@Sun.COM #define	REG_WRITE_ARRAY(iniarray, column, regWr) do {                   \
9839999SWang.Lin@Sun.COM 		int r;							\
9849999SWang.Lin@Sun.COM 		for (r = 0; r < ((iniarray)->ia_rows); r++) {		\
9859999SWang.Lin@Sun.COM 			REG_WRITE(ah, INI_RA((iniarray), (r), 0),	\
9869999SWang.Lin@Sun.COM 			    INI_RA((iniarray), r, (column)));		\
9879999SWang.Lin@Sun.COM 			DO_DELAY(regWr);				\
9889999SWang.Lin@Sun.COM 		}							\
9899999SWang.Lin@Sun.COM 	} while (0)
9909999SWang.Lin@Sun.COM 
9919999SWang.Lin@Sun.COM #define	BASE_ACTIVATE_DELAY		100
9929999SWang.Lin@Sun.COM #define	RTC_PLL_SETTLE_DELAY		1000
9939999SWang.Lin@Sun.COM #define	COEF_SCALE_S			24
9949999SWang.Lin@Sun.COM #define	HT40_CHANNEL_CENTER_SHIFT	10
9959999SWang.Lin@Sun.COM 
9969999SWang.Lin@Sun.COM #define	AR5416_EEPROM_MAGIC_OFFSET	0x0
9979999SWang.Lin@Sun.COM 
9989999SWang.Lin@Sun.COM #define	AR5416_EEPROM_S			2
9999999SWang.Lin@Sun.COM #define	AR5416_EEPROM_OFFSET		0x2000
10009999SWang.Lin@Sun.COM #define	AR5416_EEPROM_START_ADDR	\
10019999SWang.Lin@Sun.COM 	(AR_SREV_9100(ah)) ? 0x1fff1000 : 0x503f1200
10029999SWang.Lin@Sun.COM #define	AR5416_EEPROM_MAX	0xae0
10039999SWang.Lin@Sun.COM #define	ar5416_get_eep_ver(_ahp)	\
10049999SWang.Lin@Sun.COM 	(((_ahp)->ah_eeprom.def.baseEepHeader.version >> 12) & 0xF)
10059999SWang.Lin@Sun.COM #define	ar5416_get_eep_rev(_ahp)	\
10069999SWang.Lin@Sun.COM 	(((_ahp)->ah_eeprom.def.baseEepHeader.version) & 0xFFF)
10079999SWang.Lin@Sun.COM #define	ar5416_get_ntxchains(_txchainmask)	\
10089999SWang.Lin@Sun.COM 	(((_txchainmask >> 2) & 1) +	\
10099999SWang.Lin@Sun.COM 	((_txchainmask >> 1) & 1) + (_txchainmask & 1))
10109999SWang.Lin@Sun.COM 
10119999SWang.Lin@Sun.COM /* EEPROM 4K bit map definations */
10129999SWang.Lin@Sun.COM #define	ar5416_get_eep4k_ver(_ahp)   \
10139999SWang.Lin@Sun.COM 	(((_ahp)->ah_eeprom.map4k.baseEepHeader.version >> 12) & 0xF)
10149999SWang.Lin@Sun.COM #define	ar5416_get_eep4k_rev(_ahp)   \
10159999SWang.Lin@Sun.COM 	(((_ahp)->ah_eeprom.map4k.baseEepHeader.version) & 0xFFF)
10169999SWang.Lin@Sun.COM 
10179999SWang.Lin@Sun.COM #ifdef __BIG_ENDIAN
10189999SWang.Lin@Sun.COM #define	AR5416_EEPROM_MAGIC	0x5aa5
10199999SWang.Lin@Sun.COM #else
10209999SWang.Lin@Sun.COM #define	AR5416_EEPROM_MAGIC	0xa55a
10219999SWang.Lin@Sun.COM #endif
10229999SWang.Lin@Sun.COM 
10239999SWang.Lin@Sun.COM #define	ATH9K_POW_SM(_r, _s)		(((_r) & 0x3f) << (_s))
10249999SWang.Lin@Sun.COM 
10259999SWang.Lin@Sun.COM #define	ATH9K_ANTENNA0_CHAINMASK	0x1
10269999SWang.Lin@Sun.COM #define	ATH9K_ANTENNA1_CHAINMASK	0x2
10279999SWang.Lin@Sun.COM 
10289999SWang.Lin@Sun.COM #define	ATH9K_NUM_DMA_DEBUG_REGS	8
10299999SWang.Lin@Sun.COM #define	ATH9K_NUM_QUEUES		10
10309999SWang.Lin@Sun.COM 
10319999SWang.Lin@Sun.COM #define	HAL_NOISE_IMMUNE_MAX		4
10329999SWang.Lin@Sun.COM #define	HAL_SPUR_IMMUNE_MAX		7
10339999SWang.Lin@Sun.COM #define	HAL_FIRST_STEP_MAX		2
10349999SWang.Lin@Sun.COM 
10359999SWang.Lin@Sun.COM #define	ATH9K_ANI_OFDM_TRIG_HIGH	500
10369999SWang.Lin@Sun.COM #define	ATH9K_ANI_OFDM_TRIG_LOW		200
10379999SWang.Lin@Sun.COM #define	ATH9K_ANI_CCK_TRIG_HIGH		200
10389999SWang.Lin@Sun.COM #define	ATH9K_ANI_CCK_TRIG_LOW		100
10399999SWang.Lin@Sun.COM #define	ATH9K_ANI_NOISE_IMMUNE_LVL	4
10409999SWang.Lin@Sun.COM #define	ATH9K_ANI_USE_OFDM_WEAK_SIG	B_TRUE
10419999SWang.Lin@Sun.COM #define	ATH9K_ANI_CCK_WEAK_SIG_THR	B_FALSE
10429999SWang.Lin@Sun.COM #define	ATH9K_ANI_SPUR_IMMUNE_LVL	7
10439999SWang.Lin@Sun.COM #define	ATH9K_ANI_FIRSTEP_LVL		0
10449999SWang.Lin@Sun.COM #define	ATH9K_ANI_RSSI_THR_HIGH		40
10459999SWang.Lin@Sun.COM #define	ATH9K_ANI_RSSI_THR_LOW		7
10469999SWang.Lin@Sun.COM #define	ATH9K_ANI_PERIOD		100
10479999SWang.Lin@Sun.COM 
10489999SWang.Lin@Sun.COM #define	AR_GPIOD_MASK		0x00001FFF
10499999SWang.Lin@Sun.COM #define	AR_GPIO_BIT(_gpio)	(1 << (_gpio))
10509999SWang.Lin@Sun.COM 
10519999SWang.Lin@Sun.COM #define	HAL_EP_RND(x, mul)	\
10529999SWang.Lin@Sun.COM 	((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
10539999SWang.Lin@Sun.COM #define	BEACON_RSSI(ahp)	\
10549999SWang.Lin@Sun.COM 	HAL_EP_RND(ahp->ah_stats.ast_nodestats.ns_avgbrssi,	\
10559999SWang.Lin@Sun.COM 	ATH9K_RSSI_EP_MULTIPLIER)
10569999SWang.Lin@Sun.COM 
10579999SWang.Lin@Sun.COM #define	ah_mibStats	ah_stats.ast_mibstats
10589999SWang.Lin@Sun.COM 
10599999SWang.Lin@Sun.COM #define	AH_TIMEOUT	100000
10609999SWang.Lin@Sun.COM #define	AH_TIME_QUANTUM	10
10619999SWang.Lin@Sun.COM 
10629999SWang.Lin@Sun.COM #define	AR_KEYTABLE_SIZE	128
10639999SWang.Lin@Sun.COM #define	POWER_UP_TIME		200000
10649999SWang.Lin@Sun.COM 
10659999SWang.Lin@Sun.COM #define	EXT_ADDITIVE	(0x8000)
10669999SWang.Lin@Sun.COM #define	CTL_11A_EXT	(CTL_11A | EXT_ADDITIVE)
10679999SWang.Lin@Sun.COM #define	CTL_11G_EXT	(CTL_11G | EXT_ADDITIVE)
10689999SWang.Lin@Sun.COM #define	CTL_11B_EXT	(CTL_11B | EXT_ADDITIVE)
10699999SWang.Lin@Sun.COM 
10709999SWang.Lin@Sun.COM #define	SUB_NUM_CTL_MODES_AT_5G_40	2
10719999SWang.Lin@Sun.COM #define	SUB_NUM_CTL_MODES_AT_2G_40	3
10729999SWang.Lin@Sun.COM #define	SPUR_RSSI_THRESH		40
10739999SWang.Lin@Sun.COM 
10749999SWang.Lin@Sun.COM #define	TU_TO_USEC(_tu)		((_tu) << 10)
10759999SWang.Lin@Sun.COM 
10769999SWang.Lin@Sun.COM #define	CAB_TIMEOUT_VAL		10
10779999SWang.Lin@Sun.COM #define	BEACON_TIMEOUT_VAL	10
10789999SWang.Lin@Sun.COM #define	MIN_BEACON_TIMEOUT_VAL	1
10799999SWang.Lin@Sun.COM #define	SLEEP_SLOP		3
10809999SWang.Lin@Sun.COM 
10819999SWang.Lin@Sun.COM #define	CCK_SIFS_TIME		10
10829999SWang.Lin@Sun.COM #define	CCK_PREAMBLE_BITS	144
10839999SWang.Lin@Sun.COM #define	CCK_PLCP_BITS		48
10849999SWang.Lin@Sun.COM 
10859999SWang.Lin@Sun.COM #define	OFDM_SIFS_TIME		16
10869999SWang.Lin@Sun.COM #define	OFDM_PREAMBLE_TIME	20
10879999SWang.Lin@Sun.COM #define	OFDM_PLCP_BITS		22
10889999SWang.Lin@Sun.COM #define	OFDM_SYMBOL_TIME	4
10899999SWang.Lin@Sun.COM 
10909999SWang.Lin@Sun.COM #define	OFDM_SIFS_TIME_HALF	32
10919999SWang.Lin@Sun.COM #define	OFDM_PREAMBLE_TIME_HALF	40
10929999SWang.Lin@Sun.COM #define	OFDM_PLCP_BITS_HALF	22
10939999SWang.Lin@Sun.COM #define	OFDM_SYMBOL_TIME_HALF	8
10949999SWang.Lin@Sun.COM 
10959999SWang.Lin@Sun.COM #define	OFDM_SIFS_TIME_QUARTER		64
10969999SWang.Lin@Sun.COM #define	OFDM_PREAMBLE_TIME_QUARTER	80
10979999SWang.Lin@Sun.COM #define	OFDM_PLCP_BITS_QUARTER		22
10989999SWang.Lin@Sun.COM #define	OFDM_SYMBOL_TIME_QUARTER	16
10999999SWang.Lin@Sun.COM 
11009999SWang.Lin@Sun.COM uint32_t ath9k_hw_get_eeprom(struct ath_hal *ah,
11019999SWang.Lin@Sun.COM     enum eeprom_param param);
11029999SWang.Lin@Sun.COM 
1103*11729SWang.Lin@Sun.COM #ifdef	__cplusplus
11049999SWang.Lin@Sun.COM }
11059999SWang.Lin@Sun.COM #endif
11069999SWang.Lin@Sun.COM 
1107*11729SWang.Lin@Sun.COM #endif	/* _ARN_HW_H */
1108