Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/ath/ath_hal/ar5210/ar5210_misc.c
39566 views
1
/*-
2
* SPDX-License-Identifier: ISC
3
*
4
* Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
5
* Copyright (c) 2002-2004 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
#include "opt_ah.h"
20
21
#include "ah.h"
22
#include "ah_internal.h"
23
24
#include "ar5210/ar5210.h"
25
#include "ar5210/ar5210reg.h"
26
#include "ar5210/ar5210phy.h"
27
28
#include "ah_eeprom_v1.h"
29
30
#define AR_NUM_GPIO 6 /* 6 GPIO bits */
31
#define AR_GPIOD_MASK 0x2f /* 6-bit mask */
32
33
void
34
ar5210GetMacAddress(struct ath_hal *ah, uint8_t *mac)
35
{
36
struct ath_hal_5210 *ahp = AH5210(ah);
37
38
OS_MEMCPY(mac, ahp->ah_macaddr, IEEE80211_ADDR_LEN);
39
}
40
41
HAL_BOOL
42
ar5210SetMacAddress(struct ath_hal *ah, const uint8_t *mac)
43
{
44
struct ath_hal_5210 *ahp = AH5210(ah);
45
46
OS_MEMCPY(ahp->ah_macaddr, mac, IEEE80211_ADDR_LEN);
47
return AH_TRUE;
48
}
49
50
void
51
ar5210GetBssIdMask(struct ath_hal *ah, uint8_t *mask)
52
{
53
static const uint8_t ones[IEEE80211_ADDR_LEN] =
54
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
55
OS_MEMCPY(mask, ones, IEEE80211_ADDR_LEN);
56
}
57
58
HAL_BOOL
59
ar5210SetBssIdMask(struct ath_hal *ah, const uint8_t *mask)
60
{
61
return AH_FALSE;
62
}
63
64
/*
65
* Read 16 bits of data from the specified EEPROM offset.
66
*/
67
HAL_BOOL
68
ar5210EepromRead(struct ath_hal *ah, u_int off, uint16_t *data)
69
{
70
(void) OS_REG_READ(ah, AR_EP_AIR(off)); /* activate read op */
71
if (!ath_hal_wait(ah, AR_EP_STA,
72
AR_EP_STA_RDCMPLT | AR_EP_STA_RDERR, AR_EP_STA_RDCMPLT)) {
73
HALDEBUG(ah, HAL_DEBUG_ANY, "%s: read failed for entry 0x%x\n",
74
__func__, AR_EP_AIR(off));
75
return AH_FALSE;
76
}
77
*data = OS_REG_READ(ah, AR_EP_RDATA) & 0xffff;
78
return AH_TRUE;
79
}
80
81
#ifdef AH_SUPPORT_WRITE_EEPROM
82
/*
83
* Write 16 bits of data to the specified EEPROM offset.
84
*/
85
HAL_BOOL
86
ar5210EepromWrite(struct ath_hal *ah, u_int off, uint16_t data)
87
{
88
return AH_FALSE;
89
}
90
#endif /* AH_SUPPORT_WRITE_EEPROM */
91
92
/*
93
* Attempt to change the cards operating regulatory domain to the given value
94
*/
95
HAL_BOOL
96
ar5210SetRegulatoryDomain(struct ath_hal *ah,
97
uint16_t regDomain, HAL_STATUS *status)
98
{
99
HAL_STATUS ecode;
100
101
if (AH_PRIVATE(ah)->ah_currentRD == regDomain) {
102
ecode = HAL_EINVAL;
103
goto bad;
104
}
105
/*
106
* Check if EEPROM is configured to allow this; must
107
* be a proper version and the protection bits must
108
* permit re-writing that segment of the EEPROM.
109
*/
110
if (ath_hal_eepromGetFlag(ah, AR_EEP_WRITEPROTECT)) {
111
ecode = HAL_EEWRITE;
112
goto bad;
113
}
114
ecode = HAL_EIO; /* disallow all writes */
115
bad:
116
if (status)
117
*status = ecode;
118
return AH_FALSE;
119
}
120
121
/*
122
* Return the wireless modes (a,b,g,t) supported by hardware.
123
*
124
* This value is what is actually supported by the hardware
125
* and is unaffected by regulatory/country code settings.
126
*
127
*/
128
u_int
129
ar5210GetWirelessModes(struct ath_hal *ah)
130
{
131
/* XXX could enable turbo mode but can't do all rates */
132
return HAL_MODE_11A;
133
}
134
135
/*
136
* Called if RfKill is supported (according to EEPROM). Set the interrupt and
137
* GPIO values so the ISR and can disable RF on a switch signal
138
*/
139
void
140
ar5210EnableRfKill(struct ath_hal *ah)
141
{
142
uint16_t rfsilent = AH_PRIVATE(ah)->ah_rfsilent;
143
int select = MS(rfsilent, AR_EEPROM_RFSILENT_GPIO_SEL);
144
int polarity = MS(rfsilent, AR_EEPROM_RFSILENT_POLARITY);
145
146
/*
147
* If radio disable switch connection to GPIO bit 0 is enabled
148
* program GPIO interrupt.
149
* If rfkill bit on eeprom is 1, setupeeprommap routine has already
150
* verified that it is a later version of eeprom, it has a place for
151
* rfkill bit and it is set to 1, indicating that GPIO bit 0 hardware
152
* connection is present.
153
*/
154
ar5210Gpio0SetIntr(ah, select, (ar5210GpioGet(ah, select) == polarity));
155
}
156
157
/*
158
* Configure GPIO Output lines
159
*/
160
HAL_BOOL
161
ar5210GpioCfgOutput(struct ath_hal *ah, uint32_t gpio, HAL_GPIO_MUX_TYPE type)
162
{
163
HALASSERT(gpio < AR_NUM_GPIO);
164
165
OS_REG_WRITE(ah, AR_GPIOCR,
166
(OS_REG_READ(ah, AR_GPIOCR) &~ AR_GPIOCR_ALL(gpio))
167
| AR_GPIOCR_OUT1(gpio));
168
169
return AH_TRUE;
170
}
171
172
/*
173
* Configure GPIO Input lines
174
*/
175
HAL_BOOL
176
ar5210GpioCfgInput(struct ath_hal *ah, uint32_t gpio)
177
{
178
HALASSERT(gpio < AR_NUM_GPIO);
179
180
OS_REG_WRITE(ah, AR_GPIOCR,
181
(OS_REG_READ(ah, AR_GPIOCR) &~ AR_GPIOCR_ALL(gpio))
182
| AR_GPIOCR_IN(gpio));
183
184
return AH_TRUE;
185
}
186
187
/*
188
* Once configured for I/O - set output lines
189
*/
190
HAL_BOOL
191
ar5210GpioSet(struct ath_hal *ah, uint32_t gpio, uint32_t val)
192
{
193
uint32_t reg;
194
195
HALASSERT(gpio < AR_NUM_GPIO);
196
197
reg = OS_REG_READ(ah, AR_GPIODO);
198
reg &= ~(1 << gpio);
199
reg |= (val&1) << gpio;
200
201
OS_REG_WRITE(ah, AR_GPIODO, reg);
202
return AH_TRUE;
203
}
204
205
/*
206
* Once configured for I/O - get input lines
207
*/
208
uint32_t
209
ar5210GpioGet(struct ath_hal *ah, uint32_t gpio)
210
{
211
if (gpio < AR_NUM_GPIO) {
212
uint32_t val = OS_REG_READ(ah, AR_GPIODI);
213
val = ((val & AR_GPIOD_MASK) >> gpio) & 0x1;
214
return val;
215
} else {
216
return 0xffffffff;
217
}
218
}
219
220
/*
221
* Set the GPIO 0 Interrupt
222
*/
223
void
224
ar5210Gpio0SetIntr(struct ath_hal *ah, u_int gpio, uint32_t ilevel)
225
{
226
uint32_t val = OS_REG_READ(ah, AR_GPIOCR);
227
228
/* Clear the bits that we will modify. */
229
val &= ~(AR_GPIOCR_INT_SEL(gpio) | AR_GPIOCR_INT_SELH | AR_GPIOCR_INT_ENA |
230
AR_GPIOCR_ALL(gpio));
231
232
val |= AR_GPIOCR_INT_SEL(gpio) | AR_GPIOCR_INT_ENA;
233
if (ilevel)
234
val |= AR_GPIOCR_INT_SELH;
235
236
/* Don't need to change anything for low level interrupt. */
237
OS_REG_WRITE(ah, AR_GPIOCR, val);
238
239
/* Change the interrupt mask. */
240
ar5210SetInterrupts(ah, AH5210(ah)->ah_maskReg | HAL_INT_GPIO);
241
}
242
243
/*
244
* Change the LED blinking pattern to correspond to the connectivity
245
*/
246
void
247
ar5210SetLedState(struct ath_hal *ah, HAL_LED_STATE state)
248
{
249
uint32_t val;
250
251
val = OS_REG_READ(ah, AR_PCICFG);
252
switch (state) {
253
case HAL_LED_INIT:
254
val &= ~(AR_PCICFG_LED_PEND | AR_PCICFG_LED_ACT);
255
break;
256
case HAL_LED_RUN:
257
/* normal blink when connected */
258
val &= ~AR_PCICFG_LED_PEND;
259
val |= AR_PCICFG_LED_ACT;
260
break;
261
default:
262
val |= AR_PCICFG_LED_PEND;
263
val &= ~AR_PCICFG_LED_ACT;
264
break;
265
}
266
OS_REG_WRITE(ah, AR_PCICFG, val);
267
}
268
269
/*
270
* Return 1 or 2 for the corresponding antenna that is in use
271
*/
272
u_int
273
ar5210GetDefAntenna(struct ath_hal *ah)
274
{
275
uint32_t val = OS_REG_READ(ah, AR_STA_ID1);
276
return (val & AR_STA_ID1_DEFAULT_ANTENNA ? 2 : 1);
277
}
278
279
void
280
ar5210SetDefAntenna(struct ath_hal *ah, u_int antenna)
281
{
282
uint32_t val = OS_REG_READ(ah, AR_STA_ID1);
283
284
if (antenna != (val & AR_STA_ID1_DEFAULT_ANTENNA ? 2 : 1)) {
285
/*
286
* Antenna change requested, force a toggle of the default.
287
*/
288
OS_REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_DEFAULT_ANTENNA);
289
}
290
}
291
292
HAL_ANT_SETTING
293
ar5210GetAntennaSwitch(struct ath_hal *ah)
294
{
295
return HAL_ANT_VARIABLE;
296
}
297
298
HAL_BOOL
299
ar5210SetAntennaSwitch(struct ath_hal *ah, HAL_ANT_SETTING settings)
300
{
301
/* XXX not sure how to fix antenna */
302
return (settings == HAL_ANT_VARIABLE);
303
}
304
305
/*
306
* Change association related fields programmed into the hardware.
307
* Writing a valid BSSID to the hardware effectively enables the hardware
308
* to synchronize its TSF to the correct beacons and receive frames coming
309
* from that BSSID. It is called by the SME JOIN operation.
310
*/
311
void
312
ar5210WriteAssocid(struct ath_hal *ah, const uint8_t *bssid, uint16_t assocId)
313
{
314
struct ath_hal_5210 *ahp = AH5210(ah);
315
316
/* XXX save bssid for possible re-use on reset */
317
OS_MEMCPY(ahp->ah_bssid, bssid, IEEE80211_ADDR_LEN);
318
ahp->ah_associd = assocId;
319
OS_REG_WRITE(ah, AR_BSS_ID0, LE_READ_4(ahp->ah_bssid));
320
OS_REG_WRITE(ah, AR_BSS_ID1, LE_READ_2(ahp->ah_bssid+4) |
321
((assocId & 0x3fff)<<AR_BSS_ID1_AID_S));
322
if (assocId == 0)
323
OS_REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_NO_PSPOLL);
324
else
325
OS_REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_NO_PSPOLL);
326
}
327
328
/*
329
* Get the current hardware tsf for stamlme.
330
*/
331
uint64_t
332
ar5210GetTsf64(struct ath_hal *ah)
333
{
334
uint32_t low1, low2, u32;
335
336
/* sync multi-word read */
337
low1 = OS_REG_READ(ah, AR_TSF_L32);
338
u32 = OS_REG_READ(ah, AR_TSF_U32);
339
low2 = OS_REG_READ(ah, AR_TSF_L32);
340
if (low2 < low1) { /* roll over */
341
/*
342
* If we are not preempted this will work. If we are
343
* then we re-reading AR_TSF_U32 does no good as the
344
* low bits will be meaningless. Likewise reading
345
* L32, U32, U32, then comparing the last two reads
346
* to check for rollover doesn't help if preempted--so
347
* we take this approach as it costs one less PCI
348
* read which can be noticeable when doing things
349
* like timestamping packets in monitor mode.
350
*/
351
u32++;
352
}
353
return (((uint64_t) u32) << 32) | ((uint64_t) low2);
354
}
355
356
/*
357
* Get the current hardware tsf for stamlme.
358
*/
359
uint32_t
360
ar5210GetTsf32(struct ath_hal *ah)
361
{
362
return OS_REG_READ(ah, AR_TSF_L32);
363
}
364
365
/*
366
* Reset the current hardware tsf for stamlme
367
*/
368
void
369
ar5210ResetTsf(struct ath_hal *ah)
370
{
371
uint32_t val = OS_REG_READ(ah, AR_BEACON);
372
373
OS_REG_WRITE(ah, AR_BEACON, val | AR_BEACON_RESET_TSF);
374
}
375
376
/*
377
* Grab a semi-random value from hardware registers - may not
378
* change often
379
*/
380
uint32_t
381
ar5210GetRandomSeed(struct ath_hal *ah)
382
{
383
uint32_t nf;
384
385
nf = (OS_REG_READ(ah, AR_PHY_BASE + (25 << 2)) >> 19) & 0x1ff;
386
if (nf & 0x100)
387
nf = 0 - ((nf ^ 0x1ff) + 1);
388
return (OS_REG_READ(ah, AR_TSF_U32) ^
389
OS_REG_READ(ah, AR_TSF_L32) ^ nf);
390
}
391
392
/*
393
* Detect if our card is present
394
*/
395
HAL_BOOL
396
ar5210DetectCardPresent(struct ath_hal *ah)
397
{
398
/*
399
* Read the Silicon Revision register and compare that
400
* to what we read at attach time. If the same, we say
401
* a card/device is present.
402
*/
403
return (AH_PRIVATE(ah)->ah_macRev == (OS_REG_READ(ah, AR_SREV) & 0xff));
404
}
405
406
/*
407
* Update MIB Counters
408
*/
409
void
410
ar5210UpdateMibCounters(struct ath_hal *ah, HAL_MIB_STATS *stats)
411
{
412
stats->ackrcv_bad += OS_REG_READ(ah, AR_ACK_FAIL);
413
stats->rts_bad += OS_REG_READ(ah, AR_RTS_FAIL);
414
stats->fcs_bad += OS_REG_READ(ah, AR_FCS_FAIL);
415
stats->rts_good += OS_REG_READ(ah, AR_RTS_OK);
416
stats->beacons += OS_REG_READ(ah, AR_BEACON_CNT);
417
}
418
419
HAL_BOOL
420
ar5210SetSifsTime(struct ath_hal *ah, u_int us)
421
{
422
struct ath_hal_5210 *ahp = AH5210(ah);
423
424
if (us > ath_hal_mac_usec(ah, 0x7ff)) {
425
HALDEBUG(ah, HAL_DEBUG_ANY, "%s: bad SIFS time %u\n",
426
__func__, us);
427
ahp->ah_sifstime = (u_int) -1; /* restore default handling */
428
return AH_FALSE;
429
} else {
430
/* convert to system clocks */
431
OS_REG_RMW_FIELD(ah, AR_IFS0, AR_IFS0_SIFS,
432
ath_hal_mac_clks(ah, us));
433
ahp->ah_sifstime = us;
434
return AH_TRUE;
435
}
436
}
437
438
u_int
439
ar5210GetSifsTime(struct ath_hal *ah)
440
{
441
u_int clks = OS_REG_READ(ah, AR_IFS0) & 0x7ff;
442
return ath_hal_mac_usec(ah, clks); /* convert from system clocks */
443
}
444
445
HAL_BOOL
446
ar5210SetSlotTime(struct ath_hal *ah, u_int us)
447
{
448
struct ath_hal_5210 *ahp = AH5210(ah);
449
450
if (us < HAL_SLOT_TIME_9 || us > ath_hal_mac_usec(ah, 0xffff)) {
451
HALDEBUG(ah, HAL_DEBUG_ANY, "%s: bad slot time %u\n",
452
__func__, us);
453
ahp->ah_slottime = (u_int) -1; /* restore default handling */
454
return AH_FALSE;
455
} else {
456
/* convert to system clocks */
457
OS_REG_WRITE(ah, AR_SLOT_TIME, ath_hal_mac_clks(ah, us));
458
ahp->ah_slottime = us;
459
return AH_TRUE;
460
}
461
}
462
463
u_int
464
ar5210GetSlotTime(struct ath_hal *ah)
465
{
466
u_int clks = OS_REG_READ(ah, AR_SLOT_TIME) & 0xffff;
467
return ath_hal_mac_usec(ah, clks); /* convert from system clocks */
468
}
469
470
HAL_BOOL
471
ar5210SetAckTimeout(struct ath_hal *ah, u_int us)
472
{
473
struct ath_hal_5210 *ahp = AH5210(ah);
474
475
if (us > ath_hal_mac_usec(ah, MS(0xffffffff, AR_TIME_OUT_ACK))) {
476
HALDEBUG(ah, HAL_DEBUG_ANY, "%s: bad ack timeout %u\n",
477
__func__, us);
478
ahp->ah_acktimeout = (u_int) -1; /* restore default handling */
479
return AH_FALSE;
480
} else {
481
/* convert to system clocks */
482
OS_REG_RMW_FIELD(ah, AR_TIME_OUT,
483
AR_TIME_OUT_ACK, ath_hal_mac_clks(ah, us));
484
ahp->ah_acktimeout = us;
485
return AH_TRUE;
486
}
487
}
488
489
u_int
490
ar5210GetAckTimeout(struct ath_hal *ah)
491
{
492
u_int clks = MS(OS_REG_READ(ah, AR_TIME_OUT), AR_TIME_OUT_ACK);
493
return ath_hal_mac_usec(ah, clks); /* convert from system clocks */
494
}
495
496
u_int
497
ar5210GetAckCTSRate(struct ath_hal *ah)
498
{
499
return ((AH5210(ah)->ah_staId1Defaults & AR_STA_ID1_ACKCTS_6MB) == 0);
500
}
501
502
HAL_BOOL
503
ar5210SetAckCTSRate(struct ath_hal *ah, u_int high)
504
{
505
struct ath_hal_5210 *ahp = AH5210(ah);
506
507
if (high) {
508
OS_REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_ACKCTS_6MB);
509
ahp->ah_staId1Defaults &= ~AR_STA_ID1_ACKCTS_6MB;
510
} else {
511
OS_REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_ACKCTS_6MB);
512
ahp->ah_staId1Defaults |= AR_STA_ID1_ACKCTS_6MB;
513
}
514
return AH_TRUE;
515
}
516
517
HAL_BOOL
518
ar5210SetCTSTimeout(struct ath_hal *ah, u_int us)
519
{
520
struct ath_hal_5210 *ahp = AH5210(ah);
521
522
if (us > ath_hal_mac_usec(ah, MS(0xffffffff, AR_TIME_OUT_CTS))) {
523
HALDEBUG(ah, HAL_DEBUG_ANY, "%s: bad cts timeout %u\n",
524
__func__, us);
525
ahp->ah_ctstimeout = (u_int) -1; /* restore default handling */
526
return AH_FALSE;
527
} else {
528
/* convert to system clocks */
529
OS_REG_RMW_FIELD(ah, AR_TIME_OUT,
530
AR_TIME_OUT_CTS, ath_hal_mac_clks(ah, us));
531
ahp->ah_ctstimeout = us;
532
return AH_TRUE;
533
}
534
}
535
536
u_int
537
ar5210GetCTSTimeout(struct ath_hal *ah)
538
{
539
u_int clks = MS(OS_REG_READ(ah, AR_TIME_OUT), AR_TIME_OUT_CTS);
540
return ath_hal_mac_usec(ah, clks); /* convert from system clocks */
541
}
542
543
HAL_BOOL
544
ar5210SetDecompMask(struct ath_hal *ah, uint16_t keyidx, int en)
545
{
546
/* nothing to do */
547
return AH_TRUE;
548
}
549
550
void
551
ar5210SetCoverageClass(struct ath_hal *ah, uint8_t coverageclass, int now)
552
{
553
}
554
555
HAL_STATUS
556
ar5210SetQuiet(struct ath_hal *ah, uint32_t period, uint32_t duration,
557
uint32_t next_start, HAL_QUIET_FLAG flags)
558
{
559
return HAL_OK;
560
}
561
562
/*
563
* Control Adaptive Noise Immunity Parameters
564
*/
565
HAL_BOOL
566
ar5210AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param)
567
{
568
return AH_FALSE;
569
}
570
571
void
572
ar5210RxMonitor(struct ath_hal *ah, const HAL_NODE_STATS *stats,
573
const struct ieee80211_channel *chan)
574
{
575
}
576
577
void
578
ar5210AniPoll(struct ath_hal *ah, const struct ieee80211_channel *chan)
579
{
580
}
581
582
void
583
ar5210MibEvent(struct ath_hal *ah, const HAL_NODE_STATS *stats)
584
{
585
}
586
587
HAL_STATUS
588
ar5210GetCapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type,
589
uint32_t capability, uint32_t *result)
590
{
591
592
switch (type) {
593
case HAL_CAP_CIPHER: /* cipher handled in hardware */
594
#if 0
595
return (capability == HAL_CIPHER_WEP ? HAL_OK : HAL_ENOTSUPP);
596
#else
597
return HAL_ENOTSUPP;
598
#endif
599
default:
600
return ath_hal_getcapability(ah, type, capability, result);
601
}
602
}
603
604
HAL_BOOL
605
ar5210SetCapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type,
606
uint32_t capability, uint32_t setting, HAL_STATUS *status)
607
{
608
609
switch (type) {
610
case HAL_CAP_DIAG: /* hardware diagnostic support */
611
/*
612
* NB: could split this up into virtual capabilities,
613
* (e.g. 1 => ACK, 2 => CTS, etc.) but it hardly
614
* seems worth the additional complexity.
615
*/
616
#ifdef AH_DEBUG
617
AH_PRIVATE(ah)->ah_diagreg = setting;
618
#else
619
AH_PRIVATE(ah)->ah_diagreg = setting & 0x6; /* ACK+CTS */
620
#endif
621
ar5210UpdateDiagReg(ah, AH_PRIVATE(ah)->ah_diagreg);
622
return AH_TRUE;
623
case HAL_CAP_RXORN_FATAL: /* HAL_INT_RXORN treated as fatal */
624
return AH_FALSE; /* NB: disallow */
625
default:
626
return ath_hal_setcapability(ah, type, capability,
627
setting, status);
628
}
629
}
630
631
HAL_BOOL
632
ar5210GetDiagState(struct ath_hal *ah, int request,
633
const void *args, uint32_t argsize,
634
void **result, uint32_t *resultsize)
635
{
636
#ifdef AH_PRIVATE_DIAG
637
uint32_t pcicfg;
638
HAL_BOOL ok;
639
640
switch (request) {
641
case HAL_DIAG_EEPROM:
642
/* XXX */
643
break;
644
case HAL_DIAG_EEREAD:
645
if (argsize != sizeof(uint16_t))
646
return AH_FALSE;
647
pcicfg = OS_REG_READ(ah, AR_PCICFG);
648
OS_REG_WRITE(ah, AR_PCICFG, pcicfg | AR_PCICFG_EEPROMSEL);
649
ok = ath_hal_eepromRead(ah, *(const uint16_t *)args, *result);
650
OS_REG_WRITE(ah, AR_PCICFG, pcicfg);
651
if (ok)
652
*resultsize = sizeof(uint16_t);
653
return ok;
654
}
655
#endif
656
return ath_hal_getdiagstate(ah, request,
657
args, argsize, result, resultsize);
658
}
659
660
/*
661
* Return what percentage of the extension channel is busy.
662
* This is always disabled for AR5210 series NICs.
663
*/
664
uint32_t
665
ar5210Get11nExtBusy(struct ath_hal *ah)
666
{
667
668
return (0);
669
}
670
671
/*
672
* There's no channel survey support for the AR5210.
673
*/
674
HAL_BOOL
675
ar5210GetMibCycleCounts(struct ath_hal *ah, HAL_SURVEY_SAMPLE *hsample)
676
{
677
678
return (AH_FALSE);
679
}
680
681
void
682
ar5210SetChainMasks(struct ath_hal *ah, uint32_t txchainmask,
683
uint32_t rxchainmask)
684
{
685
}
686
687
void
688
ar5210EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe)
689
{
690
}
691
692
void
693
ar5210GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe)
694
{
695
}
696
697
/*
698
* Update the diagnostic register.
699
*
700
* This merges in the diagnostic register setting with the default
701
* value, which may or may not involve disabling hardware encryption.
702
*/
703
void
704
ar5210UpdateDiagReg(struct ath_hal *ah, uint32_t val)
705
{
706
707
/* Disable all hardware encryption */
708
val |= AR_DIAG_SW_DIS_CRYPTO;
709
OS_REG_WRITE(ah, AR_DIAG_SW, val);
710
}
711
712
/*
713
* Get the current NAV value from the hardware.
714
*/
715
u_int
716
ar5210GetNav(struct ath_hal *ah)
717
{
718
uint32_t reg;
719
720
reg = OS_REG_READ(ah, AR_NAV);
721
return (reg);
722
}
723
724
/*
725
* Set the current NAV value to the hardware.
726
*/
727
void
728
ar5210SetNav(struct ath_hal *ah, u_int val)
729
{
730
731
OS_REG_WRITE(ah, AR_NAV, val);
732
}
733
734
735