FreeBSD kernel ATH device code
ar9160_attach.c
Go to the documentation of this file.
1/*-
2 * SPDX-License-Identifier: ISC
3 *
4 * Copyright (c) 2008 Sam Leffler, Errno Consulting
5 * Copyright (c) 2008 Atheros Communications, Inc.
6 *
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 *
19 * $FreeBSD$
20 */
21#include "opt_ah.h"
22
23#include "ah.h"
24#include "ah_internal.h"
25#include "ah_devid.h"
26
27#include "ar5416/ar5416.h"
28#include "ar5416/ar5416reg.h"
29#include "ar5416/ar5416phy.h"
30
31#include "ar9001/ar9160.ini"
32
33static const HAL_PERCAL_DATA ar9160_iq_cal = { /* multi sample */
34 .calName = "IQ", .calType = IQ_MISMATCH_CAL,
35 .calNumSamples = MAX_CAL_SAMPLES,
36 .calCountMax = PER_MIN_LOG_COUNT,
37 .calCollect = ar5416IQCalCollect,
38 .calPostProc = ar5416IQCalibration
39};
40static const HAL_PERCAL_DATA ar9160_adc_gain_cal = { /* multi sample */
41 .calName = "ADC Gain", .calType = ADC_GAIN_CAL,
42 .calNumSamples = MAX_CAL_SAMPLES,
43 .calCountMax = PER_MIN_LOG_COUNT,
44 .calCollect = ar5416AdcGainCalCollect,
45 .calPostProc = ar5416AdcGainCalibration
46};
47static const HAL_PERCAL_DATA ar9160_adc_dc_cal = { /* multi sample */
48 .calName = "ADC DC", .calType = ADC_DC_CAL,
49 .calNumSamples = MAX_CAL_SAMPLES,
50 .calCountMax = PER_MIN_LOG_COUNT,
51 .calCollect = ar5416AdcDcCalCollect,
52 .calPostProc = ar5416AdcDcCalibration
53};
55 .calName = "ADC Init DC", .calType = ADC_DC_INIT_CAL,
56 .calNumSamples = MIN_CAL_SAMPLES,
57 .calCountMax = INIT_LOG_COUNT,
58 .calCollect = ar5416AdcDcCalCollect,
59 .calPostProc = ar5416AdcDcCalibration
60};
61
63
64static void
66{
67 static const struct ar5212AniParams aniparams = {
68 .maxNoiseImmunityLevel = 4, /* levels 0..4 */
69 .totalSizeDesired = { -55, -55, -55, -55, -62 },
70 .coarseHigh = { -14, -14, -14, -14, -12 },
71 .coarseLow = { -64, -64, -64, -64, -70 },
72 .firpwr = { -78, -78, -78, -78, -80 },
73 .maxSpurImmunityLevel = 7,
74 .cycPwrThr1 = { 2, 4, 6, 8, 10, 12, 14, 16 },
75 .maxFirstepLevel = 2, /* levels 0..2 */
76 .firstep = { 0, 4, 8 },
77 .ofdmTrigHigh = 500,
78 .ofdmTrigLow = 200,
79 .cckTrigHigh = 200,
80 .cckTrigLow = 100,
81 .rssiThrHigh = 40,
82 .rssiThrLow = 7,
83 .period = 100,
84 };
85
86 /* NB: disable ANI noise immmunity for reliable RIFS rx */
87 AH5416(ah)->ah_ani_function &= ~(1 << HAL_ANI_NOISE_IMMUNITY_LEVEL);
88 ar5416AniAttach(ah, &aniparams, &aniparams, AH_TRUE);
89}
90
91static void
92ar9160InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan)
93{
94 uint32_t pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV);
95 if (chan != AH_NULL) {
96 if (IEEE80211_IS_CHAN_HALF(chan))
97 pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL);
98 else if (IEEE80211_IS_CHAN_QUARTER(chan))
99 pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL);
100
101 if (IEEE80211_IS_CHAN_5GHZ(chan))
102 pll |= SM(0x50, AR_RTC_SOWL_PLL_DIV);
103 else
104 pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV);
105 } else
106 pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV);
107
111}
112
113/*
114 * Attach for an AR9160 part.
115 */
116static struct ath_hal *
117ar9160Attach(uint16_t devid, HAL_SOFTC sc,
118 HAL_BUS_TAG st, HAL_BUS_HANDLE sh, uint16_t *eepromdata,
120 HAL_STATUS *status)
121{
122 struct ath_hal_5416 *ahp5416;
123 struct ath_hal_5212 *ahp;
124 struct ath_hal *ah;
125 uint32_t val;
126 HAL_STATUS ecode;
127 HAL_BOOL rfStatus;
128
129 HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
130 __func__, sc, (void*) st, (void*) sh);
131
132 /* NB: memory is returned zero'd */
133 ahp5416 = ath_hal_malloc(sizeof (struct ath_hal_5416));
134 if (ahp5416 == AH_NULL) {
136 "%s: cannot allocate memory for state block\n", __func__);
137 *status = HAL_ENOMEM;
138 return AH_NULL;
139 }
140 ar5416InitState(ahp5416, devid, sc, st, sh, status);
141 ahp = &ahp5416->ah_5212;
142 ah = &ahp->ah_priv.h;
143
144 /* XXX override with 9160 specific state */
145 /* override 5416 methods for our needs */
146 AH5416(ah)->ah_initPLL = ar9160InitPLL;
147
148 AH5416(ah)->ah_cal.iqCalData.calData = &ar9160_iq_cal;
149 AH5416(ah)->ah_cal.adcGainCalData.calData = &ar9160_adc_gain_cal;
150 AH5416(ah)->ah_cal.adcDcCalData.calData = &ar9160_adc_dc_cal;
151 AH5416(ah)->ah_cal.adcDcCalInitData.calData = &ar9160_adc_init_dc_cal;
152 AH5416(ah)->ah_cal.suppCals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL;
153
155 /* reset chip */
156 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't reset chip\n",
157 __func__);
158 ecode = HAL_EIO;
159 goto bad;
160 }
161
163 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't wakeup chip\n",
164 __func__);
165 ecode = HAL_EIO;
166 goto bad;
167 }
168 /* Read Revisions from Chips before taking out of reset */
169 val = OS_REG_READ(ah, AR_SREV);
171 "%s: ID 0x%x VERSION 0x%x TYPE 0x%x REVISION 0x%x\n",
172 __func__, MS(val, AR_XSREV_ID), MS(val, AR_XSREV_VERSION),
173 MS(val, AR_XSREV_TYPE), MS(val, AR_XSREV_REVISION));
174 /* NB: include chip type to differentiate from pre-Sowl versions */
175 AH_PRIVATE(ah)->ah_macVersion =
177 AH_PRIVATE(ah)->ah_macRev = MS(val, AR_XSREV_REVISION);
178 AH_PRIVATE(ah)->ah_ispcie = (val & AR_XSREV_TYPE_HOST_MODE) == 0;
179
180 /* setup common ini data; rf backends handle remainder */
181 HAL_INI_INIT(&ahp->ah_ini_modes, ar9160Modes, 6);
182 HAL_INI_INIT(&ahp->ah_ini_common, ar9160Common, 2);
183
184 HAL_INI_INIT(&AH5416(ah)->ah_ini_bb_rfgain, ar9160BB_RfGain, 3);
185 HAL_INI_INIT(&AH5416(ah)->ah_ini_bank0, ar9160Bank0, 2);
186 HAL_INI_INIT(&AH5416(ah)->ah_ini_bank1, ar9160Bank1, 2);
187 HAL_INI_INIT(&AH5416(ah)->ah_ini_bank2, ar9160Bank2, 2);
188 HAL_INI_INIT(&AH5416(ah)->ah_ini_bank3, ar9160Bank3, 3);
189 HAL_INI_INIT(&AH5416(ah)->ah_ini_bank6, ar9160Bank6TPC, 3);
190 HAL_INI_INIT(&AH5416(ah)->ah_ini_bank7, ar9160Bank7, 2);
191 if (AR_SREV_SOWL_11(ah))
192 HAL_INI_INIT(&AH5416(ah)->ah_ini_addac, ar9160Addac_1_1, 2);
193 else
194 HAL_INI_INIT(&AH5416(ah)->ah_ini_addac, ar9160Addac, 2);
195
196 ecode = ath_hal_v14EepromAttach(ah);
197 if (ecode != HAL_OK)
198 goto bad;
199
200 HAL_INI_INIT(&AH5416(ah)->ah_ini_pcieserdes, ar9160PciePhy, 2);
202
203 if (!ar5416ChipReset(ah, AH_NULL, HAL_RESET_NORMAL)) { /* reset chip */
204 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: chip reset failed\n", __func__);
205 ecode = HAL_EIO;
206 goto bad;
207 }
208
209 AH_PRIVATE(ah)->ah_phyRev = OS_REG_READ(ah, AR_PHY_CHIP_ID);
210
211 if (!ar5212ChipTest(ah)) {
212 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: hardware self-test failed\n",
213 __func__);
214 ecode = HAL_ESELFTEST;
215 goto bad;
216 }
217
218 /*
219 * Set correct Baseband to analog shift
220 * setting to access analog chips.
221 */
222 OS_REG_WRITE(ah, AR_PHY(0), 0x00000007);
223
224 /* Read Radio Chip Rev Extract */
225 AH_PRIVATE(ah)->ah_analog5GhzRev = ar5416GetRadioRev(ah);
227 case AR_RAD2133_SREV_MAJOR: /* Sowl: 2G/3x3 */
228 case AR_RAD5133_SREV_MAJOR: /* Sowl: 2+5G/3x3 */
229 break;
230 default:
231 if (AH_PRIVATE(ah)->ah_analog5GhzRev == 0) {
232 AH_PRIVATE(ah)->ah_analog5GhzRev =
234 break;
235 }
236#ifdef AH_DEBUG
238 "%s: 5G Radio Chip Rev 0x%02X is not supported by "
239 "this driver\n", __func__,
241 ecode = HAL_ENOTSUPP;
242 goto bad;
243#endif
244 }
245 rfStatus = ar2133RfAttach(ah, &ecode);
246 if (!rfStatus) {
247 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: RF setup failed, status %u\n",
248 __func__, ecode);
249 goto bad;
250 }
251
252 /*
253 * Got everything we need now to setup the capabilities.
254 */
255 if (!ar9160FillCapabilityInfo(ah)) {
256 ecode = HAL_EEREAD;
257 goto bad;
258 }
259
261 if (ecode != HAL_OK) {
263 "%s: error getting mac address from EEPROM\n", __func__);
264 goto bad;
265 }
266 /* XXX How about the serial number ? */
267 /* Read Reg Domain */
268 AH_PRIVATE(ah)->ah_currentRD =
270 AH_PRIVATE(ah)->ah_currentRDext =
272
273 /*
274 * ah_miscMode is populated by ar5416FillCapabilityInfo()
275 * starting from griffin. Set here to make sure that
276 * AR_MISC_MODE_MIC_NEW_LOC_ENABLE is set before a GTK is
277 * placed into hardware.
278 */
279 if (ahp->ah_miscMode != 0)
281
282 ar9160AniSetup(ah); /* Anti Noise Immunity */
283
284 /* This just uses the AR5416 NF values */
287 AH5416(ah)->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_5416_2GHZ;
290 AH5416(ah)->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_5416_5GHZ;
291
292 ar5416InitNfHistBuff(AH5416(ah)->ah_cal.nfCalHist);
293
294 HALDEBUG(ah, HAL_DEBUG_ATTACH, "%s: return\n", __func__);
295
296 return ah;
297bad:
298 if (ahp)
299 ar5416Detach((struct ath_hal *) ahp);
300 if (status)
301 *status = ecode;
302 return AH_NULL;
303}
304
305/*
306 * Fill all software cached or static hardware state information.
307 * Return failure if capabilities are to come from EEPROM and
308 * cannot be read.
309 */
310static HAL_BOOL
312{
313 HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
314
316 return AH_FALSE;
317 pCap->halCSTSupport = AH_TRUE;
320 pCap->halRtsAggrLimit = 64*1024; /* 802.11n max */
323 pCap->halAutoSleepSupport = AH_FALSE; /* XXX? */
326 /* BB Read WAR */
327 pCap->halHasBBReadWar = AH_TRUE;
328
329 /* AR9160 is a 2x2 stream device */
330 pCap->halTxStreams = 2;
331 pCap->halRxStreams = 2;
332
333 return AH_TRUE;
334}
335
336static const char*
337ar9160Probe(uint16_t vendorid, uint16_t devid)
338{
339 if (vendorid == ATHEROS_VENDOR_ID && devid == AR9160_DEVID_PCI)
340 return "Atheros 9160";
341 return AH_NULL;
342}
HAL_STATUS
Definition: ah.h:71
@ HAL_EIO
Definition: ah.h:75
@ HAL_ESELFTEST
Definition: ah.h:86
@ HAL_EEREAD
Definition: ah.h:80
@ HAL_ENOTSUPP
Definition: ah.h:85
@ HAL_OK
Definition: ah.h:72
@ HAL_ENOMEM
Definition: ah.h:74
@ HAL_PM_AWAKE
Definition: ah.h:440
@ HAL_RESET_NORMAL
Definition: ah.h:772
@ HAL_ANI_NOISE_IMMUNITY_LEVEL
Definition: ah.h:972
@ HAL_RESET_POWER_ON
Definition: ah.h:778
HAL_BOOL
Definition: ah.h:93
@ AH_FALSE
Definition: ah.h:94
@ AH_TRUE
Definition: ah.h:95
@ HAL_DEBUG_ANY
Definition: ah_debug.h:62
@ HAL_DEBUG_ATTACH
Definition: ah_debug.h:30
#define ATHEROS_VENDOR_ID
Definition: ah_devid.h:25
#define AR9160_DEVID_PCI
Definition: ah_devid.h:80
@ AR_EEP_MACADDR
Definition: ah_eeprom.h:77
@ AR_EEP_REGDMN_0
Definition: ah_eeprom.h:86
@ AR_EEP_REGDMN_1
Definition: ah_eeprom.h:87
HAL_STATUS ath_hal_v14EepromAttach(struct ath_hal *ah)
#define HAL_INI_INIT(_ia, _data, _cols)
Definition: ah_internal.h:910
#define SM(_v, _f)
Definition: ah_internal.h:587
#define MS(_v, _f)
Definition: ah_internal.h:588
#define ath_hal_eepromGet(_ah, _param, _val)
Definition: ah_internal.h:486
#define AH_PRIVATE(_ah)
Definition: ah_internal.h:442
void * ath_hal_malloc(size_t)
#define AH_NULL
Definition: ah_internal.h:28
#define HALDEBUG(_ah, __m,...)
Definition: ah_internal.h:658
#define OS_DELAY(_n)
Definition: ah_osdep.h:69
bus_space_tag_t HAL_BUS_TAG
Definition: ah_osdep.h:50
#define OS_REG_WRITE(_ah, _reg, _val)
Definition: ah_osdep.h:139
void * HAL_SOFTC
Definition: ah_osdep.h:49
bus_space_handle_t HAL_BUS_HANDLE
Definition: ah_osdep.h:51
#define OS_REG_READ(_ah, _reg)
Definition: ah_osdep.h:140
HAL_BOOL ar2133RfAttach(struct ath_hal *ah, HAL_STATUS *status)
Definition: ar2133.c:530
#define AR_PHY(_n)
Definition: ar5210phy.h:30
#define AR_SREV
Definition: ar5210reg.h:63
#define AR_PHY_CHIP_ID
Definition: ar5211phy.h:36
HAL_BOOL ar5212ChipTest(struct ath_hal *ah)
#define AR_MISC_MODE
Definition: ar5212reg.h:321
#define AR_RADIO_SREV_MAJOR
Definition: ar5212reg.h:796
#define AH5416(_ah)
Definition: ar5416.h:162
void ar5416InitState(struct ath_hal_5416 *, uint16_t devid, HAL_SOFTC sc, HAL_BUS_TAG st, HAL_BUS_HANDLE sh, HAL_STATUS *status)
Definition: ar5416_attach.c:86
HAL_BOOL ar5416ChipReset(struct ath_hal *ah, const struct ieee80211_channel *, HAL_RESET_TYPE)
Definition: ar5416_reset.c:779
void ar5416Detach(struct ath_hal *ah)
HAL_BOOL ar5416SetPowerMode(struct ath_hal *ah, HAL_POWER_MODE mode, int setChip)
Definition: ar5416_power.c:127
void ar5416AttachPCIE(struct ath_hal *ah)
HAL_BOOL ar5416FillCapabilityInfo(struct ath_hal *ah)
void ar5416AniAttach(struct ath_hal *, const struct ar5212AniParams *, const struct ar5212AniParams *, HAL_BOOL ena)
Definition: ar5416_ani.c:133
HAL_BOOL ar5416SetResetReg(struct ath_hal *, uint32_t type)
uint32_t ar5416GetRadioRev(struct ath_hal *ah)
void ar5416InitNfHistBuff(struct ar5212NfCalHist *h)
Definition: ar5416_cal.c:696
#define INIT_LOG_COUNT
Definition: ar5416_cal.h:46
void ar5416AdcDcCalCollect(struct ath_hal *ah)
@ ADC_DC_CAL
Definition: ar5416_cal.h:27
@ ADC_DC_INIT_CAL
Definition: ar5416_cal.h:25
@ IQ_MISMATCH_CAL
Definition: ar5416_cal.h:28
@ ADC_GAIN_CAL
Definition: ar5416_cal.h:26
#define MIN_CAL_SAMPLES
Definition: ar5416_cal.h:44
void ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains)
void ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains)
void ar5416AdcGainCalCollect(struct ath_hal *ah)
#define MAX_CAL_SAMPLES
Definition: ar5416_cal.h:45
void ar5416IQCalCollect(struct ath_hal *ah)
Definition: ar5416_cal_iq.c:40
#define PER_MIN_LOG_COUNT
Definition: ar5416_cal.h:47
void ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains)
Definition: ar5416_cal_iq.c:66
#define RTC_PLL_SETTLE_DELAY
Definition: ar5416_reset.c:42
#define AR_PHY_CCA_MIN_GOOD_VAL_5416_5GHZ
Definition: ar5416phy.h:376
#define AR_PHY_CCA_MAX_GOOD_VAL_5416_5GHZ
Definition: ar5416phy.h:378
#define AR_PHY_CCA_NOM_VAL_5416_5GHZ
Definition: ar5416phy.h:374
#define AR_PHY_CCA_MIN_GOOD_VAL_5416_2GHZ
Definition: ar5416phy.h:375
#define AR_PHY_CCA_MAX_GOOD_VAL_5416_2GHZ
Definition: ar5416phy.h:377
#define AR_PHY_CCA_NOM_VAL_5416_2GHZ
Definition: ar5416phy.h:373
#define AR_RTC_SOWL_PLL_CLKSEL
Definition: ar5416reg.h:407
#define AR_RAD5133_SREV_MAJOR
Definition: ar5416reg.h:642
#define AR_SREV_SOWL_11(_ah)
Definition: ar5416reg.h:731
#define AR_XSREV_VERSION
Definition: ar5416reg.h:659
#define AR_RTC_SOWL_PLL_DIV
Definition: ar5416reg.h:403
#define AR_XSREV_TYPE
Definition: ar5416reg.h:661
#define AR_RAD2133_SREV_MAJOR
Definition: ar5416reg.h:643
#define AR_XSREV_ID
Definition: ar5416reg.h:657
#define AR_XSREV_TYPE_HOST_MODE
Definition: ar5416reg.h:664
#define AR_RTC_SOWL_PLL_REFDIV
Definition: ar5416reg.h:405
#define AR_RTC_SLEEP_CLK
Definition: ar5416reg.h:115
#define AR_XSREV_TYPE_S
Definition: ar5416reg.h:662
#define AR_RTC_SLEEP_DERIVED_CLK
Definition: ar5416reg.h:425
#define AR_RTC_PLL_CONTROL
Definition: ar5416reg.h:112
#define AR_XSREV_REVISION
Definition: ar5416reg.h:665
static const HAL_PERCAL_DATA ar9160_adc_dc_cal
Definition: ar9160_attach.c:47
static const HAL_PERCAL_DATA ar9160_iq_cal
Definition: ar9160_attach.c:33
static HAL_BOOL ar9160FillCapabilityInfo(struct ath_hal *ah)
static void ar9160AniSetup(struct ath_hal *ah)
Definition: ar9160_attach.c:65
static const char * ar9160Probe(uint16_t vendorid, uint16_t devid)
static const HAL_PERCAL_DATA ar9160_adc_init_dc_cal
Definition: ar9160_attach.c:54
static struct ath_hal * ar9160Attach(uint16_t devid, HAL_SOFTC sc, HAL_BUS_TAG st, HAL_BUS_HANDLE sh, uint16_t *eepromdata, HAL_OPS_CONFIG *ah_config, HAL_STATUS *status)
static const HAL_PERCAL_DATA ar9160_adc_gain_cal
Definition: ar9160_attach.c:40
static void ar9160InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan)
Definition: ar9160_attach.c:92
AH_CHIP(AR9160, ar9160Probe, ar9160Attach)
uint8_t halRxStreams
Definition: ah_internal.h:310
uint32_t halMbssidAggrSupport
Definition: ah_internal.h:266
uint32_t hal4AddrAggrSupport
Definition: ah_internal.h:260
uint32_t halAutoSleepSupport
Definition: ah_internal.h:251
uint32_t halRifsTxSupport
Definition: ah_internal.h:259
uint32_t halUseCombinedRadarRssi
Definition: ah_internal.h:262
uint32_t halCSTSupport
Definition: ah_internal.h:257
uint8_t halTxStreams
Definition: ah_internal.h:309
uint32_t halExtChanDfsSupport
Definition: ah_internal.h:261
uint32_t halRifsRxSupport
Definition: ah_internal.h:258
uint32_t halHasBBReadWar
Definition: ah_internal.h:271
int maxNoiseImmunityLevel
Definition: ar5212.h:154
uint32_t ah_miscMode
Definition: ar5212.h:287
HAL_INI_ARRAY ah_ini_common
Definition: ar5212.h:252
uint8_t ah_macaddr[IEEE80211_ADDR_LEN]
Definition: ar5212.h:256
struct ath_hal_private ah_priv
Definition: ar5212.h:245
HAL_INI_ARRAY ah_ini_modes
Definition: ar5212.h:251
struct ath_hal_5212 ah_5212
Definition: ar5416.h:68
struct ath_hal h
Definition: ah_internal.h:358
Definition: ah.h:1219
HAL_OPS_CONFIG ah_config
Definition: ah.h:1243
uint16_t ah_analog5GhzRev
Definition: ah.h:1232
const char * calName
Definition: ar5416_cal.h:52