]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/dev/ath/ath_hal/ar5416/ar5416.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / dev / ath / ath_hal / ar5416 / ar5416.h
1 /*
2  * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
3  * Copyright (c) 2002-2008 Atheros Communications, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  *
17  * $FreeBSD$
18  */
19 #ifndef _ATH_AR5416_H_
20 #define _ATH_AR5416_H_
21
22 #include "ar5212/ar5212.h"
23 #include "ar5416_cal.h"
24 #include "ah_eeprom_v14.h"      /* for CAL_TARGET_POWER_* */
25
26 #define AR5416_MAGIC    0x20065416
27
28 enum {
29         HAL_RESET_POWER_ON,
30         HAL_RESET_WARM,
31         HAL_RESET_COLD,
32 };
33
34 typedef struct {
35         uint16_t        synth_center;
36         uint16_t        ctl_center;
37         uint16_t        ext_center;
38 } CHAN_CENTERS;
39
40 typedef enum Ar5416_Rates {
41         rate6mb,  rate9mb,  rate12mb, rate18mb,
42         rate24mb, rate36mb, rate48mb, rate54mb,
43         rate1l,   rate2l,   rate2s,   rate5_5l,
44         rate5_5s, rate11l,  rate11s,  rateXr,
45         rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3,
46         rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7,
47         rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3,
48         rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7,
49         rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm,
50         Ar5416RateSize
51 } AR5416_RATES;
52
53 #define AR5416_DEFAULT_RXCHAINMASK      7
54 #define AR5416_DEFAULT_TXCHAINMASK      1
55 #define AR5416_MAX_RATE_POWER           63
56 #define AR5416_KEYTABLE_SIZE            128
57
58 #define AR5416_CCA_MAX_GOOD_VALUE       -85
59 #define AR5416_CCA_MAX_HIGH_VALUE       -62
60 #define AR5416_CCA_MIN_BAD_VALUE        -140
61 #define AR9285_CCA_MAX_GOOD_VALUE       -118
62
63 #define AR5416_SPUR_RSSI_THRESH         40
64
65 struct ar5416NfLimits {
66         int16_t max;
67         int16_t min;
68         int16_t nominal;
69 };
70
71 struct ath_hal_5416 {
72         struct ath_hal_5212 ah_5212;
73
74         /* NB: RF data setup at attach */
75         HAL_INI_ARRAY   ah_ini_bb_rfgain;
76         HAL_INI_ARRAY   ah_ini_bank0;
77         HAL_INI_ARRAY   ah_ini_bank1;
78         HAL_INI_ARRAY   ah_ini_bank2;
79         HAL_INI_ARRAY   ah_ini_bank3;
80         HAL_INI_ARRAY   ah_ini_bank6;
81         HAL_INI_ARRAY   ah_ini_bank7;
82         HAL_INI_ARRAY   ah_ini_addac;
83         HAL_INI_ARRAY   ah_ini_pcieserdes;
84
85         void            (*ah_writeIni)(struct ath_hal *,
86                             const struct ieee80211_channel *);
87         void            (*ah_spurMitigate)(struct ath_hal *,
88                             const struct ieee80211_channel *);
89
90         /* calibration ops */
91         HAL_BOOL        (*ah_cal_initcal)(struct ath_hal *,
92                             const struct ieee80211_channel *);
93         void            (*ah_cal_pacal)(struct ath_hal *,
94                             HAL_BOOL is_reset);
95
96         /* optional open-loop tx power control related methods */
97         void            (*ah_olcInit)(struct ath_hal *);
98         void            (*ah_olcTempCompensation)(struct ath_hal *);
99
100         /* tx power control */
101         HAL_BOOL        (*ah_setPowerCalTable) (struct ath_hal *ah,
102                             struct ar5416eeprom *pEepData,
103                             const struct ieee80211_channel *chan,
104                             int16_t *pTxPowerIndexOffset);
105
106         /* baseband operations */
107         void            (*ah_initPLL) (struct ath_hal *ah,
108                             const struct ieee80211_channel *chan);
109
110         u_int           ah_globaltxtimeout;     /* global tx timeout */
111         u_int           ah_gpioMask;
112         int             ah_hangs;               /* h/w hangs state */
113         uint8_t         ah_keytype[AR5416_KEYTABLE_SIZE];
114         /*
115          * Extension Channel Rx Clear State
116          */
117         uint32_t        ah_cycleCount;
118         uint32_t        ah_ctlBusy;
119         uint32_t        ah_extBusy;
120         uint32_t        ah_rx_chainmask;
121         uint32_t        ah_tx_chainmask;
122
123         HAL_ANI_CMD     ah_ani_function;
124
125         struct ar5416PerCal ah_cal;             /* periodic calibration state */
126
127         struct ar5416NfLimits nf_2g;
128         struct ar5416NfLimits nf_5g;
129
130         int             initPDADC;
131
132         int             ah_need_an_top2_fixup;  /* merlin or later chips that may need this workaround */
133 };
134 #define AH5416(_ah)     ((struct ath_hal_5416 *)(_ah))
135
136 #define IS_5416_PCI(ah) ((AH_PRIVATE(ah)->ah_macVersion) == AR_SREV_VERSION_OWL_PCI)
137 #define IS_5416_PCIE(ah) ((AH_PRIVATE(ah)->ah_macVersion) == AR_SREV_VERSION_OWL_PCIE)
138 #undef IS_PCIE
139 #define IS_PCIE(ah) (IS_5416_PCIE(ah))
140
141 extern  HAL_BOOL ar2133RfAttach(struct ath_hal *, HAL_STATUS *);
142
143 struct ath_hal;
144
145 extern  uint32_t ar5416GetRadioRev(struct ath_hal *ah);
146 extern  void ar5416InitState(struct ath_hal_5416 *, uint16_t devid,
147                 HAL_SOFTC sc, HAL_BUS_TAG st, HAL_BUS_HANDLE sh,
148                 HAL_STATUS *status);
149 extern  void ar5416Detach(struct ath_hal *ah);
150 extern  void ar5416AttachPCIE(struct ath_hal *ah);
151 extern  HAL_BOOL ar5416FillCapabilityInfo(struct ath_hal *ah);
152
153 extern  void ar5416AniAttach(struct ath_hal *, const struct ar5212AniParams *,
154                 const struct ar5212AniParams *, HAL_BOOL ena);
155 extern  void ar5416AniDetach(struct ath_hal *);
156 extern  HAL_BOOL ar5416AniControl(struct ath_hal *, HAL_ANI_CMD cmd, int param);
157 extern  HAL_BOOL ar5416AniSetParams(struct ath_hal *,
158                 const struct ar5212AniParams *, const struct ar5212AniParams *);
159 extern  void ar5416ProcessMibIntr(struct ath_hal *, const HAL_NODE_STATS *);
160 extern  void ar5416RxMonitor(struct ath_hal *, const HAL_NODE_STATS *,
161                              const struct ieee80211_channel *);
162 extern  void ar5416AniPoll(struct ath_hal *, const struct ieee80211_channel *);
163 extern  void ar5416AniReset(struct ath_hal *, const struct ieee80211_channel *,
164                 HAL_OPMODE, int);
165
166 extern  void ar5416SetBeaconTimers(struct ath_hal *, const HAL_BEACON_TIMERS *);
167 extern  void ar5416BeaconInit(struct ath_hal *ah,
168                 uint32_t next_beacon, uint32_t beacon_period);
169 extern  void ar5416ResetStaBeaconTimers(struct ath_hal *ah);
170 extern  void ar5416SetStaBeaconTimers(struct ath_hal *ah,
171                 const HAL_BEACON_STATE *);
172 extern  uint64_t ar5416GetNextTBTT(struct ath_hal *);
173
174 extern  HAL_BOOL ar5416EepromRead(struct ath_hal *, u_int off, uint16_t *data);
175 extern  HAL_BOOL ar5416EepromWrite(struct ath_hal *, u_int off, uint16_t data);
176
177 extern  HAL_BOOL ar5416IsInterruptPending(struct ath_hal *ah);
178 extern  HAL_BOOL ar5416GetPendingInterrupts(struct ath_hal *, HAL_INT *masked);
179 extern  HAL_INT ar5416SetInterrupts(struct ath_hal *ah, HAL_INT ints);
180
181 extern  HAL_BOOL ar5416GpioCfgOutput(struct ath_hal *, uint32_t gpio,
182                 HAL_GPIO_MUX_TYPE);
183 extern  HAL_BOOL ar5416GpioCfgInput(struct ath_hal *, uint32_t gpio);
184 extern  HAL_BOOL ar5416GpioSet(struct ath_hal *, uint32_t gpio, uint32_t val);
185 extern  uint32_t ar5416GpioGet(struct ath_hal *ah, uint32_t gpio);
186 extern  void ar5416GpioSetIntr(struct ath_hal *ah, u_int, uint32_t ilevel);
187
188 extern  u_int ar5416GetWirelessModes(struct ath_hal *ah);
189 extern  void ar5416SetLedState(struct ath_hal *ah, HAL_LED_STATE state);
190 extern  uint64_t ar5416GetTsf64(struct ath_hal *ah);
191 extern  void ar5416SetTsf64(struct ath_hal *ah, uint64_t tsf64);
192 extern  void ar5416ResetTsf(struct ath_hal *ah);
193 extern  HAL_BOOL ar5416SetAntennaSwitch(struct ath_hal *, HAL_ANT_SETTING);
194 extern  HAL_BOOL ar5416SetDecompMask(struct ath_hal *, uint16_t, int);
195 extern  void ar5416SetCoverageClass(struct ath_hal *, uint8_t, int);
196 extern  uint32_t ar5416Get11nExtBusy(struct ath_hal *ah);
197 extern  void ar5416Set11nMac2040(struct ath_hal *ah, HAL_HT_MACMODE mode);
198 extern  HAL_HT_RXCLEAR ar5416Get11nRxClear(struct ath_hal *ah);
199 extern  void ar5416Set11nRxClear(struct ath_hal *ah, HAL_HT_RXCLEAR rxclear);
200 extern  HAL_STATUS ar5416SetQuiet(struct ath_hal *ah, uint32_t period,
201             uint32_t duration, uint32_t nextStart, HAL_QUIET_FLAG flag);
202 extern  HAL_STATUS ar5416GetCapability(struct ath_hal *ah,
203             HAL_CAPABILITY_TYPE type, uint32_t capability, uint32_t *result);
204 extern  HAL_BOOL ar5416GetDiagState(struct ath_hal *ah, int request,
205             const void *args, uint32_t argsize,
206             void **result, uint32_t *resultsize);
207 extern  HAL_BOOL ar5416SetRifsDelay(struct ath_hal *ah,
208             const struct ieee80211_channel *chan, HAL_BOOL enable);
209 extern  void ar5416EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe);
210 extern  void ar5416GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe);
211 extern  HAL_BOOL ar5416ProcessRadarEvent(struct ath_hal *ah,
212             struct ath_rx_status *rxs, uint64_t fulltsf, const char *buf,
213             HAL_DFS_EVENT *event);
214 extern  HAL_BOOL ar5416IsFastClockEnabled(struct ath_hal *ah);
215
216 extern  HAL_BOOL ar5416SetPowerMode(struct ath_hal *ah, HAL_POWER_MODE mode,
217                 int setChip);
218 extern  HAL_POWER_MODE ar5416GetPowerMode(struct ath_hal *ah);
219 extern  HAL_BOOL ar5416GetPowerStatus(struct ath_hal *ah);
220
221 extern  HAL_BOOL ar5416ResetKeyCacheEntry(struct ath_hal *ah, uint16_t entry);
222 extern  HAL_BOOL ar5416SetKeyCacheEntry(struct ath_hal *ah, uint16_t entry,
223                const HAL_KEYVAL *k, const uint8_t *mac, int xorKey);
224
225 extern  uint32_t ar5416GetRxFilter(struct ath_hal *ah);
226 extern  void ar5416SetRxFilter(struct ath_hal *ah, uint32_t bits);
227 extern  void ar5416StartPcuReceive(struct ath_hal *ah);
228 extern  void ar5416StopPcuReceive(struct ath_hal *ah);
229 extern  HAL_BOOL ar5416SetupRxDesc(struct ath_hal *,
230                 struct ath_desc *, uint32_t size, u_int flags);
231 extern  HAL_STATUS ar5416ProcRxDesc(struct ath_hal *ah, struct ath_desc *,
232                 uint32_t, struct ath_desc *, uint64_t,
233                 struct ath_rx_status *);
234
235 extern  HAL_BOOL ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode,
236                 struct ieee80211_channel *chan,
237                 HAL_BOOL bChannelChange, HAL_STATUS *status);
238 extern  HAL_BOOL ar5416PhyDisable(struct ath_hal *ah);
239 extern  HAL_RFGAIN ar5416GetRfgain(struct ath_hal *ah);
240 extern  HAL_BOOL ar5416Disable(struct ath_hal *ah);
241 extern  HAL_BOOL ar5416ChipReset(struct ath_hal *ah,
242                 const struct ieee80211_channel *);
243 extern  int ar5416GetRegChainOffset(struct ath_hal *ah, int i);
244 extern  HAL_BOOL ar5416SetBoardValues(struct ath_hal *,
245                 const struct ieee80211_channel *);
246 extern  HAL_BOOL ar5416SetResetReg(struct ath_hal *, uint32_t type);
247 extern  HAL_BOOL ar5416SetTxPowerLimit(struct ath_hal *ah, uint32_t limit);
248 extern  HAL_BOOL ar5416SetTransmitPower(struct ath_hal *,
249                 const struct ieee80211_channel *, uint16_t *);
250 extern  HAL_BOOL ar5416GetChipPowerLimits(struct ath_hal *ah,
251                 struct ieee80211_channel *chan);
252 extern  void ar5416GetChannelCenters(struct ath_hal *,
253                 const struct ieee80211_channel *chan, CHAN_CENTERS *centers);
254 extern  void ar5416SetRatesArrayFromTargetPower(struct ath_hal *ah,
255                 const struct ieee80211_channel *chan,
256                 int16_t *ratesArray,
257                 const CAL_TARGET_POWER_LEG *targetPowerCck,
258                 const CAL_TARGET_POWER_LEG *targetPowerCckExt,
259                 const CAL_TARGET_POWER_LEG *targetPowerOfdm,
260                 const CAL_TARGET_POWER_LEG *targetPowerOfdmExt,
261                 const CAL_TARGET_POWER_HT *targetPowerHt20,
262                 const CAL_TARGET_POWER_HT *targetPowerHt40);
263 extern  void ar5416GetTargetPowers(struct ath_hal *ah, 
264                 const struct ieee80211_channel *chan,
265                 CAL_TARGET_POWER_HT *powInfo,
266                 uint16_t numChannels, CAL_TARGET_POWER_HT *pNewPower,
267                 uint16_t numRates, HAL_BOOL isHt40Target);
268 extern  void ar5416GetTargetPowersLeg(struct ath_hal *ah, 
269                 const struct ieee80211_channel *chan,
270                 CAL_TARGET_POWER_LEG *powInfo,
271                 uint16_t numChannels, CAL_TARGET_POWER_LEG *pNewPower,
272                 uint16_t numRates, HAL_BOOL isExtTarget);
273 extern  void ar5416InitChainMasks(struct ath_hal *ah);
274 extern  void ar5416RestoreChainMask(struct ath_hal *ah);
275 extern  void ar5416EepromSetAddac(struct ath_hal *ah,
276                 const struct ieee80211_channel *chan);
277 extern  uint16_t ar5416GetMaxEdgePower(uint16_t freq,
278                 CAL_CTL_EDGES *pRdEdgesPower, HAL_BOOL is2GHz);
279 extern  void ar5416InitPLL(struct ath_hal *ah,
280                 const struct ieee80211_channel *chan);
281
282 /* TX power setup related routines in ar5416_reset.c */
283 extern  void ar5416GetGainBoundariesAndPdadcs(struct ath_hal *ah,
284         const struct ieee80211_channel *chan, CAL_DATA_PER_FREQ *pRawDataSet,
285         uint8_t * bChans, uint16_t availPiers,
286         uint16_t tPdGainOverlap, int16_t *pMinCalPower,
287         uint16_t * pPdGainBoundaries, uint8_t * pPDADCValues,
288         uint16_t numXpdGains);
289 extern  void ar5416SetGainBoundariesClosedLoop(struct ath_hal *ah,
290         int i, uint16_t pdGainOverlap_t2,
291         uint16_t gainBoundaries[]);
292 extern  uint16_t ar5416GetXpdGainValues(struct ath_hal *ah, uint16_t xpdMask,
293         uint16_t xpdGainValues[]);
294 extern  void ar5416WriteDetectorGainBiases(struct ath_hal *ah,
295         uint16_t numXpdGain, uint16_t xpdGainValues[]);
296 extern  void ar5416WritePdadcValues(struct ath_hal *ah, int i,
297         uint8_t pdadcValues[]);
298 extern  HAL_BOOL ar5416SetPowerCalTable(struct ath_hal *ah,
299         struct ar5416eeprom *pEepData, const struct ieee80211_channel *chan,
300         int16_t *pTxPowerIndexOffset);
301 extern  void ar5416WriteTxPowerRateRegisters(struct ath_hal *ah,
302         const struct ieee80211_channel *chan, const int16_t ratesArray[]);
303
304 extern  HAL_BOOL ar5416StopTxDma(struct ath_hal *ah, u_int q);
305 extern  HAL_BOOL ar5416SetupTxDesc(struct ath_hal *ah, struct ath_desc *ds,
306                 u_int pktLen, u_int hdrLen, HAL_PKT_TYPE type, u_int txPower,
307                 u_int txRate0, u_int txTries0,
308                 u_int keyIx, u_int antMode, u_int flags,
309                 u_int rtsctsRate, u_int rtsctsDuration,
310                 u_int compicvLen, u_int compivLen, u_int comp);
311 extern  HAL_BOOL ar5416SetupXTxDesc(struct ath_hal *, struct ath_desc *,
312                 u_int txRate1, u_int txRetries1,
313                 u_int txRate2, u_int txRetries2,
314                 u_int txRate3, u_int txRetries3);
315 extern  HAL_BOOL ar5416FillTxDesc(struct ath_hal *ah, struct ath_desc *ds,
316                 u_int segLen, HAL_BOOL firstSeg, HAL_BOOL lastSeg,
317                 const struct ath_desc *ds0);
318 extern  HAL_STATUS ar5416ProcTxDesc(struct ath_hal *ah,
319                 struct ath_desc *, struct ath_tx_status *);
320 extern  HAL_BOOL ar5416GetTxCompletionRates(struct ath_hal *ah,
321                 const struct ath_desc *ds0, int *rates, int *tries);
322
323 extern  HAL_BOOL ar5416ResetTxQueue(struct ath_hal *ah, u_int q);
324 extern  int ar5416SetupTxQueue(struct ath_hal *ah, HAL_TX_QUEUE type,
325                 const HAL_TXQ_INFO *qInfo);
326
327 extern  HAL_BOOL ar5416ChainTxDesc(struct ath_hal *ah, struct ath_desc *ds,
328                 u_int pktLen, u_int hdrLen, HAL_PKT_TYPE type, u_int keyIx,
329                 HAL_CIPHER cipher, uint8_t delims, u_int segLen, HAL_BOOL firstSeg,
330                 HAL_BOOL lastSeg);
331 extern  HAL_BOOL ar5416SetupFirstTxDesc(struct ath_hal *ah, struct ath_desc *ds,
332                 u_int aggrLen, u_int flags, u_int txPower, u_int txRate0, u_int txTries0,
333                 u_int antMode, u_int rtsctsRate, u_int rtsctsDuration);
334 extern  HAL_BOOL ar5416SetupLastTxDesc(struct ath_hal *ah, struct ath_desc *ds,
335                 const struct ath_desc *ds0);
336 extern  HAL_BOOL ar5416SetGlobalTxTimeout(struct ath_hal *ah, u_int tu);
337 extern  u_int ar5416GetGlobalTxTimeout(struct ath_hal *ah);
338 extern  void ar5416Set11nRateScenario(struct ath_hal *ah, struct ath_desc *ds,
339                 u_int durUpdateEn, u_int rtsctsRate, HAL_11N_RATE_SERIES series[],
340                 u_int nseries, u_int flags);
341 extern  void ar5416Set11nAggrMiddle(struct ath_hal *ah, struct ath_desc *ds, u_int numDelims);
342 extern  void ar5416Clr11nAggr(struct ath_hal *ah, struct ath_desc *ds);
343 extern  void ar5416Set11nBurstDuration(struct ath_hal *ah, struct ath_desc *ds, u_int burstDuration);
344
345 extern  const HAL_RATE_TABLE *ar5416GetRateTable(struct ath_hal *, u_int mode);
346 #endif  /* _ATH_AR5416_H_ */