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