athn.c revision 1.5.4.4 1 1.5.4.2 tls /* $NetBSD: athn.c,v 1.5.4.4 2017/12/03 11:37:03 jdolecek Exp $ */
2 1.5.4.3 tls /* $OpenBSD: athn.c,v 1.83 2014/07/22 13:12:11 mpi Exp $ */
3 1.5.4.2 tls
4 1.5.4.2 tls /*-
5 1.5.4.2 tls * Copyright (c) 2009 Damien Bergamini <damien.bergamini (at) free.fr>
6 1.5.4.2 tls * Copyright (c) 2008-2010 Atheros Communications Inc.
7 1.5.4.2 tls *
8 1.5.4.2 tls * Permission to use, copy, modify, and/or distribute this software for any
9 1.5.4.2 tls * purpose with or without fee is hereby granted, provided that the above
10 1.5.4.2 tls * copyright notice and this permission notice appear in all copies.
11 1.5.4.2 tls *
12 1.5.4.2 tls * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 1.5.4.2 tls * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 1.5.4.2 tls * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 1.5.4.2 tls * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 1.5.4.2 tls * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 1.5.4.2 tls * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 1.5.4.2 tls * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 1.5.4.2 tls */
20 1.5.4.2 tls
21 1.5.4.2 tls /*
22 1.5.4.2 tls * Driver for Atheros 802.11a/g/n chipsets.
23 1.5.4.2 tls */
24 1.5.4.2 tls
25 1.5.4.2 tls #include <sys/cdefs.h>
26 1.5.4.2 tls __KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.5.4.4 2017/12/03 11:37:03 jdolecek Exp $");
27 1.5.4.2 tls
28 1.5.4.2 tls #ifndef _MODULE
29 1.5.4.2 tls #include "athn_usb.h" /* for NATHN_USB */
30 1.5.4.2 tls #endif
31 1.5.4.2 tls
32 1.5.4.2 tls #include <sys/param.h>
33 1.5.4.2 tls #include <sys/sockio.h>
34 1.5.4.2 tls #include <sys/mbuf.h>
35 1.5.4.2 tls #include <sys/kernel.h>
36 1.5.4.2 tls #include <sys/socket.h>
37 1.5.4.2 tls #include <sys/systm.h>
38 1.5.4.2 tls #include <sys/malloc.h>
39 1.5.4.2 tls #include <sys/queue.h>
40 1.5.4.2 tls #include <sys/callout.h>
41 1.5.4.2 tls #include <sys/conf.h>
42 1.5.4.2 tls #include <sys/cpu.h>
43 1.5.4.2 tls #include <sys/device.h>
44 1.5.4.2 tls
45 1.5.4.2 tls #include <sys/bus.h>
46 1.5.4.2 tls #include <sys/endian.h>
47 1.5.4.2 tls #include <sys/intr.h>
48 1.5.4.2 tls
49 1.5.4.2 tls #include <net/bpf.h>
50 1.5.4.2 tls #include <net/if.h>
51 1.5.4.2 tls #include <net/if_arp.h>
52 1.5.4.2 tls #include <net/if_dl.h>
53 1.5.4.2 tls #include <net/if_ether.h>
54 1.5.4.2 tls #include <net/if_media.h>
55 1.5.4.2 tls #include <net/if_types.h>
56 1.5.4.2 tls
57 1.5.4.2 tls #include <netinet/in.h>
58 1.5.4.2 tls #include <netinet/in_systm.h>
59 1.5.4.2 tls #include <netinet/in_var.h>
60 1.5.4.2 tls #include <netinet/ip.h>
61 1.5.4.2 tls
62 1.5.4.2 tls #include <net80211/ieee80211_var.h>
63 1.5.4.2 tls #include <net80211/ieee80211_amrr.h>
64 1.5.4.2 tls #include <net80211/ieee80211_radiotap.h>
65 1.5.4.2 tls
66 1.5.4.2 tls #include <dev/ic/athnreg.h>
67 1.5.4.2 tls #include <dev/ic/athnvar.h>
68 1.5.4.2 tls #include <dev/ic/arn5008.h>
69 1.5.4.2 tls #include <dev/ic/arn5416.h>
70 1.5.4.2 tls #include <dev/ic/arn9003.h>
71 1.5.4.2 tls #include <dev/ic/arn9280.h>
72 1.5.4.2 tls #include <dev/ic/arn9285.h>
73 1.5.4.2 tls #include <dev/ic/arn9287.h>
74 1.5.4.2 tls #include <dev/ic/arn9380.h>
75 1.5.4.2 tls
76 1.5.4.2 tls #define Static static
77 1.5.4.2 tls
78 1.5.4.2 tls #define IS_UP_AND_RUNNING(ifp) \
79 1.5.4.2 tls (((ifp)->if_flags & IFF_UP) && ((ifp)->if_flags & IFF_RUNNING))
80 1.5.4.2 tls
81 1.5.4.2 tls #ifdef ATHN_DEBUG
82 1.5.4.2 tls int athn_debug = 0;
83 1.5.4.2 tls #endif
84 1.5.4.2 tls
85 1.5.4.2 tls Static int athn_clock_rate(struct athn_softc *);
86 1.5.4.2 tls Static const char *
87 1.5.4.2 tls athn_get_mac_name(struct athn_softc *);
88 1.5.4.2 tls Static const char *
89 1.5.4.2 tls athn_get_rf_name(struct athn_softc *);
90 1.5.4.2 tls Static int athn_init(struct ifnet *);
91 1.5.4.2 tls Static int athn_init_calib(struct athn_softc *,
92 1.5.4.2 tls struct ieee80211_channel *, struct ieee80211_channel *);
93 1.5.4.2 tls Static int athn_ioctl(struct ifnet *, u_long, void *);
94 1.5.4.2 tls Static int athn_media_change(struct ifnet *);
95 1.5.4.2 tls Static int athn_newstate(struct ieee80211com *, enum ieee80211_state,
96 1.5.4.2 tls int);
97 1.5.4.2 tls Static struct ieee80211_node *
98 1.5.4.2 tls athn_node_alloc(struct ieee80211_node_table *);
99 1.5.4.2 tls Static int athn_reset_power_on(struct athn_softc *);
100 1.5.4.2 tls Static int athn_stop_rx_dma(struct athn_softc *);
101 1.5.4.2 tls Static int athn_switch_chan(struct athn_softc *,
102 1.5.4.2 tls struct ieee80211_channel *, struct ieee80211_channel *);
103 1.5.4.2 tls Static void athn_calib_to(void *);
104 1.5.4.2 tls Static void athn_disable_interrupts(struct athn_softc *);
105 1.5.4.2 tls Static void athn_enable_interrupts(struct athn_softc *);
106 1.5.4.2 tls Static void athn_get_chanlist(struct athn_softc *);
107 1.5.4.2 tls Static void athn_get_chipid(struct athn_softc *);
108 1.5.4.2 tls Static void athn_init_dma(struct athn_softc *);
109 1.5.4.2 tls Static void athn_init_qos(struct athn_softc *);
110 1.5.4.2 tls Static void athn_init_tx_queues(struct athn_softc *);
111 1.5.4.2 tls Static void athn_iter_func(void *, struct ieee80211_node *);
112 1.5.4.2 tls Static void athn_newassoc(struct ieee80211_node *, int);
113 1.5.4.2 tls Static void athn_next_scan(void *);
114 1.5.4.2 tls Static void athn_pmf_wlan_off(device_t self);
115 1.5.4.2 tls Static void athn_radiotap_attach(struct athn_softc *);
116 1.5.4.2 tls Static void athn_start(struct ifnet *);
117 1.5.4.2 tls Static void athn_tx_reclaim(struct athn_softc *, int);
118 1.5.4.2 tls Static void athn_watchdog(struct ifnet *);
119 1.5.4.2 tls Static void athn_write_serdes(struct athn_softc *,
120 1.5.4.2 tls const struct athn_serdes *);
121 1.5.4.4 jdolecek Static void athn_softintr(void *);
122 1.5.4.2 tls
123 1.5.4.2 tls #ifdef ATHN_BT_COEXISTENCE
124 1.5.4.2 tls Static void athn_btcoex_disable(struct athn_softc *);
125 1.5.4.2 tls Static void athn_btcoex_enable(struct athn_softc *);
126 1.5.4.2 tls #endif
127 1.5.4.2 tls
128 1.5.4.2 tls #ifdef unused
129 1.5.4.2 tls Static int32_t athn_ani_get_rssi(struct athn_softc *);
130 1.5.4.2 tls Static int athn_rx_abort(struct athn_softc *);
131 1.5.4.2 tls #endif
132 1.5.4.2 tls
133 1.5.4.2 tls #ifdef notyet
134 1.5.4.2 tls Static void athn_ani_cck_err_trigger(struct athn_softc *);
135 1.5.4.2 tls Static void athn_ani_lower_immunity(struct athn_softc *);
136 1.5.4.2 tls Static void athn_ani_monitor(struct athn_softc *);
137 1.5.4.2 tls Static void athn_ani_ofdm_err_trigger(struct athn_softc *);
138 1.5.4.2 tls Static void athn_ani_restart(struct athn_softc *);
139 1.5.4.2 tls Static void athn_set_multi(struct athn_softc *);
140 1.5.4.2 tls #endif /* notyet */
141 1.5.4.2 tls
142 1.5.4.2 tls PUBLIC int
143 1.5.4.2 tls athn_attach(struct athn_softc *sc)
144 1.5.4.2 tls {
145 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
146 1.5.4.2 tls struct ifnet *ifp = &sc->sc_if;
147 1.5.4.2 tls size_t max_nnodes;
148 1.5.4.2 tls int error;
149 1.5.4.2 tls
150 1.5.4.2 tls /* Read hardware revision. */
151 1.5.4.2 tls athn_get_chipid(sc);
152 1.5.4.2 tls
153 1.5.4.2 tls if ((error = athn_reset_power_on(sc)) != 0) {
154 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "could not reset chip\n");
155 1.5.4.2 tls return error;
156 1.5.4.2 tls }
157 1.5.4.2 tls
158 1.5.4.2 tls if ((error = athn_set_power_awake(sc)) != 0) {
159 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "could not wakeup chip\n");
160 1.5.4.2 tls return error;
161 1.5.4.2 tls }
162 1.5.4.2 tls
163 1.5.4.2 tls if (AR_SREV_5416(sc) || AR_SREV_9160(sc))
164 1.5.4.2 tls error = ar5416_attach(sc);
165 1.5.4.2 tls else if (AR_SREV_9280(sc))
166 1.5.4.2 tls error = ar9280_attach(sc);
167 1.5.4.2 tls else if (AR_SREV_9285(sc))
168 1.5.4.2 tls error = ar9285_attach(sc);
169 1.5.4.2 tls #if NATHN_USB > 0
170 1.5.4.2 tls else if (AR_SREV_9271(sc))
171 1.5.4.2 tls error = ar9285_attach(sc);
172 1.5.4.2 tls #endif
173 1.5.4.2 tls else if (AR_SREV_9287(sc))
174 1.5.4.2 tls error = ar9287_attach(sc);
175 1.5.4.2 tls else if (AR_SREV_9380(sc) || AR_SREV_9485(sc))
176 1.5.4.2 tls error = ar9380_attach(sc);
177 1.5.4.2 tls else
178 1.5.4.2 tls error = ENOTSUP;
179 1.5.4.2 tls if (error != 0) {
180 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "could not attach chip\n");
181 1.5.4.2 tls return error;
182 1.5.4.2 tls }
183 1.5.4.2 tls
184 1.5.4.2 tls pmf_self_suspensor_init(sc->sc_dev, &sc->sc_suspensor, &sc->sc_qual);
185 1.5.4.2 tls pmf_event_register(sc->sc_dev, PMFE_RADIO_OFF, athn_pmf_wlan_off,
186 1.5.4.2 tls false);
187 1.5.4.2 tls
188 1.5.4.2 tls /* We can put the chip in sleep state now. */
189 1.5.4.2 tls athn_set_power_sleep(sc);
190 1.5.4.2 tls
191 1.5.4.2 tls if (!(sc->sc_flags & ATHN_FLAG_USB)) {
192 1.5.4.4 jdolecek sc->sc_soft_ih = softint_establish(SOFTINT_NET, athn_softintr,
193 1.5.4.4 jdolecek sc);
194 1.5.4.4 jdolecek if (sc->sc_soft_ih == NULL) {
195 1.5.4.4 jdolecek aprint_error_dev(sc->sc_dev,
196 1.5.4.4 jdolecek "could not establish softint\n");
197 1.5.4.4 jdolecek return EINVAL;
198 1.5.4.4 jdolecek }
199 1.5.4.4 jdolecek
200 1.5.4.2 tls error = sc->sc_ops.dma_alloc(sc);
201 1.5.4.2 tls if (error != 0) {
202 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
203 1.5.4.2 tls "could not allocate DMA resources\n");
204 1.5.4.2 tls return error;
205 1.5.4.2 tls }
206 1.5.4.2 tls /* Steal one Tx buffer for beacons. */
207 1.5.4.2 tls sc->sc_bcnbuf = SIMPLEQ_FIRST(&sc->sc_txbufs);
208 1.5.4.2 tls SIMPLEQ_REMOVE_HEAD(&sc->sc_txbufs, bf_list);
209 1.5.4.2 tls }
210 1.5.4.2 tls
211 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_RFSILENT) {
212 1.5.4.2 tls DPRINTFN(DBG_INIT, sc,
213 1.5.4.2 tls "found RF switch connected to GPIO pin %d\n",
214 1.5.4.2 tls sc->sc_rfsilent_pin);
215 1.5.4.2 tls }
216 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "%zd key cache entries\n", sc->sc_kc_entries);
217 1.5.4.2 tls
218 1.5.4.2 tls /*
219 1.5.4.2 tls * In HostAP mode, the number of STAs that we can handle is
220 1.5.4.2 tls * limited by the number of entries in the HW key cache.
221 1.5.4.2 tls * TKIP keys consume 2 entries in the cache.
222 1.5.4.2 tls */
223 1.5.4.2 tls KASSERT(sc->sc_kc_entries / 2 > IEEE80211_WEP_NKID);
224 1.5.4.2 tls max_nnodes = (sc->sc_kc_entries / 2) - IEEE80211_WEP_NKID;
225 1.5.4.2 tls if (sc->sc_max_aid != 0) /* we have an override */
226 1.5.4.2 tls ic->ic_max_aid = sc->sc_max_aid;
227 1.5.4.2 tls if (ic->ic_max_aid > max_nnodes)
228 1.5.4.2 tls ic->ic_max_aid = max_nnodes;
229 1.5.4.2 tls
230 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "using %s loop power control\n",
231 1.5.4.2 tls (sc->sc_flags & ATHN_FLAG_OLPC) ? "open" : "closed");
232 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "txchainmask=0x%x rxchainmask=0x%x\n",
233 1.5.4.2 tls sc->sc_txchainmask, sc->sc_rxchainmask);
234 1.5.4.2 tls
235 1.5.4.2 tls /* Count the number of bits set (in lowest 3 bits). */
236 1.5.4.2 tls sc->sc_ntxchains =
237 1.5.4.2 tls ((sc->sc_txchainmask >> 2) & 1) +
238 1.5.4.2 tls ((sc->sc_txchainmask >> 1) & 1) +
239 1.5.4.2 tls ((sc->sc_txchainmask >> 0) & 1);
240 1.5.4.2 tls sc->sc_nrxchains =
241 1.5.4.2 tls ((sc->sc_rxchainmask >> 2) & 1) +
242 1.5.4.2 tls ((sc->sc_rxchainmask >> 1) & 1) +
243 1.5.4.2 tls ((sc->sc_rxchainmask >> 0) & 1);
244 1.5.4.2 tls
245 1.5.4.2 tls if (AR_SINGLE_CHIP(sc)) {
246 1.5.4.4 jdolecek aprint_normal(": Atheros %s\n", athn_get_mac_name(sc));
247 1.5.4.2 tls aprint_verbose_dev(sc->sc_dev,
248 1.5.4.2 tls "rev %d (%dT%dR), ROM rev %d, address %s\n",
249 1.5.4.2 tls sc->sc_mac_rev,
250 1.5.4.2 tls sc->sc_ntxchains, sc->sc_nrxchains, sc->sc_eep_rev,
251 1.5.4.2 tls ether_sprintf(ic->ic_myaddr));
252 1.5.4.4 jdolecek }
253 1.5.4.4 jdolecek else {
254 1.5.4.4 jdolecek aprint_normal(": Atheros %s, RF %s\n", athn_get_mac_name(sc),
255 1.5.4.2 tls athn_get_rf_name(sc));
256 1.5.4.2 tls aprint_verbose_dev(sc->sc_dev,
257 1.5.4.2 tls "rev %d (%dT%dR), ROM rev %d, address %s\n",
258 1.5.4.2 tls sc->sc_mac_rev,
259 1.5.4.2 tls sc->sc_ntxchains, sc->sc_nrxchains,
260 1.5.4.2 tls sc->sc_eep_rev, ether_sprintf(ic->ic_myaddr));
261 1.5.4.2 tls }
262 1.5.4.2 tls
263 1.5.4.2 tls callout_init(&sc->sc_scan_to, 0);
264 1.5.4.2 tls callout_setfunc(&sc->sc_scan_to, athn_next_scan, sc);
265 1.5.4.2 tls callout_init(&sc->sc_calib_to, 0);
266 1.5.4.2 tls callout_setfunc(&sc->sc_calib_to, athn_calib_to, sc);
267 1.5.4.2 tls
268 1.5.4.2 tls sc->sc_amrr.amrr_min_success_threshold = 1;
269 1.5.4.2 tls sc->sc_amrr.amrr_max_success_threshold = 15;
270 1.5.4.2 tls
271 1.5.4.2 tls ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
272 1.5.4.2 tls ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
273 1.5.4.2 tls ic->ic_state = IEEE80211_S_INIT;
274 1.5.4.2 tls
275 1.5.4.2 tls /* Set device capabilities. */
276 1.5.4.2 tls ic->ic_caps =
277 1.5.4.2 tls IEEE80211_C_WPA | /* 802.11i */
278 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
279 1.5.4.2 tls IEEE80211_C_HOSTAP | /* Host AP mode supported. */
280 1.5.4.2 tls // XXX? IEEE80211_C_APPMGT | /* Host AP power saving supported. */
281 1.5.4.2 tls #endif
282 1.5.4.2 tls IEEE80211_C_MONITOR | /* Monitor mode supported. */
283 1.5.4.2 tls IEEE80211_C_SHSLOT | /* Short slot time supported. */
284 1.5.4.2 tls IEEE80211_C_SHPREAMBLE | /* Short preamble supported. */
285 1.5.4.2 tls IEEE80211_C_PMGT; /* Power saving supported. */
286 1.5.4.2 tls
287 1.5.4.2 tls #ifndef IEEE80211_NO_HT
288 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_11N) {
289 1.5.4.2 tls int i, ntxstreams, nrxstreams;
290 1.5.4.2 tls
291 1.5.4.2 tls /* Set HT capabilities. */
292 1.5.4.2 tls ic->ic_htcaps =
293 1.5.4.2 tls IEEE80211_HTCAP_SMPS_DIS |
294 1.5.4.2 tls IEEE80211_HTCAP_CBW20_40 |
295 1.5.4.2 tls IEEE80211_HTCAP_SGI40 |
296 1.5.4.2 tls IEEE80211_HTCAP_DSSSCCK40;
297 1.5.4.2 tls if (AR_SREV_9271(sc) || AR_SREV_9287_10_OR_LATER(sc))
298 1.5.4.2 tls ic->ic_htcaps |= IEEE80211_HTCAP_SGI20;
299 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc))
300 1.5.4.2 tls ic->ic_htcaps |= IEEE80211_HTCAP_LDPC;
301 1.5.4.2 tls if (AR_SREV_9280_10_OR_LATER(sc)) {
302 1.5.4.2 tls ic->ic_htcaps |= IEEE80211_HTCAP_TXSTBC;
303 1.5.4.2 tls ic->ic_htcaps |= 1 << IEEE80211_HTCAP_RXSTBC_SHIFT;
304 1.5.4.2 tls }
305 1.5.4.2 tls ntxstreams = sc->sc_ntxchains;
306 1.5.4.2 tls nrxstreams = sc->sc_nrxchains;
307 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc)) {
308 1.5.4.2 tls ntxstreams = MIN(ntxstreams, 2);
309 1.5.4.2 tls nrxstreams = MIN(nrxstreams, 2);
310 1.5.4.2 tls }
311 1.5.4.2 tls /* Set supported HT rates. */
312 1.5.4.2 tls for (i = 0; i < nrxstreams; i++)
313 1.5.4.2 tls ic->ic_sup_mcs[i] = 0xff;
314 1.5.4.2 tls /* Set the "Tx MCS Set Defined" bit. */
315 1.5.4.2 tls ic->ic_sup_mcs[12] |= 0x01;
316 1.5.4.2 tls if (ntxstreams != nrxstreams) {
317 1.5.4.2 tls /* Set "Tx Rx MCS Set Not Equal" bit. */
318 1.5.4.2 tls ic->ic_sup_mcs[12] |= 0x02;
319 1.5.4.2 tls ic->ic_sup_mcs[12] |= (ntxstreams - 1) << 2;
320 1.5.4.2 tls }
321 1.5.4.2 tls }
322 1.5.4.2 tls #endif
323 1.5.4.2 tls
324 1.5.4.2 tls /* Set supported rates. */
325 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_11G) {
326 1.5.4.2 tls ic->ic_sup_rates[IEEE80211_MODE_11B] =
327 1.5.4.2 tls ieee80211_std_rateset_11b;
328 1.5.4.2 tls ic->ic_sup_rates[IEEE80211_MODE_11G] =
329 1.5.4.2 tls ieee80211_std_rateset_11g;
330 1.5.4.2 tls }
331 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_11A) {
332 1.5.4.2 tls ic->ic_sup_rates[IEEE80211_MODE_11A] =
333 1.5.4.2 tls ieee80211_std_rateset_11a;
334 1.5.4.2 tls }
335 1.5.4.2 tls
336 1.5.4.2 tls /* Get the list of authorized/supported channels. */
337 1.5.4.2 tls athn_get_chanlist(sc);
338 1.5.4.2 tls
339 1.5.4.2 tls ifp->if_softc = sc;
340 1.5.4.2 tls ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
341 1.5.4.4 jdolecek if (!ifp->if_init)
342 1.5.4.4 jdolecek ifp->if_init = athn_init;
343 1.5.4.4 jdolecek if (!ifp->if_ioctl)
344 1.5.4.4 jdolecek ifp->if_ioctl = athn_ioctl;
345 1.5.4.4 jdolecek if (!ifp->if_start)
346 1.5.4.4 jdolecek ifp->if_start = athn_start;
347 1.5.4.4 jdolecek if (!ifp->if_watchdog)
348 1.5.4.4 jdolecek ifp->if_watchdog = athn_watchdog;
349 1.5.4.2 tls IFQ_SET_READY(&ifp->if_snd);
350 1.5.4.2 tls memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
351 1.5.4.2 tls
352 1.5.4.4 jdolecek error = if_initialize(ifp);
353 1.5.4.4 jdolecek if (error != 0) {
354 1.5.4.4 jdolecek aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
355 1.5.4.4 jdolecek error);
356 1.5.4.4 jdolecek pmf_event_deregister(sc->sc_dev, PMFE_RADIO_OFF,
357 1.5.4.4 jdolecek athn_pmf_wlan_off, false);
358 1.5.4.4 jdolecek callout_destroy(&sc->sc_scan_to);
359 1.5.4.4 jdolecek callout_destroy(&sc->sc_calib_to);
360 1.5.4.4 jdolecek return error;
361 1.5.4.4 jdolecek }
362 1.5.4.2 tls ieee80211_ifattach(ic);
363 1.5.4.4 jdolecek /* Use common softint-based if_input */
364 1.5.4.4 jdolecek ifp->if_percpuq = if_percpuq_create(ifp);
365 1.5.4.4 jdolecek if_register(ifp);
366 1.5.4.2 tls
367 1.5.4.2 tls ic->ic_node_alloc = athn_node_alloc;
368 1.5.4.2 tls ic->ic_newassoc = athn_newassoc;
369 1.5.4.2 tls if (ic->ic_updateslot == NULL)
370 1.5.4.2 tls ic->ic_updateslot = athn_updateslot;
371 1.5.4.2 tls #ifdef notyet_edca
372 1.5.4.2 tls ic->ic_updateedca = athn_updateedca;
373 1.5.4.2 tls #endif
374 1.5.4.2 tls #ifdef notyet
375 1.5.4.2 tls ic->ic_set_key = athn_set_key;
376 1.5.4.2 tls ic->ic_delete_key = athn_delete_key;
377 1.5.4.2 tls #endif
378 1.5.4.2 tls
379 1.5.4.2 tls /* Override 802.11 state transition machine. */
380 1.5.4.2 tls sc->sc_newstate = ic->ic_newstate;
381 1.5.4.2 tls ic->ic_newstate = athn_newstate;
382 1.5.4.2 tls
383 1.5.4.2 tls if (sc->sc_media_change == NULL)
384 1.5.4.2 tls sc->sc_media_change = athn_media_change;
385 1.5.4.2 tls ieee80211_media_init(ic, sc->sc_media_change, ieee80211_media_status);
386 1.5.4.2 tls
387 1.5.4.2 tls athn_radiotap_attach(sc);
388 1.5.4.2 tls return 0;
389 1.5.4.2 tls }
390 1.5.4.2 tls
391 1.5.4.2 tls PUBLIC void
392 1.5.4.2 tls athn_detach(struct athn_softc *sc)
393 1.5.4.2 tls {
394 1.5.4.2 tls struct ifnet *ifp = &sc->sc_if;
395 1.5.4.2 tls int qid;
396 1.5.4.2 tls
397 1.5.4.2 tls callout_halt(&sc->sc_scan_to, NULL);
398 1.5.4.2 tls callout_halt(&sc->sc_calib_to, NULL);
399 1.5.4.2 tls
400 1.5.4.2 tls if (!(sc->sc_flags & ATHN_FLAG_USB)) {
401 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++)
402 1.5.4.2 tls athn_tx_reclaim(sc, qid);
403 1.5.4.2 tls
404 1.5.4.2 tls /* Free Tx/Rx DMA resources. */
405 1.5.4.2 tls sc->sc_ops.dma_free(sc);
406 1.5.4.4 jdolecek
407 1.5.4.4 jdolecek if (sc->sc_soft_ih != NULL) {
408 1.5.4.4 jdolecek softint_disestablish(sc->sc_soft_ih);
409 1.5.4.4 jdolecek sc->sc_soft_ih = NULL;
410 1.5.4.4 jdolecek }
411 1.5.4.2 tls }
412 1.5.4.2 tls /* Free ROM copy. */
413 1.5.4.2 tls if (sc->sc_eep != NULL) {
414 1.5.4.2 tls free(sc->sc_eep, M_DEVBUF);
415 1.5.4.2 tls sc->sc_eep = NULL;
416 1.5.4.2 tls }
417 1.5.4.2 tls
418 1.5.4.2 tls bpf_detach(ifp);
419 1.5.4.2 tls ieee80211_ifdetach(&sc->sc_ic);
420 1.5.4.2 tls if_detach(ifp);
421 1.5.4.2 tls
422 1.5.4.2 tls callout_destroy(&sc->sc_scan_to);
423 1.5.4.2 tls callout_destroy(&sc->sc_calib_to);
424 1.5.4.4 jdolecek
425 1.5.4.4 jdolecek pmf_event_deregister(sc->sc_dev, PMFE_RADIO_OFF, athn_pmf_wlan_off,
426 1.5.4.4 jdolecek false);
427 1.5.4.2 tls }
428 1.5.4.2 tls
429 1.5.4.2 tls /*
430 1.5.4.2 tls * Attach the interface to 802.11 radiotap.
431 1.5.4.2 tls */
432 1.5.4.2 tls Static void
433 1.5.4.2 tls athn_radiotap_attach(struct athn_softc *sc)
434 1.5.4.2 tls {
435 1.5.4.2 tls
436 1.5.4.2 tls bpf_attach2(&sc->sc_if, DLT_IEEE802_11_RADIO,
437 1.5.4.2 tls sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
438 1.5.4.2 tls &sc->sc_drvbpf);
439 1.5.4.2 tls
440 1.5.4.2 tls sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
441 1.5.4.2 tls sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
442 1.5.4.2 tls sc->sc_rxtap.wr_ihdr.it_present = htole32(ATHN_RX_RADIOTAP_PRESENT);
443 1.5.4.2 tls
444 1.5.4.2 tls sc->sc_txtap_len = sizeof(sc->sc_txtapu);
445 1.5.4.2 tls sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
446 1.5.4.2 tls sc->sc_txtap.wt_ihdr.it_present = htole32(ATHN_TX_RADIOTAP_PRESENT);
447 1.5.4.2 tls }
448 1.5.4.2 tls
449 1.5.4.2 tls Static void
450 1.5.4.2 tls athn_get_chanlist(struct athn_softc *sc)
451 1.5.4.2 tls {
452 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
453 1.5.4.2 tls uint8_t chan;
454 1.5.4.2 tls size_t i;
455 1.5.4.2 tls
456 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_11G) {
457 1.5.4.2 tls for (i = 1; i <= 14; i++) {
458 1.5.4.2 tls chan = i;
459 1.5.4.2 tls ic->ic_channels[chan].ic_freq =
460 1.5.4.2 tls ieee80211_ieee2mhz(chan, IEEE80211_CHAN_2GHZ);
461 1.5.4.2 tls ic->ic_channels[chan].ic_flags =
462 1.5.4.2 tls IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
463 1.5.4.2 tls IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
464 1.5.4.2 tls }
465 1.5.4.2 tls }
466 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_11A) {
467 1.5.4.2 tls for (i = 0; i < __arraycount(athn_5ghz_chans); i++) {
468 1.5.4.2 tls chan = athn_5ghz_chans[i];
469 1.5.4.2 tls ic->ic_channels[chan].ic_freq =
470 1.5.4.2 tls ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ);
471 1.5.4.2 tls ic->ic_channels[chan].ic_flags = IEEE80211_CHAN_A;
472 1.5.4.2 tls }
473 1.5.4.2 tls }
474 1.5.4.2 tls }
475 1.5.4.2 tls
476 1.5.4.2 tls PUBLIC void
477 1.5.4.2 tls athn_rx_start(struct athn_softc *sc)
478 1.5.4.2 tls {
479 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
480 1.5.4.2 tls uint32_t rfilt;
481 1.5.4.2 tls
482 1.5.4.2 tls /* Setup Rx DMA descriptors. */
483 1.5.4.2 tls sc->sc_ops.rx_enable(sc);
484 1.5.4.2 tls
485 1.5.4.2 tls /* Set Rx filter. */
486 1.5.4.2 tls rfilt = AR_RX_FILTER_UCAST | AR_RX_FILTER_BCAST | AR_RX_FILTER_MCAST;
487 1.5.4.2 tls #ifndef IEEE80211_NO_HT
488 1.5.4.2 tls /* Want Compressed Block Ack Requests. */
489 1.5.4.2 tls rfilt |= AR_RX_FILTER_COMPR_BAR;
490 1.5.4.2 tls #endif
491 1.5.4.2 tls rfilt |= AR_RX_FILTER_BEACON;
492 1.5.4.2 tls if (ic->ic_opmode != IEEE80211_M_STA) {
493 1.5.4.2 tls rfilt |= AR_RX_FILTER_PROBEREQ;
494 1.5.4.2 tls if (ic->ic_opmode == IEEE80211_M_MONITOR)
495 1.5.4.2 tls rfilt |= AR_RX_FILTER_PROM;
496 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
497 1.5.4.2 tls if (AR_SREV_9280_10_OR_LATER(sc) &&
498 1.5.4.2 tls ic->ic_opmode == IEEE80211_M_HOSTAP)
499 1.5.4.2 tls rfilt |= AR_RX_FILTER_PSPOLL;
500 1.5.4.2 tls #endif
501 1.5.4.2 tls }
502 1.5.4.2 tls athn_set_rxfilter(sc, rfilt);
503 1.5.4.2 tls
504 1.5.4.2 tls /* Set BSSID mask. */
505 1.5.4.2 tls AR_WRITE(sc, AR_BSSMSKL, 0xffffffff);
506 1.5.4.2 tls AR_WRITE(sc, AR_BSSMSKU, 0xffff);
507 1.5.4.2 tls
508 1.5.4.2 tls athn_set_opmode(sc);
509 1.5.4.2 tls
510 1.5.4.2 tls /* Set multicast filter. */
511 1.5.4.2 tls AR_WRITE(sc, AR_MCAST_FIL0, 0xffffffff);
512 1.5.4.2 tls AR_WRITE(sc, AR_MCAST_FIL1, 0xffffffff);
513 1.5.4.2 tls
514 1.5.4.2 tls AR_WRITE(sc, AR_FILT_OFDM, 0);
515 1.5.4.2 tls AR_WRITE(sc, AR_FILT_CCK, 0);
516 1.5.4.2 tls AR_WRITE(sc, AR_MIBC, 0);
517 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
518 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
519 1.5.4.2 tls
520 1.5.4.2 tls /* XXX ANI. */
521 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_1, 0);
522 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_2, 0);
523 1.5.4.2 tls
524 1.5.4.2 tls /* Disable HW crypto for now. */
525 1.5.4.2 tls AR_SETBITS(sc, AR_DIAG_SW, AR_DIAG_ENCRYPT_DIS | AR_DIAG_DECRYPT_DIS);
526 1.5.4.2 tls
527 1.5.4.2 tls /* Start PCU Rx. */
528 1.5.4.2 tls AR_CLRBITS(sc, AR_DIAG_SW, AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT);
529 1.5.4.2 tls AR_WRITE_BARRIER(sc);
530 1.5.4.2 tls }
531 1.5.4.2 tls
532 1.5.4.2 tls PUBLIC void
533 1.5.4.2 tls athn_set_rxfilter(struct athn_softc *sc, uint32_t rfilt)
534 1.5.4.2 tls {
535 1.5.4.2 tls
536 1.5.4.2 tls AR_WRITE(sc, AR_RX_FILTER, rfilt);
537 1.5.4.2 tls #ifdef notyet
538 1.5.4.2 tls reg = AR_READ(sc, AR_PHY_ERR);
539 1.5.4.2 tls reg &= (AR_PHY_ERR_RADAR | AR_PHY_ERR_OFDM_TIMING |
540 1.5.4.2 tls AR_PHY_ERR_CCK_TIMING);
541 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR, reg);
542 1.5.4.2 tls if (reg != 0)
543 1.5.4.2 tls AR_SETBITS(sc, AR_RXCFG, AR_RXCFG_ZLFDMA);
544 1.5.4.2 tls else
545 1.5.4.2 tls AR_CLRBITS(sc, AR_RXCFG, AR_RXCFG_ZLFDMA);
546 1.5.4.2 tls #else
547 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR, 0);
548 1.5.4.2 tls AR_CLRBITS(sc, AR_RXCFG, AR_RXCFG_ZLFDMA);
549 1.5.4.2 tls #endif
550 1.5.4.2 tls AR_WRITE_BARRIER(sc);
551 1.5.4.2 tls }
552 1.5.4.2 tls
553 1.5.4.2 tls PUBLIC int
554 1.5.4.2 tls athn_intr(void *xsc)
555 1.5.4.2 tls {
556 1.5.4.2 tls struct athn_softc *sc = xsc;
557 1.5.4.2 tls struct ifnet *ifp = &sc->sc_if;
558 1.5.4.2 tls
559 1.5.4.2 tls if (!IS_UP_AND_RUNNING(ifp))
560 1.5.4.2 tls return 0;
561 1.5.4.2 tls
562 1.5.4.2 tls if (!device_activation(sc->sc_dev, DEVACT_LEVEL_DRIVER))
563 1.5.4.2 tls /*
564 1.5.4.2 tls * The hardware is not ready/present, don't touch anything.
565 1.5.4.2 tls * Note this can happen early on if the IRQ is shared.
566 1.5.4.2 tls */
567 1.5.4.2 tls return 0;
568 1.5.4.2 tls
569 1.5.4.4 jdolecek if (!sc->sc_ops.intr_status(sc))
570 1.5.4.4 jdolecek return 0;
571 1.5.4.4 jdolecek
572 1.5.4.4 jdolecek AR_WRITE(sc, AR_INTR_ASYNC_MASK, 0);
573 1.5.4.4 jdolecek AR_WRITE(sc, AR_INTR_SYNC_MASK, 0);
574 1.5.4.4 jdolecek AR_WRITE_BARRIER(sc);
575 1.5.4.4 jdolecek
576 1.5.4.4 jdolecek softint_schedule(sc->sc_soft_ih);
577 1.5.4.4 jdolecek
578 1.5.4.4 jdolecek return 1;
579 1.5.4.4 jdolecek }
580 1.5.4.4 jdolecek
581 1.5.4.4 jdolecek Static void
582 1.5.4.4 jdolecek athn_softintr(void *xsc)
583 1.5.4.4 jdolecek {
584 1.5.4.4 jdolecek struct athn_softc *sc = xsc;
585 1.5.4.4 jdolecek struct ifnet *ifp = &sc->sc_if;
586 1.5.4.4 jdolecek
587 1.5.4.4 jdolecek if (!IS_UP_AND_RUNNING(ifp))
588 1.5.4.4 jdolecek return;
589 1.5.4.4 jdolecek
590 1.5.4.4 jdolecek if (!device_activation(sc->sc_dev, DEVACT_LEVEL_DRIVER))
591 1.5.4.4 jdolecek /*
592 1.5.4.4 jdolecek * The hardware is not ready/present, don't touch anything.
593 1.5.4.4 jdolecek * Note this can happen early on if the IRQ is shared.
594 1.5.4.4 jdolecek */
595 1.5.4.4 jdolecek return;
596 1.5.4.4 jdolecek
597 1.5.4.4 jdolecek sc->sc_ops.intr(sc);
598 1.5.4.4 jdolecek
599 1.5.4.4 jdolecek AR_WRITE(sc, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ);
600 1.5.4.4 jdolecek AR_WRITE(sc, AR_INTR_SYNC_MASK, sc->sc_isync);
601 1.5.4.4 jdolecek AR_WRITE_BARRIER(sc);
602 1.5.4.2 tls }
603 1.5.4.2 tls
604 1.5.4.2 tls Static void
605 1.5.4.2 tls athn_get_chipid(struct athn_softc *sc)
606 1.5.4.2 tls {
607 1.5.4.2 tls uint32_t reg;
608 1.5.4.2 tls
609 1.5.4.2 tls reg = AR_READ(sc, AR_SREV);
610 1.5.4.2 tls if (MS(reg, AR_SREV_ID) == 0xff) {
611 1.5.4.2 tls sc->sc_mac_ver = MS(reg, AR_SREV_VERSION2);
612 1.5.4.2 tls sc->sc_mac_rev = MS(reg, AR_SREV_REVISION2);
613 1.5.4.2 tls if (!(reg & AR_SREV_TYPE2_HOST_MODE))
614 1.5.4.2 tls sc->sc_flags |= ATHN_FLAG_PCIE;
615 1.5.4.2 tls }
616 1.5.4.2 tls else {
617 1.5.4.2 tls sc->sc_mac_ver = MS(reg, AR_SREV_VERSION);
618 1.5.4.2 tls sc->sc_mac_rev = MS(reg, AR_SREV_REVISION);
619 1.5.4.2 tls if (sc->sc_mac_ver == AR_SREV_VERSION_5416_PCIE)
620 1.5.4.2 tls sc->sc_flags |= ATHN_FLAG_PCIE;
621 1.5.4.2 tls }
622 1.5.4.2 tls }
623 1.5.4.2 tls
624 1.5.4.2 tls Static const char *
625 1.5.4.2 tls athn_get_mac_name(struct athn_softc *sc)
626 1.5.4.2 tls {
627 1.5.4.2 tls
628 1.5.4.2 tls switch (sc->sc_mac_ver) {
629 1.5.4.2 tls case AR_SREV_VERSION_5416_PCI:
630 1.5.4.2 tls return "AR5416";
631 1.5.4.2 tls case AR_SREV_VERSION_5416_PCIE:
632 1.5.4.2 tls return "AR5418";
633 1.5.4.2 tls case AR_SREV_VERSION_9160:
634 1.5.4.2 tls return "AR9160";
635 1.5.4.2 tls case AR_SREV_VERSION_9280:
636 1.5.4.2 tls return "AR9280";
637 1.5.4.2 tls case AR_SREV_VERSION_9285:
638 1.5.4.2 tls return "AR9285";
639 1.5.4.2 tls case AR_SREV_VERSION_9271:
640 1.5.4.2 tls return "AR9271";
641 1.5.4.2 tls case AR_SREV_VERSION_9287:
642 1.5.4.2 tls return "AR9287";
643 1.5.4.2 tls case AR_SREV_VERSION_9380:
644 1.5.4.2 tls return "AR9380";
645 1.5.4.2 tls case AR_SREV_VERSION_9485:
646 1.5.4.2 tls return "AR9485";
647 1.5.4.2 tls default:
648 1.5.4.2 tls return "unknown";
649 1.5.4.2 tls }
650 1.5.4.2 tls }
651 1.5.4.2 tls
652 1.5.4.2 tls /*
653 1.5.4.2 tls * Return RF chip name (not for single-chip solutions).
654 1.5.4.2 tls */
655 1.5.4.2 tls Static const char *
656 1.5.4.2 tls athn_get_rf_name(struct athn_softc *sc)
657 1.5.4.2 tls {
658 1.5.4.2 tls
659 1.5.4.2 tls KASSERT(!AR_SINGLE_CHIP(sc));
660 1.5.4.2 tls
661 1.5.4.2 tls switch (sc->sc_rf_rev) {
662 1.5.4.2 tls case AR_RAD5133_SREV_MAJOR: /* Dual-band 3T3R. */
663 1.5.4.2 tls return "AR5133";
664 1.5.4.2 tls case AR_RAD2133_SREV_MAJOR: /* Single-band 3T3R. */
665 1.5.4.2 tls return "AR2133";
666 1.5.4.2 tls case AR_RAD5122_SREV_MAJOR: /* Dual-band 2T2R. */
667 1.5.4.2 tls return "AR5122";
668 1.5.4.2 tls case AR_RAD2122_SREV_MAJOR: /* Single-band 2T2R. */
669 1.5.4.2 tls return "AR2122";
670 1.5.4.2 tls default:
671 1.5.4.2 tls return "unknown";
672 1.5.4.2 tls }
673 1.5.4.2 tls }
674 1.5.4.2 tls
675 1.5.4.2 tls PUBLIC int
676 1.5.4.2 tls athn_reset_power_on(struct athn_softc *sc)
677 1.5.4.2 tls {
678 1.5.4.2 tls int ntries;
679 1.5.4.2 tls
680 1.5.4.2 tls /* Set force wake. */
681 1.5.4.2 tls AR_WRITE(sc, AR_RTC_FORCE_WAKE,
682 1.5.4.2 tls AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);
683 1.5.4.2 tls
684 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc)) {
685 1.5.4.2 tls /* Make sure no DMA is active by doing an AHB reset. */
686 1.5.4.2 tls AR_WRITE(sc, AR_RC, AR_RC_AHB);
687 1.5.4.2 tls }
688 1.5.4.2 tls /* RTC reset and clear. */
689 1.5.4.2 tls AR_WRITE(sc, AR_RTC_RESET, 0);
690 1.5.4.2 tls AR_WRITE_BARRIER(sc);
691 1.5.4.2 tls DELAY(2);
692 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc))
693 1.5.4.2 tls AR_WRITE(sc, AR_RC, 0);
694 1.5.4.2 tls AR_WRITE(sc, AR_RTC_RESET, 1);
695 1.5.4.2 tls
696 1.5.4.2 tls /* Poll until RTC is ON. */
697 1.5.4.2 tls for (ntries = 0; ntries < 1000; ntries++) {
698 1.5.4.2 tls if ((AR_READ(sc, AR_RTC_STATUS) & AR_RTC_STATUS_M) ==
699 1.5.4.2 tls AR_RTC_STATUS_ON)
700 1.5.4.2 tls break;
701 1.5.4.2 tls DELAY(10);
702 1.5.4.2 tls }
703 1.5.4.2 tls if (ntries == 1000) {
704 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "RTC not waking up\n");
705 1.5.4.2 tls return ETIMEDOUT;
706 1.5.4.2 tls }
707 1.5.4.2 tls return athn_reset(sc, 0);
708 1.5.4.2 tls }
709 1.5.4.2 tls
710 1.5.4.2 tls PUBLIC int
711 1.5.4.2 tls athn_reset(struct athn_softc *sc, int cold_reset)
712 1.5.4.2 tls {
713 1.5.4.2 tls int ntries;
714 1.5.4.2 tls
715 1.5.4.2 tls /* Set force wake. */
716 1.5.4.2 tls AR_WRITE(sc, AR_RTC_FORCE_WAKE,
717 1.5.4.2 tls AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);
718 1.5.4.2 tls
719 1.5.4.2 tls if (AR_READ(sc, AR_INTR_SYNC_CAUSE) &
720 1.5.4.2 tls (AR_INTR_SYNC_LOCAL_TIMEOUT | AR_INTR_SYNC_RADM_CPL_TIMEOUT)) {
721 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_ENABLE, 0);
722 1.5.4.2 tls AR_WRITE(sc, AR_RC, AR_RC_HOSTIF |
723 1.5.4.2 tls (!AR_SREV_9380_10_OR_LATER(sc) ? AR_RC_AHB : 0));
724 1.5.4.2 tls }
725 1.5.4.2 tls else if (!AR_SREV_9380_10_OR_LATER(sc))
726 1.5.4.2 tls AR_WRITE(sc, AR_RC, AR_RC_AHB);
727 1.5.4.2 tls
728 1.5.4.2 tls AR_WRITE(sc, AR_RTC_RC, AR_RTC_RC_MAC_WARM |
729 1.5.4.2 tls (cold_reset ? AR_RTC_RC_MAC_COLD : 0));
730 1.5.4.2 tls AR_WRITE_BARRIER(sc);
731 1.5.4.2 tls DELAY(50);
732 1.5.4.2 tls AR_WRITE(sc, AR_RTC_RC, 0);
733 1.5.4.2 tls for (ntries = 0; ntries < 1000; ntries++) {
734 1.5.4.2 tls if (!(AR_READ(sc, AR_RTC_RC) &
735 1.5.4.2 tls (AR_RTC_RC_MAC_WARM | AR_RTC_RC_MAC_COLD)))
736 1.5.4.2 tls break;
737 1.5.4.2 tls DELAY(10);
738 1.5.4.2 tls }
739 1.5.4.2 tls if (ntries == 1000) {
740 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "RTC stuck in MAC reset\n");
741 1.5.4.2 tls return ETIMEDOUT;
742 1.5.4.2 tls }
743 1.5.4.2 tls AR_WRITE(sc, AR_RC, 0);
744 1.5.4.2 tls AR_WRITE_BARRIER(sc);
745 1.5.4.2 tls return 0;
746 1.5.4.2 tls }
747 1.5.4.2 tls
748 1.5.4.2 tls PUBLIC int
749 1.5.4.2 tls athn_set_power_awake(struct athn_softc *sc)
750 1.5.4.2 tls {
751 1.5.4.2 tls int ntries, error;
752 1.5.4.2 tls
753 1.5.4.2 tls /* Do a Power-On-Reset if shutdown. */
754 1.5.4.2 tls if ((AR_READ(sc, AR_RTC_STATUS) & AR_RTC_STATUS_M) ==
755 1.5.4.2 tls AR_RTC_STATUS_SHUTDOWN) {
756 1.5.4.2 tls if ((error = athn_reset_power_on(sc)) != 0)
757 1.5.4.2 tls return error;
758 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc))
759 1.5.4.2 tls athn_init_pll(sc, NULL);
760 1.5.4.2 tls }
761 1.5.4.2 tls AR_SETBITS(sc, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
762 1.5.4.2 tls AR_WRITE_BARRIER(sc);
763 1.5.4.2 tls DELAY(50); /* Give chip the chance to awake. */
764 1.5.4.2 tls
765 1.5.4.2 tls /* Poll until RTC is ON. */
766 1.5.4.2 tls for (ntries = 0; ntries < 4000; ntries++) {
767 1.5.4.2 tls if ((AR_READ(sc, AR_RTC_STATUS) & AR_RTC_STATUS_M) ==
768 1.5.4.2 tls AR_RTC_STATUS_ON)
769 1.5.4.2 tls break;
770 1.5.4.2 tls DELAY(50);
771 1.5.4.2 tls AR_SETBITS(sc, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
772 1.5.4.2 tls }
773 1.5.4.2 tls if (ntries == 4000) {
774 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "RTC not waking up\n");
775 1.5.4.2 tls return ETIMEDOUT;
776 1.5.4.2 tls }
777 1.5.4.2 tls
778 1.5.4.2 tls AR_CLRBITS(sc, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
779 1.5.4.2 tls AR_WRITE_BARRIER(sc);
780 1.5.4.2 tls return 0;
781 1.5.4.2 tls }
782 1.5.4.2 tls
783 1.5.4.2 tls PUBLIC void
784 1.5.4.2 tls athn_set_power_sleep(struct athn_softc *sc)
785 1.5.4.2 tls {
786 1.5.4.2 tls
787 1.5.4.2 tls AR_SETBITS(sc, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
788 1.5.4.2 tls /* Allow the MAC to go to sleep. */
789 1.5.4.2 tls AR_CLRBITS(sc, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
790 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc))
791 1.5.4.2 tls AR_WRITE(sc, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
792 1.5.4.2 tls /*
793 1.5.4.2 tls * NB: Clearing RTC_RESET_EN when setting the chip to sleep mode
794 1.5.4.2 tls * results in high power consumption on AR5416 chipsets.
795 1.5.4.2 tls */
796 1.5.4.2 tls if (!AR_SREV_5416(sc) && !AR_SREV_9271(sc))
797 1.5.4.2 tls AR_CLRBITS(sc, AR_RTC_RESET, AR_RTC_RESET_EN);
798 1.5.4.2 tls AR_WRITE_BARRIER(sc);
799 1.5.4.2 tls }
800 1.5.4.2 tls
801 1.5.4.2 tls PUBLIC void
802 1.5.4.2 tls athn_init_pll(struct athn_softc *sc, const struct ieee80211_channel *c)
803 1.5.4.2 tls {
804 1.5.4.2 tls uint32_t pll;
805 1.5.4.2 tls
806 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc)) {
807 1.5.4.2 tls if (AR_SREV_9485(sc))
808 1.5.4.2 tls AR_WRITE(sc, AR_RTC_PLL_CONTROL2, 0x886666);
809 1.5.4.2 tls pll = SM(AR_RTC_9160_PLL_REFDIV, 0x5);
810 1.5.4.2 tls pll |= SM(AR_RTC_9160_PLL_DIV, 0x2c);
811 1.5.4.2 tls }
812 1.5.4.2 tls else if (AR_SREV_9280_10_OR_LATER(sc)) {
813 1.5.4.2 tls pll = SM(AR_RTC_9160_PLL_REFDIV, 0x05);
814 1.5.4.2 tls if (c != NULL && IEEE80211_IS_CHAN_5GHZ(c)) {
815 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_FAST_PLL_CLOCK)
816 1.5.4.2 tls pll = 0x142c;
817 1.5.4.2 tls else if (AR_SREV_9280_20(sc))
818 1.5.4.2 tls pll = 0x2850;
819 1.5.4.2 tls else
820 1.5.4.2 tls pll |= SM(AR_RTC_9160_PLL_DIV, 0x28);
821 1.5.4.2 tls }
822 1.5.4.2 tls else
823 1.5.4.2 tls pll |= SM(AR_RTC_9160_PLL_DIV, 0x2c);
824 1.5.4.2 tls }
825 1.5.4.2 tls else if (AR_SREV_9160_10_OR_LATER(sc)) {
826 1.5.4.2 tls pll = SM(AR_RTC_9160_PLL_REFDIV, 0x05);
827 1.5.4.2 tls if (c != NULL && IEEE80211_IS_CHAN_5GHZ(c))
828 1.5.4.2 tls pll |= SM(AR_RTC_9160_PLL_DIV, 0x50);
829 1.5.4.2 tls else
830 1.5.4.2 tls pll |= SM(AR_RTC_9160_PLL_DIV, 0x58);
831 1.5.4.2 tls }
832 1.5.4.2 tls else {
833 1.5.4.2 tls pll = AR_RTC_PLL_REFDIV_5 | AR_RTC_PLL_DIV2;
834 1.5.4.2 tls if (c != NULL && IEEE80211_IS_CHAN_5GHZ(c))
835 1.5.4.2 tls pll |= SM(AR_RTC_PLL_DIV, 0x0a);
836 1.5.4.2 tls else
837 1.5.4.2 tls pll |= SM(AR_RTC_PLL_DIV, 0x0b);
838 1.5.4.2 tls }
839 1.5.4.2 tls DPRINTFN(DBG_INIT, sc, "AR_RTC_PLL_CONTROL=0x%08x\n", pll);
840 1.5.4.2 tls AR_WRITE(sc, AR_RTC_PLL_CONTROL, pll);
841 1.5.4.2 tls if (AR_SREV_9271(sc)) {
842 1.5.4.2 tls /* Switch core clock to 117MHz. */
843 1.5.4.2 tls AR_WRITE_BARRIER(sc);
844 1.5.4.2 tls DELAY(500);
845 1.5.4.2 tls AR_WRITE(sc, 0x50050, 0x304);
846 1.5.4.2 tls }
847 1.5.4.2 tls AR_WRITE_BARRIER(sc);
848 1.5.4.2 tls DELAY(100);
849 1.5.4.2 tls AR_WRITE(sc, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
850 1.5.4.2 tls AR_WRITE_BARRIER(sc);
851 1.5.4.2 tls }
852 1.5.4.2 tls
853 1.5.4.2 tls Static void
854 1.5.4.2 tls athn_write_serdes(struct athn_softc *sc, const struct athn_serdes *serdes)
855 1.5.4.2 tls {
856 1.5.4.2 tls int i;
857 1.5.4.2 tls
858 1.5.4.2 tls /* Write sequence to Serializer/Deserializer. */
859 1.5.4.2 tls for (i = 0; i < serdes->nvals; i++)
860 1.5.4.2 tls AR_WRITE(sc, serdes->regs[i], serdes->vals[i]);
861 1.5.4.2 tls AR_WRITE_BARRIER(sc);
862 1.5.4.2 tls }
863 1.5.4.2 tls
864 1.5.4.2 tls PUBLIC void
865 1.5.4.2 tls athn_config_pcie(struct athn_softc *sc)
866 1.5.4.2 tls {
867 1.5.4.2 tls
868 1.5.4.2 tls /* Disable PLL when in L0s as well as receiver clock when in L1. */
869 1.5.4.2 tls athn_write_serdes(sc, sc->sc_serdes);
870 1.5.4.2 tls
871 1.5.4.2 tls DELAY(1000);
872 1.5.4.2 tls /* Allow forcing of PCIe core into L1 state. */
873 1.5.4.2 tls AR_SETBITS(sc, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
874 1.5.4.2 tls
875 1.5.4.2 tls #ifndef ATHN_PCIE_WAEN
876 1.5.4.2 tls AR_WRITE(sc, AR_WA, sc->sc_workaround);
877 1.5.4.2 tls #else
878 1.5.4.2 tls AR_WRITE(sc, AR_WA, ATHN_PCIE_WAEN);
879 1.5.4.2 tls #endif
880 1.5.4.2 tls AR_WRITE_BARRIER(sc);
881 1.5.4.2 tls }
882 1.5.4.2 tls
883 1.5.4.2 tls /*
884 1.5.4.2 tls * Serializer/Deserializer programming for non-PCIe devices.
885 1.5.4.2 tls */
886 1.5.4.2 tls static const uint32_t ar_nonpcie_serdes_regs[] = {
887 1.5.4.2 tls AR_PCIE_SERDES,
888 1.5.4.2 tls AR_PCIE_SERDES,
889 1.5.4.2 tls AR_PCIE_SERDES,
890 1.5.4.2 tls AR_PCIE_SERDES,
891 1.5.4.2 tls AR_PCIE_SERDES,
892 1.5.4.2 tls AR_PCIE_SERDES,
893 1.5.4.2 tls AR_PCIE_SERDES,
894 1.5.4.2 tls AR_PCIE_SERDES,
895 1.5.4.2 tls AR_PCIE_SERDES,
896 1.5.4.2 tls AR_PCIE_SERDES2,
897 1.5.4.2 tls };
898 1.5.4.2 tls
899 1.5.4.2 tls static const uint32_t ar_nonpcie_serdes_vals[] = {
900 1.5.4.2 tls 0x9248fc00,
901 1.5.4.2 tls 0x24924924,
902 1.5.4.2 tls 0x28000029,
903 1.5.4.2 tls 0x57160824,
904 1.5.4.2 tls 0x25980579,
905 1.5.4.2 tls 0x00000000,
906 1.5.4.2 tls 0x1aaabe40,
907 1.5.4.2 tls 0xbe105554,
908 1.5.4.2 tls 0x000e1007,
909 1.5.4.2 tls 0x00000000
910 1.5.4.2 tls };
911 1.5.4.2 tls
912 1.5.4.2 tls static const struct athn_serdes ar_nonpcie_serdes = {
913 1.5.4.2 tls __arraycount(ar_nonpcie_serdes_vals),
914 1.5.4.2 tls ar_nonpcie_serdes_regs,
915 1.5.4.2 tls ar_nonpcie_serdes_vals
916 1.5.4.2 tls };
917 1.5.4.2 tls
918 1.5.4.2 tls PUBLIC void
919 1.5.4.2 tls athn_config_nonpcie(struct athn_softc *sc)
920 1.5.4.2 tls {
921 1.5.4.2 tls
922 1.5.4.2 tls athn_write_serdes(sc, &ar_nonpcie_serdes);
923 1.5.4.2 tls }
924 1.5.4.2 tls
925 1.5.4.2 tls PUBLIC int
926 1.5.4.2 tls athn_set_chan(struct athn_softc *sc, struct ieee80211_channel *curchan,
927 1.5.4.2 tls struct ieee80211_channel *extchan)
928 1.5.4.2 tls {
929 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
930 1.5.4.2 tls int error, qid;
931 1.5.4.2 tls
932 1.5.4.2 tls /* Check that Tx is stopped, otherwise RF Bus grant will not work. */
933 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++)
934 1.5.4.2 tls if (athn_tx_pending(sc, qid))
935 1.5.4.2 tls return EBUSY;
936 1.5.4.2 tls
937 1.5.4.2 tls /* Request RF Bus grant. */
938 1.5.4.2 tls if ((error = ops->rf_bus_request(sc)) != 0)
939 1.5.4.2 tls return error;
940 1.5.4.2 tls
941 1.5.4.2 tls ops->set_phy(sc, curchan, extchan);
942 1.5.4.2 tls
943 1.5.4.2 tls /* Change the synthesizer. */
944 1.5.4.2 tls if ((error = ops->set_synth(sc, curchan, extchan)) != 0)
945 1.5.4.2 tls return error;
946 1.5.4.2 tls
947 1.5.4.2 tls sc->sc_curchan = curchan;
948 1.5.4.2 tls sc->sc_curchanext = extchan;
949 1.5.4.2 tls
950 1.5.4.2 tls /* Set transmit power values for new channel. */
951 1.5.4.2 tls ops->set_txpower(sc, curchan, extchan);
952 1.5.4.2 tls
953 1.5.4.2 tls /* Release the RF Bus grant. */
954 1.5.4.2 tls ops->rf_bus_release(sc);
955 1.5.4.2 tls
956 1.5.4.2 tls /* Write delta slope coeffs for modes where OFDM may be used. */
957 1.5.4.2 tls if (sc->sc_ic.ic_curmode != IEEE80211_MODE_11B)
958 1.5.4.2 tls ops->set_delta_slope(sc, curchan, extchan);
959 1.5.4.2 tls
960 1.5.4.2 tls ops->spur_mitigate(sc, curchan, extchan);
961 1.5.4.2 tls /* XXX Load noisefloor values and start calibration. */
962 1.5.4.2 tls
963 1.5.4.2 tls return 0;
964 1.5.4.2 tls }
965 1.5.4.2 tls
966 1.5.4.2 tls Static int
967 1.5.4.2 tls athn_switch_chan(struct athn_softc *sc, struct ieee80211_channel *curchan,
968 1.5.4.2 tls struct ieee80211_channel *extchan)
969 1.5.4.2 tls {
970 1.5.4.2 tls int error, qid;
971 1.5.4.2 tls
972 1.5.4.2 tls /* Disable interrupts. */
973 1.5.4.2 tls athn_disable_interrupts(sc);
974 1.5.4.2 tls
975 1.5.4.2 tls /* Stop all Tx queues. */
976 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++)
977 1.5.4.2 tls athn_stop_tx_dma(sc, qid);
978 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++)
979 1.5.4.2 tls athn_tx_reclaim(sc, qid);
980 1.5.4.2 tls
981 1.5.4.2 tls /* Stop Rx. */
982 1.5.4.2 tls AR_SETBITS(sc, AR_DIAG_SW, AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT);
983 1.5.4.2 tls AR_WRITE(sc, AR_MIBC, AR_MIBC_FMC);
984 1.5.4.2 tls AR_WRITE(sc, AR_MIBC, AR_MIBC_CMC);
985 1.5.4.2 tls AR_WRITE(sc, AR_FILT_OFDM, 0);
986 1.5.4.2 tls AR_WRITE(sc, AR_FILT_CCK, 0);
987 1.5.4.2 tls athn_set_rxfilter(sc, 0);
988 1.5.4.2 tls error = athn_stop_rx_dma(sc);
989 1.5.4.2 tls if (error != 0)
990 1.5.4.2 tls goto reset;
991 1.5.4.2 tls
992 1.5.4.2 tls #ifdef notyet
993 1.5.4.2 tls /* AR9280 needs a full reset. */
994 1.5.4.2 tls if (AR_SREV_9280(sc))
995 1.5.4.2 tls #endif
996 1.5.4.2 tls goto reset;
997 1.5.4.2 tls
998 1.5.4.2 tls /* If band or bandwidth changes, we need to do a full reset. */
999 1.5.4.2 tls if (curchan->ic_flags != sc->sc_curchan->ic_flags ||
1000 1.5.4.2 tls ((extchan != NULL) ^ (sc->sc_curchanext != NULL))) {
1001 1.5.4.2 tls DPRINTFN(DBG_RF, sc, "channel band switch\n");
1002 1.5.4.2 tls goto reset;
1003 1.5.4.2 tls }
1004 1.5.4.2 tls error = athn_set_power_awake(sc);
1005 1.5.4.2 tls if (error != 0)
1006 1.5.4.2 tls goto reset;
1007 1.5.4.2 tls
1008 1.5.4.2 tls error = athn_set_chan(sc, curchan, extchan);
1009 1.5.4.2 tls if (error != 0) {
1010 1.5.4.2 tls reset: /* Error found, try a full reset. */
1011 1.5.4.2 tls DPRINTFN(DBG_RF, sc, "needs a full reset\n");
1012 1.5.4.2 tls error = athn_hw_reset(sc, curchan, extchan, 0);
1013 1.5.4.2 tls if (error != 0) /* Hopeless case. */
1014 1.5.4.2 tls return error;
1015 1.5.4.2 tls }
1016 1.5.4.2 tls athn_rx_start(sc);
1017 1.5.4.2 tls
1018 1.5.4.2 tls /* Re-enable interrupts. */
1019 1.5.4.2 tls athn_enable_interrupts(sc);
1020 1.5.4.2 tls return 0;
1021 1.5.4.2 tls }
1022 1.5.4.2 tls
1023 1.5.4.2 tls PUBLIC void
1024 1.5.4.2 tls athn_get_delta_slope(uint32_t coeff, uint32_t *exponent, uint32_t *mantissa)
1025 1.5.4.2 tls {
1026 1.5.4.2 tls #define COEFF_SCALE_SHIFT 24
1027 1.5.4.2 tls uint32_t exp, man;
1028 1.5.4.2 tls
1029 1.5.4.2 tls /* exponent = 14 - floor(log2(coeff)) */
1030 1.5.4.2 tls for (exp = 31; exp > 0; exp--)
1031 1.5.4.2 tls if (coeff & (1 << exp))
1032 1.5.4.2 tls break;
1033 1.5.4.2 tls exp = 14 - (exp - COEFF_SCALE_SHIFT);
1034 1.5.4.2 tls
1035 1.5.4.2 tls /* mantissa = floor(coeff * 2^exponent + 0.5) */
1036 1.5.4.2 tls man = coeff + (1 << (COEFF_SCALE_SHIFT - exp - 1));
1037 1.5.4.2 tls
1038 1.5.4.2 tls *mantissa = man >> (COEFF_SCALE_SHIFT - exp);
1039 1.5.4.2 tls *exponent = exp - 16;
1040 1.5.4.2 tls #undef COEFF_SCALE_SHIFT
1041 1.5.4.2 tls }
1042 1.5.4.2 tls
1043 1.5.4.2 tls PUBLIC void
1044 1.5.4.2 tls athn_reset_key(struct athn_softc *sc, int entry)
1045 1.5.4.2 tls {
1046 1.5.4.2 tls
1047 1.5.4.2 tls /*
1048 1.5.4.2 tls * NB: Key cache registers access special memory area that requires
1049 1.5.4.2 tls * two 32-bit writes to actually update the values in the internal
1050 1.5.4.2 tls * memory. Consequently, writes must be grouped by pair.
1051 1.5.4.2 tls */
1052 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY0(entry), 0);
1053 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY1(entry), 0);
1054 1.5.4.2 tls
1055 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY2(entry), 0);
1056 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY3(entry), 0);
1057 1.5.4.2 tls
1058 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY4(entry), 0);
1059 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_TYPE(entry), AR_KEYTABLE_TYPE_CLR);
1060 1.5.4.2 tls
1061 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_MAC0(entry), 0);
1062 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_MAC1(entry), 0);
1063 1.5.4.2 tls
1064 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1065 1.5.4.2 tls }
1066 1.5.4.2 tls
1067 1.5.4.2 tls #ifdef notyet
1068 1.5.4.2 tls Static int
1069 1.5.4.2 tls athn_set_key(struct ieee80211com *ic, struct ieee80211_node *ni,
1070 1.5.4.2 tls struct ieee80211_key *k)
1071 1.5.4.2 tls {
1072 1.5.4.2 tls struct athn_softc *sc = ic->ic_ifp->if_softc;
1073 1.5.4.2 tls const uint8_t *txmic, *rxmic, *key, *addr;
1074 1.5.4.2 tls uintptr_t entry, micentry;
1075 1.5.4.2 tls uint32_t type, lo, hi;
1076 1.5.4.2 tls
1077 1.5.4.2 tls switch (k->k_cipher) {
1078 1.5.4.2 tls case IEEE80211_CIPHER_WEP40:
1079 1.5.4.2 tls type = AR_KEYTABLE_TYPE_40;
1080 1.5.4.2 tls break;
1081 1.5.4.2 tls case IEEE80211_CIPHER_WEP104:
1082 1.5.4.2 tls type = AR_KEYTABLE_TYPE_104;
1083 1.5.4.2 tls break;
1084 1.5.4.2 tls case IEEE80211_CIPHER_TKIP:
1085 1.5.4.2 tls type = AR_KEYTABLE_TYPE_TKIP;
1086 1.5.4.2 tls break;
1087 1.5.4.2 tls case IEEE80211_CIPHER_CCMP:
1088 1.5.4.2 tls type = AR_KEYTABLE_TYPE_CCM;
1089 1.5.4.2 tls break;
1090 1.5.4.2 tls default:
1091 1.5.4.2 tls /* Fallback to software crypto for other ciphers. */
1092 1.5.4.2 tls return ieee80211_set_key(ic, ni, k);
1093 1.5.4.2 tls }
1094 1.5.4.2 tls
1095 1.5.4.2 tls if (!(k->k_flags & IEEE80211_KEY_GROUP))
1096 1.5.4.2 tls entry = IEEE80211_WEP_NKID + IEEE80211_AID(ni->ni_associd);
1097 1.5.4.2 tls else
1098 1.5.4.2 tls entry = k->k_id;
1099 1.5.4.2 tls k->k_priv = (void *)entry;
1100 1.5.4.2 tls
1101 1.5.4.2 tls /* NB: See note about key cache registers access above. */
1102 1.5.4.2 tls key = k->k_key;
1103 1.5.4.2 tls if (type == AR_KEYTABLE_TYPE_TKIP) {
1104 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
1105 1.5.4.2 tls if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
1106 1.5.4.2 tls txmic = &key[16];
1107 1.5.4.2 tls rxmic = &key[24];
1108 1.5.4.2 tls }
1109 1.5.4.2 tls else
1110 1.5.4.2 tls #endif
1111 1.5.4.2 tls {
1112 1.5.4.2 tls rxmic = &key[16];
1113 1.5.4.2 tls txmic = &key[24];
1114 1.5.4.2 tls }
1115 1.5.4.2 tls /* Tx+Rx MIC key is at entry + 64. */
1116 1.5.4.2 tls micentry = entry + 64;
1117 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY0(micentry), LE_READ_4(&rxmic[0]));
1118 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY1(micentry), LE_READ_2(&txmic[2]));
1119 1.5.4.2 tls
1120 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY2(micentry), LE_READ_4(&rxmic[4]));
1121 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY3(micentry), LE_READ_2(&txmic[0]));
1122 1.5.4.2 tls
1123 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY4(micentry), LE_READ_4(&txmic[4]));
1124 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_TYPE(micentry), AR_KEYTABLE_TYPE_CLR);
1125 1.5.4.2 tls }
1126 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY0(entry), LE_READ_4(&key[ 0]));
1127 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY1(entry), LE_READ_2(&key[ 4]));
1128 1.5.4.2 tls
1129 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY2(entry), LE_READ_4(&key[ 6]));
1130 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY3(entry), LE_READ_2(&key[10]));
1131 1.5.4.2 tls
1132 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_KEY4(entry), LE_READ_4(&key[12]));
1133 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_TYPE(entry), type);
1134 1.5.4.2 tls
1135 1.5.4.2 tls if (!(k->k_flags & IEEE80211_KEY_GROUP)) {
1136 1.5.4.2 tls addr = ni->ni_macaddr;
1137 1.5.4.2 tls lo = LE_READ_4(&addr[0]);
1138 1.5.4.2 tls hi = LE_READ_2(&addr[4]);
1139 1.5.4.2 tls lo = lo >> 1 | hi << 31;
1140 1.5.4.2 tls hi = hi >> 1;
1141 1.5.4.2 tls }
1142 1.5.4.2 tls else
1143 1.5.4.2 tls lo = hi = 0;
1144 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_MAC0(entry), lo);
1145 1.5.4.2 tls AR_WRITE(sc, AR_KEYTABLE_MAC1(entry), hi | AR_KEYTABLE_VALID);
1146 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1147 1.5.4.2 tls return 0;
1148 1.5.4.2 tls }
1149 1.5.4.2 tls
1150 1.5.4.2 tls Static void
1151 1.5.4.2 tls athn_delete_key(struct ieee80211com *ic, struct ieee80211_node *ni,
1152 1.5.4.2 tls struct ieee80211_key *k)
1153 1.5.4.2 tls {
1154 1.5.4.2 tls struct athn_softc *sc = ic->ic_ifp->if_softc;
1155 1.5.4.2 tls uintptr_t entry;
1156 1.5.4.2 tls
1157 1.5.4.2 tls switch (k->k_cipher) {
1158 1.5.4.2 tls case IEEE80211_CIPHER_WEP40:
1159 1.5.4.2 tls case IEEE80211_CIPHER_WEP104:
1160 1.5.4.2 tls case IEEE80211_CIPHER_CCMP:
1161 1.5.4.2 tls entry = (uintptr_t)k->k_priv;
1162 1.5.4.2 tls athn_reset_key(sc, entry);
1163 1.5.4.2 tls break;
1164 1.5.4.2 tls case IEEE80211_CIPHER_TKIP:
1165 1.5.4.2 tls entry = (uintptr_t)k->k_priv;
1166 1.5.4.2 tls athn_reset_key(sc, entry);
1167 1.5.4.2 tls athn_reset_key(sc, entry + 64);
1168 1.5.4.2 tls break;
1169 1.5.4.2 tls default:
1170 1.5.4.2 tls /* Fallback to software crypto for other ciphers. */
1171 1.5.4.2 tls ieee80211_delete_key(ic, ni, k);
1172 1.5.4.2 tls }
1173 1.5.4.2 tls }
1174 1.5.4.2 tls #endif /* notyet */
1175 1.5.4.2 tls
1176 1.5.4.2 tls PUBLIC void
1177 1.5.4.2 tls athn_led_init(struct athn_softc *sc)
1178 1.5.4.2 tls {
1179 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1180 1.5.4.2 tls
1181 1.5.4.2 tls ops->gpio_config_output(sc, sc->sc_led_pin, AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1182 1.5.4.2 tls /* LED off, active low. */
1183 1.5.4.2 tls athn_set_led(sc, 0);
1184 1.5.4.2 tls }
1185 1.5.4.2 tls
1186 1.5.4.2 tls PUBLIC void
1187 1.5.4.2 tls athn_set_led(struct athn_softc *sc, int on)
1188 1.5.4.2 tls {
1189 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1190 1.5.4.2 tls
1191 1.5.4.2 tls sc->sc_led_state = on;
1192 1.5.4.2 tls ops->gpio_write(sc, sc->sc_led_pin, !sc->sc_led_state);
1193 1.5.4.2 tls }
1194 1.5.4.2 tls
1195 1.5.4.2 tls #ifdef ATHN_BT_COEXISTENCE
1196 1.5.4.2 tls Static void
1197 1.5.4.2 tls athn_btcoex_init(struct athn_softc *sc)
1198 1.5.4.2 tls {
1199 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1200 1.5.4.2 tls uint32_t reg;
1201 1.5.4.2 tls
1202 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_BTCOEX2WIRE) {
1203 1.5.4.2 tls /* Connect bt_active to baseband. */
1204 1.5.4.2 tls AR_CLRBITS(sc, sc->sc_gpio_input_en_off,
1205 1.5.4.2 tls AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF |
1206 1.5.4.2 tls AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF);
1207 1.5.4.2 tls AR_SETBITS(sc, sc->sc_gpio_input_en_off,
1208 1.5.4.2 tls AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB);
1209 1.5.4.2 tls
1210 1.5.4.2 tls reg = AR_READ(sc, AR_GPIO_INPUT_MUX1);
1211 1.5.4.2 tls reg = RW(reg, AR_GPIO_INPUT_MUX1_BT_ACTIVE,
1212 1.5.4.2 tls AR_GPIO_BTACTIVE_PIN);
1213 1.5.4.2 tls AR_WRITE(sc, AR_GPIO_INPUT_MUX1, reg);
1214 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1215 1.5.4.2 tls
1216 1.5.4.2 tls ops->gpio_config_input(sc, AR_GPIO_BTACTIVE_PIN);
1217 1.5.4.2 tls }
1218 1.5.4.2 tls else { /* 3-wire. */
1219 1.5.4.2 tls AR_SETBITS(sc, sc->sc_gpio_input_en_off,
1220 1.5.4.2 tls AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB |
1221 1.5.4.2 tls AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB);
1222 1.5.4.2 tls
1223 1.5.4.2 tls reg = AR_READ(sc, AR_GPIO_INPUT_MUX1);
1224 1.5.4.2 tls reg = RW(reg, AR_GPIO_INPUT_MUX1_BT_ACTIVE,
1225 1.5.4.2 tls AR_GPIO_BTACTIVE_PIN);
1226 1.5.4.2 tls reg = RW(reg, AR_GPIO_INPUT_MUX1_BT_PRIORITY,
1227 1.5.4.2 tls AR_GPIO_BTPRIORITY_PIN);
1228 1.5.4.2 tls AR_WRITE(sc, AR_GPIO_INPUT_MUX1, reg);
1229 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1230 1.5.4.2 tls
1231 1.5.4.2 tls ops->gpio_config_input(sc, AR_GPIO_BTACTIVE_PIN);
1232 1.5.4.2 tls ops->gpio_config_input(sc, AR_GPIO_BTPRIORITY_PIN);
1233 1.5.4.2 tls }
1234 1.5.4.2 tls }
1235 1.5.4.2 tls
1236 1.5.4.2 tls Static void
1237 1.5.4.2 tls athn_btcoex_enable(struct athn_softc *sc)
1238 1.5.4.2 tls {
1239 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1240 1.5.4.2 tls uint32_t reg;
1241 1.5.4.2 tls
1242 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_BTCOEX3WIRE) {
1243 1.5.4.2 tls AR_WRITE(sc, AR_BT_COEX_MODE,
1244 1.5.4.2 tls SM(AR_BT_MODE, AR_BT_MODE_SLOTTED) |
1245 1.5.4.2 tls SM(AR_BT_PRIORITY_TIME, 2) |
1246 1.5.4.2 tls SM(AR_BT_FIRST_SLOT_TIME, 5) |
1247 1.5.4.2 tls SM(AR_BT_QCU_THRESH, ATHN_QID_AC_BE) |
1248 1.5.4.2 tls AR_BT_TXSTATE_EXTEND | AR_BT_TX_FRAME_EXTEND |
1249 1.5.4.2 tls AR_BT_QUIET | AR_BT_RX_CLEAR_POLARITY);
1250 1.5.4.2 tls AR_WRITE(sc, AR_BT_COEX_WEIGHT,
1251 1.5.4.2 tls SM(AR_BTCOEX_BT_WGHT, AR_STOMP_LOW_BT_WGHT) |
1252 1.5.4.2 tls SM(AR_BTCOEX_WL_WGHT, AR_STOMP_LOW_WL_WGHT));
1253 1.5.4.2 tls AR_WRITE(sc, AR_BT_COEX_MODE2,
1254 1.5.4.2 tls SM(AR_BT_BCN_MISS_THRESH, 50) |
1255 1.5.4.2 tls AR_BT_HOLD_RX_CLEAR | AR_BT_DISABLE_BT_ANT);
1256 1.5.4.2 tls
1257 1.5.4.2 tls AR_SETBITS(sc, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE);
1258 1.5.4.2 tls AR_CLRBITS(sc, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX);
1259 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1260 1.5.4.2 tls
1261 1.5.4.2 tls ops->gpio_config_output(sc, AR_GPIO_WLANACTIVE_PIN,
1262 1.5.4.2 tls AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL);
1263 1.5.4.2 tls
1264 1.5.4.2 tls }
1265 1.5.4.2 tls else { /* 2-wire. */
1266 1.5.4.2 tls ops->gpio_config_output(sc, AR_GPIO_WLANACTIVE_PIN,
1267 1.5.4.2 tls AR_GPIO_OUTPUT_MUX_AS_TX_FRAME);
1268 1.5.4.2 tls }
1269 1.5.4.2 tls reg = AR_READ(sc, AR_GPIO_PDPU);
1270 1.5.4.2 tls reg &= ~(0x3 << (AR_GPIO_WLANACTIVE_PIN * 2));
1271 1.5.4.2 tls reg |= 0x2 << (AR_GPIO_WLANACTIVE_PIN * 2);
1272 1.5.4.2 tls AR_WRITE(sc, AR_GPIO_PDPU, reg);
1273 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1274 1.5.4.2 tls
1275 1.5.4.2 tls /* Disable PCIe Active State Power Management (ASPM). */
1276 1.5.4.2 tls if (sc->sc_disable_aspm != NULL)
1277 1.5.4.2 tls sc->sc_disable_aspm(sc);
1278 1.5.4.2 tls
1279 1.5.4.2 tls /* XXX Start periodic timer. */
1280 1.5.4.2 tls }
1281 1.5.4.2 tls
1282 1.5.4.2 tls Static void
1283 1.5.4.2 tls athn_btcoex_disable(struct athn_softc *sc)
1284 1.5.4.2 tls {
1285 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1286 1.5.4.2 tls
1287 1.5.4.2 tls ops->gpio_write(sc, AR_GPIO_WLANACTIVE_PIN, 0);
1288 1.5.4.2 tls
1289 1.5.4.2 tls ops->gpio_config_output(sc, AR_GPIO_WLANACTIVE_PIN,
1290 1.5.4.2 tls AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1291 1.5.4.2 tls
1292 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_BTCOEX3WIRE) {
1293 1.5.4.2 tls AR_WRITE(sc, AR_BT_COEX_MODE,
1294 1.5.4.2 tls SM(AR_BT_MODE, AR_BT_MODE_DISABLED) | AR_BT_QUIET);
1295 1.5.4.2 tls AR_WRITE(sc, AR_BT_COEX_WEIGHT, 0);
1296 1.5.4.2 tls AR_WRITE(sc, AR_BT_COEX_MODE2, 0);
1297 1.5.4.2 tls /* XXX Stop periodic timer. */
1298 1.5.4.2 tls }
1299 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1300 1.5.4.2 tls /* XXX Restore ASPM setting? */
1301 1.5.4.2 tls }
1302 1.5.4.2 tls #endif
1303 1.5.4.2 tls
1304 1.5.4.2 tls Static void
1305 1.5.4.2 tls athn_iter_func(void *arg, struct ieee80211_node *ni)
1306 1.5.4.2 tls {
1307 1.5.4.2 tls struct athn_softc *sc = arg;
1308 1.5.4.2 tls struct athn_node *an = (struct athn_node *)ni;
1309 1.5.4.2 tls
1310 1.5.4.2 tls ieee80211_amrr_choose(&sc->sc_amrr, ni, &an->amn);
1311 1.5.4.2 tls }
1312 1.5.4.2 tls
1313 1.5.4.2 tls Static void
1314 1.5.4.2 tls athn_calib_to(void *arg)
1315 1.5.4.2 tls {
1316 1.5.4.2 tls extern int ticks;
1317 1.5.4.2 tls struct athn_softc *sc = arg;
1318 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1319 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
1320 1.5.4.2 tls int s;
1321 1.5.4.2 tls
1322 1.5.4.2 tls s = splnet();
1323 1.5.4.2 tls
1324 1.5.4.2 tls /* Do periodic (every 4 minutes) PA calibration. */
1325 1.5.4.2 tls if (AR_SREV_9285_11_OR_LATER(sc) &&
1326 1.5.4.2 tls !AR_SREV_9380_10_OR_LATER(sc) &&
1327 1.5.4.3 tls (ticks - (sc->sc_pa_calib_ticks + 240 * hz)) >= 0) {
1328 1.5.4.2 tls sc->sc_pa_calib_ticks = ticks;
1329 1.5.4.2 tls if (AR_SREV_9271(sc))
1330 1.5.4.2 tls ar9271_pa_calib(sc);
1331 1.5.4.2 tls else
1332 1.5.4.2 tls ar9285_pa_calib(sc);
1333 1.5.4.2 tls }
1334 1.5.4.2 tls
1335 1.5.4.2 tls /* Do periodic (every 30 seconds) temperature compensation. */
1336 1.5.4.2 tls if ((sc->sc_flags & ATHN_FLAG_OLPC) &&
1337 1.5.4.2 tls ticks >= sc->sc_olpc_ticks + 30 * hz) {
1338 1.5.4.2 tls sc->sc_olpc_ticks = ticks;
1339 1.5.4.2 tls ops->olpc_temp_compensation(sc);
1340 1.5.4.2 tls }
1341 1.5.4.2 tls
1342 1.5.4.2 tls #ifdef notyet
1343 1.5.4.2 tls /* XXX ANI. */
1344 1.5.4.2 tls athn_ani_monitor(sc);
1345 1.5.4.2 tls
1346 1.5.4.2 tls ops->next_calib(sc);
1347 1.5.4.2 tls #endif
1348 1.5.4.2 tls if (ic->ic_fixed_rate == -1) {
1349 1.5.4.2 tls if (ic->ic_opmode == IEEE80211_M_STA)
1350 1.5.4.2 tls athn_iter_func(sc, ic->ic_bss);
1351 1.5.4.2 tls else
1352 1.5.4.2 tls ieee80211_iterate_nodes(&ic->ic_sta, athn_iter_func, sc);
1353 1.5.4.2 tls }
1354 1.5.4.2 tls callout_schedule(&sc->sc_calib_to, hz / 2);
1355 1.5.4.2 tls splx(s);
1356 1.5.4.2 tls }
1357 1.5.4.2 tls
1358 1.5.4.2 tls Static int
1359 1.5.4.2 tls athn_init_calib(struct athn_softc *sc, struct ieee80211_channel *curchan,
1360 1.5.4.2 tls struct ieee80211_channel *extchan)
1361 1.5.4.2 tls {
1362 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1363 1.5.4.2 tls int error;
1364 1.5.4.2 tls
1365 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc))
1366 1.5.4.2 tls error = ar9003_init_calib(sc);
1367 1.5.4.2 tls else if (AR_SREV_9285_10_OR_LATER(sc))
1368 1.5.4.2 tls error = ar9285_init_calib(sc, curchan, extchan);
1369 1.5.4.2 tls else
1370 1.5.4.2 tls error = ar5416_init_calib(sc, curchan, extchan);
1371 1.5.4.2 tls if (error != 0)
1372 1.5.4.2 tls return error;
1373 1.5.4.2 tls
1374 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc)) {
1375 1.5.4.2 tls /* Do PA calibration. */
1376 1.5.4.2 tls if (AR_SREV_9285_11_OR_LATER(sc)) {
1377 1.5.4.2 tls extern int ticks;
1378 1.5.4.2 tls sc->sc_pa_calib_ticks = ticks;
1379 1.5.4.2 tls if (AR_SREV_9271(sc))
1380 1.5.4.2 tls ar9271_pa_calib(sc);
1381 1.5.4.2 tls else
1382 1.5.4.2 tls ar9285_pa_calib(sc);
1383 1.5.4.2 tls }
1384 1.5.4.2 tls /* Do noisefloor calibration. */
1385 1.5.4.2 tls ops->noisefloor_calib(sc);
1386 1.5.4.2 tls }
1387 1.5.4.2 tls if (AR_SREV_9160_10_OR_LATER(sc)) {
1388 1.5.4.2 tls /* Support IQ calibration. */
1389 1.5.4.2 tls sc->sc_sup_calib_mask = ATHN_CAL_IQ;
1390 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc)) {
1391 1.5.4.2 tls /* Support temperature compensation calibration. */
1392 1.5.4.2 tls sc->sc_sup_calib_mask |= ATHN_CAL_TEMP;
1393 1.5.4.2 tls }
1394 1.5.4.2 tls else if (IEEE80211_IS_CHAN_5GHZ(curchan) || extchan != NULL) {
1395 1.5.4.2 tls /*
1396 1.5.4.2 tls * ADC gain calibration causes uplink throughput
1397 1.5.4.2 tls * drops in HT40 mode on AR9287.
1398 1.5.4.2 tls */
1399 1.5.4.2 tls if (!AR_SREV_9287(sc)) {
1400 1.5.4.2 tls /* Support ADC gain calibration. */
1401 1.5.4.2 tls sc->sc_sup_calib_mask |= ATHN_CAL_ADC_GAIN;
1402 1.5.4.2 tls }
1403 1.5.4.2 tls /* Support ADC DC offset calibration. */
1404 1.5.4.2 tls sc->sc_sup_calib_mask |= ATHN_CAL_ADC_DC;
1405 1.5.4.2 tls }
1406 1.5.4.2 tls }
1407 1.5.4.2 tls return 0;
1408 1.5.4.2 tls }
1409 1.5.4.2 tls
1410 1.5.4.2 tls /*
1411 1.5.4.2 tls * Adaptive noise immunity.
1412 1.5.4.2 tls */
1413 1.5.4.2 tls #ifdef notyet
1414 1.5.4.2 tls Static int32_t
1415 1.5.4.2 tls athn_ani_get_rssi(struct athn_softc *sc)
1416 1.5.4.2 tls {
1417 1.5.4.2 tls
1418 1.5.4.2 tls return 0; /* XXX */
1419 1.5.4.2 tls }
1420 1.5.4.2 tls #endif /* notyet */
1421 1.5.4.2 tls
1422 1.5.4.2 tls #ifdef notyet
1423 1.5.4.2 tls Static void
1424 1.5.4.2 tls athn_ani_ofdm_err_trigger(struct athn_softc *sc)
1425 1.5.4.2 tls {
1426 1.5.4.2 tls struct athn_ani *ani = &sc->sc_ani;
1427 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1428 1.5.4.2 tls int32_t rssi;
1429 1.5.4.2 tls
1430 1.5.4.2 tls /* First, raise noise immunity level, up to max. */
1431 1.5.4.2 tls if (ani->noise_immunity_level < 4) {
1432 1.5.4.2 tls ani->noise_immunity_level++;
1433 1.5.4.2 tls ops->set_noise_immunity_level(sc, ani->noise_immunity_level);
1434 1.5.4.2 tls return;
1435 1.5.4.2 tls }
1436 1.5.4.2 tls
1437 1.5.4.2 tls /* Then, raise our spur immunity level, up to max. */
1438 1.5.4.2 tls if (ani->spur_immunity_level < 7) {
1439 1.5.4.2 tls ani->spur_immunity_level++;
1440 1.5.4.2 tls ops->set_spur_immunity_level(sc, ani->spur_immunity_level);
1441 1.5.4.2 tls return;
1442 1.5.4.2 tls }
1443 1.5.4.2 tls
1444 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
1445 1.5.4.2 tls if (sc->sc_ic.ic_opmode == IEEE80211_M_HOSTAP) {
1446 1.5.4.2 tls if (ani->firstep_level < 2) {
1447 1.5.4.2 tls ani->firstep_level++;
1448 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1449 1.5.4.2 tls }
1450 1.5.4.2 tls return;
1451 1.5.4.2 tls }
1452 1.5.4.2 tls #endif
1453 1.5.4.2 tls rssi = athn_ani_get_rssi(sc);
1454 1.5.4.2 tls if (rssi > ATHN_ANI_RSSI_THR_HIGH) {
1455 1.5.4.2 tls /*
1456 1.5.4.2 tls * Beacon RSSI is high, turn off OFDM weak signal detection
1457 1.5.4.2 tls * or raise first step level as last resort.
1458 1.5.4.2 tls */
1459 1.5.4.2 tls if (ani->ofdm_weak_signal) {
1460 1.5.4.2 tls ani->ofdm_weak_signal = 0;
1461 1.5.4.2 tls ops->disable_ofdm_weak_signal(sc);
1462 1.5.4.2 tls ani->spur_immunity_level = 0;
1463 1.5.4.2 tls ops->set_spur_immunity_level(sc, 0);
1464 1.5.4.2 tls }
1465 1.5.4.2 tls else if (ani->firstep_level < 2) {
1466 1.5.4.2 tls ani->firstep_level++;
1467 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1468 1.5.4.2 tls }
1469 1.5.4.2 tls }
1470 1.5.4.2 tls else if (rssi > ATHN_ANI_RSSI_THR_LOW) {
1471 1.5.4.2 tls /*
1472 1.5.4.2 tls * Beacon RSSI is in mid range, we need OFDM weak signal
1473 1.5.4.2 tls * detection but we can raise first step level.
1474 1.5.4.2 tls */
1475 1.5.4.2 tls if (!ani->ofdm_weak_signal) {
1476 1.5.4.2 tls ani->ofdm_weak_signal = 1;
1477 1.5.4.2 tls ops->enable_ofdm_weak_signal(sc);
1478 1.5.4.2 tls }
1479 1.5.4.2 tls if (ani->firstep_level < 2) {
1480 1.5.4.2 tls ani->firstep_level++;
1481 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1482 1.5.4.2 tls }
1483 1.5.4.2 tls }
1484 1.5.4.2 tls else if (sc->sc_ic.ic_curmode != IEEE80211_MODE_11A) {
1485 1.5.4.2 tls /*
1486 1.5.4.2 tls * Beacon RSSI is low, if in b/g mode, turn off OFDM weak
1487 1.5.4.2 tls * signal detection and zero first step level to maximize
1488 1.5.4.2 tls * CCK sensitivity.
1489 1.5.4.2 tls */
1490 1.5.4.2 tls if (ani->ofdm_weak_signal) {
1491 1.5.4.2 tls ani->ofdm_weak_signal = 0;
1492 1.5.4.2 tls ops->disable_ofdm_weak_signal(sc);
1493 1.5.4.2 tls }
1494 1.5.4.2 tls if (ani->firstep_level > 0) {
1495 1.5.4.2 tls ani->firstep_level = 0;
1496 1.5.4.2 tls ops->set_firstep_level(sc, 0);
1497 1.5.4.2 tls }
1498 1.5.4.2 tls }
1499 1.5.4.2 tls }
1500 1.5.4.2 tls #endif /* notyet */
1501 1.5.4.2 tls
1502 1.5.4.2 tls #ifdef notyet
1503 1.5.4.2 tls Static void
1504 1.5.4.2 tls athn_ani_cck_err_trigger(struct athn_softc *sc)
1505 1.5.4.2 tls {
1506 1.5.4.2 tls struct athn_ani *ani = &sc->sc_ani;
1507 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1508 1.5.4.2 tls int32_t rssi;
1509 1.5.4.2 tls
1510 1.5.4.2 tls /* Raise noise immunity level, up to max. */
1511 1.5.4.2 tls if (ani->noise_immunity_level < 4) {
1512 1.5.4.2 tls ani->noise_immunity_level++;
1513 1.5.4.2 tls ops->set_noise_immunity_level(sc, ani->noise_immunity_level);
1514 1.5.4.2 tls return;
1515 1.5.4.2 tls }
1516 1.5.4.2 tls
1517 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
1518 1.5.4.2 tls if (sc->sc_ic.ic_opmode == IEEE80211_M_HOSTAP) {
1519 1.5.4.2 tls if (ani->firstep_level < 2) {
1520 1.5.4.2 tls ani->firstep_level++;
1521 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1522 1.5.4.2 tls }
1523 1.5.4.2 tls return;
1524 1.5.4.2 tls }
1525 1.5.4.2 tls #endif
1526 1.5.4.2 tls rssi = athn_ani_get_rssi(sc);
1527 1.5.4.2 tls if (rssi > ATHN_ANI_RSSI_THR_LOW) {
1528 1.5.4.2 tls /*
1529 1.5.4.2 tls * Beacon RSSI is in mid or high range, raise first step
1530 1.5.4.2 tls * level.
1531 1.5.4.2 tls */
1532 1.5.4.2 tls if (ani->firstep_level < 2) {
1533 1.5.4.2 tls ani->firstep_level++;
1534 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1535 1.5.4.2 tls }
1536 1.5.4.2 tls }
1537 1.5.4.2 tls else if (sc->sc_ic.ic_curmode != IEEE80211_MODE_11A) {
1538 1.5.4.2 tls /*
1539 1.5.4.2 tls * Beacon RSSI is low, zero first step level to maximize
1540 1.5.4.2 tls * CCK sensitivity.
1541 1.5.4.2 tls */
1542 1.5.4.2 tls if (ani->firstep_level > 0) {
1543 1.5.4.2 tls ani->firstep_level = 0;
1544 1.5.4.2 tls ops->set_firstep_level(sc, 0);
1545 1.5.4.2 tls }
1546 1.5.4.2 tls }
1547 1.5.4.2 tls }
1548 1.5.4.2 tls #endif /* notyet */
1549 1.5.4.2 tls
1550 1.5.4.2 tls #ifdef notyet
1551 1.5.4.2 tls Static void
1552 1.5.4.2 tls athn_ani_lower_immunity(struct athn_softc *sc)
1553 1.5.4.2 tls {
1554 1.5.4.2 tls struct athn_ani *ani = &sc->sc_ani;
1555 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
1556 1.5.4.2 tls int32_t rssi;
1557 1.5.4.2 tls
1558 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
1559 1.5.4.2 tls if (sc->sc_ic.ic_opmode == IEEE80211_M_HOSTAP) {
1560 1.5.4.2 tls if (ani->firstep_level > 0) {
1561 1.5.4.2 tls ani->firstep_level--;
1562 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1563 1.5.4.2 tls }
1564 1.5.4.2 tls return;
1565 1.5.4.2 tls }
1566 1.5.4.2 tls #endif
1567 1.5.4.2 tls rssi = athn_ani_get_rssi(sc);
1568 1.5.4.2 tls if (rssi > ATHN_ANI_RSSI_THR_HIGH) {
1569 1.5.4.2 tls /*
1570 1.5.4.2 tls * Beacon RSSI is high, leave OFDM weak signal detection
1571 1.5.4.2 tls * off or it may oscillate.
1572 1.5.4.2 tls */
1573 1.5.4.2 tls }
1574 1.5.4.2 tls else if (rssi > ATHN_ANI_RSSI_THR_LOW) {
1575 1.5.4.2 tls /*
1576 1.5.4.2 tls * Beacon RSSI is in mid range, turn on OFDM weak signal
1577 1.5.4.2 tls * detection or lower first step level.
1578 1.5.4.2 tls */
1579 1.5.4.2 tls if (!ani->ofdm_weak_signal) {
1580 1.5.4.2 tls ani->ofdm_weak_signal = 1;
1581 1.5.4.2 tls ops->enable_ofdm_weak_signal(sc);
1582 1.5.4.2 tls return;
1583 1.5.4.2 tls }
1584 1.5.4.2 tls if (ani->firstep_level > 0) {
1585 1.5.4.2 tls ani->firstep_level--;
1586 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1587 1.5.4.2 tls return;
1588 1.5.4.2 tls }
1589 1.5.4.2 tls }
1590 1.5.4.2 tls else {
1591 1.5.4.2 tls /* Beacon RSSI is low, lower first step level. */
1592 1.5.4.2 tls if (ani->firstep_level > 0) {
1593 1.5.4.2 tls ani->firstep_level--;
1594 1.5.4.2 tls ops->set_firstep_level(sc, ani->firstep_level);
1595 1.5.4.2 tls return;
1596 1.5.4.2 tls }
1597 1.5.4.2 tls }
1598 1.5.4.2 tls /*
1599 1.5.4.2 tls * Lower spur immunity level down to zero, or if all else fails,
1600 1.5.4.2 tls * lower noise immunity level down to zero.
1601 1.5.4.2 tls */
1602 1.5.4.2 tls if (ani->spur_immunity_level > 0) {
1603 1.5.4.2 tls ani->spur_immunity_level--;
1604 1.5.4.2 tls ops->set_spur_immunity_level(sc, ani->spur_immunity_level);
1605 1.5.4.2 tls }
1606 1.5.4.2 tls else if (ani->noise_immunity_level > 0) {
1607 1.5.4.2 tls ani->noise_immunity_level--;
1608 1.5.4.2 tls ops->set_noise_immunity_level(sc, ani->noise_immunity_level);
1609 1.5.4.2 tls }
1610 1.5.4.2 tls }
1611 1.5.4.2 tls #endif /* notyet */
1612 1.5.4.2 tls
1613 1.5.4.2 tls #ifdef notyet
1614 1.5.4.2 tls Static void
1615 1.5.4.2 tls athn_ani_restart(struct athn_softc *sc)
1616 1.5.4.2 tls {
1617 1.5.4.2 tls struct athn_ani *ani = &sc->sc_ani;
1618 1.5.4.2 tls
1619 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_1, 0);
1620 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_2, 0);
1621 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
1622 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
1623 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1624 1.5.4.2 tls
1625 1.5.4.2 tls ani->listen_time = 0;
1626 1.5.4.2 tls ani->ofdm_phy_err_count = 0;
1627 1.5.4.2 tls ani->cck_phy_err_count = 0;
1628 1.5.4.2 tls }
1629 1.5.4.2 tls #endif /* notyet */
1630 1.5.4.2 tls
1631 1.5.4.2 tls #ifdef notyet
1632 1.5.4.2 tls Static void
1633 1.5.4.2 tls athn_ani_monitor(struct athn_softc *sc)
1634 1.5.4.2 tls {
1635 1.5.4.2 tls struct athn_ani *ani = &sc->sc_ani;
1636 1.5.4.2 tls uint32_t cyccnt, txfcnt, rxfcnt, phy1, phy2;
1637 1.5.4.2 tls int32_t cycdelta, txfdelta, rxfdelta;
1638 1.5.4.2 tls int32_t listen_time;
1639 1.5.4.2 tls
1640 1.5.4.2 tls txfcnt = AR_READ(sc, AR_TFCNT); /* Tx frame count. */
1641 1.5.4.2 tls rxfcnt = AR_READ(sc, AR_RFCNT); /* Rx frame count. */
1642 1.5.4.2 tls cyccnt = AR_READ(sc, AR_CCCNT); /* Cycle count. */
1643 1.5.4.2 tls
1644 1.5.4.2 tls if (ani->cyccnt != 0 && ani->cyccnt <= cyccnt) {
1645 1.5.4.2 tls cycdelta = cyccnt - ani->cyccnt;
1646 1.5.4.2 tls txfdelta = txfcnt - ani->txfcnt;
1647 1.5.4.2 tls rxfdelta = rxfcnt - ani->rxfcnt;
1648 1.5.4.2 tls
1649 1.5.4.2 tls listen_time = (cycdelta - txfdelta - rxfdelta) /
1650 1.5.4.2 tls (athn_clock_rate(sc) * 1000);
1651 1.5.4.2 tls }
1652 1.5.4.2 tls else
1653 1.5.4.2 tls listen_time = 0;
1654 1.5.4.2 tls
1655 1.5.4.2 tls ani->cyccnt = cyccnt;
1656 1.5.4.2 tls ani->txfcnt = txfcnt;
1657 1.5.4.2 tls ani->rxfcnt = rxfcnt;
1658 1.5.4.2 tls
1659 1.5.4.2 tls if (listen_time < 0) {
1660 1.5.4.2 tls athn_ani_restart(sc);
1661 1.5.4.2 tls return;
1662 1.5.4.2 tls }
1663 1.5.4.2 tls ani->listen_time += listen_time;
1664 1.5.4.2 tls
1665 1.5.4.2 tls phy1 = AR_READ(sc, AR_PHY_ERR_1);
1666 1.5.4.2 tls phy2 = AR_READ(sc, AR_PHY_ERR_2);
1667 1.5.4.2 tls
1668 1.5.4.2 tls if (phy1 < ani->ofdm_phy_err_base) {
1669 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_1, ani->ofdm_phy_err_base);
1670 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
1671 1.5.4.2 tls }
1672 1.5.4.2 tls if (phy2 < ani->cck_phy_err_base) {
1673 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_2, ani->cck_phy_err_base);
1674 1.5.4.2 tls AR_WRITE(sc, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
1675 1.5.4.2 tls }
1676 1.5.4.2 tls if (phy1 < ani->ofdm_phy_err_base || phy2 < ani->cck_phy_err_base) {
1677 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1678 1.5.4.2 tls return;
1679 1.5.4.2 tls }
1680 1.5.4.2 tls ani->ofdm_phy_err_count = phy1 - ani->ofdm_phy_err_base;
1681 1.5.4.2 tls ani->cck_phy_err_count = phy2 - ani->cck_phy_err_base;
1682 1.5.4.2 tls
1683 1.5.4.2 tls if (ani->listen_time > 5 * ATHN_ANI_PERIOD) {
1684 1.5.4.2 tls /* Check to see if we need to lower immunity. */
1685 1.5.4.2 tls if (ani->ofdm_phy_err_count <=
1686 1.5.4.2 tls ani->listen_time * ani->ofdm_trig_low / 1000 &&
1687 1.5.4.2 tls ani->cck_phy_err_count <=
1688 1.5.4.2 tls ani->listen_time * ani->cck_trig_low / 1000)
1689 1.5.4.2 tls athn_ani_lower_immunity(sc);
1690 1.5.4.2 tls athn_ani_restart(sc);
1691 1.5.4.2 tls
1692 1.5.4.2 tls }
1693 1.5.4.2 tls else if (ani->listen_time > ATHN_ANI_PERIOD) {
1694 1.5.4.2 tls /* Check to see if we need to raise immunity. */
1695 1.5.4.2 tls if (ani->ofdm_phy_err_count >
1696 1.5.4.2 tls ani->listen_time * ani->ofdm_trig_high / 1000) {
1697 1.5.4.2 tls athn_ani_ofdm_err_trigger(sc);
1698 1.5.4.2 tls athn_ani_restart(sc);
1699 1.5.4.2 tls }
1700 1.5.4.2 tls else if (ani->cck_phy_err_count >
1701 1.5.4.2 tls ani->listen_time * ani->cck_trig_high / 1000) {
1702 1.5.4.2 tls athn_ani_cck_err_trigger(sc);
1703 1.5.4.2 tls athn_ani_restart(sc);
1704 1.5.4.2 tls }
1705 1.5.4.2 tls }
1706 1.5.4.2 tls }
1707 1.5.4.2 tls #endif /* notyet */
1708 1.5.4.2 tls
1709 1.5.4.2 tls PUBLIC uint8_t
1710 1.5.4.2 tls athn_chan2fbin(struct ieee80211_channel *c)
1711 1.5.4.2 tls {
1712 1.5.4.2 tls
1713 1.5.4.2 tls if (IEEE80211_IS_CHAN_2GHZ(c))
1714 1.5.4.2 tls return c->ic_freq - 2300;
1715 1.5.4.2 tls else
1716 1.5.4.2 tls return (c->ic_freq - 4800) / 5;
1717 1.5.4.2 tls }
1718 1.5.4.2 tls
1719 1.5.4.2 tls PUBLIC int
1720 1.5.4.2 tls athn_interpolate(int x, int x1, int y1, int x2, int y2)
1721 1.5.4.2 tls {
1722 1.5.4.2 tls
1723 1.5.4.2 tls if (x1 == x2) /* Prevents division by zero. */
1724 1.5.4.2 tls return y1;
1725 1.5.4.2 tls /* Linear interpolation. */
1726 1.5.4.2 tls return y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);
1727 1.5.4.2 tls }
1728 1.5.4.2 tls
1729 1.5.4.2 tls PUBLIC void
1730 1.5.4.2 tls athn_get_pier_ival(uint8_t fbin, const uint8_t *pierfreq, int npiers,
1731 1.5.4.2 tls int *lo, int *hi)
1732 1.5.4.2 tls {
1733 1.5.4.2 tls int i;
1734 1.5.4.2 tls
1735 1.5.4.2 tls for (i = 0; i < npiers; i++)
1736 1.5.4.2 tls if (pierfreq[i] == AR_BCHAN_UNUSED ||
1737 1.5.4.2 tls pierfreq[i] > fbin)
1738 1.5.4.2 tls break;
1739 1.5.4.2 tls *hi = i;
1740 1.5.4.2 tls *lo = *hi - 1;
1741 1.5.4.2 tls if (*lo == -1)
1742 1.5.4.2 tls *lo = *hi;
1743 1.5.4.2 tls else if (*hi == npiers || pierfreq[*hi] == AR_BCHAN_UNUSED)
1744 1.5.4.2 tls *hi = *lo;
1745 1.5.4.2 tls }
1746 1.5.4.2 tls
1747 1.5.4.2 tls Static void
1748 1.5.4.2 tls athn_init_dma(struct athn_softc *sc)
1749 1.5.4.2 tls {
1750 1.5.4.2 tls uint32_t reg;
1751 1.5.4.2 tls
1752 1.5.4.2 tls if (!AR_SREV_9380_10_OR_LATER(sc)) {
1753 1.5.4.2 tls /* Set AHB not to do cacheline prefetches. */
1754 1.5.4.2 tls AR_SETBITS(sc, AR_AHB_MODE, AR_AHB_PREFETCH_RD_EN);
1755 1.5.4.2 tls }
1756 1.5.4.2 tls reg = AR_READ(sc, AR_TXCFG);
1757 1.5.4.2 tls /* Let MAC DMA reads be in 128-byte chunks. */
1758 1.5.4.2 tls reg = RW(reg, AR_TXCFG_DMASZ, AR_DMASZ_128B);
1759 1.5.4.2 tls
1760 1.5.4.2 tls /* Set initial Tx trigger level. */
1761 1.5.4.2 tls if (AR_SREV_9285(sc) || AR_SREV_9271(sc))
1762 1.5.4.2 tls reg = RW(reg, AR_TXCFG_FTRIG, AR_TXCFG_FTRIG_256B);
1763 1.5.4.2 tls else if (!AR_SREV_9380_10_OR_LATER(sc))
1764 1.5.4.2 tls reg = RW(reg, AR_TXCFG_FTRIG, AR_TXCFG_FTRIG_512B);
1765 1.5.4.2 tls AR_WRITE(sc, AR_TXCFG, reg);
1766 1.5.4.2 tls
1767 1.5.4.2 tls /* Let MAC DMA writes be in 128-byte chunks. */
1768 1.5.4.2 tls reg = AR_READ(sc, AR_RXCFG);
1769 1.5.4.2 tls reg = RW(reg, AR_RXCFG_DMASZ, AR_DMASZ_128B);
1770 1.5.4.2 tls AR_WRITE(sc, AR_RXCFG, reg);
1771 1.5.4.2 tls
1772 1.5.4.2 tls /* Setup Rx FIFO threshold to hold off Tx activities. */
1773 1.5.4.2 tls AR_WRITE(sc, AR_RXFIFO_CFG, 512);
1774 1.5.4.2 tls
1775 1.5.4.2 tls /* Reduce the number of entries in PCU TXBUF to avoid wrap around. */
1776 1.5.4.2 tls if (AR_SREV_9285(sc)) {
1777 1.5.4.2 tls AR_WRITE(sc, AR_PCU_TXBUF_CTRL,
1778 1.5.4.2 tls AR9285_PCU_TXBUF_CTRL_USABLE_SIZE);
1779 1.5.4.2 tls }
1780 1.5.4.2 tls else if (!AR_SREV_9271(sc)) {
1781 1.5.4.2 tls AR_WRITE(sc, AR_PCU_TXBUF_CTRL,
1782 1.5.4.2 tls AR_PCU_TXBUF_CTRL_USABLE_SIZE);
1783 1.5.4.2 tls }
1784 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1785 1.5.4.2 tls
1786 1.5.4.2 tls /* Reset Tx status ring. */
1787 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc))
1788 1.5.4.2 tls ar9003_reset_txsring(sc);
1789 1.5.4.2 tls }
1790 1.5.4.2 tls
1791 1.5.4.2 tls PUBLIC void
1792 1.5.4.2 tls athn_inc_tx_trigger_level(struct athn_softc *sc)
1793 1.5.4.2 tls {
1794 1.5.4.2 tls uint32_t reg, ftrig;
1795 1.5.4.2 tls
1796 1.5.4.2 tls reg = AR_READ(sc, AR_TXCFG);
1797 1.5.4.2 tls ftrig = MS(reg, AR_TXCFG_FTRIG);
1798 1.5.4.2 tls /*
1799 1.5.4.2 tls * NB: The AR9285 and all single-stream parts have an issue that
1800 1.5.4.2 tls * limits the size of the PCU Tx FIFO to 2KB instead of 4KB.
1801 1.5.4.2 tls */
1802 1.5.4.2 tls if (ftrig == ((AR_SREV_9285(sc) || AR_SREV_9271(sc)) ? 0x1f : 0x3f))
1803 1.5.4.2 tls return; /* Already at max. */
1804 1.5.4.2 tls reg = RW(reg, AR_TXCFG_FTRIG, ftrig + 1);
1805 1.5.4.2 tls AR_WRITE(sc, AR_TXCFG, reg);
1806 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1807 1.5.4.2 tls }
1808 1.5.4.2 tls
1809 1.5.4.2 tls PUBLIC int
1810 1.5.4.2 tls athn_stop_rx_dma(struct athn_softc *sc)
1811 1.5.4.2 tls {
1812 1.5.4.2 tls int ntries;
1813 1.5.4.2 tls
1814 1.5.4.2 tls AR_WRITE(sc, AR_CR, AR_CR_RXD);
1815 1.5.4.2 tls /* Wait for Rx enable bit to go low. */
1816 1.5.4.2 tls for (ntries = 0; ntries < 100; ntries++) {
1817 1.5.4.2 tls if (!(AR_READ(sc, AR_CR) & AR_CR_RXE))
1818 1.5.4.2 tls return 0;
1819 1.5.4.2 tls DELAY(100);
1820 1.5.4.2 tls }
1821 1.5.4.2 tls DPRINTFN(DBG_RX, sc, "Rx DMA failed to stop\n");
1822 1.5.4.2 tls return ETIMEDOUT;
1823 1.5.4.2 tls }
1824 1.5.4.2 tls
1825 1.5.4.2 tls #ifdef unused
1826 1.5.4.2 tls Static int
1827 1.5.4.2 tls athn_rx_abort(struct athn_softc *sc)
1828 1.5.4.2 tls {
1829 1.5.4.2 tls int ntries;
1830 1.5.4.2 tls
1831 1.5.4.2 tls AR_SETBITS(sc, AR_DIAG_SW, AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT);
1832 1.5.4.2 tls for (ntries = 0; ntries < 1000; ntries++) {
1833 1.5.4.2 tls if (MS(AR_READ(sc, AR_OBS_BUS_1), AR_OBS_BUS_1_RX_STATE) == 0)
1834 1.5.4.2 tls return 0;
1835 1.5.4.2 tls DELAY(10);
1836 1.5.4.2 tls }
1837 1.5.4.2 tls DPRINTFN(DBG_RX, sc, "Rx failed to go idle in 10ms\n");
1838 1.5.4.2 tls AR_CLRBITS(sc, AR_DIAG_SW, AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT);
1839 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1840 1.5.4.2 tls return ETIMEDOUT;
1841 1.5.4.2 tls }
1842 1.5.4.2 tls #endif /* unused */
1843 1.5.4.2 tls
1844 1.5.4.2 tls Static void
1845 1.5.4.2 tls athn_tx_reclaim(struct athn_softc *sc, int qid)
1846 1.5.4.2 tls {
1847 1.5.4.2 tls struct athn_txq *txq = &sc->sc_txq[qid];
1848 1.5.4.2 tls struct athn_tx_buf *bf;
1849 1.5.4.2 tls
1850 1.5.4.2 tls /* Reclaim all buffers queued in the specified Tx queue. */
1851 1.5.4.2 tls /* NB: Tx DMA must be stopped. */
1852 1.5.4.2 tls while ((bf = SIMPLEQ_FIRST(&txq->head)) != NULL) {
1853 1.5.4.2 tls SIMPLEQ_REMOVE_HEAD(&txq->head, bf_list);
1854 1.5.4.2 tls
1855 1.5.4.2 tls bus_dmamap_sync(sc->sc_dmat, bf->bf_map, 0,
1856 1.5.4.2 tls bf->bf_map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1857 1.5.4.2 tls bus_dmamap_unload(sc->sc_dmat, bf->bf_map);
1858 1.5.4.2 tls m_freem(bf->bf_m);
1859 1.5.4.2 tls bf->bf_m = NULL;
1860 1.5.4.2 tls bf->bf_ni = NULL; /* Nodes already freed! */
1861 1.5.4.2 tls
1862 1.5.4.2 tls /* Link Tx buffer back to global free list. */
1863 1.5.4.2 tls SIMPLEQ_INSERT_TAIL(&sc->sc_txbufs, bf, bf_list);
1864 1.5.4.2 tls }
1865 1.5.4.2 tls }
1866 1.5.4.2 tls
1867 1.5.4.2 tls PUBLIC int
1868 1.5.4.2 tls athn_tx_pending(struct athn_softc *sc, int qid)
1869 1.5.4.2 tls {
1870 1.5.4.2 tls
1871 1.5.4.2 tls return MS(AR_READ(sc, AR_QSTS(qid)), AR_Q_STS_PEND_FR_CNT) != 0 ||
1872 1.5.4.2 tls (AR_READ(sc, AR_Q_TXE) & (1 << qid)) != 0;
1873 1.5.4.2 tls }
1874 1.5.4.2 tls
1875 1.5.4.2 tls PUBLIC void
1876 1.5.4.2 tls athn_stop_tx_dma(struct athn_softc *sc, int qid)
1877 1.5.4.2 tls {
1878 1.5.4.2 tls uint32_t tsflo;
1879 1.5.4.2 tls int ntries, i;
1880 1.5.4.2 tls
1881 1.5.4.2 tls AR_WRITE(sc, AR_Q_TXD, 1 << qid);
1882 1.5.4.2 tls for (ntries = 0; ntries < 40; ntries++) {
1883 1.5.4.2 tls if (!athn_tx_pending(sc, qid))
1884 1.5.4.2 tls break;
1885 1.5.4.2 tls DELAY(100);
1886 1.5.4.2 tls }
1887 1.5.4.2 tls if (ntries == 40) {
1888 1.5.4.2 tls for (i = 0; i < 2; i++) {
1889 1.5.4.2 tls tsflo = AR_READ(sc, AR_TSF_L32) / 1024;
1890 1.5.4.2 tls AR_WRITE(sc, AR_QUIET2,
1891 1.5.4.2 tls SM(AR_QUIET2_QUIET_DUR, 10));
1892 1.5.4.2 tls AR_WRITE(sc, AR_QUIET_PERIOD, 100);
1893 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_QUIET_TIMER, tsflo);
1894 1.5.4.2 tls AR_SETBITS(sc, AR_TIMER_MODE, AR_QUIET_TIMER_EN);
1895 1.5.4.2 tls if (AR_READ(sc, AR_TSF_L32) / 1024 == tsflo)
1896 1.5.4.2 tls break;
1897 1.5.4.2 tls }
1898 1.5.4.2 tls AR_SETBITS(sc, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
1899 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1900 1.5.4.2 tls DELAY(200);
1901 1.5.4.2 tls AR_CLRBITS(sc, AR_TIMER_MODE, AR_QUIET_TIMER_EN);
1902 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1903 1.5.4.2 tls
1904 1.5.4.2 tls for (ntries = 0; ntries < 40; ntries++) {
1905 1.5.4.2 tls if (!athn_tx_pending(sc, qid))
1906 1.5.4.2 tls break;
1907 1.5.4.2 tls DELAY(100);
1908 1.5.4.2 tls }
1909 1.5.4.2 tls
1910 1.5.4.2 tls AR_CLRBITS(sc, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
1911 1.5.4.2 tls }
1912 1.5.4.2 tls AR_WRITE(sc, AR_Q_TXD, 0);
1913 1.5.4.2 tls AR_WRITE_BARRIER(sc);
1914 1.5.4.2 tls }
1915 1.5.4.2 tls
1916 1.5.4.2 tls PUBLIC int
1917 1.5.4.2 tls athn_txtime(struct athn_softc *sc, int len, int ridx, u_int flags)
1918 1.5.4.2 tls {
1919 1.5.4.2 tls #define divround(a, b) (((a) + (b) - 1) / (b))
1920 1.5.4.2 tls int txtime;
1921 1.5.4.2 tls
1922 1.5.4.2 tls /* XXX HT. */
1923 1.5.4.2 tls if (athn_rates[ridx].phy == IEEE80211_T_OFDM) {
1924 1.5.4.2 tls txtime = divround(8 + 4 * len + 3, athn_rates[ridx].rate);
1925 1.5.4.2 tls /* SIFS is 10us for 11g but Signal Extension adds 6us. */
1926 1.5.4.2 tls txtime = 16 + 4 + 4 * txtime + 16;
1927 1.5.4.2 tls }
1928 1.5.4.2 tls else {
1929 1.5.4.2 tls txtime = divround(16 * len, athn_rates[ridx].rate);
1930 1.5.4.2 tls if (ridx != ATHN_RIDX_CCK1 && (flags & IEEE80211_F_SHPREAMBLE))
1931 1.5.4.2 tls txtime += 72 + 24;
1932 1.5.4.2 tls else
1933 1.5.4.2 tls txtime += 144 + 48;
1934 1.5.4.2 tls txtime += 10; /* 10us SIFS. */
1935 1.5.4.2 tls }
1936 1.5.4.2 tls return txtime;
1937 1.5.4.2 tls #undef divround
1938 1.5.4.2 tls }
1939 1.5.4.2 tls
1940 1.5.4.2 tls PUBLIC void
1941 1.5.4.2 tls athn_init_tx_queues(struct athn_softc *sc)
1942 1.5.4.2 tls {
1943 1.5.4.2 tls int qid;
1944 1.5.4.2 tls
1945 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++) {
1946 1.5.4.2 tls SIMPLEQ_INIT(&sc->sc_txq[qid].head);
1947 1.5.4.2 tls sc->sc_txq[qid].lastds = NULL;
1948 1.5.4.2 tls sc->sc_txq[qid].wait = NULL;
1949 1.5.4.2 tls sc->sc_txq[qid].queued = 0;
1950 1.5.4.2 tls
1951 1.5.4.2 tls AR_WRITE(sc, AR_DRETRY_LIMIT(qid),
1952 1.5.4.2 tls SM(AR_D_RETRY_LIMIT_STA_SH, 32) |
1953 1.5.4.2 tls SM(AR_D_RETRY_LIMIT_STA_LG, 32) |
1954 1.5.4.2 tls SM(AR_D_RETRY_LIMIT_FR_SH, 10));
1955 1.5.4.2 tls AR_WRITE(sc, AR_QMISC(qid),
1956 1.5.4.2 tls AR_Q_MISC_DCU_EARLY_TERM_REQ);
1957 1.5.4.2 tls AR_WRITE(sc, AR_DMISC(qid),
1958 1.5.4.2 tls SM(AR_D_MISC_BKOFF_THRESH, 2) |
1959 1.5.4.2 tls AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN);
1960 1.5.4.2 tls }
1961 1.5.4.2 tls
1962 1.5.4.2 tls /* Init beacon queue. */
1963 1.5.4.2 tls AR_SETBITS(sc, AR_QMISC(ATHN_QID_BEACON),
1964 1.5.4.2 tls AR_Q_MISC_FSP_DBA_GATED | AR_Q_MISC_BEACON_USE |
1965 1.5.4.2 tls AR_Q_MISC_CBR_INCR_DIS1);
1966 1.5.4.2 tls AR_SETBITS(sc, AR_DMISC(ATHN_QID_BEACON),
1967 1.5.4.2 tls SM(AR_D_MISC_ARB_LOCKOUT_CNTRL,
1968 1.5.4.2 tls AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL) |
1969 1.5.4.2 tls AR_D_MISC_BEACON_USE |
1970 1.5.4.2 tls AR_D_MISC_POST_FR_BKOFF_DIS);
1971 1.5.4.2 tls AR_WRITE(sc, AR_DLCL_IFS(ATHN_QID_BEACON),
1972 1.5.4.2 tls SM(AR_D_LCL_IFS_CWMIN, 0) |
1973 1.5.4.2 tls SM(AR_D_LCL_IFS_CWMAX, 0) |
1974 1.5.4.2 tls SM(AR_D_LCL_IFS_AIFS, 1));
1975 1.5.4.2 tls
1976 1.5.4.2 tls /* Init CAB (Content After Beacon) queue. */
1977 1.5.4.2 tls AR_SETBITS(sc, AR_QMISC(ATHN_QID_CAB),
1978 1.5.4.2 tls AR_Q_MISC_FSP_DBA_GATED | AR_Q_MISC_CBR_INCR_DIS1 |
1979 1.5.4.2 tls AR_Q_MISC_CBR_INCR_DIS0);
1980 1.5.4.2 tls AR_SETBITS(sc, AR_DMISC(ATHN_QID_CAB),
1981 1.5.4.2 tls SM(AR_D_MISC_ARB_LOCKOUT_CNTRL,
1982 1.5.4.2 tls AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL));
1983 1.5.4.2 tls
1984 1.5.4.2 tls /* Init PS-Poll queue. */
1985 1.5.4.2 tls AR_SETBITS(sc, AR_QMISC(ATHN_QID_PSPOLL),
1986 1.5.4.2 tls AR_Q_MISC_CBR_INCR_DIS1);
1987 1.5.4.2 tls
1988 1.5.4.2 tls /* Init UAPSD queue. */
1989 1.5.4.2 tls AR_SETBITS(sc, AR_DMISC(ATHN_QID_UAPSD),
1990 1.5.4.2 tls AR_D_MISC_POST_FR_BKOFF_DIS);
1991 1.5.4.2 tls
1992 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc)) {
1993 1.5.4.2 tls /* Enable MAC descriptor CRC check. */
1994 1.5.4.2 tls AR_WRITE(sc, AR_Q_DESC_CRCCHK, AR_Q_DESC_CRCCHK_EN);
1995 1.5.4.2 tls }
1996 1.5.4.2 tls /* Enable DESC interrupts for all Tx queues. */
1997 1.5.4.2 tls AR_WRITE(sc, AR_IMR_S0, 0x00ff0000);
1998 1.5.4.2 tls /* Enable EOL interrupts for all Tx queues except UAPSD. */
1999 1.5.4.2 tls AR_WRITE(sc, AR_IMR_S1, 0x00df0000);
2000 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2001 1.5.4.2 tls }
2002 1.5.4.2 tls
2003 1.5.4.2 tls PUBLIC void
2004 1.5.4.2 tls athn_set_sta_timers(struct athn_softc *sc)
2005 1.5.4.2 tls {
2006 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2007 1.5.4.2 tls uint32_t tsfhi, tsflo, tsftu, reg;
2008 1.5.4.2 tls uint32_t intval, next_tbtt, next_dtim;
2009 1.5.4.3 tls int dtim_period, rem_dtim_count;
2010 1.5.4.2 tls
2011 1.5.4.2 tls tsfhi = AR_READ(sc, AR_TSF_U32);
2012 1.5.4.2 tls tsflo = AR_READ(sc, AR_TSF_L32);
2013 1.5.4.2 tls tsftu = AR_TSF_TO_TU(tsfhi, tsflo) + AR_FUDGE;
2014 1.5.4.2 tls
2015 1.5.4.2 tls /* Beacon interval in TU. */
2016 1.5.4.2 tls intval = ic->ic_bss->ni_intval;
2017 1.5.4.2 tls
2018 1.5.4.2 tls next_tbtt = roundup(tsftu, intval);
2019 1.5.4.2 tls #ifdef notyet
2020 1.5.4.2 tls dtim_period = ic->ic_dtim_period;
2021 1.5.4.2 tls if (dtim_period <= 0)
2022 1.5.4.2 tls #endif
2023 1.5.4.2 tls dtim_period = 1; /* Assume all TIMs are DTIMs. */
2024 1.5.4.2 tls
2025 1.5.4.2 tls #ifdef notyet
2026 1.5.4.3 tls int dtim_count = ic->ic_dtim_count;
2027 1.5.4.2 tls if (dtim_count >= dtim_period) /* Should not happen. */
2028 1.5.4.2 tls dtim_count = 0; /* Assume last TIM was a DTIM. */
2029 1.5.4.3 tls #endif
2030 1.5.4.2 tls
2031 1.5.4.2 tls /* Compute number of remaining TIMs until next DTIM. */
2032 1.5.4.2 tls rem_dtim_count = 0; /* XXX */
2033 1.5.4.2 tls next_dtim = next_tbtt + rem_dtim_count * intval;
2034 1.5.4.2 tls
2035 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_TBTT_TIMER, next_tbtt * IEEE80211_DUR_TU);
2036 1.5.4.2 tls AR_WRITE(sc, AR_BEACON_PERIOD, intval * IEEE80211_DUR_TU);
2037 1.5.4.2 tls AR_WRITE(sc, AR_DMA_BEACON_PERIOD, intval * IEEE80211_DUR_TU);
2038 1.5.4.2 tls
2039 1.5.4.2 tls /*
2040 1.5.4.2 tls * Set the number of consecutive beacons to miss before raising
2041 1.5.4.2 tls * a BMISS interrupt to 10.
2042 1.5.4.2 tls */
2043 1.5.4.2 tls reg = AR_READ(sc, AR_RSSI_THR);
2044 1.5.4.2 tls reg = RW(reg, AR_RSSI_THR_BM_THR, 10);
2045 1.5.4.2 tls AR_WRITE(sc, AR_RSSI_THR, reg);
2046 1.5.4.2 tls
2047 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_DTIM,
2048 1.5.4.2 tls (next_dtim - AR_SLEEP_SLOP) * IEEE80211_DUR_TU);
2049 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_TIM,
2050 1.5.4.2 tls (next_tbtt - AR_SLEEP_SLOP) * IEEE80211_DUR_TU);
2051 1.5.4.2 tls
2052 1.5.4.2 tls /* CAB timeout is in 1/8 TU. */
2053 1.5.4.2 tls AR_WRITE(sc, AR_SLEEP1,
2054 1.5.4.2 tls SM(AR_SLEEP1_CAB_TIMEOUT, AR_CAB_TIMEOUT_VAL * 8) |
2055 1.5.4.2 tls AR_SLEEP1_ASSUME_DTIM);
2056 1.5.4.2 tls AR_WRITE(sc, AR_SLEEP2,
2057 1.5.4.2 tls SM(AR_SLEEP2_BEACON_TIMEOUT, AR_MIN_BEACON_TIMEOUT_VAL));
2058 1.5.4.2 tls
2059 1.5.4.2 tls AR_WRITE(sc, AR_TIM_PERIOD, intval * IEEE80211_DUR_TU);
2060 1.5.4.2 tls AR_WRITE(sc, AR_DTIM_PERIOD, dtim_period * intval * IEEE80211_DUR_TU);
2061 1.5.4.2 tls
2062 1.5.4.2 tls AR_SETBITS(sc, AR_TIMER_MODE,
2063 1.5.4.2 tls AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN | AR_DTIM_TIMER_EN);
2064 1.5.4.2 tls
2065 1.5.4.2 tls /* Set TSF out-of-range threshold (fixed at 16k us). */
2066 1.5.4.2 tls AR_WRITE(sc, AR_TSFOOR_THRESHOLD, 0x4240);
2067 1.5.4.2 tls
2068 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2069 1.5.4.2 tls }
2070 1.5.4.2 tls
2071 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
2072 1.5.4.2 tls PUBLIC void
2073 1.5.4.2 tls athn_set_hostap_timers(struct athn_softc *sc)
2074 1.5.4.2 tls {
2075 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2076 1.5.4.2 tls uint32_t intval, next_tbtt;
2077 1.5.4.2 tls
2078 1.5.4.2 tls /* Beacon interval in TU. */
2079 1.5.4.2 tls intval = ic->ic_bss->ni_intval;
2080 1.5.4.2 tls next_tbtt = intval;
2081 1.5.4.2 tls
2082 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_TBTT_TIMER, next_tbtt * IEEE80211_DUR_TU);
2083 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_DMA_BEACON_ALERT,
2084 1.5.4.2 tls (next_tbtt - AR_BEACON_DMA_DELAY) * IEEE80211_DUR_TU);
2085 1.5.4.2 tls AR_WRITE(sc, AR_NEXT_CFP,
2086 1.5.4.2 tls (next_tbtt - AR_SWBA_DELAY) * IEEE80211_DUR_TU);
2087 1.5.4.2 tls
2088 1.5.4.2 tls AR_WRITE(sc, AR_BEACON_PERIOD, intval * IEEE80211_DUR_TU);
2089 1.5.4.2 tls AR_WRITE(sc, AR_DMA_BEACON_PERIOD, intval * IEEE80211_DUR_TU);
2090 1.5.4.2 tls AR_WRITE(sc, AR_SWBA_PERIOD, intval * IEEE80211_DUR_TU);
2091 1.5.4.2 tls AR_WRITE(sc, AR_NDP_PERIOD, intval * IEEE80211_DUR_TU);
2092 1.5.4.2 tls
2093 1.5.4.2 tls AR_WRITE(sc, AR_TIMER_MODE,
2094 1.5.4.2 tls AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN);
2095 1.5.4.2 tls
2096 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2097 1.5.4.2 tls }
2098 1.5.4.2 tls #endif
2099 1.5.4.2 tls
2100 1.5.4.2 tls PUBLIC void
2101 1.5.4.2 tls athn_set_opmode(struct athn_softc *sc)
2102 1.5.4.2 tls {
2103 1.5.4.2 tls uint32_t reg;
2104 1.5.4.2 tls
2105 1.5.4.2 tls switch (sc->sc_ic.ic_opmode) {
2106 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
2107 1.5.4.2 tls case IEEE80211_M_HOSTAP:
2108 1.5.4.2 tls reg = AR_READ(sc, AR_STA_ID1);
2109 1.5.4.2 tls reg &= ~AR_STA_ID1_ADHOC;
2110 1.5.4.2 tls reg |= AR_STA_ID1_STA_AP | AR_STA_ID1_KSRCH_MODE;
2111 1.5.4.2 tls AR_WRITE(sc, AR_STA_ID1, reg);
2112 1.5.4.2 tls
2113 1.5.4.2 tls AR_CLRBITS(sc, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
2114 1.5.4.2 tls break;
2115 1.5.4.2 tls case IEEE80211_M_IBSS:
2116 1.5.4.2 tls case IEEE80211_M_AHDEMO:
2117 1.5.4.2 tls reg = AR_READ(sc, AR_STA_ID1);
2118 1.5.4.2 tls reg &= ~AR_STA_ID1_STA_AP;
2119 1.5.4.2 tls reg |= AR_STA_ID1_ADHOC | AR_STA_ID1_KSRCH_MODE;
2120 1.5.4.2 tls AR_WRITE(sc, AR_STA_ID1, reg);
2121 1.5.4.2 tls
2122 1.5.4.2 tls AR_SETBITS(sc, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
2123 1.5.4.2 tls break;
2124 1.5.4.2 tls #endif
2125 1.5.4.2 tls default:
2126 1.5.4.2 tls reg = AR_READ(sc, AR_STA_ID1);
2127 1.5.4.2 tls reg &= ~(AR_STA_ID1_ADHOC | AR_STA_ID1_STA_AP);
2128 1.5.4.2 tls reg |= AR_STA_ID1_KSRCH_MODE;
2129 1.5.4.2 tls AR_WRITE(sc, AR_STA_ID1, reg);
2130 1.5.4.2 tls break;
2131 1.5.4.2 tls }
2132 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2133 1.5.4.2 tls }
2134 1.5.4.2 tls
2135 1.5.4.2 tls PUBLIC void
2136 1.5.4.2 tls athn_set_bss(struct athn_softc *sc, struct ieee80211_node *ni)
2137 1.5.4.2 tls {
2138 1.5.4.2 tls const uint8_t *bssid = ni->ni_bssid;
2139 1.5.4.2 tls
2140 1.5.4.2 tls AR_WRITE(sc, AR_BSS_ID0, LE_READ_4(&bssid[0]));
2141 1.5.4.2 tls AR_WRITE(sc, AR_BSS_ID1, LE_READ_2(&bssid[4]) |
2142 1.5.4.2 tls SM(AR_BSS_ID1_AID, IEEE80211_AID(ni->ni_associd)));
2143 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2144 1.5.4.2 tls }
2145 1.5.4.2 tls
2146 1.5.4.2 tls Static void
2147 1.5.4.2 tls athn_enable_interrupts(struct athn_softc *sc)
2148 1.5.4.2 tls {
2149 1.5.4.2 tls uint32_t mask2;
2150 1.5.4.2 tls
2151 1.5.4.2 tls athn_disable_interrupts(sc); /* XXX */
2152 1.5.4.2 tls
2153 1.5.4.2 tls AR_WRITE(sc, AR_IMR, sc->sc_imask);
2154 1.5.4.2 tls
2155 1.5.4.2 tls mask2 = AR_READ(sc, AR_IMR_S2);
2156 1.5.4.2 tls mask2 &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC |
2157 1.5.4.2 tls AR_IMR_S2_CABEND | AR_IMR_S2_CABTO | AR_IMR_S2_TSFOOR);
2158 1.5.4.2 tls mask2 |= AR_IMR_S2_GTT | AR_IMR_S2_CST;
2159 1.5.4.2 tls AR_WRITE(sc, AR_IMR_S2, mask2);
2160 1.5.4.2 tls
2161 1.5.4.2 tls AR_CLRBITS(sc, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
2162 1.5.4.2 tls
2163 1.5.4.2 tls AR_WRITE(sc, AR_IER, AR_IER_ENABLE);
2164 1.5.4.2 tls
2165 1.5.4.2 tls AR_WRITE(sc, AR_INTR_ASYNC_ENABLE, AR_INTR_MAC_IRQ);
2166 1.5.4.2 tls AR_WRITE(sc, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ);
2167 1.5.4.2 tls
2168 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_ENABLE, sc->sc_isync);
2169 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_MASK, sc->sc_isync);
2170 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2171 1.5.4.2 tls }
2172 1.5.4.2 tls
2173 1.5.4.2 tls Static void
2174 1.5.4.2 tls athn_disable_interrupts(struct athn_softc *sc)
2175 1.5.4.2 tls {
2176 1.5.4.2 tls
2177 1.5.4.2 tls AR_WRITE(sc, AR_IER, 0);
2178 1.5.4.2 tls (void)AR_READ(sc, AR_IER);
2179 1.5.4.2 tls
2180 1.5.4.2 tls AR_WRITE(sc, AR_INTR_ASYNC_ENABLE, 0);
2181 1.5.4.2 tls (void)AR_READ(sc, AR_INTR_ASYNC_ENABLE);
2182 1.5.4.2 tls
2183 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_ENABLE, 0);
2184 1.5.4.2 tls (void)AR_READ(sc, AR_INTR_SYNC_ENABLE);
2185 1.5.4.2 tls
2186 1.5.4.2 tls AR_WRITE(sc, AR_IMR, 0);
2187 1.5.4.2 tls
2188 1.5.4.2 tls AR_CLRBITS(sc, AR_IMR_S2, AR_IMR_S2_TIM | AR_IMR_S2_DTIM |
2189 1.5.4.2 tls AR_IMR_S2_DTIMSYNC | AR_IMR_S2_CABEND | AR_IMR_S2_CABTO |
2190 1.5.4.2 tls AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST);
2191 1.5.4.2 tls
2192 1.5.4.2 tls AR_CLRBITS(sc, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
2193 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2194 1.5.4.2 tls }
2195 1.5.4.2 tls
2196 1.5.4.2 tls Static void
2197 1.5.4.2 tls athn_init_qos(struct athn_softc *sc)
2198 1.5.4.2 tls {
2199 1.5.4.2 tls
2200 1.5.4.2 tls /* Initialize QoS settings. */
2201 1.5.4.2 tls AR_WRITE(sc, AR_MIC_QOS_CONTROL, 0x100aa);
2202 1.5.4.2 tls AR_WRITE(sc, AR_MIC_QOS_SELECT, 0x3210);
2203 1.5.4.2 tls AR_WRITE(sc, AR_QOS_NO_ACK,
2204 1.5.4.2 tls SM(AR_QOS_NO_ACK_TWO_BIT, 2) |
2205 1.5.4.2 tls SM(AR_QOS_NO_ACK_BIT_OFF, 5) |
2206 1.5.4.2 tls SM(AR_QOS_NO_ACK_BYTE_OFF, 0));
2207 1.5.4.2 tls AR_WRITE(sc, AR_TXOP_X, AR_TXOP_X_VAL);
2208 1.5.4.2 tls /* Initialize TXOP for all TIDs. */
2209 1.5.4.2 tls AR_WRITE(sc, AR_TXOP_0_3, 0xffffffff);
2210 1.5.4.2 tls AR_WRITE(sc, AR_TXOP_4_7, 0xffffffff);
2211 1.5.4.2 tls AR_WRITE(sc, AR_TXOP_8_11, 0xffffffff);
2212 1.5.4.2 tls AR_WRITE(sc, AR_TXOP_12_15, 0xffffffff);
2213 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2214 1.5.4.2 tls }
2215 1.5.4.2 tls
2216 1.5.4.2 tls PUBLIC int
2217 1.5.4.2 tls athn_hw_reset(struct athn_softc *sc, struct ieee80211_channel *curchan,
2218 1.5.4.2 tls struct ieee80211_channel *extchan, int init)
2219 1.5.4.2 tls {
2220 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2221 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
2222 1.5.4.2 tls uint32_t reg, def_ant, sta_id1, cfg_led, tsflo, tsfhi;
2223 1.5.4.2 tls int i, error;
2224 1.5.4.2 tls
2225 1.5.4.2 tls /* XXX not if already awake */
2226 1.5.4.2 tls if ((error = athn_set_power_awake(sc)) != 0) {
2227 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "could not wakeup chip\n");
2228 1.5.4.2 tls return error;
2229 1.5.4.2 tls }
2230 1.5.4.2 tls
2231 1.5.4.2 tls /* Preserve the antenna on a channel switch. */
2232 1.5.4.2 tls if ((def_ant = AR_READ(sc, AR_DEF_ANTENNA)) == 0)
2233 1.5.4.2 tls def_ant = 1;
2234 1.5.4.2 tls /* Preserve other registers. */
2235 1.5.4.2 tls sta_id1 = AR_READ(sc, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;
2236 1.5.4.2 tls cfg_led = AR_READ(sc, AR_CFG_LED) & (AR_CFG_LED_ASSOC_CTL_M |
2237 1.5.4.2 tls AR_CFG_LED_MODE_SEL_M | AR_CFG_LED_BLINK_THRESH_SEL_M |
2238 1.5.4.2 tls AR_CFG_LED_BLINK_SLOW);
2239 1.5.4.2 tls
2240 1.5.4.2 tls /* Mark PHY as inactive. */
2241 1.5.4.2 tls ops->disable_phy(sc);
2242 1.5.4.2 tls
2243 1.5.4.2 tls if (init && AR_SREV_9271(sc)) {
2244 1.5.4.2 tls AR_WRITE(sc, AR9271_RESET_POWER_DOWN_CONTROL,
2245 1.5.4.2 tls AR9271_RADIO_RF_RST);
2246 1.5.4.2 tls DELAY(50);
2247 1.5.4.2 tls }
2248 1.5.4.2 tls if (AR_SREV_9280(sc) && (sc->sc_flags & ATHN_FLAG_OLPC)) {
2249 1.5.4.2 tls /* Save TSF before it gets cleared. */
2250 1.5.4.2 tls tsfhi = AR_READ(sc, AR_TSF_U32);
2251 1.5.4.2 tls tsflo = AR_READ(sc, AR_TSF_L32);
2252 1.5.4.2 tls
2253 1.5.4.2 tls /* NB: RTC reset clears TSF. */
2254 1.5.4.2 tls error = athn_reset_power_on(sc);
2255 1.5.4.2 tls }
2256 1.5.4.2 tls else {
2257 1.5.4.2 tls tsfhi = tsflo = 0; /* XXX: gcc */
2258 1.5.4.2 tls error = athn_reset(sc, 0);
2259 1.5.4.2 tls }
2260 1.5.4.2 tls if (error != 0) {
2261 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
2262 1.5.4.2 tls "could not reset chip (error=%d)\n", error);
2263 1.5.4.2 tls return error;
2264 1.5.4.2 tls }
2265 1.5.4.2 tls
2266 1.5.4.2 tls /* XXX not if already awake */
2267 1.5.4.2 tls if ((error = athn_set_power_awake(sc)) != 0) {
2268 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "could not wakeup chip\n");
2269 1.5.4.2 tls return error;
2270 1.5.4.2 tls }
2271 1.5.4.2 tls
2272 1.5.4.2 tls athn_init_pll(sc, curchan);
2273 1.5.4.2 tls ops->set_rf_mode(sc, curchan);
2274 1.5.4.2 tls
2275 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_RFSILENT) {
2276 1.5.4.2 tls /* Check that the radio is not disabled by hardware switch. */
2277 1.5.4.2 tls reg = ops->gpio_read(sc, sc->sc_rfsilent_pin);
2278 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_RFSILENT_REVERSED)
2279 1.5.4.2 tls reg = !reg;
2280 1.5.4.2 tls if (!reg) {
2281 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
2282 1.5.4.2 tls "radio is disabled by hardware switch\n");
2283 1.5.4.2 tls return EPERM;
2284 1.5.4.2 tls }
2285 1.5.4.2 tls }
2286 1.5.4.2 tls if (init && AR_SREV_9271(sc)) {
2287 1.5.4.2 tls AR_WRITE(sc, AR9271_RESET_POWER_DOWN_CONTROL,
2288 1.5.4.2 tls AR9271_GATE_MAC_CTL);
2289 1.5.4.2 tls DELAY(50);
2290 1.5.4.2 tls }
2291 1.5.4.2 tls if (AR_SREV_9280(sc) && (sc->sc_flags & ATHN_FLAG_OLPC)) {
2292 1.5.4.2 tls /* Restore TSF if it got cleared. */
2293 1.5.4.2 tls AR_WRITE(sc, AR_TSF_L32, tsflo);
2294 1.5.4.2 tls AR_WRITE(sc, AR_TSF_U32, tsfhi);
2295 1.5.4.2 tls }
2296 1.5.4.2 tls
2297 1.5.4.2 tls if (AR_SREV_9280_10_OR_LATER(sc))
2298 1.5.4.2 tls AR_SETBITS(sc, sc->sc_gpio_input_en_off, AR_GPIO_JTAG_DISABLE);
2299 1.5.4.2 tls
2300 1.5.4.2 tls if (AR_SREV_9287_13_OR_LATER(sc) && !AR_SREV_9380_10_OR_LATER(sc))
2301 1.5.4.2 tls ar9287_1_3_enable_async_fifo(sc);
2302 1.5.4.2 tls
2303 1.5.4.2 tls /* Write init values to hardware. */
2304 1.5.4.2 tls ops->hw_init(sc, curchan, extchan);
2305 1.5.4.2 tls
2306 1.5.4.2 tls /*
2307 1.5.4.2 tls * Only >=AR9280 2.0 parts are capable of encrypting unicast
2308 1.5.4.2 tls * management frames using CCMP.
2309 1.5.4.2 tls */
2310 1.5.4.2 tls if (AR_SREV_9280_20_OR_LATER(sc)) {
2311 1.5.4.2 tls reg = AR_READ(sc, AR_AES_MUTE_MASK1);
2312 1.5.4.2 tls /* Do not mask the subtype field in management frames. */
2313 1.5.4.2 tls reg = RW(reg, AR_AES_MUTE_MASK1_FC0_MGMT, 0xff);
2314 1.5.4.2 tls reg = RW(reg, AR_AES_MUTE_MASK1_FC1_MGMT,
2315 1.5.4.4 jdolecek (uint32_t)~(IEEE80211_FC1_RETRY | IEEE80211_FC1_PWR_MGT |
2316 1.5.4.2 tls IEEE80211_FC1_MORE_DATA));
2317 1.5.4.2 tls AR_WRITE(sc, AR_AES_MUTE_MASK1, reg);
2318 1.5.4.2 tls }
2319 1.5.4.2 tls else if (AR_SREV_9160_10_OR_LATER(sc)) {
2320 1.5.4.2 tls /* Disable hardware crypto for management frames. */
2321 1.5.4.2 tls AR_CLRBITS(sc, AR_PCU_MISC_MODE2,
2322 1.5.4.2 tls AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE);
2323 1.5.4.2 tls AR_SETBITS(sc, AR_PCU_MISC_MODE2,
2324 1.5.4.2 tls AR_PCU_MISC_MODE2_NO_CRYPTO_FOR_NON_DATA_PKT);
2325 1.5.4.2 tls }
2326 1.5.4.2 tls
2327 1.5.4.2 tls if (ic->ic_curmode != IEEE80211_MODE_11B)
2328 1.5.4.2 tls ops->set_delta_slope(sc, curchan, extchan);
2329 1.5.4.2 tls
2330 1.5.4.2 tls ops->spur_mitigate(sc, curchan, extchan);
2331 1.5.4.2 tls ops->init_from_rom(sc, curchan, extchan);
2332 1.5.4.2 tls
2333 1.5.4.2 tls /* XXX */
2334 1.5.4.2 tls AR_WRITE(sc, AR_STA_ID0, LE_READ_4(&ic->ic_myaddr[0]));
2335 1.5.4.2 tls AR_WRITE(sc, AR_STA_ID1, LE_READ_2(&ic->ic_myaddr[4]) |
2336 1.5.4.2 tls sta_id1 | AR_STA_ID1_RTS_USE_DEF | AR_STA_ID1_CRPT_MIC_ENABLE);
2337 1.5.4.2 tls
2338 1.5.4.2 tls athn_set_opmode(sc);
2339 1.5.4.2 tls
2340 1.5.4.2 tls AR_WRITE(sc, AR_BSSMSKL, 0xffffffff);
2341 1.5.4.2 tls AR_WRITE(sc, AR_BSSMSKU, 0xffff);
2342 1.5.4.2 tls
2343 1.5.4.2 tls /* Restore previous antenna. */
2344 1.5.4.2 tls AR_WRITE(sc, AR_DEF_ANTENNA, def_ant);
2345 1.5.4.2 tls
2346 1.5.4.2 tls AR_WRITE(sc, AR_BSS_ID0, 0);
2347 1.5.4.2 tls AR_WRITE(sc, AR_BSS_ID1, 0);
2348 1.5.4.2 tls
2349 1.5.4.2 tls AR_WRITE(sc, AR_ISR, 0xffffffff);
2350 1.5.4.2 tls
2351 1.5.4.2 tls AR_WRITE(sc, AR_RSSI_THR, SM(AR_RSSI_THR_BM_THR, 7));
2352 1.5.4.2 tls
2353 1.5.4.2 tls if ((error = ops->set_synth(sc, curchan, extchan)) != 0) {
2354 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "could not set channel\n");
2355 1.5.4.2 tls return error;
2356 1.5.4.2 tls }
2357 1.5.4.2 tls sc->sc_curchan = curchan;
2358 1.5.4.2 tls sc->sc_curchanext = extchan;
2359 1.5.4.2 tls
2360 1.5.4.2 tls for (i = 0; i < AR_NUM_DCU; i++)
2361 1.5.4.2 tls AR_WRITE(sc, AR_DQCUMASK(i), 1 << i);
2362 1.5.4.2 tls
2363 1.5.4.2 tls athn_init_tx_queues(sc);
2364 1.5.4.2 tls
2365 1.5.4.2 tls /* Initialize interrupt mask. */
2366 1.5.4.2 tls sc->sc_imask =
2367 1.5.4.2 tls AR_IMR_TXDESC | AR_IMR_TXEOL |
2368 1.5.4.2 tls AR_IMR_RXERR | AR_IMR_RXEOL | AR_IMR_RXORN |
2369 1.5.4.2 tls AR_IMR_RXMINTR | AR_IMR_RXINTM |
2370 1.5.4.2 tls AR_IMR_GENTMR | AR_IMR_BCNMISC;
2371 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc))
2372 1.5.4.2 tls sc->sc_imask |= AR_IMR_RXERR | AR_IMR_HP_RXOK;
2373 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
2374 1.5.4.2 tls if (0 && ic->ic_opmode == IEEE80211_M_HOSTAP)
2375 1.5.4.2 tls sc->sc_imask |= AR_IMR_MIB;
2376 1.5.4.2 tls #endif
2377 1.5.4.2 tls AR_WRITE(sc, AR_IMR, sc->sc_imask);
2378 1.5.4.2 tls AR_SETBITS(sc, AR_IMR_S2, AR_IMR_S2_GTT);
2379 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_CAUSE, 0xffffffff);
2380 1.5.4.2 tls sc->sc_isync = AR_INTR_SYNC_DEFAULT;
2381 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_RFSILENT)
2382 1.5.4.2 tls sc->sc_isync |= AR_INTR_SYNC_GPIO_PIN(sc->sc_rfsilent_pin);
2383 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_ENABLE, sc->sc_isync);
2384 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_MASK, 0);
2385 1.5.4.2 tls if (AR_SREV_9380_10_OR_LATER(sc)) {
2386 1.5.4.2 tls AR_WRITE(sc, AR_INTR_PRIO_ASYNC_ENABLE, 0);
2387 1.5.4.2 tls AR_WRITE(sc, AR_INTR_PRIO_ASYNC_MASK, 0);
2388 1.5.4.2 tls AR_WRITE(sc, AR_INTR_PRIO_SYNC_ENABLE, 0);
2389 1.5.4.2 tls AR_WRITE(sc, AR_INTR_PRIO_SYNC_MASK, 0);
2390 1.5.4.2 tls }
2391 1.5.4.2 tls
2392 1.5.4.2 tls athn_init_qos(sc);
2393 1.5.4.2 tls
2394 1.5.4.2 tls AR_SETBITS(sc, AR_PCU_MISC, AR_PCU_MIC_NEW_LOC_ENA);
2395 1.5.4.2 tls
2396 1.5.4.2 tls if (AR_SREV_9287_13_OR_LATER(sc) && !AR_SREV_9380_10_OR_LATER(sc))
2397 1.5.4.2 tls ar9287_1_3_setup_async_fifo(sc);
2398 1.5.4.2 tls
2399 1.5.4.2 tls /* Disable sequence number generation in hardware. */
2400 1.5.4.2 tls AR_SETBITS(sc, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
2401 1.5.4.2 tls
2402 1.5.4.2 tls athn_init_dma(sc);
2403 1.5.4.2 tls
2404 1.5.4.2 tls /* Program observation bus to see MAC interrupts. */
2405 1.5.4.2 tls AR_WRITE(sc, sc->sc_obs_off, 8);
2406 1.5.4.2 tls
2407 1.5.4.2 tls /* Setup Rx interrupt mitigation. */
2408 1.5.4.2 tls AR_WRITE(sc, AR_RIMT, SM(AR_RIMT_FIRST, 2000) | SM(AR_RIMT_LAST, 500));
2409 1.5.4.2 tls
2410 1.5.4.2 tls ops->init_baseband(sc);
2411 1.5.4.2 tls
2412 1.5.4.2 tls if ((error = athn_init_calib(sc, curchan, extchan)) != 0) {
2413 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
2414 1.5.4.2 tls "could not initialize calibration\n");
2415 1.5.4.2 tls return error;
2416 1.5.4.2 tls }
2417 1.5.4.2 tls
2418 1.5.4.2 tls ops->set_rxchains(sc);
2419 1.5.4.2 tls
2420 1.5.4.2 tls AR_WRITE(sc, AR_CFG_LED, cfg_led | AR_CFG_SCLK_32KHZ);
2421 1.5.4.2 tls
2422 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_USB) {
2423 1.5.4.2 tls if (AR_SREV_9271(sc))
2424 1.5.4.2 tls AR_WRITE(sc, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB);
2425 1.5.4.2 tls else
2426 1.5.4.2 tls AR_WRITE(sc, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
2427 1.5.4.2 tls }
2428 1.5.4.2 tls #if BYTE_ORDER == BIG_ENDIAN
2429 1.5.4.2 tls else {
2430 1.5.4.2 tls /* Default is LE, turn on swapping for BE. */
2431 1.5.4.2 tls AR_WRITE(sc, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
2432 1.5.4.2 tls }
2433 1.5.4.2 tls #endif
2434 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2435 1.5.4.2 tls
2436 1.5.4.2 tls return 0;
2437 1.5.4.2 tls }
2438 1.5.4.2 tls
2439 1.5.4.2 tls Static struct ieee80211_node *
2440 1.5.4.2 tls athn_node_alloc(struct ieee80211_node_table *ntp)
2441 1.5.4.2 tls {
2442 1.5.4.2 tls
2443 1.5.4.2 tls return malloc(sizeof(struct athn_node), M_DEVBUF,
2444 1.5.4.2 tls M_NOWAIT | M_ZERO);
2445 1.5.4.2 tls }
2446 1.5.4.2 tls
2447 1.5.4.2 tls Static void
2448 1.5.4.2 tls athn_newassoc(struct ieee80211_node *ni, int isnew)
2449 1.5.4.2 tls {
2450 1.5.4.2 tls struct ieee80211com *ic = ni->ni_ic;
2451 1.5.4.2 tls struct athn_softc *sc = ic->ic_ifp->if_softc;
2452 1.5.4.2 tls struct athn_node *an = (void *)ni;
2453 1.5.4.2 tls struct ieee80211_rateset *rs = &ni->ni_rates;
2454 1.5.4.2 tls uint8_t rate;
2455 1.5.4.2 tls int ridx, i, j;
2456 1.5.4.2 tls
2457 1.5.4.2 tls ieee80211_amrr_node_init(&sc->sc_amrr, &an->amn);
2458 1.5.4.2 tls /* Start at lowest available bit-rate, AMRR will raise. */
2459 1.5.4.2 tls ni->ni_txrate = 0;
2460 1.5.4.2 tls
2461 1.5.4.2 tls for (i = 0; i < rs->rs_nrates; i++) {
2462 1.5.4.2 tls rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
2463 1.5.4.2 tls
2464 1.5.4.2 tls /* Map 802.11 rate to HW rate index. */
2465 1.5.4.2 tls for (ridx = 0; ridx <= ATHN_RIDX_MAX; ridx++)
2466 1.5.4.2 tls if (athn_rates[ridx].rate == rate)
2467 1.5.4.2 tls break;
2468 1.5.4.2 tls an->ridx[i] = ridx;
2469 1.5.4.2 tls DPRINTFN(DBG_STM, sc, "rate %d index %d\n", rate, ridx);
2470 1.5.4.2 tls
2471 1.5.4.2 tls /* Compute fallback rate for retries. */
2472 1.5.4.2 tls an->fallback[i] = i;
2473 1.5.4.2 tls for (j = i - 1; j >= 0; j--) {
2474 1.5.4.2 tls if (athn_rates[an->ridx[j]].phy ==
2475 1.5.4.2 tls athn_rates[an->ridx[i]].phy) {
2476 1.5.4.2 tls an->fallback[i] = j;
2477 1.5.4.2 tls break;
2478 1.5.4.2 tls }
2479 1.5.4.2 tls }
2480 1.5.4.2 tls DPRINTFN(DBG_STM, sc, "%d fallbacks to %d\n",
2481 1.5.4.2 tls i, an->fallback[i]);
2482 1.5.4.2 tls }
2483 1.5.4.2 tls }
2484 1.5.4.2 tls
2485 1.5.4.2 tls Static int
2486 1.5.4.2 tls athn_media_change(struct ifnet *ifp)
2487 1.5.4.2 tls {
2488 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2489 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2490 1.5.4.2 tls uint8_t rate, ridx;
2491 1.5.4.2 tls int error;
2492 1.5.4.2 tls
2493 1.5.4.2 tls error = ieee80211_media_change(ifp);
2494 1.5.4.2 tls if (error != ENETRESET)
2495 1.5.4.2 tls return error;
2496 1.5.4.2 tls
2497 1.5.4.2 tls if (ic->ic_fixed_rate != -1) {
2498 1.5.4.2 tls rate = ic->ic_sup_rates[ic->ic_curmode].
2499 1.5.4.2 tls rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
2500 1.5.4.2 tls /* Map 802.11 rate to HW rate index. */
2501 1.5.4.2 tls for (ridx = 0; ridx <= ATHN_RIDX_MAX; ridx++)
2502 1.5.4.2 tls if (athn_rates[ridx].rate == rate)
2503 1.5.4.2 tls break;
2504 1.5.4.2 tls sc->sc_fixed_ridx = ridx;
2505 1.5.4.2 tls }
2506 1.5.4.2 tls if (IS_UP_AND_RUNNING(ifp)) {
2507 1.5.4.2 tls athn_stop(ifp, 0);
2508 1.5.4.2 tls error = athn_init(ifp);
2509 1.5.4.2 tls }
2510 1.5.4.2 tls return error;
2511 1.5.4.2 tls }
2512 1.5.4.2 tls
2513 1.5.4.2 tls Static void
2514 1.5.4.2 tls athn_next_scan(void *arg)
2515 1.5.4.2 tls {
2516 1.5.4.2 tls struct athn_softc *sc = arg;
2517 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2518 1.5.4.2 tls int s;
2519 1.5.4.2 tls
2520 1.5.4.2 tls s = splnet();
2521 1.5.4.2 tls if (ic->ic_state == IEEE80211_S_SCAN)
2522 1.5.4.2 tls ieee80211_next_scan(ic);
2523 1.5.4.2 tls splx(s);
2524 1.5.4.2 tls }
2525 1.5.4.2 tls
2526 1.5.4.2 tls Static int
2527 1.5.4.2 tls athn_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
2528 1.5.4.2 tls {
2529 1.5.4.2 tls struct ifnet *ifp = ic->ic_ifp;
2530 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2531 1.5.4.2 tls uint32_t reg;
2532 1.5.4.2 tls int error;
2533 1.5.4.2 tls
2534 1.5.4.2 tls callout_stop(&sc->sc_calib_to);
2535 1.5.4.2 tls
2536 1.5.4.2 tls switch (nstate) {
2537 1.5.4.2 tls case IEEE80211_S_INIT:
2538 1.5.4.2 tls athn_set_led(sc, 0);
2539 1.5.4.2 tls break;
2540 1.5.4.2 tls case IEEE80211_S_SCAN:
2541 1.5.4.2 tls /* Make the LED blink while scanning. */
2542 1.5.4.2 tls athn_set_led(sc, !sc->sc_led_state);
2543 1.5.4.2 tls error = athn_switch_chan(sc, ic->ic_curchan, NULL);
2544 1.5.4.2 tls if (error != 0)
2545 1.5.4.2 tls return error;
2546 1.5.4.2 tls callout_schedule(&sc->sc_scan_to, hz / 5);
2547 1.5.4.2 tls break;
2548 1.5.4.2 tls case IEEE80211_S_AUTH:
2549 1.5.4.2 tls athn_set_led(sc, 0);
2550 1.5.4.2 tls error = athn_switch_chan(sc, ic->ic_curchan, NULL);
2551 1.5.4.2 tls if (error != 0)
2552 1.5.4.2 tls return error;
2553 1.5.4.2 tls break;
2554 1.5.4.2 tls case IEEE80211_S_ASSOC:
2555 1.5.4.2 tls break;
2556 1.5.4.2 tls case IEEE80211_S_RUN:
2557 1.5.4.2 tls athn_set_led(sc, 1);
2558 1.5.4.2 tls
2559 1.5.4.2 tls if (ic->ic_opmode == IEEE80211_M_MONITOR)
2560 1.5.4.2 tls break;
2561 1.5.4.2 tls
2562 1.5.4.2 tls /* Fake a join to initialize the Tx rate. */
2563 1.5.4.2 tls athn_newassoc(ic->ic_bss, 1);
2564 1.5.4.2 tls
2565 1.5.4.2 tls athn_set_bss(sc, ic->ic_bss);
2566 1.5.4.2 tls athn_disable_interrupts(sc);
2567 1.5.4.2 tls #ifndef IEEE80211_STA_ONLY
2568 1.5.4.2 tls if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
2569 1.5.4.2 tls athn_set_hostap_timers(sc);
2570 1.5.4.2 tls /* Enable software beacon alert interrupts. */
2571 1.5.4.2 tls sc->sc_imask |= AR_IMR_SWBA;
2572 1.5.4.2 tls }
2573 1.5.4.2 tls else
2574 1.5.4.2 tls #endif
2575 1.5.4.2 tls {
2576 1.5.4.2 tls athn_set_sta_timers(sc);
2577 1.5.4.2 tls /* Enable beacon miss interrupts. */
2578 1.5.4.2 tls sc->sc_imask |= AR_IMR_BMISS;
2579 1.5.4.2 tls
2580 1.5.4.2 tls /* Stop receiving beacons from other BSS. */
2581 1.5.4.2 tls reg = AR_READ(sc, AR_RX_FILTER);
2582 1.5.4.2 tls reg = (reg & ~AR_RX_FILTER_BEACON) |
2583 1.5.4.2 tls AR_RX_FILTER_MYBEACON;
2584 1.5.4.2 tls AR_WRITE(sc, AR_RX_FILTER, reg);
2585 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2586 1.5.4.2 tls }
2587 1.5.4.2 tls athn_enable_interrupts(sc);
2588 1.5.4.2 tls
2589 1.5.4.2 tls if (sc->sc_sup_calib_mask != 0) {
2590 1.5.4.2 tls memset(&sc->sc_calib, 0, sizeof(sc->sc_calib));
2591 1.5.4.2 tls sc->sc_cur_calib_mask = sc->sc_sup_calib_mask;
2592 1.5.4.2 tls /* ops->do_calib(sc); */
2593 1.5.4.2 tls }
2594 1.5.4.2 tls /* XXX Start ANI. */
2595 1.5.4.2 tls
2596 1.5.4.2 tls callout_schedule(&sc->sc_calib_to, hz / 2);
2597 1.5.4.2 tls break;
2598 1.5.4.2 tls }
2599 1.5.4.2 tls
2600 1.5.4.2 tls return sc->sc_newstate(ic, nstate, arg);
2601 1.5.4.2 tls }
2602 1.5.4.2 tls
2603 1.5.4.2 tls #ifdef notyet_edca
2604 1.5.4.2 tls PUBLIC void
2605 1.5.4.2 tls athn_updateedca(struct ieee80211com *ic)
2606 1.5.4.2 tls {
2607 1.5.4.2 tls #define ATHN_EXP2(x) ((1 << (x)) - 1) /* CWmin = 2^ECWmin - 1 */
2608 1.5.4.2 tls struct athn_softc *sc = ic->ic_ifp->if_softc;
2609 1.5.4.2 tls const struct ieee80211_edca_ac_params *ac;
2610 1.5.4.2 tls int aci, qid;
2611 1.5.4.2 tls
2612 1.5.4.2 tls for (aci = 0; aci < EDCA_NUM_AC; aci++) {
2613 1.5.4.2 tls ac = &ic->ic_edca_ac[aci];
2614 1.5.4.2 tls qid = athn_ac2qid[aci];
2615 1.5.4.2 tls
2616 1.5.4.2 tls AR_WRITE(sc, AR_DLCL_IFS(qid),
2617 1.5.4.2 tls SM(AR_D_LCL_IFS_CWMIN, ATHN_EXP2(ac->ac_ecwmin)) |
2618 1.5.4.2 tls SM(AR_D_LCL_IFS_CWMAX, ATHN_EXP2(ac->ac_ecwmax)) |
2619 1.5.4.2 tls SM(AR_D_LCL_IFS_AIFS, ac->ac_aifsn));
2620 1.5.4.2 tls if (ac->ac_txoplimit != 0) {
2621 1.5.4.2 tls AR_WRITE(sc, AR_DCHNTIME(qid),
2622 1.5.4.2 tls SM(AR_D_CHNTIME_DUR,
2623 1.5.4.2 tls IEEE80211_TXOP_TO_US(ac->ac_txoplimit)) |
2624 1.5.4.2 tls AR_D_CHNTIME_EN);
2625 1.5.4.2 tls }
2626 1.5.4.2 tls else
2627 1.5.4.2 tls AR_WRITE(sc, AR_DCHNTIME(qid), 0);
2628 1.5.4.2 tls }
2629 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2630 1.5.4.2 tls #undef ATHN_EXP2
2631 1.5.4.2 tls }
2632 1.5.4.2 tls #endif /* notyet_edca */
2633 1.5.4.2 tls
2634 1.5.4.2 tls Static int
2635 1.5.4.2 tls athn_clock_rate(struct athn_softc *sc)
2636 1.5.4.2 tls {
2637 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2638 1.5.4.2 tls int clockrate; /* MHz. */
2639 1.5.4.2 tls
2640 1.5.4.2 tls if (ic->ic_curmode == IEEE80211_MODE_11A) {
2641 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_FAST_PLL_CLOCK)
2642 1.5.4.2 tls clockrate = AR_CLOCK_RATE_FAST_5GHZ_OFDM;
2643 1.5.4.2 tls else
2644 1.5.4.2 tls clockrate = AR_CLOCK_RATE_5GHZ_OFDM;
2645 1.5.4.2 tls }
2646 1.5.4.2 tls else if (ic->ic_curmode == IEEE80211_MODE_11B) {
2647 1.5.4.2 tls clockrate = AR_CLOCK_RATE_CCK;
2648 1.5.4.2 tls }
2649 1.5.4.2 tls else
2650 1.5.4.2 tls clockrate = AR_CLOCK_RATE_2GHZ_OFDM;
2651 1.5.4.2 tls #ifndef IEEE80211_NO_HT
2652 1.5.4.2 tls if (sc->sc_curchanext != NULL)
2653 1.5.4.2 tls clockrate *= 2;
2654 1.5.4.2 tls #endif
2655 1.5.4.2 tls return clockrate;
2656 1.5.4.2 tls }
2657 1.5.4.2 tls
2658 1.5.4.2 tls PUBLIC void
2659 1.5.4.2 tls athn_updateslot(struct ifnet *ifp)
2660 1.5.4.2 tls {
2661 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2662 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2663 1.5.4.2 tls int slot;
2664 1.5.4.2 tls
2665 1.5.4.2 tls slot = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
2666 1.5.4.2 tls AR_WRITE(sc, AR_D_GBL_IFS_SLOT, slot * athn_clock_rate(sc));
2667 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2668 1.5.4.2 tls }
2669 1.5.4.2 tls
2670 1.5.4.2 tls Static void
2671 1.5.4.2 tls athn_start(struct ifnet *ifp)
2672 1.5.4.2 tls {
2673 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2674 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2675 1.5.4.2 tls struct ether_header *eh;
2676 1.5.4.2 tls struct ieee80211_node *ni;
2677 1.5.4.2 tls struct mbuf *m;
2678 1.5.4.2 tls
2679 1.5.4.2 tls if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING
2680 1.5.4.2 tls || !device_is_active(sc->sc_dev))
2681 1.5.4.2 tls return;
2682 1.5.4.2 tls
2683 1.5.4.2 tls for (;;) {
2684 1.5.4.2 tls if (SIMPLEQ_EMPTY(&sc->sc_txbufs)) {
2685 1.5.4.2 tls ifp->if_flags |= IFF_OACTIVE;
2686 1.5.4.2 tls break;
2687 1.5.4.2 tls }
2688 1.5.4.2 tls /* Send pending management frames first. */
2689 1.5.4.2 tls IF_DEQUEUE(&ic->ic_mgtq, m);
2690 1.5.4.2 tls if (m != NULL) {
2691 1.5.4.4 jdolecek ni = M_GETCTX(m, struct ieee80211_node *);
2692 1.5.4.2 tls goto sendit;
2693 1.5.4.2 tls }
2694 1.5.4.2 tls if (ic->ic_state != IEEE80211_S_RUN)
2695 1.5.4.2 tls break;
2696 1.5.4.2 tls
2697 1.5.4.2 tls /* Encapsulate and send data frames. */
2698 1.5.4.2 tls IFQ_DEQUEUE(&ifp->if_snd, m);
2699 1.5.4.2 tls if (m == NULL)
2700 1.5.4.2 tls break;
2701 1.5.4.2 tls
2702 1.5.4.2 tls if (m->m_len < (int)sizeof(*eh) &&
2703 1.5.4.2 tls (m = m_pullup(m, sizeof(*eh))) == NULL) {
2704 1.5.4.2 tls ifp->if_oerrors++;
2705 1.5.4.2 tls continue;
2706 1.5.4.2 tls }
2707 1.5.4.2 tls eh = mtod(m, struct ether_header *);
2708 1.5.4.2 tls ni = ieee80211_find_txnode(ic, eh->ether_dhost);
2709 1.5.4.2 tls if (ni == NULL) {
2710 1.5.4.2 tls m_freem(m);
2711 1.5.4.2 tls ifp->if_oerrors++;
2712 1.5.4.2 tls continue;
2713 1.5.4.2 tls }
2714 1.5.4.2 tls
2715 1.5.4.2 tls bpf_mtap(ifp, m);
2716 1.5.4.2 tls
2717 1.5.4.2 tls if ((m = ieee80211_encap(ic, m, ni)) == NULL)
2718 1.5.4.2 tls continue;
2719 1.5.4.2 tls sendit:
2720 1.5.4.2 tls bpf_mtap3(ic->ic_rawbpf, m);
2721 1.5.4.2 tls
2722 1.5.4.2 tls if (sc->sc_ops.tx(sc, m, ni, 0) != 0) {
2723 1.5.4.2 tls ieee80211_free_node(ni);
2724 1.5.4.2 tls ifp->if_oerrors++;
2725 1.5.4.2 tls continue;
2726 1.5.4.2 tls }
2727 1.5.4.2 tls
2728 1.5.4.2 tls sc->sc_tx_timer = 5;
2729 1.5.4.2 tls ifp->if_timer = 1;
2730 1.5.4.2 tls }
2731 1.5.4.2 tls }
2732 1.5.4.2 tls
2733 1.5.4.2 tls Static void
2734 1.5.4.2 tls athn_watchdog(struct ifnet *ifp)
2735 1.5.4.2 tls {
2736 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2737 1.5.4.2 tls
2738 1.5.4.2 tls ifp->if_timer = 0;
2739 1.5.4.2 tls
2740 1.5.4.2 tls if (sc->sc_tx_timer > 0) {
2741 1.5.4.2 tls if (--sc->sc_tx_timer == 0) {
2742 1.5.4.2 tls aprint_error_dev(sc->sc_dev, "device timeout\n");
2743 1.5.4.3 tls /* see athn_init, no need to call athn_stop here */
2744 1.5.4.3 tls /* athn_stop(ifp, 0); */
2745 1.5.4.2 tls (void)athn_init(ifp);
2746 1.5.4.2 tls ifp->if_oerrors++;
2747 1.5.4.2 tls return;
2748 1.5.4.2 tls }
2749 1.5.4.2 tls ifp->if_timer = 1;
2750 1.5.4.2 tls }
2751 1.5.4.2 tls ieee80211_watchdog(&sc->sc_ic);
2752 1.5.4.2 tls }
2753 1.5.4.2 tls
2754 1.5.4.2 tls #ifdef notyet
2755 1.5.4.2 tls Static void
2756 1.5.4.2 tls athn_set_multi(struct athn_softc *sc)
2757 1.5.4.2 tls {
2758 1.5.4.2 tls struct arpcom *ac = &sc->sc_ic.ic_ac;
2759 1.5.4.2 tls struct ifnet *ifp = &ac->ac_if;
2760 1.5.4.2 tls struct ether_multi *enm;
2761 1.5.4.2 tls struct ether_multistep step;
2762 1.5.4.2 tls const uint8_t *addr;
2763 1.5.4.2 tls uint32_t val, lo, hi;
2764 1.5.4.2 tls uint8_t bit;
2765 1.5.4.2 tls
2766 1.5.4.2 tls if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
2767 1.5.4.2 tls lo = hi = 0xffffffff;
2768 1.5.4.2 tls goto done;
2769 1.5.4.2 tls }
2770 1.5.4.2 tls lo = hi = 0;
2771 1.5.4.2 tls ETHER_FIRST_MULTI(step, ac, enm);
2772 1.5.4.2 tls while (enm != NULL) {
2773 1.5.4.2 tls if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
2774 1.5.4.2 tls ifp->if_flags |= IFF_ALLMULTI;
2775 1.5.4.2 tls lo = hi = 0xffffffff;
2776 1.5.4.2 tls goto done;
2777 1.5.4.2 tls }
2778 1.5.4.2 tls addr = enm->enm_addrlo;
2779 1.5.4.2 tls /* Calculate the XOR value of all eight 6-bit words. */
2780 1.5.4.2 tls val = addr[0] | addr[1] << 8 | addr[2] << 16;
2781 1.5.4.2 tls bit = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
2782 1.5.4.2 tls val = addr[3] | addr[4] << 8 | addr[5] << 16;
2783 1.5.4.2 tls bit ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
2784 1.5.4.2 tls bit &= 0x3f;
2785 1.5.4.2 tls if (bit < 32)
2786 1.5.4.2 tls lo |= 1 << bit;
2787 1.5.4.2 tls else
2788 1.5.4.2 tls hi |= 1 << (bit - 32);
2789 1.5.4.2 tls ETHER_NEXT_MULTI(step, enm);
2790 1.5.4.2 tls }
2791 1.5.4.2 tls done:
2792 1.5.4.2 tls AR_WRITE(sc, AR_MCAST_FIL0, lo);
2793 1.5.4.2 tls AR_WRITE(sc, AR_MCAST_FIL1, hi);
2794 1.5.4.2 tls AR_WRITE_BARRIER(sc);
2795 1.5.4.2 tls }
2796 1.5.4.2 tls #endif /* notyet */
2797 1.5.4.2 tls
2798 1.5.4.2 tls Static int
2799 1.5.4.2 tls athn_ioctl(struct ifnet *ifp, u_long cmd, void *data)
2800 1.5.4.2 tls {
2801 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2802 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2803 1.5.4.2 tls int s, error = 0;
2804 1.5.4.2 tls
2805 1.5.4.2 tls s = splnet();
2806 1.5.4.2 tls
2807 1.5.4.2 tls switch (cmd) {
2808 1.5.4.2 tls case SIOCSIFFLAGS:
2809 1.5.4.2 tls if ((error = ifioctl_common(ifp, cmd, data)) != 0)
2810 1.5.4.2 tls break;
2811 1.5.4.2 tls
2812 1.5.4.2 tls switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) {
2813 1.5.4.2 tls case IFF_UP | IFF_RUNNING:
2814 1.5.4.2 tls #ifdef notyet
2815 1.5.4.2 tls if (((ifp->if_flags ^ sc->sc_if_flags) &
2816 1.5.4.2 tls (IFF_ALLMULTI | IFF_PROMISC)) != 0)
2817 1.5.4.2 tls /* XXX: setup multi */
2818 1.5.4.2 tls #endif
2819 1.5.4.2 tls break;
2820 1.5.4.2 tls case IFF_UP:
2821 1.5.4.2 tls athn_init(ifp);
2822 1.5.4.2 tls break;
2823 1.5.4.2 tls
2824 1.5.4.2 tls case IFF_RUNNING:
2825 1.5.4.2 tls athn_stop(ifp, 1);
2826 1.5.4.2 tls break;
2827 1.5.4.2 tls case 0:
2828 1.5.4.2 tls default:
2829 1.5.4.2 tls break;
2830 1.5.4.2 tls }
2831 1.5.4.2 tls sc->sc_if_flags = ifp->if_flags;
2832 1.5.4.2 tls break;
2833 1.5.4.2 tls
2834 1.5.4.2 tls case SIOCADDMULTI:
2835 1.5.4.2 tls case SIOCDELMULTI:
2836 1.5.4.2 tls if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
2837 1.5.4.2 tls /* setup multicast filter, etc */
2838 1.5.4.2 tls #ifdef notyet
2839 1.5.4.2 tls athn_set_multi(sc);
2840 1.5.4.2 tls #endif
2841 1.5.4.2 tls error = 0;
2842 1.5.4.2 tls }
2843 1.5.4.2 tls break;
2844 1.5.4.2 tls
2845 1.5.4.2 tls case SIOCS80211CHANNEL:
2846 1.5.4.2 tls error = ieee80211_ioctl(ic, cmd, data);
2847 1.5.4.2 tls if (error == ENETRESET &&
2848 1.5.4.2 tls ic->ic_opmode == IEEE80211_M_MONITOR) {
2849 1.5.4.2 tls if (IS_UP_AND_RUNNING(ifp))
2850 1.5.4.2 tls athn_switch_chan(sc, ic->ic_curchan, NULL);
2851 1.5.4.2 tls error = 0;
2852 1.5.4.2 tls }
2853 1.5.4.2 tls break;
2854 1.5.4.2 tls
2855 1.5.4.2 tls default:
2856 1.5.4.2 tls error = ieee80211_ioctl(ic, cmd, data);
2857 1.5.4.2 tls }
2858 1.5.4.2 tls
2859 1.5.4.2 tls if (error == ENETRESET) {
2860 1.5.4.2 tls error = 0;
2861 1.5.4.2 tls if (IS_UP_AND_RUNNING(ifp) &&
2862 1.5.4.2 tls ic->ic_roaming != IEEE80211_ROAMING_MANUAL) {
2863 1.5.4.2 tls athn_stop(ifp, 0);
2864 1.5.4.2 tls error = athn_init(ifp);
2865 1.5.4.2 tls }
2866 1.5.4.2 tls }
2867 1.5.4.2 tls
2868 1.5.4.2 tls splx(s);
2869 1.5.4.2 tls return error;
2870 1.5.4.2 tls }
2871 1.5.4.2 tls
2872 1.5.4.2 tls Static int
2873 1.5.4.2 tls athn_init(struct ifnet *ifp)
2874 1.5.4.2 tls {
2875 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2876 1.5.4.2 tls struct athn_ops *ops = &sc->sc_ops;
2877 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2878 1.5.4.2 tls struct ieee80211_channel *curchan, *extchan;
2879 1.5.4.2 tls size_t i;
2880 1.5.4.2 tls int error;
2881 1.5.4.2 tls
2882 1.5.4.2 tls KASSERT(!cpu_intr_p());
2883 1.5.4.2 tls
2884 1.5.4.2 tls if (device_is_active(sc->sc_dev)) {
2885 1.5.4.3 tls athn_stop(ifp, 0); /* see athn_watchdog() */
2886 1.5.4.2 tls } else {
2887 1.5.4.2 tls short flags = ifp->if_flags;
2888 1.5.4.2 tls ifp->if_flags &= ~IFF_UP;
2889 1.5.4.2 tls /* avoid recursion in athn_resume */
2890 1.5.4.2 tls if (!pmf_device_subtree_resume(sc->sc_dev, &sc->sc_qual) ||
2891 1.5.4.2 tls !device_is_active(sc->sc_dev)) {
2892 1.5.4.4 jdolecek printf("%s: failed to power up device\n",
2893 1.5.4.4 jdolecek device_xname(sc->sc_dev));
2894 1.5.4.2 tls return 0;
2895 1.5.4.2 tls }
2896 1.5.4.2 tls ifp->if_flags = flags;
2897 1.5.4.2 tls }
2898 1.5.4.2 tls
2899 1.5.4.2 tls curchan = ic->ic_curchan;
2900 1.5.4.2 tls extchan = NULL;
2901 1.5.4.2 tls
2902 1.5.4.2 tls /* In case a new MAC address has been configured. */
2903 1.5.4.2 tls IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
2904 1.5.4.2 tls
2905 1.5.4.2 tls #ifdef openbsd_power_management
2906 1.5.4.2 tls /* For CardBus, power on the socket. */
2907 1.5.4.2 tls if (sc->sc_enable != NULL) {
2908 1.5.4.2 tls if ((error = sc->sc_enable(sc)) != 0) {
2909 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
2910 1.5.4.2 tls "could not enable device\n");
2911 1.5.4.2 tls goto fail;
2912 1.5.4.2 tls }
2913 1.5.4.2 tls if ((error = athn_reset_power_on(sc)) != 0) {
2914 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
2915 1.5.4.2 tls "could not power on device\n");
2916 1.5.4.2 tls goto fail;
2917 1.5.4.2 tls }
2918 1.5.4.2 tls }
2919 1.5.4.2 tls #endif
2920 1.5.4.2 tls if (!(sc->sc_flags & ATHN_FLAG_PCIE))
2921 1.5.4.2 tls athn_config_nonpcie(sc);
2922 1.5.4.2 tls else
2923 1.5.4.2 tls athn_config_pcie(sc);
2924 1.5.4.2 tls
2925 1.5.4.2 tls /* Reset HW key cache entries. */
2926 1.5.4.2 tls for (i = 0; i < sc->sc_kc_entries; i++)
2927 1.5.4.2 tls athn_reset_key(sc, i);
2928 1.5.4.2 tls
2929 1.5.4.2 tls ops->enable_antenna_diversity(sc);
2930 1.5.4.2 tls
2931 1.5.4.2 tls #ifdef ATHN_BT_COEXISTENCE
2932 1.5.4.2 tls /* Configure bluetooth coexistence for combo chips. */
2933 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_BTCOEX)
2934 1.5.4.2 tls athn_btcoex_init(sc);
2935 1.5.4.2 tls #endif
2936 1.5.4.2 tls
2937 1.5.4.2 tls /* Configure LED. */
2938 1.5.4.2 tls athn_led_init(sc);
2939 1.5.4.2 tls
2940 1.5.4.2 tls /* Configure hardware radio switch. */
2941 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_RFSILENT)
2942 1.5.4.2 tls ops->rfsilent_init(sc);
2943 1.5.4.2 tls
2944 1.5.4.2 tls if ((error = athn_hw_reset(sc, curchan, extchan, 1)) != 0) {
2945 1.5.4.2 tls aprint_error_dev(sc->sc_dev,
2946 1.5.4.2 tls "unable to reset hardware; reset status %d\n", error);
2947 1.5.4.2 tls goto fail;
2948 1.5.4.2 tls }
2949 1.5.4.2 tls
2950 1.5.4.2 tls /* Enable Rx. */
2951 1.5.4.2 tls athn_rx_start(sc);
2952 1.5.4.2 tls
2953 1.5.4.2 tls /* Enable interrupts. */
2954 1.5.4.2 tls athn_enable_interrupts(sc);
2955 1.5.4.2 tls
2956 1.5.4.2 tls #ifdef ATHN_BT_COEXISTENCE
2957 1.5.4.2 tls /* Enable bluetooth coexistence for combo chips. */
2958 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_BTCOEX)
2959 1.5.4.2 tls athn_btcoex_enable(sc);
2960 1.5.4.2 tls #endif
2961 1.5.4.2 tls
2962 1.5.4.2 tls ifp->if_flags &= ~IFF_OACTIVE;
2963 1.5.4.2 tls ifp->if_flags |= IFF_RUNNING;
2964 1.5.4.2 tls
2965 1.5.4.2 tls #ifdef notyet
2966 1.5.4.2 tls if (ic->ic_flags & IEEE80211_F_WEPON) {
2967 1.5.4.2 tls /* Configure WEP keys. */
2968 1.5.4.2 tls for (i = 0; i < IEEE80211_WEP_NKID; i++)
2969 1.5.4.2 tls athn_set_key(ic, NULL, &ic->ic_nw_keys[i]);
2970 1.5.4.2 tls }
2971 1.5.4.2 tls #endif
2972 1.5.4.2 tls if (ic->ic_opmode == IEEE80211_M_MONITOR)
2973 1.5.4.2 tls ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2974 1.5.4.2 tls else
2975 1.5.4.2 tls ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2976 1.5.4.2 tls
2977 1.5.4.2 tls return 0;
2978 1.5.4.2 tls fail:
2979 1.5.4.2 tls athn_stop(ifp, 1);
2980 1.5.4.2 tls return error;
2981 1.5.4.2 tls }
2982 1.5.4.2 tls
2983 1.5.4.2 tls PUBLIC void
2984 1.5.4.2 tls athn_stop(struct ifnet *ifp, int disable)
2985 1.5.4.2 tls {
2986 1.5.4.2 tls struct athn_softc *sc = ifp->if_softc;
2987 1.5.4.2 tls struct ieee80211com *ic = &sc->sc_ic;
2988 1.5.4.2 tls int qid;
2989 1.5.4.2 tls
2990 1.5.4.2 tls ifp->if_timer = sc->sc_tx_timer = 0;
2991 1.5.4.2 tls ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2992 1.5.4.2 tls
2993 1.5.4.2 tls callout_stop(&sc->sc_scan_to);
2994 1.5.4.2 tls /* In case we were scanning, release the scan "lock". */
2995 1.5.4.2 tls // ic->ic_scan_lock = IEEE80211_SCAN_UNLOCKED; /* XXX:??? */
2996 1.5.4.2 tls
2997 1.5.4.2 tls ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2998 1.5.4.2 tls
2999 1.5.4.2 tls #ifdef ATHN_BT_COEXISTENCE
3000 1.5.4.2 tls /* Disable bluetooth coexistence for combo chips. */
3001 1.5.4.2 tls if (sc->sc_flags & ATHN_FLAG_BTCOEX)
3002 1.5.4.2 tls athn_btcoex_disable(sc);
3003 1.5.4.2 tls #endif
3004 1.5.4.2 tls
3005 1.5.4.2 tls /* Disable interrupts. */
3006 1.5.4.2 tls athn_disable_interrupts(sc);
3007 1.5.4.2 tls /* Acknowledge interrupts (avoids interrupt storms). */
3008 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_CAUSE, 0xffffffff);
3009 1.5.4.2 tls AR_WRITE(sc, AR_INTR_SYNC_MASK, 0);
3010 1.5.4.2 tls
3011 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++)
3012 1.5.4.2 tls athn_stop_tx_dma(sc, qid);
3013 1.5.4.2 tls /* XXX call athn_hw_reset if Tx still pending? */
3014 1.5.4.2 tls for (qid = 0; qid < ATHN_QID_COUNT; qid++)
3015 1.5.4.2 tls athn_tx_reclaim(sc, qid);
3016 1.5.4.2 tls
3017 1.5.4.2 tls /* Stop Rx. */
3018 1.5.4.2 tls AR_SETBITS(sc, AR_DIAG_SW, AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT);
3019 1.5.4.2 tls AR_WRITE(sc, AR_MIBC, AR_MIBC_FMC);
3020 1.5.4.2 tls AR_WRITE(sc, AR_MIBC, AR_MIBC_CMC);
3021 1.5.4.2 tls AR_WRITE(sc, AR_FILT_OFDM, 0);
3022 1.5.4.2 tls AR_WRITE(sc, AR_FILT_CCK, 0);
3023 1.5.4.2 tls AR_WRITE_BARRIER(sc);
3024 1.5.4.2 tls athn_set_rxfilter(sc, 0);
3025 1.5.4.2 tls athn_stop_rx_dma(sc);
3026 1.5.4.2 tls
3027 1.5.4.2 tls athn_reset(sc, 0);
3028 1.5.4.2 tls athn_init_pll(sc, NULL);
3029 1.5.4.2 tls athn_set_power_awake(sc);
3030 1.5.4.2 tls athn_reset(sc, 1);
3031 1.5.4.2 tls athn_init_pll(sc, NULL);
3032 1.5.4.2 tls
3033 1.5.4.2 tls athn_set_power_sleep(sc);
3034 1.5.4.2 tls
3035 1.5.4.2 tls #if 0 /* XXX: shouldn't the pmf stuff take care of this? */
3036 1.5.4.2 tls /* For CardBus, power down the socket. */
3037 1.5.4.2 tls if (disable && sc->sc_disable != NULL)
3038 1.5.4.2 tls sc->sc_disable(sc);
3039 1.5.4.2 tls #endif
3040 1.5.4.2 tls if (disable)
3041 1.5.4.2 tls pmf_device_recursive_suspend(sc->sc_dev, &sc->sc_qual);
3042 1.5.4.2 tls }
3043 1.5.4.2 tls
3044 1.5.4.2 tls Static void
3045 1.5.4.2 tls athn_pmf_wlan_off(device_t self)
3046 1.5.4.2 tls {
3047 1.5.4.2 tls struct athn_softc *sc = device_private(self);
3048 1.5.4.2 tls struct ifnet *ifp = &sc->sc_if;
3049 1.5.4.2 tls
3050 1.5.4.2 tls /* Turn the interface down. */
3051 1.5.4.2 tls ifp->if_flags &= ~IFF_UP;
3052 1.5.4.2 tls athn_stop(ifp, 1);
3053 1.5.4.2 tls }
3054 1.5.4.2 tls
3055 1.5.4.2 tls PUBLIC void
3056 1.5.4.2 tls athn_suspend(struct athn_softc *sc)
3057 1.5.4.2 tls {
3058 1.5.4.2 tls struct ifnet *ifp = &sc->sc_if;
3059 1.5.4.2 tls
3060 1.5.4.2 tls if (ifp->if_flags & IFF_RUNNING)
3061 1.5.4.2 tls athn_stop(ifp, 1);
3062 1.5.4.2 tls }
3063 1.5.4.2 tls
3064 1.5.4.2 tls PUBLIC bool
3065 1.5.4.2 tls athn_resume(struct athn_softc *sc)
3066 1.5.4.2 tls {
3067 1.5.4.2 tls struct ifnet *ifp = &sc->sc_if;
3068 1.5.4.2 tls
3069 1.5.4.2 tls if (ifp->if_flags & IFF_UP)
3070 1.5.4.2 tls athn_init(ifp);
3071 1.5.4.2 tls
3072 1.5.4.2 tls return true;
3073 1.5.4.2 tls }
3074