Annotation of sys/dev/ic/ar5211.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: ar5211.c,v 1.34 2007/04/10 17:47:55 miod Exp $ */
2:
3: /*
4: * Copyright (c) 2004, 2005, 2006, 2007 Reyk Floeter <reyk@openbsd.org>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: /*
20: * HAL interface for the Atheros AR5001 Wireless LAN chipset
21: * (AR5211 + AR5111).
22: */
23:
24: #include <dev/ic/ar5xxx.h>
25: #include <dev/ic/ar5211reg.h>
26: #include <dev/ic/ar5211var.h>
27:
28: HAL_BOOL ar5k_ar5211_nic_reset(struct ath_hal *, u_int32_t);
29: HAL_BOOL ar5k_ar5211_nic_wakeup(struct ath_hal *, u_int16_t);
30: u_int16_t ar5k_ar5211_radio_revision(struct ath_hal *, HAL_CHIP);
31: const void ar5k_ar5211_fill(struct ath_hal *);
32: void ar5k_ar5211_rfregs(struct ath_hal *, HAL_CHANNEL *, u_int,
33: u_int);
34:
35: /*
36: * Initial register setting for the AR5211
37: */
38: static const struct ar5k_ini ar5211_ini[] =
39: AR5K_AR5211_INI;
40: static const struct ar5k_ar5211_ini_mode ar5211_mode[] =
41: AR5K_AR5211_INI_MODE;
42: static const struct ar5k_ar5211_ini_rf ar5211_rf[] =
43: AR5K_AR5211_INI_RF;
44:
45: AR5K_HAL_FUNCTIONS(extern, ar5k_ar5211,);
46:
47: const void
48: ar5k_ar5211_fill(struct ath_hal *hal)
49: {
50: hal->ah_magic = AR5K_AR5211_MAGIC;
51:
52: /*
53: * Init/Exit functions
54: */
55: AR5K_HAL_FUNCTION(hal, ar5211, get_rate_table);
56: AR5K_HAL_FUNCTION(hal, ar5211, detach);
57:
58: /*
59: * Reset functions
60: */
61: AR5K_HAL_FUNCTION(hal, ar5211, reset);
62: AR5K_HAL_FUNCTION(hal, ar5211, set_opmode);
63: AR5K_HAL_FUNCTION(hal, ar5211, calibrate);
64:
65: /*
66: * TX functions
67: */
68: AR5K_HAL_FUNCTION(hal, ar5211, update_tx_triglevel);
69: AR5K_HAL_FUNCTION(hal, ar5211, setup_tx_queue);
70: AR5K_HAL_FUNCTION(hal, ar5211, setup_tx_queueprops);
71: AR5K_HAL_FUNCTION(hal, ar5211, release_tx_queue);
72: AR5K_HAL_FUNCTION(hal, ar5211, reset_tx_queue);
73: AR5K_HAL_FUNCTION(hal, ar5211, get_tx_buf);
74: AR5K_HAL_FUNCTION(hal, ar5211, put_tx_buf);
75: AR5K_HAL_FUNCTION(hal, ar5211, tx_start);
76: AR5K_HAL_FUNCTION(hal, ar5211, stop_tx_dma);
77: AR5K_HAL_FUNCTION(hal, ar5211, setup_tx_desc);
78: AR5K_HAL_FUNCTION(hal, ar5211, setup_xtx_desc);
79: AR5K_HAL_FUNCTION(hal, ar5211, fill_tx_desc);
80: AR5K_HAL_FUNCTION(hal, ar5211, proc_tx_desc);
81: AR5K_HAL_FUNCTION(hal, ar5211, has_veol);
82:
83: /*
84: * RX functions
85: */
86: AR5K_HAL_FUNCTION(hal, ar5211, get_rx_buf);
87: AR5K_HAL_FUNCTION(hal, ar5211, put_rx_buf);
88: AR5K_HAL_FUNCTION(hal, ar5211, start_rx);
89: AR5K_HAL_FUNCTION(hal, ar5211, stop_rx_dma);
90: AR5K_HAL_FUNCTION(hal, ar5211, start_rx_pcu);
91: AR5K_HAL_FUNCTION(hal, ar5211, stop_pcu_recv);
92: AR5K_HAL_FUNCTION(hal, ar5211, set_mcast_filter);
93: AR5K_HAL_FUNCTION(hal, ar5211, set_mcast_filterindex);
94: AR5K_HAL_FUNCTION(hal, ar5211, clear_mcast_filter_idx);
95: AR5K_HAL_FUNCTION(hal, ar5211, get_rx_filter);
96: AR5K_HAL_FUNCTION(hal, ar5211, set_rx_filter);
97: AR5K_HAL_FUNCTION(hal, ar5211, setup_rx_desc);
98: AR5K_HAL_FUNCTION(hal, ar5211, proc_rx_desc);
99: AR5K_HAL_FUNCTION(hal, ar5211, set_rx_signal);
100:
101: /*
102: * Misc functions
103: */
104: AR5K_HAL_FUNCTION(hal, ar5211, dump_state);
105: AR5K_HAL_FUNCTION(hal, ar5211, get_diag_state);
106: AR5K_HAL_FUNCTION(hal, ar5211, get_lladdr);
107: AR5K_HAL_FUNCTION(hal, ar5211, set_lladdr);
108: AR5K_HAL_FUNCTION(hal, ar5211, set_regdomain);
109: AR5K_HAL_FUNCTION(hal, ar5211, set_ledstate);
110: AR5K_HAL_FUNCTION(hal, ar5211, set_associd);
111: AR5K_HAL_FUNCTION(hal, ar5211, set_gpio_input);
112: AR5K_HAL_FUNCTION(hal, ar5211, set_gpio_output);
113: AR5K_HAL_FUNCTION(hal, ar5211, get_gpio);
114: AR5K_HAL_FUNCTION(hal, ar5211, set_gpio);
115: AR5K_HAL_FUNCTION(hal, ar5211, set_gpio_intr);
116: AR5K_HAL_FUNCTION(hal, ar5211, get_tsf32);
117: AR5K_HAL_FUNCTION(hal, ar5211, get_tsf64);
118: AR5K_HAL_FUNCTION(hal, ar5211, reset_tsf);
119: AR5K_HAL_FUNCTION(hal, ar5211, get_regdomain);
120: AR5K_HAL_FUNCTION(hal, ar5211, detect_card_present);
121: AR5K_HAL_FUNCTION(hal, ar5211, update_mib_counters);
122: AR5K_HAL_FUNCTION(hal, ar5211, get_rf_gain);
123: AR5K_HAL_FUNCTION(hal, ar5211, set_slot_time);
124: AR5K_HAL_FUNCTION(hal, ar5211, get_slot_time);
125: AR5K_HAL_FUNCTION(hal, ar5211, set_ack_timeout);
126: AR5K_HAL_FUNCTION(hal, ar5211, get_ack_timeout);
127: AR5K_HAL_FUNCTION(hal, ar5211, set_cts_timeout);
128: AR5K_HAL_FUNCTION(hal, ar5211, get_cts_timeout);
129:
130: /*
131: * Key table (WEP) functions
132: */
133: AR5K_HAL_FUNCTION(hal, ar5211, is_cipher_supported);
134: AR5K_HAL_FUNCTION(hal, ar5211, get_keycache_size);
135: AR5K_HAL_FUNCTION(hal, ar5211, reset_key);
136: AR5K_HAL_FUNCTION(hal, ar5211, is_key_valid);
137: AR5K_HAL_FUNCTION(hal, ar5211, set_key);
138: AR5K_HAL_FUNCTION(hal, ar5211, set_key_lladdr);
139:
140: /*
141: * Power management functions
142: */
143: AR5K_HAL_FUNCTION(hal, ar5211, set_power);
144: AR5K_HAL_FUNCTION(hal, ar5211, get_power_mode);
145: AR5K_HAL_FUNCTION(hal, ar5211, query_pspoll_support);
146: AR5K_HAL_FUNCTION(hal, ar5211, init_pspoll);
147: AR5K_HAL_FUNCTION(hal, ar5211, enable_pspoll);
148: AR5K_HAL_FUNCTION(hal, ar5211, disable_pspoll);
149:
150: /*
151: * Beacon functions
152: */
153: AR5K_HAL_FUNCTION(hal, ar5211, init_beacon);
154: AR5K_HAL_FUNCTION(hal, ar5211, set_beacon_timers);
155: AR5K_HAL_FUNCTION(hal, ar5211, reset_beacon);
156: AR5K_HAL_FUNCTION(hal, ar5211, wait_for_beacon);
157:
158: /*
159: * Interrupt functions
160: */
161: AR5K_HAL_FUNCTION(hal, ar5211, is_intr_pending);
162: AR5K_HAL_FUNCTION(hal, ar5211, get_isr);
163: AR5K_HAL_FUNCTION(hal, ar5211, get_intr);
164: AR5K_HAL_FUNCTION(hal, ar5211, set_intr);
165:
166: /*
167: * Chipset functions (ar5k-specific, non-HAL)
168: */
169: AR5K_HAL_FUNCTION(hal, ar5211, get_capabilities);
170: AR5K_HAL_FUNCTION(hal, ar5211, radar_alert);
171:
172: /*
173: * EEPROM access
174: */
175: AR5K_HAL_FUNCTION(hal, ar5211, eeprom_is_busy);
176: AR5K_HAL_FUNCTION(hal, ar5211, eeprom_read);
177: AR5K_HAL_FUNCTION(hal, ar5211, eeprom_write);
178:
179: /*
180: * Unused functions or functions not implemented
181: */
182: AR5K_HAL_FUNCTION(hal, ar5211, get_tx_queueprops);
183: AR5K_HAL_FUNCTION(hal, ar5211, num_tx_pending);
184: AR5K_HAL_FUNCTION(hal, ar5211, phy_disable);
185: AR5K_HAL_FUNCTION(hal, ar5211, set_txpower_limit);
186: AR5K_HAL_FUNCTION(hal, ar5211, set_def_antenna);
187: AR5K_HAL_FUNCTION(hal, ar5211, get_def_antenna);
188: AR5K_HAL_FUNCTION(hal, ar5211, set_bssid_mask);
189: #ifdef notyet
190: AR5K_HAL_FUNCTION(hal, ar5211, set_capability);
191: AR5K_HAL_FUNCTION(hal, ar5211, proc_mib_event);
192: AR5K_HAL_FUNCTION(hal, ar5211, get_tx_inter_queue);
193: #endif
194: }
195:
196: struct ath_hal *
197: ar5k_ar5211_attach(u_int16_t device, void *sc, bus_space_tag_t st,
198: bus_space_handle_t sh, int *status)
199: {
200: struct ath_hal *hal = (struct ath_hal*) sc;
201: u_int8_t mac[IEEE80211_ADDR_LEN];
202: u_int32_t srev;
203:
204: ar5k_ar5211_fill(hal);
205:
206: /* Bring device out of sleep and reset its units */
207: if (ar5k_ar5211_nic_wakeup(hal, AR5K_INIT_MODE) != AH_TRUE)
208: return (NULL);
209:
210: /* Get MAC, PHY and RADIO revisions */
211: srev = AR5K_REG_READ(AR5K_AR5211_SREV);
212: hal->ah_mac_srev = srev;
213: hal->ah_mac_version = AR5K_REG_MS(srev, AR5K_AR5211_SREV_VER);
214: hal->ah_mac_revision = AR5K_REG_MS(srev, AR5K_AR5211_SREV_REV);
215: hal->ah_phy_revision = AR5K_REG_READ(AR5K_AR5211_PHY_CHIP_ID) &
216: 0x00ffffffff;
217: hal->ah_radio_5ghz_revision =
218: ar5k_ar5211_radio_revision(hal, HAL_CHIP_5GHZ);
219: hal->ah_radio_2ghz_revision = 0;
220:
221: /* Identify the chipset (this has to be done in an early step) */
222: hal->ah_version = AR5K_AR5211;
223: hal->ah_radio = AR5K_AR5111;
224: hal->ah_phy = AR5K_AR5211_PHY(0);
225:
226: bcopy(etherbroadcastaddr, mac, IEEE80211_ADDR_LEN);
227: ar5k_ar5211_set_associd(hal, mac, 0, 0);
228: ar5k_ar5211_get_lladdr(hal, mac);
229: ar5k_ar5211_set_opmode(hal);
230:
231: return (hal);
232: }
233:
234: HAL_BOOL
235: ar5k_ar5211_nic_reset(struct ath_hal *hal, u_int32_t val)
236: {
237: HAL_BOOL ret = AH_FALSE;
238: u_int32_t mask = val ? val : ~0;
239:
240: /* Read-and-clear */
241: AR5K_REG_READ(AR5K_AR5211_RXDP);
242:
243: /*
244: * Reset the device and wait until success
245: */
246: AR5K_REG_WRITE(AR5K_AR5211_RC, val);
247:
248: /* Wait at least 128 PCI clocks */
249: AR5K_DELAY(15);
250:
251: val &=
252: AR5K_AR5211_RC_PCU | AR5K_AR5211_RC_BB;
253:
254: mask &=
255: AR5K_AR5211_RC_PCU | AR5K_AR5211_RC_BB;
256:
257: ret = ar5k_register_timeout(hal, AR5K_AR5211_RC, mask, val, AH_FALSE);
258:
259: /*
260: * Reset configuration register
261: */
262: if ((val & AR5K_AR5211_RC_PCU) == 0)
263: AR5K_REG_WRITE(AR5K_AR5211_CFG, AR5K_AR5211_INIT_CFG);
264:
265: return (ret);
266: }
267:
268: HAL_BOOL
269: ar5k_ar5211_nic_wakeup(struct ath_hal *hal, u_int16_t flags)
270: {
271: u_int32_t turbo, mode, clock;
272:
273: turbo = 0;
274: mode = 0;
275: clock = 0;
276:
277: /*
278: * Get channel mode flags
279: */
280:
281: if (flags & IEEE80211_CHAN_2GHZ) {
282: mode |= AR5K_AR5211_PHY_MODE_FREQ_2GHZ;
283: clock |= AR5K_AR5211_PHY_PLL_44MHZ;
284: } else if (flags & IEEE80211_CHAN_5GHZ) {
285: mode |= AR5K_AR5211_PHY_MODE_FREQ_5GHZ;
286: clock |= AR5K_AR5211_PHY_PLL_40MHZ;
287: } else {
288: AR5K_PRINT("invalid radio frequency mode\n");
289: return (AH_FALSE);
290: }
291:
292: if ((flags & IEEE80211_CHAN_CCK) ||
293: (flags & IEEE80211_CHAN_DYN)) {
294: /* Dynamic OFDM/CCK is not supported by the AR5211 */
295: mode |= AR5K_AR5211_PHY_MODE_MOD_CCK;
296: } else if (flags & IEEE80211_CHAN_OFDM) {
297: mode |= AR5K_AR5211_PHY_MODE_MOD_OFDM;
298: } else {
299: AR5K_PRINT("invalid radio frequency mode\n");
300: return (AH_FALSE);
301: }
302:
303: if (flags & IEEE80211_CHAN_TURBO) {
304: turbo = AR5K_AR5211_PHY_TURBO_MODE |
305: AR5K_AR5211_PHY_TURBO_SHORT;
306: }
307:
308: /*
309: * Reset and wakeup the device
310: */
311:
312: /* ...reset chipset and PCI device */
313: if (ar5k_ar5211_nic_reset(hal,
314: AR5K_AR5211_RC_CHIP | AR5K_AR5211_RC_PCI) == AH_FALSE) {
315: AR5K_PRINT("failed to reset the AR5211 + PCI chipset\n");
316: return (AH_FALSE);
317: }
318:
319: /* ...wakeup */
320: if (ar5k_ar5211_set_power(hal,
321: HAL_PM_AWAKE, AH_TRUE, 0) == AH_FALSE) {
322: AR5K_PRINT("failed to resume the AR5211 (again)\n");
323: return (AH_FALSE);
324: }
325:
326: /* ...final warm reset */
327: if (ar5k_ar5211_nic_reset(hal, 0) == AH_FALSE) {
328: AR5K_PRINT("failed to warm reset the AR5211\n");
329: return (AH_FALSE);
330: }
331:
332: /* ...set the PHY operating mode */
333: AR5K_REG_WRITE(AR5K_AR5211_PHY_PLL, clock);
334: AR5K_DELAY(300);
335:
336: AR5K_REG_WRITE(AR5K_AR5211_PHY_MODE, mode);
337: AR5K_REG_WRITE(AR5K_AR5211_PHY_TURBO, turbo);
338:
339: return (AH_TRUE);
340: }
341:
342: u_int16_t
343: ar5k_ar5211_radio_revision(struct ath_hal *hal, HAL_CHIP chip)
344: {
345: int i;
346: u_int32_t srev;
347: u_int16_t ret;
348:
349: /*
350: * Set the radio chip access register
351: */
352: switch (chip) {
353: case HAL_CHIP_2GHZ:
354: AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_2GHZ);
355: break;
356: case HAL_CHIP_5GHZ:
357: AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_5GHZ);
358: break;
359: default:
360: return (0);
361: }
362:
363: AR5K_DELAY(2000);
364:
365: /* ...wait until PHY is ready and read the selected radio revision */
366: AR5K_REG_WRITE(AR5K_AR5211_PHY(0x34), 0x00001c16);
367:
368: for (i = 0; i < 8; i++)
369: AR5K_REG_WRITE(AR5K_AR5211_PHY(0x20), 0x00010000);
370: srev = (AR5K_REG_READ(AR5K_AR5211_PHY(0x100)) >> 24) & 0xff;
371:
372: ret = ar5k_bitswap(((srev & 0xf0) >> 4) | ((srev & 0x0f) << 4), 8);
373:
374: /* Reset to the 5GHz mode */
375: AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_5GHZ);
376:
377: return (ret);
378: }
379:
380: const HAL_RATE_TABLE *
381: ar5k_ar5211_get_rate_table(struct ath_hal *hal, u_int mode)
382: {
383: switch (mode) {
384: case HAL_MODE_11A:
385: return (&hal->ah_rt_11a);
386: case HAL_MODE_TURBO:
387: return (&hal->ah_rt_turbo);
388: case HAL_MODE_11B:
389: return (&hal->ah_rt_11b);
390: case HAL_MODE_11G:
391: case HAL_MODE_PUREG:
392: return (&hal->ah_rt_11g);
393: default:
394: return (NULL);
395: }
396:
397: return (NULL);
398: }
399:
400: void
401: ar5k_ar5211_detach(struct ath_hal *hal)
402: {
403: /*
404: * Free HAL structure, assume interrupts are down
405: */
406: free(hal, M_DEVBUF);
407: }
408:
409: HAL_BOOL
410: ar5k_ar5211_phy_disable(struct ath_hal *hal)
411: {
412: AR5K_REG_WRITE(AR5K_AR5211_PHY_ACTIVE, AR5K_AR5211_PHY_DISABLE);
413: return (AH_TRUE);
414: }
415:
416: HAL_BOOL
417: ar5k_ar5211_reset(struct ath_hal *hal, HAL_OPMODE op_mode, HAL_CHANNEL *channel,
418: HAL_BOOL change_channel, HAL_STATUS *status)
419: {
420: struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;
421: u_int8_t mac[IEEE80211_ADDR_LEN];
422: u_int32_t data, s_seq, s_ant, s_led[3];
423: u_int i, mode, freq, ee_mode, ant[2];
424:
425: /*
426: * Save some registers before a reset
427: */
428: if (change_channel == AH_TRUE) {
429: s_seq = AR5K_REG_READ(AR5K_AR5211_DCU_SEQNUM(0));
430: s_ant = AR5K_REG_READ(AR5K_AR5211_DEFAULT_ANTENNA);
431: } else {
432: s_seq = 0;
433: s_ant = 1;
434: }
435:
436: s_led[0] = AR5K_REG_READ(AR5K_AR5211_PCICFG) &
437: AR5K_AR5211_PCICFG_LEDSTATE;
438: s_led[1] = AR5K_REG_READ(AR5K_AR5211_GPIOCR);
439: s_led[2] = AR5K_REG_READ(AR5K_AR5211_GPIODO);
440:
441: if (ar5k_ar5211_nic_wakeup(hal, channel->c_channel_flags) == AH_FALSE)
442: return (AH_FALSE);
443:
444: /*
445: * Initialize operating mode
446: */
447: hal->ah_op_mode = op_mode;
448:
449: switch (channel->c_channel_flags & CHANNEL_MODES) {
450: case CHANNEL_A:
451: mode = AR5K_INI_VAL_11A;
452: freq = AR5K_INI_RFGAIN_5GHZ;
453: ee_mode = AR5K_EEPROM_MODE_11A;
454: break;
455: case CHANNEL_T:
456: mode = AR5K_INI_VAL_11A_TURBO;
457: freq = AR5K_INI_RFGAIN_5GHZ;
458: ee_mode = AR5K_EEPROM_MODE_11A;
459: break;
460: case CHANNEL_B:
461: mode = AR5K_INI_VAL_11B;
462: freq = AR5K_INI_RFGAIN_2GHZ;
463: ee_mode = AR5K_EEPROM_MODE_11B;
464: break;
465: case CHANNEL_G:
466: case CHANNEL_PUREG:
467: mode = AR5K_INI_VAL_11G;
468: freq = AR5K_INI_RFGAIN_2GHZ;
469: ee_mode = AR5K_EEPROM_MODE_11G;
470: break;
471: default:
472: AR5K_PRINTF("invalid channel: %d\n", channel->c_channel);
473: return (AH_FALSE);
474: }
475:
476: /* PHY access enable */
477: AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_5GHZ);
478:
479: /*
480: * Write initial RF registers
481: */
482: ar5k_ar5211_rfregs(hal, channel, freq, ee_mode);
483:
484: /*
485: * Write initial mode settings
486: */
487: for (i = 0; i < AR5K_ELEMENTS(ar5211_mode); i++) {
488: AR5K_REG_WAIT(i);
489: AR5K_REG_WRITE((u_int32_t)ar5211_mode[i].mode_register,
490: ar5211_mode[i].mode_value[mode]);
491: }
492:
493: /*
494: * Write initial register settings
495: */
496: for (i = 0; i < AR5K_ELEMENTS(ar5211_ini); i++) {
497: if (change_channel == AH_TRUE &&
498: ar5211_ini[i].ini_register >= AR5K_AR5211_PCU_MIN &&
499: ar5211_ini[i].ini_register <= AR5K_AR5211_PCU_MAX)
500: continue;
501:
502: AR5K_REG_WAIT(i);
503: AR5K_REG_WRITE((u_int32_t)ar5211_ini[i].ini_register,
504: ar5211_ini[i].ini_value);
505: }
506:
507: /*
508: * Write initial RF gain settings
509: */
510: if (ar5k_rfgain(hal, AR5K_INI_PHY_5111, freq) == AH_FALSE)
511: return (AH_FALSE);
512:
513: AR5K_DELAY(1000);
514:
515: /*
516: * Configure additional registers
517: */
518:
519: if (hal->ah_radio == AR5K_AR5111) {
520: if (channel->c_channel_flags & IEEE80211_CHAN_B)
521: AR5K_REG_ENABLE_BITS(AR5K_AR5211_TXCFG,
522: AR5K_AR5211_TXCFG_B_MODE);
523: else
524: AR5K_REG_DISABLE_BITS(AR5K_AR5211_TXCFG,
525: AR5K_AR5211_TXCFG_B_MODE);
526: }
527:
528: /* Set antenna mode */
529: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x44),
530: hal->ah_antenna[ee_mode][0], 0xfffffc06);
531:
532: if (freq == AR5K_INI_RFGAIN_2GHZ)
533: ant[0] = ant[1] = HAL_ANT_FIXED_B;
534: else
535: ant[0] = ant[1] = HAL_ANT_FIXED_A;
536:
537: AR5K_REG_WRITE(AR5K_AR5211_PHY_ANT_SWITCH_TABLE_0,
538: hal->ah_antenna[ee_mode][ant[0]]);
539: AR5K_REG_WRITE(AR5K_AR5211_PHY_ANT_SWITCH_TABLE_1,
540: hal->ah_antenna[ee_mode][ant[1]]);
541:
542: /* Commit values from EEPROM */
543: AR5K_REG_WRITE_BITS(AR5K_AR5211_PHY_FC,
544: AR5K_AR5211_PHY_FC_TX_CLIP, ee->ee_tx_clip);
545:
546: AR5K_REG_WRITE(AR5K_AR5211_PHY(0x5a),
547: AR5K_AR5211_PHY_NF_SVAL(ee->ee_noise_floor_thr[ee_mode]));
548:
549: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x11),
550: (ee->ee_switch_settling[ee_mode] << 7) & 0x3f80, 0xffffc07f);
551: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x12),
552: (ee->ee_ant_tx_rx[ee_mode] << 12) & 0x3f000, 0xfffc0fff);
553: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x14),
554: (ee->ee_adc_desired_size[ee_mode] & 0x00ff) |
555: ((ee->ee_pga_desired_size[ee_mode] << 8) & 0xff00), 0xffff0000);
556:
557: AR5K_REG_WRITE(AR5K_AR5211_PHY(0x0d),
558: (ee->ee_tx_end2xpa_disable[ee_mode] << 24) |
559: (ee->ee_tx_end2xpa_disable[ee_mode] << 16) |
560: (ee->ee_tx_frm2xpa_enable[ee_mode] << 8) |
561: (ee->ee_tx_frm2xpa_enable[ee_mode]));
562:
563: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x0a),
564: ee->ee_tx_end2xlna_enable[ee_mode] << 8, 0xffff00ff);
565: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x19),
566: (ee->ee_thr_62[ee_mode] << 12) & 0x7f000, 0xfff80fff);
567: AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x49), 4, 0xffffff01);
568:
569: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_IQ,
570: AR5K_AR5211_PHY_IQ_CORR_ENABLE |
571: (ee->ee_i_cal[ee_mode] << AR5K_AR5211_PHY_IQ_CORR_Q_I_COFF_S) |
572: ee->ee_q_cal[ee_mode]);
573:
574: /*
575: * Restore saved values
576: */
577: AR5K_REG_WRITE(AR5K_AR5211_DCU_SEQNUM(0), s_seq);
578: AR5K_REG_WRITE(AR5K_AR5211_DEFAULT_ANTENNA, s_ant);
579: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PCICFG, s_led[0]);
580: AR5K_REG_WRITE(AR5K_AR5211_GPIOCR, s_led[1]);
581: AR5K_REG_WRITE(AR5K_AR5211_GPIODO, s_led[2]);
582:
583: /*
584: * Misc
585: */
586: bcopy(etherbroadcastaddr, mac, IEEE80211_ADDR_LEN);
587: ar5k_ar5211_set_associd(hal, mac, 0, 0);
588: ar5k_ar5211_set_opmode(hal);
589: AR5K_REG_WRITE(AR5K_AR5211_PISR, 0xffffffff);
590: AR5K_REG_WRITE(AR5K_AR5211_RSSI_THR, AR5K_TUNE_RSSI_THRES);
591:
592: /*
593: * Set Rx/Tx DMA Configuration
594: */
595: AR5K_REG_WRITE_BITS(AR5K_AR5211_TXCFG, AR5K_AR5211_TXCFG_SDMAMR,
596: AR5K_AR5211_DMASIZE_512B | AR5K_AR5211_TXCFG_DMASIZE);
597: AR5K_REG_WRITE_BITS(AR5K_AR5211_RXCFG, AR5K_AR5211_RXCFG_SDMAMW,
598: AR5K_AR5211_DMASIZE_512B);
599:
600: /*
601: * Set channel and calibrate the PHY
602: */
603: if (ar5k_channel(hal, channel) == AH_FALSE)
604: return (AH_FALSE);
605:
606: /*
607: * Enable the PHY and wait until completion
608: */
609: AR5K_REG_WRITE(AR5K_AR5211_PHY_ACTIVE, AR5K_AR5211_PHY_ENABLE);
610:
611: data = AR5K_REG_READ(AR5K_AR5211_PHY_RX_DELAY) &
612: AR5K_AR5211_PHY_RX_DELAY_M;
613: data = (channel->c_channel_flags & IEEE80211_CHAN_CCK) ?
614: ((data << 2) / 22) : (data / 10);
615:
616: AR5K_DELAY(100 + data);
617:
618: /*
619: * Start calibration
620: */
621: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_AGCCTL,
622: AR5K_AR5211_PHY_AGCCTL_NF |
623: AR5K_AR5211_PHY_AGCCTL_CAL);
624:
625: if (channel->c_channel_flags & IEEE80211_CHAN_B) {
626: hal->ah_calibration = AH_FALSE;
627: } else {
628: hal->ah_calibration = AH_TRUE;
629: AR5K_REG_WRITE_BITS(AR5K_AR5211_PHY_IQ,
630: AR5K_AR5211_PHY_IQ_CAL_NUM_LOG_MAX, 15);
631: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_IQ,
632: AR5K_AR5211_PHY_IQ_RUN);
633: }
634:
635: /*
636: * Reset queues and start beacon timers at the end of the reset routine
637: */
638: for (i = 0; i < hal->ah_capabilities.cap_queues.q_tx_num; i++) {
639: AR5K_REG_WRITE_Q(AR5K_AR5211_DCU_QCUMASK(i), i);
640: if (ar5k_ar5211_reset_tx_queue(hal, i) == AH_FALSE) {
641: AR5K_PRINTF("failed to reset TX queue #%d\n", i);
642: return (AH_FALSE);
643: }
644: }
645:
646: /* Pre-enable interrupts */
647: ar5k_ar5211_set_intr(hal, HAL_INT_RX | HAL_INT_TX | HAL_INT_FATAL);
648:
649: /*
650: * Set RF kill flags if supported by the device (read from the EEPROM)
651: */
652: if (AR5K_EEPROM_HDR_RFKILL(hal->ah_capabilities.cap_eeprom.ee_header)) {
653: ar5k_ar5211_set_gpio_input(hal, 0);
654: if ((hal->ah_gpio[0] = ar5k_ar5211_get_gpio(hal, 0)) == 0)
655: ar5k_ar5211_set_gpio_intr(hal, 0, 1);
656: else
657: ar5k_ar5211_set_gpio_intr(hal, 0, 0);
658: }
659:
660: /*
661: * Disable beacons and reset the register
662: */
663: AR5K_REG_DISABLE_BITS(AR5K_AR5211_BEACON,
664: AR5K_AR5211_BEACON_ENABLE | AR5K_AR5211_BEACON_RESET_TSF);
665:
666: return (AH_TRUE);
667: }
668:
669: void
670: ar5k_ar5211_set_def_antenna(struct ath_hal *hal, u_int ant)
671: {
672: AR5K_REG_WRITE(AR5K_AR5211_DEFAULT_ANTENNA, ant);
673: }
674:
675: u_int
676: ar5k_ar5211_get_def_antenna(struct ath_hal *hal)
677: {
678: return AR5K_REG_READ(AR5K_AR5211_DEFAULT_ANTENNA);
679: }
680:
681: void
682: ar5k_ar5211_set_opmode(struct ath_hal *hal)
683: {
684: u_int32_t pcu_reg, low_id, high_id;
685:
686: pcu_reg = 0;
687:
688: switch (hal->ah_op_mode) {
689: case IEEE80211_M_IBSS:
690: pcu_reg |= AR5K_AR5211_STA_ID1_ADHOC |
691: AR5K_AR5211_STA_ID1_DESC_ANTENNA;
692: break;
693:
694: case IEEE80211_M_HOSTAP:
695: pcu_reg |= AR5K_AR5211_STA_ID1_AP |
696: AR5K_AR5211_STA_ID1_RTS_DEFAULT_ANTENNA;
697: break;
698:
699: case IEEE80211_M_STA:
700: case IEEE80211_M_MONITOR:
701: pcu_reg |= AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA;
702: break;
703:
704: default:
705: return;
706: }
707:
708: /*
709: * Set PCU registers
710: */
711: low_id = AR5K_LOW_ID(hal->ah_sta_id);
712: high_id = AR5K_HIGH_ID(hal->ah_sta_id);
713: AR5K_REG_WRITE(AR5K_AR5211_STA_ID0, low_id);
714: AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, pcu_reg | high_id);
715:
716: return;
717: }
718:
719: HAL_BOOL
720: ar5k_ar5211_calibrate(struct ath_hal *hal, HAL_CHANNEL *channel)
721: {
722: u_int32_t i_pwr, q_pwr;
723: int32_t iq_corr, i_coff, i_coffd, q_coff, q_coffd;
724:
725: if (hal->ah_calibration == AH_FALSE ||
726: AR5K_REG_READ(AR5K_AR5211_PHY_IQ) & AR5K_AR5211_PHY_IQ_RUN)
727: goto done;
728:
729: hal->ah_calibration = AH_FALSE;
730:
731: iq_corr = AR5K_REG_READ(AR5K_AR5211_PHY_IQRES_CAL_CORR);
732: i_pwr = AR5K_REG_READ(AR5K_AR5211_PHY_IQRES_CAL_PWR_I);
733: q_pwr = AR5K_REG_READ(AR5K_AR5211_PHY_IQRES_CAL_PWR_Q);
734: i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7;
735: q_coffd = q_pwr >> 6;
736:
737: if (i_coffd == 0 || q_coffd == 0)
738: goto done;
739:
740: i_coff = ((-iq_corr) / i_coffd) & 0x3f;
741: q_coff = (((int32_t)i_pwr / q_coffd) - 64) & 0x1f;
742:
743: /* Commit new IQ value */
744: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_IQ,
745: AR5K_AR5211_PHY_IQ_CORR_ENABLE |
746: ((u_int32_t)q_coff) |
747: ((u_int32_t)i_coff << AR5K_AR5211_PHY_IQ_CORR_Q_I_COFF_S));
748:
749: done:
750: /* Start noise floor calibration */
751: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_AGCCTL,
752: AR5K_AR5211_PHY_AGCCTL_NF);
753:
754: return (AH_TRUE);
755: }
756:
757: /*
758: * Transmit functions
759: */
760:
761: HAL_BOOL
762: ar5k_ar5211_update_tx_triglevel(struct ath_hal *hal, HAL_BOOL increase)
763: {
764: u_int32_t trigger_level, imr;
765: HAL_BOOL status = AH_FALSE;
766:
767: /*
768: * Disable interrupts by setting the mask
769: */
770: imr = ar5k_ar5211_set_intr(hal, hal->ah_imr & ~HAL_INT_GLOBAL);
771:
772: trigger_level = AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TXCFG),
773: AR5K_AR5211_TXCFG_TXFULL);
774:
775: if (increase == AH_FALSE) {
776: if (--trigger_level < AR5K_TUNE_MIN_TX_FIFO_THRES)
777: goto done;
778: } else
779: trigger_level +=
780: ((AR5K_TUNE_MAX_TX_FIFO_THRES - trigger_level) / 2);
781:
782: /*
783: * Update trigger level on success
784: */
785: AR5K_REG_WRITE_BITS(AR5K_AR5211_TXCFG,
786: AR5K_AR5211_TXCFG_TXFULL, trigger_level);
787: status = AH_TRUE;
788:
789: done:
790: /*
791: * Restore interrupt mask
792: */
793: ar5k_ar5211_set_intr(hal, imr);
794:
795: return (status);
796: }
797:
798: int
799: ar5k_ar5211_setup_tx_queue(struct ath_hal *hal, HAL_TX_QUEUE queue_type,
800: const HAL_TXQ_INFO *queue_info)
801: {
802: u_int queue;
803:
804: /*
805: * Get queue by type
806: */
807: if (queue_type == HAL_TX_QUEUE_DATA) {
808: for (queue = HAL_TX_QUEUE_ID_DATA_MIN;
809: hal->ah_txq[queue].tqi_type != HAL_TX_QUEUE_INACTIVE;
810: queue++)
811: if (queue > HAL_TX_QUEUE_ID_DATA_MAX)
812: return (-1);
813: } else if (queue_type == HAL_TX_QUEUE_PSPOLL) {
814: queue = HAL_TX_QUEUE_ID_PSPOLL;
815: } else if (queue_type == HAL_TX_QUEUE_BEACON) {
816: queue = HAL_TX_QUEUE_ID_BEACON;
817: } else if (queue_type == HAL_TX_QUEUE_CAB) {
818: queue = HAL_TX_QUEUE_ID_CAB;
819: } else
820: return (-1);
821:
822: /*
823: * Setup internal queue structure
824: */
825: bzero(&hal->ah_txq[queue], sizeof(HAL_TXQ_INFO));
826: hal->ah_txq[queue].tqi_type = queue_type;
827:
828: if (queue_info != NULL) {
829: if (ar5k_ar5211_setup_tx_queueprops(hal, queue, queue_info)
830: != AH_TRUE)
831: return (-1);
832: }
833:
834: AR5K_Q_ENABLE_BITS(hal->ah_txq_interrupts, queue);
835:
836: return (queue);
837: }
838:
839: HAL_BOOL
840: ar5k_ar5211_setup_tx_queueprops(struct ath_hal *hal, int queue,
841: const HAL_TXQ_INFO *queue_info)
842: {
843: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
844:
845: if (hal->ah_txq[queue].tqi_type == HAL_TX_QUEUE_INACTIVE)
846: return (AH_FALSE);
847:
848: bcopy(queue_info, &hal->ah_txq[queue], sizeof(HAL_TXQ_INFO));
849:
850: if (queue_info->tqi_type == HAL_TX_QUEUE_DATA &&
851: (queue_info->tqi_subtype >= HAL_WME_AC_VI) &&
852: (queue_info->tqi_subtype <= HAL_WME_UPSD))
853: hal->ah_txq[queue].tqi_flags |=
854: AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS;
855:
856: return (AH_TRUE);
857: }
858:
859: HAL_BOOL
860: ar5k_ar5211_get_tx_queueprops(struct ath_hal *hal, int queue,
861: HAL_TXQ_INFO *queue_info)
862: {
863: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
864: bcopy(&hal->ah_txq[queue], queue_info, sizeof(HAL_TXQ_INFO));
865: return (AH_TRUE);
866: }
867:
868: HAL_BOOL
869: ar5k_ar5211_release_tx_queue(struct ath_hal *hal, u_int queue)
870: {
871: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
872:
873: /* This queue will be skipped in further operations */
874: hal->ah_txq[queue].tqi_type = HAL_TX_QUEUE_INACTIVE;
875: AR5K_Q_DISABLE_BITS(hal->ah_txq_interrupts, queue);
876:
877: return (AH_FALSE);
878: }
879:
880: HAL_BOOL
881: ar5k_ar5211_reset_tx_queue(struct ath_hal *hal, u_int queue)
882: {
883: u_int32_t cw_min, cw_max, retry_lg, retry_sh;
884: struct ieee80211_channel *channel = (struct ieee80211_channel*)
885: &hal->ah_current_channel;
886: HAL_TXQ_INFO *tq;
887:
888: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
889:
890: tq = &hal->ah_txq[queue];
891:
892: if (tq->tqi_type == HAL_TX_QUEUE_INACTIVE)
893: return (AH_TRUE);
894:
895: /*
896: * Set registers by channel mode
897: */
898: if (IEEE80211_IS_CHAN_B(channel)) {
899: hal->ah_cw_min = AR5K_TUNE_CWMIN_11B;
900: cw_max = hal->ah_cw_max = AR5K_TUNE_CWMAX_11B;
901: hal->ah_aifs = AR5K_TUNE_AIFS_11B;
902: } else {
903: hal->ah_cw_min = AR5K_TUNE_CWMIN;
904: cw_max = hal->ah_cw_max = AR5K_TUNE_CWMAX;
905: hal->ah_aifs = AR5K_TUNE_AIFS;
906: }
907:
908: /*
909: * Set retry limits
910: */
911: if (hal->ah_software_retry == AH_TRUE) {
912: /* XXX Need to test this */
913: retry_lg = hal->ah_limit_tx_retries;
914: retry_sh = retry_lg =
915: retry_lg > AR5K_AR5211_DCU_RETRY_LMT_SH_RETRY ?
916: AR5K_AR5211_DCU_RETRY_LMT_SH_RETRY : retry_lg;
917: } else {
918: retry_lg = AR5K_INIT_LG_RETRY;
919: retry_sh = AR5K_INIT_SH_RETRY;
920: }
921:
922: AR5K_REG_WRITE(AR5K_AR5211_DCU_RETRY_LMT(queue),
923: AR5K_REG_SM(AR5K_INIT_SLG_RETRY,
924: AR5K_AR5211_DCU_RETRY_LMT_SLG_RETRY) |
925: AR5K_REG_SM(AR5K_INIT_SSH_RETRY,
926: AR5K_AR5211_DCU_RETRY_LMT_SSH_RETRY) |
927: AR5K_REG_SM(retry_lg, AR5K_AR5211_DCU_RETRY_LMT_LG_RETRY) |
928: AR5K_REG_SM(retry_sh, AR5K_AR5211_DCU_RETRY_LMT_SH_RETRY));
929:
930: /*
931: * Set initial content window (cw_min/cw_max)
932: */
933: cw_min = 1;
934: while (cw_min < hal->ah_cw_min)
935: cw_min = (cw_min << 1) | 1;
936:
937: cw_min = tq->tqi_cw_min < 0 ?
938: (cw_min >> (-tq->tqi_cw_min)) :
939: ((cw_min << tq->tqi_cw_min) + (1 << tq->tqi_cw_min) - 1);
940: cw_max = tq->tqi_cw_max < 0 ?
941: (cw_max >> (-tq->tqi_cw_max)) :
942: ((cw_max << tq->tqi_cw_max) + (1 << tq->tqi_cw_max) - 1);
943:
944: AR5K_REG_WRITE(AR5K_AR5211_DCU_LCL_IFS(queue),
945: AR5K_REG_SM(cw_min, AR5K_AR5211_DCU_LCL_IFS_CW_MIN) |
946: AR5K_REG_SM(cw_max, AR5K_AR5211_DCU_LCL_IFS_CW_MAX) |
947: AR5K_REG_SM(hal->ah_aifs + tq->tqi_aifs,
948: AR5K_AR5211_DCU_LCL_IFS_AIFS));
949:
950: /*
951: * Set misc registers
952: */
953: AR5K_REG_WRITE(AR5K_AR5211_QCU_MISC(queue),
954: AR5K_AR5211_QCU_MISC_DCU_EARLY);
955:
956: if (tq->tqi_cbr_period) {
957: AR5K_REG_WRITE(AR5K_AR5211_QCU_CBRCFG(queue),
958: AR5K_REG_SM(tq->tqi_cbr_period,
959: AR5K_AR5211_QCU_CBRCFG_INTVAL) |
960: AR5K_REG_SM(tq->tqi_cbr_overflow_limit,
961: AR5K_AR5211_QCU_CBRCFG_ORN_THRES));
962: AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
963: AR5K_AR5211_QCU_MISC_FRSHED_CBR);
964: if (tq->tqi_cbr_overflow_limit)
965: AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
966: AR5K_AR5211_QCU_MISC_CBR_THRES_ENABLE);
967: }
968:
969: if (tq->tqi_ready_time) {
970: AR5K_REG_WRITE(AR5K_AR5211_QCU_RDYTIMECFG(queue),
971: AR5K_REG_SM(tq->tqi_ready_time,
972: AR5K_AR5211_QCU_RDYTIMECFG_INTVAL) |
973: AR5K_AR5211_QCU_RDYTIMECFG_ENABLE);
974: }
975:
976: if (tq->tqi_burst_time) {
977: AR5K_REG_WRITE(AR5K_AR5211_DCU_CHAN_TIME(queue),
978: AR5K_REG_SM(tq->tqi_burst_time,
979: AR5K_AR5211_DCU_CHAN_TIME_DUR) |
980: AR5K_AR5211_DCU_CHAN_TIME_ENABLE);
981:
982: if (tq->tqi_flags & AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE) {
983: AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
984: AR5K_AR5211_QCU_MISC_TXE);
985: }
986: }
987:
988: if (tq->tqi_flags & AR5K_TXQ_FLAG_BACKOFF_DISABLE) {
989: AR5K_REG_WRITE(AR5K_AR5211_DCU_MISC(queue),
990: AR5K_AR5211_DCU_MISC_POST_FR_BKOFF_DIS);
991: }
992:
993: if (tq->tqi_flags & AR5K_TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) {
994: AR5K_REG_WRITE(AR5K_AR5211_DCU_MISC(queue),
995: AR5K_AR5211_DCU_MISC_BACKOFF_FRAG);
996: }
997:
998: /*
999: * Set registers by queue type
1000: */
1001: switch (tq->tqi_type) {
1002: case HAL_TX_QUEUE_BEACON:
1003: AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
1004: AR5K_AR5211_QCU_MISC_FRSHED_DBA_GT |
1005: AR5K_AR5211_QCU_MISC_CBREXP_BCN |
1006: AR5K_AR5211_QCU_MISC_BCN_ENABLE);
1007:
1008: AR5K_REG_ENABLE_BITS(AR5K_AR5211_DCU_MISC(queue),
1009: (AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL <<
1010: AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL) |
1011: AR5K_AR5211_DCU_MISC_POST_FR_BKOFF_DIS |
1012: AR5K_AR5211_DCU_MISC_BCN_ENABLE);
1013:
1014: AR5K_REG_WRITE(AR5K_AR5211_QCU_RDYTIMECFG(queue),
1015: ((AR5K_TUNE_BEACON_INTERVAL -
1016: (AR5K_TUNE_SW_BEACON_RESP - AR5K_TUNE_DMA_BEACON_RESP) -
1017: AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF) * 1024) |
1018: AR5K_AR5211_QCU_RDYTIMECFG_ENABLE);
1019: break;
1020:
1021: case HAL_TX_QUEUE_CAB:
1022: AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
1023: AR5K_AR5211_QCU_MISC_FRSHED_DBA_GT |
1024: AR5K_AR5211_QCU_MISC_CBREXP |
1025: AR5K_AR5211_QCU_MISC_CBREXP_BCN);
1026:
1027: AR5K_REG_ENABLE_BITS(AR5K_AR5211_DCU_MISC(queue),
1028: (AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL <<
1029: AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL));
1030: break;
1031:
1032: case HAL_TX_QUEUE_PSPOLL:
1033: AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
1034: AR5K_AR5211_QCU_MISC_CBREXP);
1035: break;
1036:
1037: case HAL_TX_QUEUE_DATA:
1038: default:
1039: break;
1040: }
1041:
1042: /*
1043: * Enable tx queue in the secondary interrupt mask registers
1044: */
1045: AR5K_REG_WRITE(AR5K_AR5211_SIMR0,
1046: AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR0_QCU_TXOK) |
1047: AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR0_QCU_TXDESC));
1048: AR5K_REG_WRITE(AR5K_AR5211_SIMR1,
1049: AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR1_QCU_TXERR));
1050: AR5K_REG_WRITE(AR5K_AR5211_SIMR2,
1051: AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR2_QCU_TXURN));
1052:
1053: return (AH_TRUE);
1054: }
1055:
1056: u_int32_t
1057: ar5k_ar5211_get_tx_buf(struct ath_hal *hal, u_int queue)
1058: {
1059: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
1060:
1061: /*
1062: * Get the transmit queue descriptor pointer from the selected queue
1063: */
1064: return (AR5K_REG_READ(AR5K_AR5211_QCU_TXDP(queue)));
1065: }
1066:
1067: HAL_BOOL
1068: ar5k_ar5211_put_tx_buf(struct ath_hal *hal, u_int queue, u_int32_t phys_addr)
1069: {
1070: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
1071:
1072: /*
1073: * Set the transmit queue descriptor pointer for the selected queue
1074: * (this won't work if the queue is still active)
1075: */
1076: if (AR5K_REG_READ_Q(AR5K_AR5211_QCU_TXE, queue))
1077: return (AH_FALSE);
1078:
1079: AR5K_REG_WRITE(AR5K_AR5211_QCU_TXDP(queue), phys_addr);
1080:
1081: return (AH_TRUE);
1082: }
1083:
1084: u_int32_t
1085: ar5k_ar5211_num_tx_pending(struct ath_hal *hal, u_int queue)
1086: {
1087: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
1088: return (AR5K_AR5211_QCU_STS(queue) & AR5K_AR5211_QCU_STS_FRMPENDCNT);
1089: }
1090:
1091: HAL_BOOL
1092: ar5k_ar5211_tx_start(struct ath_hal *hal, u_int queue)
1093: {
1094: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
1095:
1096: /* Return if queue is disabled */
1097: if (AR5K_REG_READ_Q(AR5K_AR5211_QCU_TXD, queue))
1098: return (AH_FALSE);
1099:
1100: /* Start queue */
1101: AR5K_REG_WRITE_Q(AR5K_AR5211_QCU_TXE, queue);
1102:
1103: return (AH_TRUE);
1104: }
1105:
1106: HAL_BOOL
1107: ar5k_ar5211_stop_tx_dma(struct ath_hal *hal, u_int queue)
1108: {
1109: int i = 100, pending;
1110:
1111: AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
1112:
1113: /*
1114: * Schedule TX disable and wait until queue is empty
1115: */
1116: AR5K_REG_WRITE_Q(AR5K_AR5211_QCU_TXD, queue);
1117:
1118: do {
1119: pending = AR5K_REG_READ(AR5K_AR5211_QCU_STS(queue)) &
1120: AR5K_AR5211_QCU_STS_FRMPENDCNT;
1121: delay(100);
1122: } while (--i && pending);
1123:
1124: /* Clear register */
1125: AR5K_REG_WRITE(AR5K_AR5211_QCU_TXD, 0);
1126:
1127: return (AH_TRUE);
1128: }
1129:
1130: HAL_BOOL
1131: ar5k_ar5211_setup_tx_desc(struct ath_hal *hal, struct ath_desc *desc,
1132: u_int packet_length, u_int header_length, HAL_PKT_TYPE type, u_int tx_power,
1133: u_int tx_rate0, u_int tx_tries0, u_int key_index, u_int antenna_mode,
1134: u_int flags, u_int rtscts_rate, u_int rtscts_duration)
1135: {
1136: struct ar5k_ar5211_tx_desc *tx_desc;
1137:
1138: tx_desc = (struct ar5k_ar5211_tx_desc*)&desc->ds_ctl0;
1139:
1140: /*
1141: * Validate input
1142: */
1143: if (tx_tries0 == 0)
1144: return (AH_FALSE);
1145:
1146: if ((tx_desc->tx_control_0 = (packet_length &
1147: AR5K_AR5211_DESC_TX_CTL0_FRAME_LEN)) != packet_length)
1148: return (AH_FALSE);
1149:
1150: tx_desc->tx_control_0 |=
1151: AR5K_REG_SM(tx_rate0, AR5K_AR5211_DESC_TX_CTL0_XMIT_RATE) |
1152: AR5K_REG_SM(antenna_mode, AR5K_AR5211_DESC_TX_CTL0_ANT_MODE_XMIT);
1153: tx_desc->tx_control_1 =
1154: AR5K_REG_SM(type, AR5K_AR5211_DESC_TX_CTL1_FRAME_TYPE);
1155:
1156: #define _TX_FLAGS(_c, _flag) \
1157: if (flags & HAL_TXDESC_##_flag) \
1158: tx_desc->tx_control_##_c |= \
1159: AR5K_AR5211_DESC_TX_CTL##_c##_##_flag
1160:
1161: _TX_FLAGS(0, CLRDMASK);
1162: _TX_FLAGS(0, VEOL);
1163: _TX_FLAGS(0, INTREQ);
1164: _TX_FLAGS(0, RTSENA);
1165: _TX_FLAGS(1, NOACK);
1166:
1167: #undef _TX_FLAGS
1168:
1169: /*
1170: * WEP crap
1171: */
1172: if (key_index != HAL_TXKEYIX_INVALID) {
1173: tx_desc->tx_control_0 |=
1174: AR5K_AR5211_DESC_TX_CTL0_ENCRYPT_KEY_VALID;
1175: tx_desc->tx_control_1 |=
1176: AR5K_REG_SM(key_index,
1177: AR5K_AR5211_DESC_TX_CTL1_ENCRYPT_KEY_INDEX);
1178: }
1179:
1180: return (AH_TRUE);
1181: }
1182:
1183: HAL_BOOL
1184: ar5k_ar5211_fill_tx_desc(struct ath_hal *hal, struct ath_desc *desc,
1185: u_int segment_length, HAL_BOOL first_segment, HAL_BOOL last_segment)
1186: {
1187: struct ar5k_ar5211_tx_desc *tx_desc;
1188:
1189: tx_desc = (struct ar5k_ar5211_tx_desc*)&desc->ds_ctl0;
1190:
1191: /* Clear status descriptor */
1192: bzero(desc->ds_hw, sizeof(desc->ds_hw));
1193:
1194: /* Validate segment length and initialize the descriptor */
1195: if ((tx_desc->tx_control_1 = (segment_length &
1196: AR5K_AR5211_DESC_TX_CTL1_BUF_LEN)) != segment_length)
1197: return (AH_FALSE);
1198:
1199: if (first_segment != AH_TRUE)
1200: tx_desc->tx_control_0 &= ~AR5K_AR5211_DESC_TX_CTL0_FRAME_LEN;
1201:
1202: if (last_segment != AH_TRUE)
1203: tx_desc->tx_control_1 |= AR5K_AR5211_DESC_TX_CTL1_MORE;
1204:
1205: return (AH_TRUE);
1206: }
1207:
1208: HAL_BOOL
1209: ar5k_ar5211_setup_xtx_desc(struct ath_hal *hal, struct ath_desc *desc,
1210: u_int tx_rate1, u_int tx_tries1, u_int tx_rate2, u_int tx_tries2,
1211: u_int tx_rate3, u_int tx_tries3)
1212: {
1213: return (AH_FALSE);
1214: }
1215:
1216: HAL_STATUS
1217: ar5k_ar5211_proc_tx_desc(struct ath_hal *hal, struct ath_desc *desc)
1218: {
1219: struct ar5k_ar5211_tx_status *tx_status;
1220: struct ar5k_ar5211_tx_desc *tx_desc;
1221:
1222: tx_desc = (struct ar5k_ar5211_tx_desc*)&desc->ds_ctl0;
1223: tx_status = (struct ar5k_ar5211_tx_status*)&desc->ds_hw[0];
1224:
1225: /* No frame has been send or error */
1226: if ((tx_status->tx_status_1 & AR5K_AR5211_DESC_TX_STATUS1_DONE) == 0)
1227: return (HAL_EINPROGRESS);
1228:
1229: /*
1230: * Get descriptor status
1231: */
1232: desc->ds_us.tx.ts_tstamp =
1233: AR5K_REG_MS(tx_status->tx_status_0,
1234: AR5K_AR5211_DESC_TX_STATUS0_SEND_TIMESTAMP);
1235: desc->ds_us.tx.ts_shortretry =
1236: AR5K_REG_MS(tx_status->tx_status_0,
1237: AR5K_AR5211_DESC_TX_STATUS0_RTS_FAIL_COUNT);
1238: desc->ds_us.tx.ts_longretry =
1239: AR5K_REG_MS(tx_status->tx_status_0,
1240: AR5K_AR5211_DESC_TX_STATUS0_DATA_FAIL_COUNT);
1241: desc->ds_us.tx.ts_seqnum =
1242: AR5K_REG_MS(tx_status->tx_status_1,
1243: AR5K_AR5211_DESC_TX_STATUS1_SEQ_NUM);
1244: desc->ds_us.tx.ts_rssi =
1245: AR5K_REG_MS(tx_status->tx_status_1,
1246: AR5K_AR5211_DESC_TX_STATUS1_ACK_SIG_STRENGTH);
1247: desc->ds_us.tx.ts_antenna = 1;
1248: desc->ds_us.tx.ts_status = 0;
1249: desc->ds_us.tx.ts_rate =
1250: AR5K_REG_MS(tx_desc->tx_control_0,
1251: AR5K_AR5211_DESC_TX_CTL0_XMIT_RATE);
1252:
1253: if ((tx_status->tx_status_0 &
1254: AR5K_AR5211_DESC_TX_STATUS0_FRAME_XMIT_OK) == 0) {
1255: if (tx_status->tx_status_0 &
1256: AR5K_AR5211_DESC_TX_STATUS0_EXCESSIVE_RETRIES)
1257: desc->ds_us.tx.ts_status |= HAL_TXERR_XRETRY;
1258:
1259: if (tx_status->tx_status_0 &
1260: AR5K_AR5211_DESC_TX_STATUS0_FIFO_UNDERRUN)
1261: desc->ds_us.tx.ts_status |= HAL_TXERR_FIFO;
1262:
1263: if (tx_status->tx_status_0 &
1264: AR5K_AR5211_DESC_TX_STATUS0_FILTERED)
1265: desc->ds_us.tx.ts_status |= HAL_TXERR_FILT;
1266: }
1267:
1268: return (HAL_OK);
1269: }
1270:
1271: HAL_BOOL
1272: ar5k_ar5211_has_veol(struct ath_hal *hal)
1273: {
1274: return (AH_TRUE);
1275: }
1276:
1277: /*
1278: * Receive functions
1279: */
1280:
1281: u_int32_t
1282: ar5k_ar5211_get_rx_buf(struct ath_hal *hal)
1283: {
1284: return (AR5K_REG_READ(AR5K_AR5211_RXDP));
1285: }
1286:
1287: void
1288: ar5k_ar5211_put_rx_buf(struct ath_hal *hal, u_int32_t phys_addr)
1289: {
1290: AR5K_REG_WRITE(AR5K_AR5211_RXDP, phys_addr);
1291: }
1292:
1293: void
1294: ar5k_ar5211_start_rx(struct ath_hal *hal)
1295: {
1296: AR5K_REG_WRITE(AR5K_AR5211_CR, AR5K_AR5211_CR_RXE);
1297: }
1298:
1299: HAL_BOOL
1300: ar5k_ar5211_stop_rx_dma(struct ath_hal *hal)
1301: {
1302: int i;
1303:
1304: AR5K_REG_WRITE(AR5K_AR5211_CR, AR5K_AR5211_CR_RXD);
1305:
1306: /*
1307: * It may take some time to disable the DMA receive unit
1308: */
1309: for (i = 2000;
1310: i > 0 && (AR5K_REG_READ(AR5K_AR5211_CR) & AR5K_AR5211_CR_RXE) != 0;
1311: i--)
1312: AR5K_DELAY(10);
1313:
1314: return (i > 0 ? AH_TRUE : AH_FALSE);
1315: }
1316:
1317: void
1318: ar5k_ar5211_start_rx_pcu(struct ath_hal *hal)
1319: {
1320: AR5K_REG_DISABLE_BITS(AR5K_AR5211_DIAG_SW, AR5K_AR5211_DIAG_SW_DIS_RX);
1321: }
1322:
1323: void
1324: ar5k_ar5211_stop_pcu_recv(struct ath_hal *hal)
1325: {
1326: AR5K_REG_ENABLE_BITS(AR5K_AR5211_DIAG_SW, AR5K_AR5211_DIAG_SW_DIS_RX);
1327: }
1328:
1329: void
1330: ar5k_ar5211_set_mcast_filter(struct ath_hal *hal, u_int32_t filter0,
1331: u_int32_t filter1)
1332: {
1333: /* Set the multicat filter */
1334: AR5K_REG_WRITE(AR5K_AR5211_MCAST_FIL0, filter0);
1335: AR5K_REG_WRITE(AR5K_AR5211_MCAST_FIL1, filter1);
1336: }
1337:
1338: HAL_BOOL
1339: ar5k_ar5211_set_mcast_filterindex(struct ath_hal *hal, u_int32_t index)
1340: {
1341: if (index >= 64) {
1342: return (AH_FALSE);
1343: } else if (index >= 32) {
1344: AR5K_REG_ENABLE_BITS(AR5K_AR5211_MCAST_FIL1,
1345: (1 << (index - 32)));
1346: } else {
1347: AR5K_REG_ENABLE_BITS(AR5K_AR5211_MCAST_FIL0,
1348: (1 << index));
1349: }
1350:
1351: return (AH_TRUE);
1352: }
1353:
1354: HAL_BOOL
1355: ar5k_ar5211_clear_mcast_filter_idx(struct ath_hal *hal, u_int32_t index)
1356: {
1357:
1358: if (index >= 64) {
1359: return (AH_FALSE);
1360: } else if (index >= 32) {
1361: AR5K_REG_DISABLE_BITS(AR5K_AR5211_MCAST_FIL1,
1362: (1 << (index - 32)));
1363: } else {
1364: AR5K_REG_DISABLE_BITS(AR5K_AR5211_MCAST_FIL0,
1365: (1 << index));
1366: }
1367:
1368: return (AH_TRUE);
1369: }
1370:
1371: u_int32_t
1372: ar5k_ar5211_get_rx_filter(struct ath_hal *hal)
1373: {
1374: return (AR5K_REG_READ(AR5K_AR5211_RX_FILTER));
1375: }
1376:
1377: void
1378: ar5k_ar5211_set_rx_filter(struct ath_hal *hal, u_int32_t filter)
1379: {
1380: AR5K_REG_WRITE(AR5K_AR5211_RX_FILTER, filter);
1381: }
1382:
1383: HAL_BOOL
1384: ar5k_ar5211_setup_rx_desc(struct ath_hal *hal, struct ath_desc *desc,
1385: u_int32_t size, u_int flags)
1386: {
1387: struct ar5k_ar5211_rx_desc *rx_desc;
1388:
1389: rx_desc = (struct ar5k_ar5211_rx_desc*)&desc->ds_ctl0;
1390:
1391: if ((rx_desc->rx_control_1 = (size &
1392: AR5K_AR5211_DESC_RX_CTL1_BUF_LEN)) != size)
1393: return (AH_FALSE);
1394:
1395: if (flags & HAL_RXDESC_INTREQ)
1396: rx_desc->rx_control_1 |= AR5K_AR5211_DESC_RX_CTL1_INTREQ;
1397:
1398: return (AH_TRUE);
1399: }
1400:
1401: HAL_STATUS
1402: ar5k_ar5211_proc_rx_desc(struct ath_hal *hal, struct ath_desc *desc,
1403: u_int32_t phys_addr, struct ath_desc *next)
1404: {
1405: struct ar5k_ar5211_rx_status *rx_status;
1406:
1407: rx_status = (struct ar5k_ar5211_rx_status*)&desc->ds_hw[0];
1408:
1409: /* No frame received / not ready */
1410: if ((rx_status->rx_status_1 & AR5K_AR5211_DESC_RX_STATUS1_DONE) == 0)
1411: return (HAL_EINPROGRESS);
1412:
1413: /*
1414: * Frame receive status
1415: */
1416: desc->ds_us.rx.rs_datalen = rx_status->rx_status_0 &
1417: AR5K_AR5211_DESC_RX_STATUS0_DATA_LEN;
1418: desc->ds_us.rx.rs_rssi =
1419: AR5K_REG_MS(rx_status->rx_status_0,
1420: AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_SIGNAL);
1421: desc->ds_us.rx.rs_rate =
1422: AR5K_REG_MS(rx_status->rx_status_0,
1423: AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_RATE);
1424: desc->ds_us.rx.rs_antenna = rx_status->rx_status_0 &
1425: AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_ANTENNA;
1426: desc->ds_us.rx.rs_more = rx_status->rx_status_0 &
1427: AR5K_AR5211_DESC_RX_STATUS0_MORE;
1428: desc->ds_us.rx.rs_tstamp =
1429: AR5K_REG_MS(rx_status->rx_status_1,
1430: AR5K_AR5211_DESC_RX_STATUS1_RECEIVE_TIMESTAMP);
1431: desc->ds_us.rx.rs_status = 0;
1432:
1433: /*
1434: * Key table status
1435: */
1436: if (rx_status->rx_status_1 &
1437: AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX_VALID) {
1438: desc->ds_us.rx.rs_keyix =
1439: AR5K_REG_MS(rx_status->rx_status_1,
1440: AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX);
1441: } else {
1442: desc->ds_us.rx.rs_keyix = HAL_RXKEYIX_INVALID;
1443: }
1444:
1445: /*
1446: * Receive/descriptor errors
1447: */
1448: if ((rx_status->rx_status_1 &
1449: AR5K_AR5211_DESC_RX_STATUS1_FRAME_RECEIVE_OK) == 0) {
1450: if (rx_status->rx_status_1 &
1451: AR5K_AR5211_DESC_RX_STATUS1_CRC_ERROR)
1452: desc->ds_us.rx.rs_status |= HAL_RXERR_CRC;
1453:
1454: if (rx_status->rx_status_1 &
1455: AR5K_AR5211_DESC_RX_STATUS1_PHY_ERROR) {
1456: desc->ds_us.rx.rs_status |= HAL_RXERR_PHY;
1457: desc->ds_us.rx.rs_phyerr =
1458: AR5K_REG_MS(rx_status->rx_status_1,
1459: AR5K_AR5211_DESC_RX_STATUS1_PHY_ERROR);
1460: }
1461:
1462: if (rx_status->rx_status_1 &
1463: AR5K_AR5211_DESC_RX_STATUS1_DECRYPT_CRC_ERROR)
1464: desc->ds_us.rx.rs_status |= HAL_RXERR_DECRYPT;
1465: }
1466:
1467: return (HAL_OK);
1468: }
1469:
1470: void
1471: ar5k_ar5211_set_rx_signal(struct ath_hal *hal)
1472: {
1473: /* Signal state monitoring is not yet supported */
1474: }
1475:
1476: /*
1477: * Misc functions
1478: */
1479:
1480: void
1481: ar5k_ar5211_dump_state(struct ath_hal *hal)
1482: {
1483: #ifdef AR5K_DEBUG
1484: #define AR5K_PRINT_REGISTER(_x) \
1485: printf("(%s: %08x) ", #_x, AR5K_REG_READ(AR5K_AR5211_##_x));
1486:
1487: printf("MAC registers:\n");
1488: AR5K_PRINT_REGISTER(CR);
1489: AR5K_PRINT_REGISTER(CFG);
1490: AR5K_PRINT_REGISTER(IER);
1491: AR5K_PRINT_REGISTER(RTSD0);
1492: AR5K_PRINT_REGISTER(TXCFG);
1493: AR5K_PRINT_REGISTER(RXCFG);
1494: AR5K_PRINT_REGISTER(RXJLA);
1495: AR5K_PRINT_REGISTER(MIBC);
1496: AR5K_PRINT_REGISTER(TOPS);
1497: AR5K_PRINT_REGISTER(RXNOFRM);
1498: AR5K_PRINT_REGISTER(RPGTO);
1499: AR5K_PRINT_REGISTER(RFCNT);
1500: AR5K_PRINT_REGISTER(MISC);
1501: AR5K_PRINT_REGISTER(PISR);
1502: AR5K_PRINT_REGISTER(SISR0);
1503: AR5K_PRINT_REGISTER(SISR1);
1504: AR5K_PRINT_REGISTER(SISR3);
1505: AR5K_PRINT_REGISTER(SISR4);
1506: AR5K_PRINT_REGISTER(QCU_TXE);
1507: AR5K_PRINT_REGISTER(QCU_TXD);
1508: AR5K_PRINT_REGISTER(DCU_GBL_IFS_SIFS);
1509: AR5K_PRINT_REGISTER(DCU_GBL_IFS_SLOT);
1510: AR5K_PRINT_REGISTER(DCU_FP);
1511: AR5K_PRINT_REGISTER(DCU_TXP);
1512: AR5K_PRINT_REGISTER(DCU_TX_FILTER);
1513: AR5K_PRINT_REGISTER(RC);
1514: AR5K_PRINT_REGISTER(SCR);
1515: AR5K_PRINT_REGISTER(INTPEND);
1516: AR5K_PRINT_REGISTER(PCICFG);
1517: AR5K_PRINT_REGISTER(GPIOCR);
1518: AR5K_PRINT_REGISTER(GPIODO);
1519: AR5K_PRINT_REGISTER(SREV);
1520: AR5K_PRINT_REGISTER(EEPROM_BASE);
1521: AR5K_PRINT_REGISTER(EEPROM_DATA);
1522: AR5K_PRINT_REGISTER(EEPROM_CMD);
1523: AR5K_PRINT_REGISTER(EEPROM_CFG);
1524: AR5K_PRINT_REGISTER(PCU_MIN);
1525: AR5K_PRINT_REGISTER(STA_ID0);
1526: AR5K_PRINT_REGISTER(STA_ID1);
1527: AR5K_PRINT_REGISTER(BSS_ID0);
1528: AR5K_PRINT_REGISTER(SLOT_TIME);
1529: AR5K_PRINT_REGISTER(TIME_OUT);
1530: AR5K_PRINT_REGISTER(RSSI_THR);
1531: AR5K_PRINT_REGISTER(BEACON);
1532: AR5K_PRINT_REGISTER(CFP_PERIOD);
1533: AR5K_PRINT_REGISTER(TIMER0);
1534: AR5K_PRINT_REGISTER(TIMER2);
1535: AR5K_PRINT_REGISTER(TIMER3);
1536: AR5K_PRINT_REGISTER(CFP_DUR);
1537: AR5K_PRINT_REGISTER(MCAST_FIL0);
1538: AR5K_PRINT_REGISTER(MCAST_FIL1);
1539: AR5K_PRINT_REGISTER(DIAG_SW);
1540: AR5K_PRINT_REGISTER(TSF_U32);
1541: AR5K_PRINT_REGISTER(ADDAC_TEST);
1542: AR5K_PRINT_REGISTER(DEFAULT_ANTENNA);
1543: AR5K_PRINT_REGISTER(LAST_TSTP);
1544: AR5K_PRINT_REGISTER(NAV);
1545: AR5K_PRINT_REGISTER(RTS_OK);
1546: AR5K_PRINT_REGISTER(ACK_FAIL);
1547: AR5K_PRINT_REGISTER(FCS_FAIL);
1548: AR5K_PRINT_REGISTER(BEACON_CNT);
1549: AR5K_PRINT_REGISTER(KEYTABLE_0);
1550: printf("\n");
1551:
1552: printf("PHY registers:\n");
1553: AR5K_PRINT_REGISTER(PHY_TURBO);
1554: AR5K_PRINT_REGISTER(PHY_AGC);
1555: AR5K_PRINT_REGISTER(PHY_CHIP_ID);
1556: AR5K_PRINT_REGISTER(PHY_AGCCTL);
1557: AR5K_PRINT_REGISTER(PHY_NF);
1558: AR5K_PRINT_REGISTER(PHY_RX_DELAY);
1559: AR5K_PRINT_REGISTER(PHY_IQ);
1560: AR5K_PRINT_REGISTER(PHY_PAPD_PROBE);
1561: AR5K_PRINT_REGISTER(PHY_FC);
1562: AR5K_PRINT_REGISTER(PHY_RADAR);
1563: AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_0);
1564: AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_1);
1565: printf("\n");
1566: #endif
1567: }
1568:
1569: HAL_BOOL
1570: ar5k_ar5211_get_diag_state(struct ath_hal *hal, int id, void **device,
1571: u_int *size)
1572: {
1573: /*
1574: * We'll ignore this right now. This seems to be some kind of an obscure
1575: * debugging interface for the binary-only HAL.
1576: */
1577: return (AH_FALSE);
1578: }
1579:
1580: void
1581: ar5k_ar5211_get_lladdr(struct ath_hal *hal, u_int8_t *mac)
1582: {
1583: bcopy(hal->ah_sta_id, mac, IEEE80211_ADDR_LEN);
1584: }
1585:
1586: HAL_BOOL
1587: ar5k_ar5211_set_lladdr(struct ath_hal *hal, const u_int8_t *mac)
1588: {
1589: u_int32_t low_id, high_id;
1590:
1591: /* Set new station ID */
1592: bcopy(mac, hal->ah_sta_id, IEEE80211_ADDR_LEN);
1593:
1594: low_id = AR5K_LOW_ID(mac);
1595: high_id = 0x0000ffff & AR5K_HIGH_ID(mac);
1596:
1597: AR5K_REG_WRITE(AR5K_AR5211_STA_ID0, low_id);
1598: AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, high_id);
1599:
1600: return (AH_TRUE);
1601: }
1602:
1603: HAL_BOOL
1604: ar5k_ar5211_set_regdomain(struct ath_hal *hal, u_int16_t regdomain,
1605: HAL_STATUS *status)
1606: {
1607: ieee80211_regdomain_t ieee_regdomain;
1608:
1609: ieee_regdomain = ar5k_regdomain_to_ieee(regdomain);
1610:
1611: if (ar5k_eeprom_regulation_domain(hal, AH_TRUE,
1612: &ieee_regdomain) == AH_TRUE) {
1613: *status = HAL_OK;
1614: return (AH_TRUE);
1615: }
1616:
1617: *status = EIO;
1618:
1619: return (AH_FALSE);
1620: }
1621:
1622: void
1623: ar5k_ar5211_set_ledstate(struct ath_hal *hal, HAL_LED_STATE state)
1624: {
1625: u_int32_t led;
1626:
1627: AR5K_REG_DISABLE_BITS(AR5K_AR5211_PCICFG,
1628: AR5K_AR5211_PCICFG_LEDMODE | AR5K_AR5211_PCICFG_LED);
1629:
1630: /*
1631: * Some blinking values, define at your wish
1632: */
1633: switch (state) {
1634: case IEEE80211_S_SCAN:
1635: case IEEE80211_S_AUTH:
1636: led = AR5K_AR5211_PCICFG_LEDMODE_PROP |
1637: AR5K_AR5211_PCICFG_LED_PEND;
1638: break;
1639:
1640: case IEEE80211_S_INIT:
1641: led = AR5K_AR5211_PCICFG_LEDMODE_PROP |
1642: AR5K_AR5211_PCICFG_LED_NONE;
1643: break;
1644:
1645: case IEEE80211_S_ASSOC:
1646: case IEEE80211_S_RUN:
1647: led = AR5K_AR5211_PCICFG_LEDMODE_PROP |
1648: AR5K_AR5211_PCICFG_LED_ASSOC;
1649: break;
1650:
1651: default:
1652: led = AR5K_AR5211_PCICFG_LEDMODE_PROM |
1653: AR5K_AR5211_PCICFG_LED_NONE;
1654: break;
1655: }
1656:
1657: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PCICFG, led);
1658: }
1659:
1660: void
1661: ar5k_ar5211_set_associd(struct ath_hal *hal, const u_int8_t *bssid,
1662: u_int16_t assoc_id, u_int16_t tim_offset)
1663: {
1664: u_int32_t low_id, high_id;
1665:
1666: /*
1667: * Set BSSID which triggers the "SME Join" operation
1668: */
1669: low_id = AR5K_LOW_ID(bssid);
1670: high_id = AR5K_HIGH_ID(bssid);
1671: AR5K_REG_WRITE(AR5K_AR5211_BSS_ID0, low_id);
1672: AR5K_REG_WRITE(AR5K_AR5211_BSS_ID1, high_id |
1673: ((assoc_id & 0x3fff) << AR5K_AR5211_BSS_ID1_AID_S));
1674: bcopy(bssid, hal->ah_bssid, IEEE80211_ADDR_LEN);
1675:
1676: if (assoc_id == 0) {
1677: ar5k_ar5211_disable_pspoll(hal);
1678: return;
1679: }
1680:
1681: AR5K_REG_WRITE(AR5K_AR5211_BEACON,
1682: (AR5K_REG_READ(AR5K_AR5211_BEACON) &
1683: ~AR5K_AR5211_BEACON_TIM) |
1684: (((tim_offset ? tim_offset + 4 : 0) <<
1685: AR5K_AR5211_BEACON_TIM_S) &
1686: AR5K_AR5211_BEACON_TIM));
1687:
1688: ar5k_ar5211_enable_pspoll(hal, NULL, 0);
1689: }
1690:
1691: HAL_BOOL
1692: ar5k_ar5211_set_bssid_mask(struct ath_hal *hal, const u_int8_t* mask)
1693: {
1694: /* Not supported in 5211 */
1695: return (AH_FALSE);
1696: }
1697:
1698: HAL_BOOL
1699: ar5k_ar5211_set_gpio_output(struct ath_hal *hal, u_int32_t gpio)
1700: {
1701: if (gpio > AR5K_AR5211_NUM_GPIO)
1702: return (AH_FALSE);
1703:
1704: AR5K_REG_WRITE(AR5K_AR5211_GPIOCR,
1705: (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &~ AR5K_AR5211_GPIOCR_ALL(gpio))
1706: | AR5K_AR5211_GPIOCR_ALL(gpio));
1707:
1708: return (AH_TRUE);
1709: }
1710:
1711: HAL_BOOL
1712: ar5k_ar5211_set_gpio_input(struct ath_hal *hal, u_int32_t gpio)
1713: {
1714: if (gpio > AR5K_AR5211_NUM_GPIO)
1715: return (AH_FALSE);
1716:
1717: AR5K_REG_WRITE(AR5K_AR5211_GPIOCR,
1718: (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &~ AR5K_AR5211_GPIOCR_ALL(gpio))
1719: | AR5K_AR5211_GPIOCR_NONE(gpio));
1720:
1721: return (AH_TRUE);
1722: }
1723:
1724: u_int32_t
1725: ar5k_ar5211_get_gpio(struct ath_hal *hal, u_int32_t gpio)
1726: {
1727: if (gpio > AR5K_AR5211_NUM_GPIO)
1728: return (0xffffffff);
1729:
1730: /* GPIO input magic */
1731: return (((AR5K_REG_READ(AR5K_AR5211_GPIODI) &
1732: AR5K_AR5211_GPIODI_M) >> gpio) & 0x1);
1733: }
1734:
1735: HAL_BOOL
1736: ar5k_ar5211_set_gpio(struct ath_hal *hal, u_int32_t gpio, u_int32_t val)
1737: {
1738: u_int32_t data;
1739:
1740: if (gpio > AR5K_AR5211_NUM_GPIO)
1741: return (0xffffffff);
1742:
1743: /* GPIO output magic */
1744: data = AR5K_REG_READ(AR5K_AR5211_GPIODO);
1745:
1746: data &= ~(1 << gpio);
1747: data |= (val&1) << gpio;
1748:
1749: AR5K_REG_WRITE(AR5K_AR5211_GPIODO, data);
1750:
1751: return (AH_TRUE);
1752: }
1753:
1754: void
1755: ar5k_ar5211_set_gpio_intr(struct ath_hal *hal, u_int gpio,
1756: u_int32_t interrupt_level)
1757: {
1758: u_int32_t data;
1759:
1760: if (gpio > AR5K_AR5211_NUM_GPIO)
1761: return;
1762:
1763: /*
1764: * Set the GPIO interrupt
1765: */
1766: data = (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &
1767: ~(AR5K_AR5211_GPIOCR_INT_SEL(gpio) | AR5K_AR5211_GPIOCR_INT_SELH |
1768: AR5K_AR5211_GPIOCR_INT_ENA | AR5K_AR5211_GPIOCR_ALL(gpio))) |
1769: (AR5K_AR5211_GPIOCR_INT_SEL(gpio) | AR5K_AR5211_GPIOCR_INT_ENA);
1770:
1771: AR5K_REG_WRITE(AR5K_AR5211_GPIOCR,
1772: interrupt_level ? data : (data | AR5K_AR5211_GPIOCR_INT_SELH));
1773:
1774: hal->ah_imr |= AR5K_AR5211_PIMR_GPIO;
1775:
1776: /* Enable GPIO interrupts */
1777: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PIMR, AR5K_AR5211_PIMR_GPIO);
1778: }
1779:
1780: u_int32_t
1781: ar5k_ar5211_get_tsf32(struct ath_hal *hal)
1782: {
1783: return (AR5K_REG_READ(AR5K_AR5211_TSF_L32));
1784: }
1785:
1786: u_int64_t
1787: ar5k_ar5211_get_tsf64(struct ath_hal *hal)
1788: {
1789: u_int64_t tsf = AR5K_REG_READ(AR5K_AR5211_TSF_U32);
1790:
1791: return (AR5K_REG_READ(AR5K_AR5211_TSF_L32) | (tsf << 32));
1792: }
1793:
1794: void
1795: ar5k_ar5211_reset_tsf(struct ath_hal *hal)
1796: {
1797: AR5K_REG_ENABLE_BITS(AR5K_AR5211_BEACON,
1798: AR5K_AR5211_BEACON_RESET_TSF);
1799: }
1800:
1801: u_int16_t
1802: ar5k_ar5211_get_regdomain(struct ath_hal *hal)
1803: {
1804: return (ar5k_get_regdomain(hal));
1805: }
1806:
1807: HAL_BOOL
1808: ar5k_ar5211_detect_card_present(struct ath_hal *hal)
1809: {
1810: u_int16_t magic;
1811:
1812: /*
1813: * Checking the EEPROM's magic value could be an indication
1814: * if the card is still present. I didn't find another suitable
1815: * way to do this.
1816: */
1817: if (ar5k_ar5211_eeprom_read(hal, AR5K_EEPROM_MAGIC, &magic) != 0)
1818: return (AH_FALSE);
1819:
1820: return (magic == AR5K_EEPROM_MAGIC_VALUE ? AH_TRUE : AH_FALSE);
1821: }
1822:
1823: void
1824: ar5k_ar5211_update_mib_counters(struct ath_hal *hal, HAL_MIB_STATS *statistics)
1825: {
1826: statistics->ackrcv_bad += AR5K_REG_READ(AR5K_AR5211_ACK_FAIL);
1827: statistics->rts_bad += AR5K_REG_READ(AR5K_AR5211_RTS_FAIL);
1828: statistics->rts_good += AR5K_REG_READ(AR5K_AR5211_RTS_OK);
1829: statistics->fcs_bad += AR5K_REG_READ(AR5K_AR5211_FCS_FAIL);
1830: statistics->beacons += AR5K_REG_READ(AR5K_AR5211_BEACON_CNT);
1831: }
1832:
1833: HAL_RFGAIN
1834: ar5k_ar5211_get_rf_gain(struct ath_hal *hal)
1835: {
1836: return (HAL_RFGAIN_INACTIVE);
1837: }
1838:
1839: HAL_BOOL
1840: ar5k_ar5211_set_slot_time(struct ath_hal *hal, u_int slot_time)
1841: {
1842: if (slot_time < HAL_SLOT_TIME_9 || slot_time > HAL_SLOT_TIME_MAX)
1843: return (AH_FALSE);
1844:
1845: AR5K_REG_WRITE(AR5K_AR5211_DCU_GBL_IFS_SLOT, slot_time);
1846:
1847: return (AH_TRUE);
1848: }
1849:
1850: u_int
1851: ar5k_ar5211_get_slot_time(struct ath_hal *hal)
1852: {
1853: return (AR5K_REG_READ(AR5K_AR5211_DCU_GBL_IFS_SLOT) & 0xffff);
1854: }
1855:
1856: HAL_BOOL
1857: ar5k_ar5211_set_ack_timeout(struct ath_hal *hal, u_int timeout)
1858: {
1859: if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5211_TIME_OUT_ACK),
1860: hal->ah_turbo) <= timeout)
1861: return (AH_FALSE);
1862:
1863: AR5K_REG_WRITE_BITS(AR5K_AR5211_TIME_OUT, AR5K_AR5211_TIME_OUT_ACK,
1864: ar5k_htoclock(timeout, hal->ah_turbo));
1865:
1866: return (AH_TRUE);
1867: }
1868:
1869: u_int
1870: ar5k_ar5211_get_ack_timeout(struct ath_hal *hal)
1871: {
1872: return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TIME_OUT),
1873: AR5K_AR5211_TIME_OUT_ACK), hal->ah_turbo));
1874: }
1875:
1876: HAL_BOOL
1877: ar5k_ar5211_set_cts_timeout(struct ath_hal *hal, u_int timeout)
1878: {
1879: if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5211_TIME_OUT_CTS),
1880: hal->ah_turbo) <= timeout)
1881: return (AH_FALSE);
1882:
1883: AR5K_REG_WRITE_BITS(AR5K_AR5211_TIME_OUT, AR5K_AR5211_TIME_OUT_CTS,
1884: ar5k_htoclock(timeout, hal->ah_turbo));
1885:
1886: return (AH_TRUE);
1887: }
1888:
1889: u_int
1890: ar5k_ar5211_get_cts_timeout(struct ath_hal *hal)
1891: {
1892: return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TIME_OUT),
1893: AR5K_AR5211_TIME_OUT_CTS), hal->ah_turbo));
1894: }
1895:
1896: /*
1897: * Key table (WEP) functions
1898: */
1899:
1900: HAL_BOOL
1901: ar5k_ar5211_is_cipher_supported(struct ath_hal *hal, HAL_CIPHER cipher)
1902: {
1903: /*
1904: * The AR5211 only supports WEP
1905: */
1906: if (cipher == HAL_CIPHER_WEP)
1907: return (AH_TRUE);
1908:
1909: return (AH_FALSE);
1910: }
1911:
1912: u_int32_t
1913: ar5k_ar5211_get_keycache_size(struct ath_hal *hal)
1914: {
1915: return (AR5K_AR5211_KEYCACHE_SIZE);
1916: }
1917:
1918: HAL_BOOL
1919: ar5k_ar5211_reset_key(struct ath_hal *hal, u_int16_t entry)
1920: {
1921: int i;
1922:
1923: AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
1924:
1925: for (i = 0; i < AR5K_AR5211_KEYCACHE_SIZE; i++)
1926: AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_OFF(entry, i), 0);
1927:
1928: return (AH_FALSE);
1929: }
1930:
1931: HAL_BOOL
1932: ar5k_ar5211_is_key_valid(struct ath_hal *hal, u_int16_t entry)
1933: {
1934: AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
1935:
1936: /*
1937: * Check the validation flag at the end of the entry
1938: */
1939: if (AR5K_REG_READ(AR5K_AR5211_KEYTABLE_MAC1(entry)) &
1940: AR5K_AR5211_KEYTABLE_VALID)
1941: return (AH_TRUE);
1942:
1943: return (AH_FALSE);
1944: }
1945:
1946: HAL_BOOL
1947: ar5k_ar5211_set_key(struct ath_hal *hal, u_int16_t entry,
1948: const HAL_KEYVAL *keyval, const u_int8_t *mac, int xor_notused)
1949: {
1950: int i;
1951: u_int32_t key_v[AR5K_AR5211_KEYCACHE_SIZE - 2];
1952:
1953: AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
1954:
1955: bzero(&key_v, sizeof(key_v));
1956:
1957: switch (keyval->wk_len) {
1958: case AR5K_KEYVAL_LENGTH_40:
1959: bcopy(keyval->wk_key, &key_v[0], 4);
1960: bcopy(keyval->wk_key + 4, &key_v[1], 1);
1961: key_v[5] = AR5K_AR5211_KEYTABLE_TYPE_40;
1962: break;
1963:
1964: case AR5K_KEYVAL_LENGTH_104:
1965: bcopy(keyval->wk_key, &key_v[0], 4);
1966: bcopy(keyval->wk_key + 4, &key_v[1], 2);
1967: bcopy(keyval->wk_key + 6, &key_v[2], 4);
1968: bcopy(keyval->wk_key + 10, &key_v[3], 2);
1969: bcopy(keyval->wk_key + 12, &key_v[4], 1);
1970: key_v[5] = AR5K_AR5211_KEYTABLE_TYPE_104;
1971: break;
1972:
1973: case AR5K_KEYVAL_LENGTH_128:
1974: bcopy(keyval->wk_key, &key_v[0], 4);
1975: bcopy(keyval->wk_key + 4, &key_v[1], 2);
1976: bcopy(keyval->wk_key + 6, &key_v[2], 4);
1977: bcopy(keyval->wk_key + 10, &key_v[3], 2);
1978: bcopy(keyval->wk_key + 12, &key_v[4], 4);
1979: key_v[5] = AR5K_AR5211_KEYTABLE_TYPE_128;
1980: break;
1981:
1982: default:
1983: /* Unsupported key length (not WEP40/104/128) */
1984: return (AH_FALSE);
1985: }
1986:
1987: for (i = 0; i < AR5K_ELEMENTS(key_v); i++)
1988: AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_OFF(entry, i), key_v[i]);
1989:
1990: return (ar5k_ar5211_set_key_lladdr(hal, entry, mac));
1991: }
1992:
1993: HAL_BOOL
1994: ar5k_ar5211_set_key_lladdr(struct ath_hal *hal, u_int16_t entry,
1995: const u_int8_t *mac)
1996: {
1997: u_int32_t low_id, high_id;
1998: const u_int8_t *mac_v;
1999:
2000: /*
2001: * Invalid entry (key table overflow)
2002: */
2003: AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
2004:
2005: /* MAC may be NULL if it's a broadcast key */
2006: mac_v = mac == NULL ? etherbroadcastaddr : mac;
2007:
2008: low_id = AR5K_LOW_ID(mac_v);
2009: high_id = AR5K_HIGH_ID(mac_v) | AR5K_AR5211_KEYTABLE_VALID;
2010:
2011: AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_MAC0(entry), low_id);
2012: AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_MAC1(entry), high_id);
2013:
2014: return (AH_TRUE);
2015: }
2016:
2017: /*
2018: * Power management functions
2019: */
2020:
2021: HAL_BOOL
2022: ar5k_ar5211_set_power(struct ath_hal *hal, HAL_POWER_MODE mode,
2023: HAL_BOOL set_chip, u_int16_t sleep_duration)
2024: {
2025: u_int32_t staid;
2026: int i;
2027:
2028: staid = AR5K_REG_READ(AR5K_AR5211_STA_ID1);
2029:
2030: switch (mode) {
2031: case HAL_PM_AUTO:
2032: staid &= ~AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA;
2033: /* FALLTHROUGH */
2034: case HAL_PM_NETWORK_SLEEP:
2035: if (set_chip == AH_TRUE) {
2036: AR5K_REG_WRITE(AR5K_AR5211_SCR,
2037: AR5K_AR5211_SCR_SLE | sleep_duration);
2038: }
2039: staid |= AR5K_AR5211_STA_ID1_PWR_SV;
2040: break;
2041:
2042: case HAL_PM_FULL_SLEEP:
2043: if (set_chip == AH_TRUE) {
2044: AR5K_REG_WRITE(AR5K_AR5211_SCR,
2045: AR5K_AR5211_SCR_SLE_SLP);
2046: }
2047: staid |= AR5K_AR5211_STA_ID1_PWR_SV;
2048: break;
2049:
2050: case HAL_PM_AWAKE:
2051: if (set_chip == AH_FALSE)
2052: goto commit;
2053:
2054: AR5K_REG_WRITE(AR5K_AR5211_SCR, AR5K_AR5211_SCR_SLE_WAKE);
2055:
2056: for (i = 5000; i > 0; i--) {
2057: /* Check if the AR5211 did wake up */
2058: if ((AR5K_REG_READ(AR5K_AR5211_PCICFG) &
2059: AR5K_AR5211_PCICFG_SPWR_DN) == 0)
2060: break;
2061:
2062: /* Wait a bit and retry */
2063: AR5K_DELAY(200);
2064: AR5K_REG_WRITE(AR5K_AR5211_SCR,
2065: AR5K_AR5211_SCR_SLE_WAKE);
2066: }
2067:
2068: /* Fail if the AR5211 didn't wake up */
2069: if (i <= 0)
2070: return (AH_FALSE);
2071:
2072: staid &= ~AR5K_AR5211_STA_ID1_PWR_SV;
2073: break;
2074:
2075: default:
2076: return (AH_FALSE);
2077: }
2078:
2079: commit:
2080: hal->ah_power_mode = mode;
2081:
2082: AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, staid);
2083:
2084: return (AH_TRUE);
2085: }
2086:
2087: HAL_POWER_MODE
2088: ar5k_ar5211_get_power_mode(struct ath_hal *hal)
2089: {
2090: return (hal->ah_power_mode);
2091: }
2092:
2093: HAL_BOOL
2094: ar5k_ar5211_query_pspoll_support(struct ath_hal *hal)
2095: {
2096: /* nope */
2097: return (AH_FALSE);
2098: }
2099:
2100: HAL_BOOL
2101: ar5k_ar5211_init_pspoll(struct ath_hal *hal)
2102: {
2103: /*
2104: * Not used on the AR5211
2105: */
2106: return (AH_FALSE);
2107: }
2108:
2109: HAL_BOOL
2110: ar5k_ar5211_enable_pspoll(struct ath_hal *hal, u_int8_t *bssid,
2111: u_int16_t assoc_id)
2112: {
2113: return (AH_FALSE);
2114: }
2115:
2116: HAL_BOOL
2117: ar5k_ar5211_disable_pspoll(struct ath_hal *hal)
2118: {
2119: return (AH_FALSE);
2120: }
2121:
2122: /*
2123: * Beacon functions
2124: */
2125:
2126: void
2127: ar5k_ar5211_init_beacon(struct ath_hal *hal, u_int32_t next_beacon,
2128: u_int32_t interval)
2129: {
2130: u_int32_t timer1, timer2, timer3;
2131:
2132: /*
2133: * Set the additional timers by mode
2134: */
2135: switch (hal->ah_op_mode) {
2136: case HAL_M_STA:
2137: timer1 = 0x0000ffff;
2138: timer2 = 0x0007ffff;
2139: break;
2140:
2141: default:
2142: timer1 = (next_beacon - AR5K_TUNE_DMA_BEACON_RESP) <<
2143: 0x00000003;
2144: timer2 = (next_beacon - AR5K_TUNE_SW_BEACON_RESP) <<
2145: 0x00000003;
2146: }
2147:
2148: timer3 = next_beacon +
2149: (hal->ah_atim_window ? hal->ah_atim_window : 1);
2150:
2151: /*
2152: * Enable all timers and set the beacon register
2153: * (next beacon, DMA beacon, software beacon, ATIM window time)
2154: */
2155: AR5K_REG_WRITE(AR5K_AR5211_TIMER0, next_beacon);
2156: AR5K_REG_WRITE(AR5K_AR5211_TIMER1, timer1);
2157: AR5K_REG_WRITE(AR5K_AR5211_TIMER2, timer2);
2158: AR5K_REG_WRITE(AR5K_AR5211_TIMER3, timer3);
2159:
2160: AR5K_REG_WRITE(AR5K_AR5211_BEACON, interval &
2161: (AR5K_AR5211_BEACON_PERIOD | AR5K_AR5211_BEACON_RESET_TSF |
2162: AR5K_AR5211_BEACON_ENABLE));
2163: }
2164:
2165: void
2166: ar5k_ar5211_set_beacon_timers(struct ath_hal *hal,
2167: const HAL_BEACON_STATE *state, u_int32_t tsf, u_int32_t dtim_count,
2168: u_int32_t cfp_count)
2169: {
2170: u_int32_t cfp_period, next_cfp;
2171:
2172: /* Return on an invalid beacon state */
2173: if (state->bs_interval < 1)
2174: return;
2175:
2176: /*
2177: * PCF support?
2178: */
2179: if (state->bs_cfp_period > 0) {
2180: /* Enable CFP mode and set the CFP and timer registers */
2181: cfp_period = state->bs_cfp_period * state->bs_dtim_period *
2182: state->bs_interval;
2183: next_cfp = (cfp_count * state->bs_dtim_period + dtim_count) *
2184: state->bs_interval;
2185:
2186: AR5K_REG_DISABLE_BITS(AR5K_AR5211_STA_ID1,
2187: AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA |
2188: AR5K_AR5211_STA_ID1_PCF);
2189: AR5K_REG_WRITE(AR5K_AR5211_CFP_PERIOD, cfp_period);
2190: AR5K_REG_WRITE(AR5K_AR5211_CFP_DUR, state->bs_cfp_max_duration);
2191: AR5K_REG_WRITE(AR5K_AR5211_TIMER2,
2192: (tsf + (next_cfp == 0 ? cfp_period : next_cfp)) << 3);
2193: } else {
2194: /* Disable PCF mode */
2195: AR5K_REG_DISABLE_BITS(AR5K_AR5211_STA_ID1,
2196: AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA |
2197: AR5K_AR5211_STA_ID1_PCF);
2198: }
2199:
2200: /*
2201: * Enable the beacon timer register
2202: */
2203: AR5K_REG_WRITE(AR5K_AR5211_TIMER0, state->bs_next_beacon);
2204:
2205: /*
2206: * Start the beacon timers
2207: */
2208: AR5K_REG_WRITE(AR5K_AR5211_BEACON,
2209: (AR5K_REG_READ(AR5K_AR5211_BEACON) &~
2210: (AR5K_AR5211_BEACON_PERIOD | AR5K_AR5211_BEACON_TIM)) |
2211: AR5K_REG_SM(state->bs_tim_offset ? state->bs_tim_offset + 4 : 0,
2212: AR5K_AR5211_BEACON_TIM) | AR5K_REG_SM(state->bs_interval,
2213: AR5K_AR5211_BEACON_PERIOD));
2214:
2215: /*
2216: * Write new beacon miss threshold, if it appears to be valid
2217: */
2218: if ((AR5K_AR5211_RSSI_THR_BMISS >> AR5K_AR5211_RSSI_THR_BMISS_S) <
2219: state->bs_bmiss_threshold)
2220: return;
2221:
2222: AR5K_REG_WRITE_BITS(AR5K_AR5211_RSSI_THR_M,
2223: AR5K_AR5211_RSSI_THR_BMISS, state->bs_bmiss_threshold);
2224: AR5K_REG_WRITE_BITS(AR5K_AR5211_SCR, AR5K_AR5211_SCR_SLDUR,
2225: (state->bs_sleepduration - 3) << 3);
2226: }
2227:
2228: void
2229: ar5k_ar5211_reset_beacon(struct ath_hal *hal)
2230: {
2231: /*
2232: * Disable beacon timer
2233: */
2234: AR5K_REG_WRITE(AR5K_AR5211_TIMER0, 0);
2235:
2236: /*
2237: * Disable some beacon register values
2238: */
2239: AR5K_REG_DISABLE_BITS(AR5K_AR5211_STA_ID1,
2240: AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA | AR5K_AR5211_STA_ID1_PCF);
2241: AR5K_REG_WRITE(AR5K_AR5211_BEACON, AR5K_AR5211_BEACON_PERIOD);
2242: }
2243:
2244: HAL_BOOL
2245: ar5k_ar5211_wait_for_beacon(struct ath_hal *hal, bus_addr_t phys_addr)
2246: {
2247: HAL_BOOL ret;
2248:
2249: /*
2250: * Wait for beaconn queue to be done
2251: */
2252: ret = ar5k_register_timeout(hal,
2253: AR5K_AR5211_QCU_STS(HAL_TX_QUEUE_ID_BEACON),
2254: AR5K_AR5211_QCU_STS_FRMPENDCNT, 0, AH_FALSE);
2255:
2256: if (AR5K_REG_READ_Q(AR5K_AR5211_QCU_TXE, HAL_TX_QUEUE_ID_BEACON))
2257: return (AH_FALSE);
2258:
2259: return (ret);
2260: }
2261:
2262: /*
2263: * Interrupt handling
2264: */
2265:
2266: HAL_BOOL
2267: ar5k_ar5211_is_intr_pending(struct ath_hal *hal)
2268: {
2269: return (AR5K_REG_READ(AR5K_AR5211_INTPEND) == 0 ? AH_FALSE : AH_TRUE);
2270: }
2271:
2272: HAL_BOOL
2273: ar5k_ar5211_get_isr(struct ath_hal *hal, u_int32_t *interrupt_mask)
2274: {
2275: u_int32_t data;
2276:
2277: /*
2278: * Read interrupt status from the Read-And-Clear shadow register
2279: */
2280: data = AR5K_REG_READ(AR5K_AR5211_RAC_PISR);
2281:
2282: /*
2283: * Get abstract interrupt mask (HAL-compatible)
2284: */
2285: *interrupt_mask = (data & HAL_INT_COMMON) & hal->ah_imr;
2286:
2287: if (data == HAL_INT_NOCARD)
2288: return (AH_FALSE);
2289:
2290: if (data & (AR5K_AR5211_PISR_RXOK | AR5K_AR5211_PISR_RXERR))
2291: *interrupt_mask |= HAL_INT_RX;
2292:
2293: if (data & (AR5K_AR5211_PISR_TXOK | AR5K_AR5211_PISR_TXERR))
2294: *interrupt_mask |= HAL_INT_TX;
2295:
2296: if (data & (AR5K_AR5211_PISR_HIUERR))
2297: *interrupt_mask |= HAL_INT_FATAL;
2298:
2299: /*
2300: * Special interrupt handling (not caught by the driver)
2301: */
2302: if (((*interrupt_mask) & AR5K_AR5211_PISR_RXPHY) &&
2303: hal->ah_radar.r_enabled == AH_TRUE)
2304: ar5k_radar_alert(hal);
2305:
2306: return (AH_TRUE);
2307: }
2308:
2309: u_int32_t
2310: ar5k_ar5211_get_intr(struct ath_hal *hal)
2311: {
2312: /* Return the interrupt mask stored previously */
2313: return (hal->ah_imr);
2314: }
2315:
2316: HAL_INT
2317: ar5k_ar5211_set_intr(struct ath_hal *hal, HAL_INT new_mask)
2318: {
2319: HAL_INT old_mask, int_mask;
2320:
2321: /*
2322: * Disable card interrupts to prevent any race conditions
2323: * (they will be re-enabled afterwards).
2324: */
2325: AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_DISABLE);
2326:
2327: old_mask = hal->ah_imr;
2328:
2329: /*
2330: * Add additional, chipset-dependent interrupt mask flags
2331: * and write them to the IMR (interrupt mask register).
2332: */
2333: int_mask = new_mask & HAL_INT_COMMON;
2334:
2335: if (new_mask & HAL_INT_RX)
2336: int_mask |=
2337: AR5K_AR5211_PIMR_RXOK |
2338: AR5K_AR5211_PIMR_RXERR |
2339: AR5K_AR5211_PIMR_RXORN |
2340: AR5K_AR5211_PIMR_RXDESC;
2341:
2342: if (new_mask & HAL_INT_TX)
2343: int_mask |=
2344: AR5K_AR5211_PIMR_TXOK |
2345: AR5K_AR5211_PIMR_TXERR |
2346: AR5K_AR5211_PIMR_TXDESC |
2347: AR5K_AR5211_PIMR_TXURN;
2348:
2349: if (new_mask & HAL_INT_FATAL) {
2350: int_mask |= AR5K_AR5211_PIMR_HIUERR;
2351: AR5K_REG_ENABLE_BITS(AR5K_AR5211_SIMR2,
2352: AR5K_AR5211_SIMR2_MCABT |
2353: AR5K_AR5211_SIMR2_SSERR |
2354: AR5K_AR5211_SIMR2_DPERR);
2355: }
2356:
2357: AR5K_REG_WRITE(AR5K_AR5211_PIMR, int_mask);
2358:
2359: /* Store new interrupt mask */
2360: hal->ah_imr = new_mask;
2361:
2362: /* ..re-enable interrupts */
2363: AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_ENABLE);
2364:
2365: return (old_mask);
2366: }
2367:
2368: /*
2369: * Misc internal functions
2370: */
2371:
2372: HAL_BOOL
2373: ar5k_ar5211_get_capabilities(struct ath_hal *hal)
2374: {
2375: u_int16_t ee_header;
2376:
2377: /* Capabilities stored in the EEPROM */
2378: ee_header = hal->ah_capabilities.cap_eeprom.ee_header;
2379:
2380: /*
2381: * XXX The AR5211 tranceiver supports frequencies from 4920 to 6100GHz
2382: * XXX and from 2312 to 2732GHz. There are problems with the current
2383: * XXX ieee80211 implementation because the IEEE channel mapping
2384: * XXX does not support negative channel numbers (2312MHz is channel
2385: * XXX -19). Of course, this doesn't matter because these channels
2386: * XXX are out of range but some regulation domains like MKK (Japan)
2387: * XXX will support frequencies somewhere around 4.8GHz.
2388: */
2389:
2390: /*
2391: * Set radio capabilities
2392: */
2393:
2394: if (AR5K_EEPROM_HDR_11A(ee_header)) {
2395: hal->ah_capabilities.cap_range.range_5ghz_min = 5005; /* 4920 */
2396: hal->ah_capabilities.cap_range.range_5ghz_max = 6100;
2397:
2398: /* Set supported modes */
2399: hal->ah_capabilities.cap_mode = HAL_MODE_11A | HAL_MODE_TURBO;
2400: }
2401:
2402: /* This chip will support 802.11b if the 2GHz radio is connected */
2403: if (AR5K_EEPROM_HDR_11B(ee_header) || AR5K_EEPROM_HDR_11G(ee_header)) {
2404: hal->ah_capabilities.cap_range.range_2ghz_min = 2412; /* 2312 */
2405: hal->ah_capabilities.cap_range.range_2ghz_max = 2732;
2406:
2407: if (AR5K_EEPROM_HDR_11B(ee_header))
2408: hal->ah_capabilities.cap_mode |= HAL_MODE_11B;
2409: #if 0
2410: if (AR5K_EEPROM_HDR_11G(ee_header))
2411: hal->ah_capabilities.cap_mode |= HAL_MODE_11G;
2412: #endif
2413: }
2414:
2415: /* GPIO */
2416: hal->ah_gpio_npins = AR5K_AR5211_NUM_GPIO;
2417:
2418: /* Set number of supported TX queues */
2419: hal->ah_capabilities.cap_queues.q_tx_num = AR5K_AR5211_TX_NUM_QUEUES;
2420:
2421: return (AH_TRUE);
2422: }
2423:
2424: void
2425: ar5k_ar5211_radar_alert(struct ath_hal *hal, HAL_BOOL enable)
2426: {
2427: /*
2428: * Enable radar detection
2429: */
2430: AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_DISABLE);
2431:
2432: if (enable == AH_TRUE) {
2433: AR5K_REG_WRITE(AR5K_AR5211_PHY_RADAR,
2434: AR5K_AR5211_PHY_RADAR_ENABLE);
2435: AR5K_REG_ENABLE_BITS(AR5K_AR5211_PIMR,
2436: AR5K_AR5211_PIMR_RXPHY);
2437: } else {
2438: AR5K_REG_WRITE(AR5K_AR5211_PHY_RADAR,
2439: AR5K_AR5211_PHY_RADAR_DISABLE);
2440: AR5K_REG_DISABLE_BITS(AR5K_AR5211_PIMR,
2441: AR5K_AR5211_PIMR_RXPHY);
2442: }
2443:
2444: AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_ENABLE);
2445: }
2446:
2447: /*
2448: * EEPROM access functions
2449: */
2450:
2451: HAL_BOOL
2452: ar5k_ar5211_eeprom_is_busy(struct ath_hal *hal)
2453: {
2454: return (AR5K_REG_READ(AR5K_AR5211_CFG) & AR5K_AR5211_CFG_EEBS ?
2455: AH_TRUE : AH_FALSE);
2456: }
2457:
2458: int
2459: ar5k_ar5211_eeprom_read(struct ath_hal *hal, u_int32_t offset, u_int16_t *data)
2460: {
2461: u_int32_t status, i;
2462:
2463: /*
2464: * Initialize EEPROM access
2465: */
2466: AR5K_REG_WRITE(AR5K_AR5211_EEPROM_BASE, (u_int8_t)offset);
2467: AR5K_REG_ENABLE_BITS(AR5K_AR5211_EEPROM_CMD,
2468: AR5K_AR5211_EEPROM_CMD_READ);
2469:
2470: for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
2471: status = AR5K_REG_READ(AR5K_AR5211_EEPROM_STATUS);
2472: if (status & AR5K_AR5211_EEPROM_STAT_RDDONE) {
2473: if (status & AR5K_AR5211_EEPROM_STAT_RDERR)
2474: return (EIO);
2475: *data = (u_int16_t)
2476: (AR5K_REG_READ(AR5K_AR5211_EEPROM_DATA) & 0xffff);
2477: return (0);
2478: }
2479: AR5K_DELAY(15);
2480: }
2481:
2482: return (ETIMEDOUT);
2483: }
2484:
2485: int
2486: ar5k_ar5211_eeprom_write(struct ath_hal *hal, u_int32_t offset, u_int16_t data)
2487: {
2488: u_int32_t status, timeout;
2489:
2490: /* Enable eeprom access */
2491: AR5K_REG_ENABLE_BITS(AR5K_AR5211_EEPROM_CMD,
2492: AR5K_AR5211_EEPROM_CMD_RESET);
2493: AR5K_REG_ENABLE_BITS(AR5K_AR5211_EEPROM_CMD,
2494: AR5K_AR5211_EEPROM_CMD_WRITE);
2495:
2496: /*
2497: * Prime write pump
2498: */
2499: AR5K_REG_WRITE(AR5K_AR5211_EEPROM_BASE, (u_int8_t)offset - 1);
2500:
2501: for (timeout = 10000; timeout > 0; timeout--) {
2502: AR5K_DELAY(1);
2503: status = AR5K_REG_READ(AR5K_AR5211_EEPROM_STATUS);
2504: if (status & AR5K_AR5211_EEPROM_STAT_WRDONE) {
2505: if (status & AR5K_AR5211_EEPROM_STAT_WRERR)
2506: return (EIO);
2507: return (0);
2508: }
2509: }
2510:
2511: return (ETIMEDOUT);
2512: }
2513:
2514: /*
2515: * RF register settings
2516: */
2517:
2518: void
2519: ar5k_ar5211_rfregs(struct ath_hal *hal, HAL_CHANNEL *channel, u_int freq,
2520: u_int ee_mode)
2521: {
2522: struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;
2523: struct ar5k_ar5211_ini_rf rf[AR5K_ELEMENTS(ar5211_rf)];
2524: u_int32_t ob, db, obdb, xpds, xpdp, x_gain;
2525: u_int i;
2526:
2527: bcopy(ar5211_rf, rf, sizeof(rf));
2528: obdb = 0;
2529:
2530: if (freq == AR5K_INI_RFGAIN_2GHZ &&
2531: hal->ah_ee_version >= AR5K_EEPROM_VERSION_3_1) {
2532: ob = ar5k_bitswap(ee->ee_ob[ee_mode][0], 3);
2533: db = ar5k_bitswap(ee->ee_db[ee_mode][0], 3);
2534: rf[25].rf_value[freq] =
2535: ((ob << 6) & 0xc0) | (rf[25].rf_value[freq] & ~0xc0);
2536: rf[26].rf_value[freq] =
2537: (((ob >> 2) & 0x1) | ((db << 1) & 0xe)) |
2538: (rf[26].rf_value[freq] & ~0xf);
2539: }
2540:
2541: if (freq == AR5K_INI_RFGAIN_5GHZ) {
2542: /* For 11a and Turbo */
2543: obdb = channel->c_channel >= 5725 ? 3 :
2544: (channel->c_channel >= 5500 ? 2 :
2545: (channel->c_channel >= 5260 ? 1 :
2546: (channel->c_channel > 4000 ? 0 : -1)));
2547: }
2548:
2549: ob = ee->ee_ob[ee_mode][obdb];
2550: db = ee->ee_db[ee_mode][obdb];
2551: x_gain = ee->ee_x_gain[ee_mode];
2552: xpds = ee->ee_xpd[ee_mode];
2553: xpdp = !xpds;
2554:
2555: rf[11].rf_value[freq] = (rf[11].rf_value[freq] & ~0xc0) |
2556: (((ar5k_bitswap(x_gain, 4) << 7) | (xpdp << 6)) & 0xc0);
2557: rf[12].rf_value[freq] = (rf[12].rf_value[freq] & ~0x7) |
2558: ((ar5k_bitswap(x_gain, 4) >> 1) & 0x7);
2559: rf[12].rf_value[freq] = (rf[12].rf_value[freq] & ~0x80) |
2560: ((ar5k_bitswap(ob, 3) << 7) & 0x80);
2561: rf[13].rf_value[freq] = (rf[13].rf_value[freq] & ~0x3) |
2562: ((ar5k_bitswap(ob, 3) >> 1) & 0x3);
2563: rf[13].rf_value[freq] = (rf[13].rf_value[freq] & ~0x1c) |
2564: ((ar5k_bitswap(db, 3) << 2) & 0x1c);
2565: rf[17].rf_value[freq] = (rf[17].rf_value[freq] & ~0x8) |
2566: ((xpds << 3) & 0x8);
2567:
2568: for (i = 0; i < AR5K_ELEMENTS(rf); i++) {
2569: AR5K_REG_WAIT(i);
2570: AR5K_REG_WRITE((u_int32_t)rf[i].rf_register,
2571: rf[i].rf_value[freq]);
2572: }
2573:
2574: hal->ah_rf_gain = HAL_RFGAIN_INACTIVE;
2575: }
2576:
2577: HAL_BOOL
2578: ar5k_ar5211_set_txpower_limit(struct ath_hal *hal, u_int power)
2579: {
2580: /* Not implemented */
2581: return (AH_FALSE);
2582: }
CVSweb