xref: /illumos-gate/usr/src/uts/common/io/arn/arn_main.c (revision ed093b41a93e8563e6e1e5dae0768dda2a7bcc27)
1 /*
2  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*
7  * Copyright (c) 2008 Atheros Communications Inc.
8  *
9  * Permission to use, copy, modify, and/or distribute this software for any
10  * purpose with or without fee is hereby granted, provided that the above
11  * copyright notice and this permission notice appear in all copies.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 #include <sys/sysmacros.h>
23 #include <sys/param.h>
24 #include <sys/types.h>
25 #include <sys/signal.h>
26 #include <sys/stream.h>
27 #include <sys/termio.h>
28 #include <sys/errno.h>
29 #include <sys/file.h>
30 #include <sys/cmn_err.h>
31 #include <sys/stropts.h>
32 #include <sys/strsubr.h>
33 #include <sys/strtty.h>
34 #include <sys/kbio.h>
35 #include <sys/cred.h>
36 #include <sys/stat.h>
37 #include <sys/consdev.h>
38 #include <sys/kmem.h>
39 #include <sys/modctl.h>
40 #include <sys/ddi.h>
41 #include <sys/sunddi.h>
42 #include <sys/pci.h>
43 #include <sys/errno.h>
44 #include <sys/mac_provider.h>
45 #include <sys/dlpi.h>
46 #include <sys/ethernet.h>
47 #include <sys/list.h>
48 #include <sys/byteorder.h>
49 #include <sys/strsun.h>
50 #include <sys/policy.h>
51 #include <inet/common.h>
52 #include <inet/nd.h>
53 #include <inet/mi.h>
54 #include <inet/wifi_ioctl.h>
55 #include <sys/mac_wifi.h>
56 #include <sys/net80211.h>
57 #include <sys/net80211_proto.h>
58 #include <sys/net80211_ht.h>
59 
60 
61 #include "arn_ath9k.h"
62 #include "arn_core.h"
63 #include "arn_reg.h"
64 #include "arn_hw.h"
65 
66 #define	ARN_MAX_RSSI	45	/* max rssi */
67 
68 /*
69  * Default 11n reates supported by this station.
70  */
71 extern struct ieee80211_htrateset ieee80211_rateset_11n;
72 
73 /*
74  * PIO access attributes for registers
75  */
76 static ddi_device_acc_attr_t arn_reg_accattr = {
77 	DDI_DEVICE_ATTR_V0,
78 	DDI_STRUCTURE_LE_ACC,
79 	DDI_STRICTORDER_ACC,
80 	DDI_DEFAULT_ACC
81 };
82 
83 /*
84  * DMA access attributes for descriptors: NOT to be byte swapped.
85  */
86 static ddi_device_acc_attr_t arn_desc_accattr = {
87 	DDI_DEVICE_ATTR_V0,
88 	DDI_STRUCTURE_LE_ACC,
89 	DDI_STRICTORDER_ACC,
90 	DDI_DEFAULT_ACC
91 };
92 
93 /*
94  * Describes the chip's DMA engine
95  */
96 static ddi_dma_attr_t arn_dma_attr = {
97 	DMA_ATTR_V0,	/* version number */
98 	0,				/* low address */
99 	0xffffffffU,	/* high address */
100 	0x3ffffU,		/* counter register max */
101 	1,				/* alignment */
102 	0xFFF,			/* burst sizes */
103 	1,				/* minimum transfer size */
104 	0x3ffffU,		/* max transfer size */
105 	0xffffffffU,	/* address register max */
106 	1,				/* no scatter-gather */
107 	1,				/* granularity of device */
108 	0,				/* DMA flags */
109 };
110 
111 static ddi_dma_attr_t arn_desc_dma_attr = {
112 	DMA_ATTR_V0,	/* version number */
113 	0,				/* low address */
114 	0xffffffffU,	/* high address */
115 	0xffffffffU,	/* counter register max */
116 	0x1000,			/* alignment */
117 	0xFFF,			/* burst sizes */
118 	1,				/* minimum transfer size */
119 	0xffffffffU,	/* max transfer size */
120 	0xffffffffU,	/* address register max */
121 	1,				/* no scatter-gather */
122 	1,				/* granularity of device */
123 	0,				/* DMA flags */
124 };
125 
126 #define	ATH_DEF_CACHE_BYTES	32 /* default cache line size */
127 
128 static kmutex_t arn_loglock;
129 static void *arn_soft_state_p = NULL;
130 static int arn_dwelltime = 200; /* scan interval */
131 
132 static int	arn_m_stat(void *,  uint_t, uint64_t *);
133 static int	arn_m_start(void *);
134 static void	arn_m_stop(void *);
135 static int	arn_m_promisc(void *, boolean_t);
136 static int	arn_m_multicst(void *, boolean_t, const uint8_t *);
137 static int	arn_m_unicst(void *, const uint8_t *);
138 static mblk_t	*arn_m_tx(void *, mblk_t *);
139 static void	arn_m_ioctl(void *, queue_t *, mblk_t *);
140 static int	arn_m_setprop(void *, const char *, mac_prop_id_t,
141     uint_t, const void *);
142 static int	arn_m_getprop(void *, const char *, mac_prop_id_t,
143     uint_t, void *);
144 static void	arn_m_propinfo(void *, const char *, mac_prop_id_t,
145     mac_prop_info_handle_t);
146 
147 /* MAC Callcack Functions */
148 static mac_callbacks_t arn_m_callbacks = {
149 	MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO,
150 	arn_m_stat,
151 	arn_m_start,
152 	arn_m_stop,
153 	arn_m_promisc,
154 	arn_m_multicst,
155 	arn_m_unicst,
156 	arn_m_tx,
157 	NULL,
158 	arn_m_ioctl,
159 	NULL,
160 	NULL,
161 	NULL,
162 	arn_m_setprop,
163 	arn_m_getprop,
164 	arn_m_propinfo
165 };
166 
167 /*
168  * ARN_DBG_HW
169  * ARN_DBG_REG_IO
170  * ARN_DBG_QUEUE
171  * ARN_DBG_EEPROM
172  * ARN_DBG_XMIT
173  * ARN_DBG_RECV
174  * ARN_DBG_CALIBRATE
175  * ARN_DBG_CHANNEL
176  * ARN_DBG_INTERRUPT
177  * ARN_DBG_REGULATORY
178  * ARN_DBG_ANI
179  * ARN_DBG_POWER_MGMT
180  * ARN_DBG_KEYCACHE
181  * ARN_DBG_BEACON
182  * ARN_DBG_RATE
183  * ARN_DBG_INIT
184  * ARN_DBG_ATTACH
185  * ARN_DBG_DEATCH
186  * ARN_DBG_AGGR
187  * ARN_DBG_RESET
188  * ARN_DBG_FATAL
189  * ARN_DBG_ANY
190  * ARN_DBG_ALL
191  */
192 uint32_t arn_dbg_mask = 0;
193 
194 /*
195  * Exception/warning cases not leading to panic.
196  */
197 void
198 arn_problem(const int8_t *fmt, ...)
199 {
200 	va_list args;
201 
202 	mutex_enter(&arn_loglock);
203 
204 	va_start(args, fmt);
205 	vcmn_err(CE_WARN, fmt, args);
206 	va_end(args);
207 
208 	mutex_exit(&arn_loglock);
209 }
210 
211 /*
212  * Normal log information independent of debug.
213  */
214 void
215 arn_log(const int8_t *fmt, ...)
216 {
217 	va_list args;
218 
219 	mutex_enter(&arn_loglock);
220 
221 	va_start(args, fmt);
222 	vcmn_err(CE_CONT, fmt, args);
223 	va_end(args);
224 
225 	mutex_exit(&arn_loglock);
226 }
227 
228 void
229 arn_dbg(uint32_t dbg_flags, const int8_t *fmt, ...)
230 {
231 	va_list args;
232 
233 	if (dbg_flags & arn_dbg_mask) {
234 		mutex_enter(&arn_loglock);
235 		va_start(args, fmt);
236 		vcmn_err(CE_CONT, fmt, args);
237 		va_end(args);
238 		mutex_exit(&arn_loglock);
239 	}
240 }
241 
242 /*
243  * Read and write, they both share the same lock. We do this to serialize
244  * reads and writes on Atheros 802.11n PCI devices only. This is required
245  * as the FIFO on these devices can only accept sanely 2 requests. After
246  * that the device goes bananas. Serializing the reads/writes prevents this
247  * from happening.
248  */
249 void
250 arn_iowrite32(struct ath_hal *ah, uint32_t reg_offset, uint32_t val)
251 {
252 	struct arn_softc *sc = ah->ah_sc;
253 	if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
254 		mutex_enter(&sc->sc_serial_rw);
255 		ddi_put32(sc->sc_io_handle,
256 		    (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)), val);
257 		mutex_exit(&sc->sc_serial_rw);
258 	} else {
259 		ddi_put32(sc->sc_io_handle,
260 		    (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)), val);
261 	}
262 }
263 
264 unsigned int
265 arn_ioread32(struct ath_hal *ah, uint32_t reg_offset)
266 {
267 	uint32_t val;
268 	struct arn_softc *sc = ah->ah_sc;
269 	if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
270 		mutex_enter(&sc->sc_serial_rw);
271 		val = ddi_get32(sc->sc_io_handle,
272 		    (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)));
273 		mutex_exit(&sc->sc_serial_rw);
274 	} else {
275 		val = ddi_get32(sc->sc_io_handle,
276 		    (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)));
277 	}
278 
279 	return (val);
280 }
281 
282 /*
283  * Allocate an area of memory and a DMA handle for accessing it
284  */
285 static int
286 arn_alloc_dma_mem(dev_info_t *devinfo, ddi_dma_attr_t *dma_attr, size_t memsize,
287     ddi_device_acc_attr_t *attr_p, uint_t alloc_flags,
288     uint_t bind_flags, dma_area_t *dma_p)
289 {
290 	int err;
291 
292 	/*
293 	 * Allocate handle
294 	 */
295 	err = ddi_dma_alloc_handle(devinfo, dma_attr,
296 	    DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl);
297 	if (err != DDI_SUCCESS)
298 		return (DDI_FAILURE);
299 
300 	/*
301 	 * Allocate memory
302 	 */
303 	err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, attr_p,
304 	    alloc_flags, DDI_DMA_SLEEP, NULL, &dma_p->mem_va,
305 	    &dma_p->alength, &dma_p->acc_hdl);
306 	if (err != DDI_SUCCESS)
307 		return (DDI_FAILURE);
308 
309 	/*
310 	 * Bind the two together
311 	 */
312 	err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL,
313 	    dma_p->mem_va, dma_p->alength, bind_flags,
314 	    DDI_DMA_SLEEP, NULL, &dma_p->cookie, &dma_p->ncookies);
315 	if (err != DDI_DMA_MAPPED)
316 		return (DDI_FAILURE);
317 
318 	dma_p->nslots = ~0U;
319 	dma_p->size = ~0U;
320 	dma_p->token = ~0U;
321 	dma_p->offset = 0;
322 	return (DDI_SUCCESS);
323 }
324 
325 /*
326  * Free one allocated area of DMAable memory
327  */
328 static void
329 arn_free_dma_mem(dma_area_t *dma_p)
330 {
331 	if (dma_p->dma_hdl != NULL) {
332 		(void) ddi_dma_unbind_handle(dma_p->dma_hdl);
333 		if (dma_p->acc_hdl != NULL) {
334 			ddi_dma_mem_free(&dma_p->acc_hdl);
335 			dma_p->acc_hdl = NULL;
336 		}
337 		ddi_dma_free_handle(&dma_p->dma_hdl);
338 		dma_p->ncookies = 0;
339 		dma_p->dma_hdl = NULL;
340 	}
341 }
342 
343 /*
344  * Initialize tx, rx. or beacon buffer list. Allocate DMA memory for
345  * each buffer.
346  */
347 static int
348 arn_buflist_setup(dev_info_t *devinfo,
349     struct arn_softc *sc,
350     list_t *bflist,
351     struct ath_buf **pbf,
352     struct ath_desc **pds,
353     int nbuf,
354     uint_t dmabflags,
355     uint32_t buflen)
356 {
357 	int i, err;
358 	struct ath_buf *bf = *pbf;
359 	struct ath_desc *ds = *pds;
360 
361 	list_create(bflist, sizeof (struct ath_buf),
362 	    offsetof(struct ath_buf, bf_node));
363 	for (i = 0; i < nbuf; i++, bf++, ds++) {
364 		bf->bf_desc = ds;
365 		bf->bf_daddr = sc->sc_desc_dma.cookie.dmac_address +
366 		    ((uintptr_t)ds - (uintptr_t)sc->sc_desc);
367 		list_insert_tail(bflist, bf);
368 
369 		/* alloc DMA memory */
370 		err = arn_alloc_dma_mem(devinfo, &arn_dma_attr,
371 		    buflen, &arn_desc_accattr, DDI_DMA_STREAMING,
372 		    dmabflags, &bf->bf_dma);
373 		if (err != DDI_SUCCESS)
374 			return (err);
375 	}
376 	*pbf = bf;
377 	*pds = ds;
378 
379 	return (DDI_SUCCESS);
380 }
381 
382 /*
383  * Destroy tx, rx or beacon buffer list. Free DMA memory.
384  */
385 static void
386 arn_buflist_cleanup(list_t *buflist)
387 {
388 	struct ath_buf *bf;
389 
390 	if (!buflist)
391 		return;
392 
393 	bf = list_head(buflist);
394 	while (bf != NULL) {
395 		if (bf->bf_m != NULL) {
396 			freemsg(bf->bf_m);
397 			bf->bf_m = NULL;
398 		}
399 		/* Free DMA buffer */
400 		arn_free_dma_mem(&bf->bf_dma);
401 		if (bf->bf_in != NULL) {
402 			ieee80211_free_node(bf->bf_in);
403 			bf->bf_in = NULL;
404 		}
405 		list_remove(buflist, bf);
406 		bf = list_head(buflist);
407 	}
408 	list_destroy(buflist);
409 }
410 
411 static void
412 arn_desc_free(struct arn_softc *sc)
413 {
414 	arn_buflist_cleanup(&sc->sc_txbuf_list);
415 	arn_buflist_cleanup(&sc->sc_rxbuf_list);
416 #ifdef ARN_IBSS
417 	arn_buflist_cleanup(&sc->sc_bcbuf_list);
418 #endif
419 
420 	/* Free descriptor DMA buffer */
421 	arn_free_dma_mem(&sc->sc_desc_dma);
422 
423 	kmem_free((void *)sc->sc_vbufptr, sc->sc_vbuflen);
424 	sc->sc_vbufptr = NULL;
425 }
426 
427 static int
428 arn_desc_alloc(dev_info_t *devinfo, struct arn_softc *sc)
429 {
430 	int err;
431 	size_t size;
432 	struct ath_desc *ds;
433 	struct ath_buf *bf;
434 
435 #ifdef ARN_IBSS
436 	size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF + ATH_BCBUF);
437 #else
438 	size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF);
439 #endif
440 
441 	err = arn_alloc_dma_mem(devinfo, &arn_desc_dma_attr, size,
442 	    &arn_desc_accattr, DDI_DMA_CONSISTENT,
443 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT, &sc->sc_desc_dma);
444 
445 	/* virtual address of the first descriptor */
446 	sc->sc_desc = (struct ath_desc *)sc->sc_desc_dma.mem_va;
447 
448 	ds = sc->sc_desc;
449 	ARN_DBG((ARN_DBG_INIT, "arn: arn_desc_alloc(): DMA map: "
450 	    "%p (%d) -> %p\n",
451 	    sc->sc_desc, sc->sc_desc_dma.alength,
452 	    sc->sc_desc_dma.cookie.dmac_address));
453 
454 	/* allocate data structures to describe TX/RX DMA buffers */
455 #ifdef ARN_IBSS
456 	sc->sc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF +
457 	    ATH_BCBUF);
458 #else
459 	sc->sc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF);
460 #endif
461 	bf = (struct ath_buf *)kmem_zalloc(sc->sc_vbuflen, KM_SLEEP);
462 	sc->sc_vbufptr = bf;
463 
464 	/* DMA buffer size for each TX/RX packet */
465 #ifdef ARN_TX_AGGREGRATION
466 	sc->tx_dmabuf_size =
467 	    roundup((IEEE80211_MAX_MPDU_LEN + 3840 * 2),
468 	    min(sc->sc_cachelsz, (uint16_t)64));
469 #else
470 	sc->tx_dmabuf_size =
471 	    roundup(IEEE80211_MAX_MPDU_LEN, min(sc->sc_cachelsz, (uint16_t)64));
472 #endif
473 	sc->rx_dmabuf_size =
474 	    roundup(IEEE80211_MAX_MPDU_LEN, min(sc->sc_cachelsz, (uint16_t)64));
475 
476 	/* create RX buffer list */
477 	err = arn_buflist_setup(devinfo, sc, &sc->sc_rxbuf_list, &bf, &ds,
478 	    ATH_RXBUF, DDI_DMA_READ | DDI_DMA_STREAMING, sc->rx_dmabuf_size);
479 	if (err != DDI_SUCCESS) {
480 		arn_desc_free(sc);
481 		return (err);
482 	}
483 
484 	/* create TX buffer list */
485 	err = arn_buflist_setup(devinfo, sc, &sc->sc_txbuf_list, &bf, &ds,
486 	    ATH_TXBUF, DDI_DMA_STREAMING, sc->tx_dmabuf_size);
487 	if (err != DDI_SUCCESS) {
488 		arn_desc_free(sc);
489 		return (err);
490 	}
491 
492 	/* create beacon buffer list */
493 #ifdef ARN_IBSS
494 	err = arn_buflist_setup(devinfo, sc, &sc->sc_bcbuf_list, &bf, &ds,
495 	    ATH_BCBUF, DDI_DMA_STREAMING);
496 	if (err != DDI_SUCCESS) {
497 		arn_desc_free(sc);
498 		return (err);
499 	}
500 #endif
501 
502 	return (DDI_SUCCESS);
503 }
504 
505 static void
506 arn_setcurmode(struct arn_softc *sc, enum wireless_mode mode)
507 {
508 	struct ath_rate_table *rt;
509 	int i;
510 
511 	for (i = 0; i < sizeof (sc->asc_rixmap); i++)
512 		sc->asc_rixmap[i] = 0xff;
513 
514 	rt = sc->hw_rate_table[mode];
515 	ASSERT(rt != NULL);
516 
517 	for (i = 0; i < rt->rate_cnt; i++)
518 		sc->asc_rixmap[rt->info[i].dot11rate &
519 		    IEEE80211_RATE_VAL] = (uint8_t)i; /* LINT */
520 
521 	sc->sc_currates = rt;
522 	sc->sc_curmode = mode;
523 
524 	/*
525 	 * All protection frames are transmited at 2Mb/s for
526 	 * 11g, otherwise at 1Mb/s.
527 	 * XXX select protection rate index from rate table.
528 	 */
529 	sc->sc_protrix = (mode == ATH9K_MODE_11G ? 1 : 0);
530 }
531 
532 static enum wireless_mode
533 arn_chan2mode(struct ath9k_channel *chan)
534 {
535 	if (chan->chanmode == CHANNEL_A)
536 		return (ATH9K_MODE_11A);
537 	else if (chan->chanmode == CHANNEL_G)
538 		return (ATH9K_MODE_11G);
539 	else if (chan->chanmode == CHANNEL_B)
540 		return (ATH9K_MODE_11B);
541 	else if (chan->chanmode == CHANNEL_A_HT20)
542 		return (ATH9K_MODE_11NA_HT20);
543 	else if (chan->chanmode == CHANNEL_G_HT20)
544 		return (ATH9K_MODE_11NG_HT20);
545 	else if (chan->chanmode == CHANNEL_A_HT40PLUS)
546 		return (ATH9K_MODE_11NA_HT40PLUS);
547 	else if (chan->chanmode == CHANNEL_A_HT40MINUS)
548 		return (ATH9K_MODE_11NA_HT40MINUS);
549 	else if (chan->chanmode == CHANNEL_G_HT40PLUS)
550 		return (ATH9K_MODE_11NG_HT40PLUS);
551 	else if (chan->chanmode == CHANNEL_G_HT40MINUS)
552 		return (ATH9K_MODE_11NG_HT40MINUS);
553 
554 	return (ATH9K_MODE_11B);
555 }
556 
557 static void
558 arn_update_txpow(struct arn_softc *sc)
559 {
560 	struct ath_hal 	*ah = sc->sc_ah;
561 	uint32_t txpow;
562 
563 	if (sc->sc_curtxpow != sc->sc_config.txpowlimit) {
564 		(void) ath9k_hw_set_txpowerlimit(ah, sc->sc_config.txpowlimit);
565 		/* read back in case value is clamped */
566 		(void) ath9k_hw_getcapability(ah, ATH9K_CAP_TXPOW, 1, &txpow);
567 		sc->sc_curtxpow = (uint32_t)txpow;
568 	}
569 }
570 
571 uint8_t
572 parse_mpdudensity(uint8_t mpdudensity)
573 {
574 	/*
575 	 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
576 	 *   0 for no restriction
577 	 *   1 for 1/4 us
578 	 *   2 for 1/2 us
579 	 *   3 for 1 us
580 	 *   4 for 2 us
581 	 *   5 for 4 us
582 	 *   6 for 8 us
583 	 *   7 for 16 us
584 	 */
585 	switch (mpdudensity) {
586 	case 0:
587 		return (0);
588 	case 1:
589 	case 2:
590 	case 3:
591 		/*
592 		 * Our lower layer calculations limit our
593 		 * precision to 1 microsecond
594 		 */
595 		return (1);
596 	case 4:
597 		return (2);
598 	case 5:
599 		return (4);
600 	case 6:
601 		return (8);
602 	case 7:
603 		return (16);
604 	default:
605 		return (0);
606 	}
607 }
608 
609 static void
610 arn_setup_rates(struct arn_softc *sc, uint32_t mode)
611 {
612 	int i, maxrates;
613 	struct ath_rate_table *rate_table = NULL;
614 	struct ieee80211_rateset *rateset;
615 	ieee80211com_t *ic = (ieee80211com_t *)sc;
616 
617 	/* rate_table = arn_get_ratetable(sc, mode); */
618 	switch (mode) {
619 	case IEEE80211_MODE_11A:
620 		rate_table = sc->hw_rate_table[ATH9K_MODE_11A];
621 		break;
622 	case IEEE80211_MODE_11B:
623 		rate_table = sc->hw_rate_table[ATH9K_MODE_11B];
624 		break;
625 	case IEEE80211_MODE_11G:
626 		rate_table = sc->hw_rate_table[ATH9K_MODE_11G];
627 		break;
628 #ifdef ARN_11N
629 	case IEEE80211_MODE_11NA_HT20:
630 		rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT20];
631 		break;
632 	case IEEE80211_MODE_11NG_HT20:
633 		rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT20];
634 		break;
635 	case IEEE80211_MODE_11NA_HT40PLUS:
636 		rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT40PLUS];
637 		break;
638 	case IEEE80211_MODE_11NA_HT40MINUS:
639 		rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT40MINUS];
640 		break;
641 	case IEEE80211_MODE_11NG_HT40PLUS:
642 		rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT40PLUS];
643 		break;
644 	case IEEE80211_MODE_11NG_HT40MINUS:
645 		rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT40MINUS];
646 		break;
647 #endif
648 	default:
649 		ARN_DBG((ARN_DBG_RATE, "arn: arn_get_ratetable(): "
650 		    "invalid mode %u\n", mode));
651 		break;
652 	}
653 	if (rate_table == NULL)
654 		return;
655 	if (rate_table->rate_cnt > ATH_RATE_MAX) {
656 		ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): "
657 		    "rate table too small (%u > %u)\n",
658 		    rate_table->rate_cnt, IEEE80211_RATE_MAXSIZE));
659 		maxrates = ATH_RATE_MAX;
660 	} else
661 		maxrates = rate_table->rate_cnt;
662 
663 	ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): "
664 	    "maxrates is %d\n", maxrates));
665 
666 	rateset = &ic->ic_sup_rates[mode];
667 	for (i = 0; i < maxrates; i++) {
668 		rateset->ir_rates[i] = rate_table->info[i].dot11rate;
669 		ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): "
670 		    "%d\n", rate_table->info[i].dot11rate));
671 	}
672 	rateset->ir_nrates = (uint8_t)maxrates; /* ??? */
673 }
674 
675 static int
676 arn_setup_channels(struct arn_softc *sc)
677 {
678 	struct ath_hal *ah = sc->sc_ah;
679 	ieee80211com_t *ic = (ieee80211com_t *)sc;
680 	int nchan, i, index;
681 	uint8_t regclassids[ATH_REGCLASSIDS_MAX];
682 	uint32_t nregclass = 0;
683 	struct ath9k_channel *c;
684 
685 	/* Fill in ah->ah_channels */
686 	if (!ath9k_regd_init_channels(ah, ATH_CHAN_MAX, (uint32_t *)&nchan,
687 	    regclassids, ATH_REGCLASSIDS_MAX, &nregclass, CTRY_DEFAULT,
688 	    B_FALSE, 1)) {
689 		uint32_t rd = ah->ah_currentRD;
690 		ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_setup_channels(): "
691 		    "unable to collect channel list; "
692 		    "regdomain likely %u country code %u\n",
693 		    rd, CTRY_DEFAULT));
694 		return (EINVAL);
695 	}
696 
697 	ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_setup_channels(): "
698 	    "number of channel is %d\n", nchan));
699 
700 	for (i = 0; i < nchan; i++) {
701 		c = &ah->ah_channels[i];
702 		uint32_t flags;
703 		index = ath9k_hw_mhz2ieee(ah, c->channel, c->channelFlags);
704 
705 		if (index > IEEE80211_CHAN_MAX) {
706 			ARN_DBG((ARN_DBG_CHANNEL,
707 			    "arn: arn_setup_channels(): "
708 			    "bad hal channel %d (%u/%x) ignored\n",
709 			    index, c->channel, c->channelFlags));
710 			continue;
711 		}
712 		/* NB: flags are known to be compatible */
713 		if (index < 0) {
714 			/*
715 			 * can't handle frequency <2400MHz (negative
716 			 * channels) right now
717 			 */
718 			ARN_DBG((ARN_DBG_CHANNEL,
719 			    "arn: arn_setup_channels(): "
720 			    "hal channel %d (%u/%x) "
721 			    "cannot be handled, ignored\n",
722 			    index, c->channel, c->channelFlags));
723 			continue;
724 		}
725 
726 		/*
727 		 * Calculate net80211 flags; most are compatible
728 		 * but some need massaging.  Note the static turbo
729 		 * conversion can be removed once net80211 is updated
730 		 * to understand static vs. dynamic turbo.
731 		 */
732 
733 		flags = c->channelFlags & (CHANNEL_ALL | CHANNEL_PASSIVE);
734 
735 		if (ic->ic_sup_channels[index].ich_freq == 0) {
736 			ic->ic_sup_channels[index].ich_freq = c->channel;
737 			ic->ic_sup_channels[index].ich_flags = flags;
738 		} else {
739 			/* channels overlap; e.g. 11g and 11b */
740 			ic->ic_sup_channels[index].ich_flags |= flags;
741 		}
742 		if ((c->channelFlags & CHANNEL_G) == CHANNEL_G) {
743 			sc->sc_have11g = 1;
744 			ic->ic_caps |= IEEE80211_C_SHPREAMBLE |
745 			    IEEE80211_C_SHSLOT;	/* short slot time */
746 		}
747 	}
748 
749 	return (0);
750 }
751 
752 uint32_t
753 arn_chan2flags(ieee80211com_t *isc, struct ieee80211_channel *chan)
754 {
755 	uint32_t channel_mode;
756 	switch (ieee80211_chan2mode(isc, chan)) {
757 	case IEEE80211_MODE_11NA:
758 		if (chan->ich_flags & IEEE80211_CHAN_HT40U)
759 			channel_mode = CHANNEL_A_HT40PLUS;
760 		else if (chan->ich_flags & IEEE80211_CHAN_HT40D)
761 			channel_mode = CHANNEL_A_HT40MINUS;
762 		else
763 			channel_mode = CHANNEL_A_HT20;
764 		break;
765 	case IEEE80211_MODE_11NG:
766 		if (chan->ich_flags & IEEE80211_CHAN_HT40U)
767 			channel_mode = CHANNEL_G_HT40PLUS;
768 		else if (chan->ich_flags & IEEE80211_CHAN_HT40D)
769 			channel_mode = CHANNEL_G_HT40MINUS;
770 		else
771 			channel_mode = CHANNEL_G_HT20;
772 		break;
773 	case IEEE80211_MODE_TURBO_G:
774 	case IEEE80211_MODE_STURBO_A:
775 	case IEEE80211_MODE_TURBO_A:
776 		channel_mode = 0;
777 		break;
778 	case IEEE80211_MODE_11A:
779 		channel_mode = CHANNEL_A;
780 		break;
781 	case IEEE80211_MODE_11G:
782 		channel_mode = CHANNEL_B;
783 		break;
784 	case IEEE80211_MODE_11B:
785 		channel_mode = CHANNEL_G;
786 		break;
787 	case IEEE80211_MODE_FH:
788 		channel_mode = 0;
789 		break;
790 	default:
791 		break;
792 	}
793 
794 	return (channel_mode);
795 }
796 
797 /*
798  * Update internal state after a channel change.
799  */
800 void
801 arn_chan_change(struct arn_softc *sc, struct ieee80211_channel *chan)
802 {
803 	struct ieee80211com *ic = &sc->sc_isc;
804 	enum ieee80211_phymode mode;
805 	enum wireless_mode wlmode;
806 
807 	/*
808 	 * Change channels and update the h/w rate map
809 	 * if we're switching; e.g. 11a to 11b/g.
810 	 */
811 	mode = ieee80211_chan2mode(ic, chan);
812 	switch (mode) {
813 	case IEEE80211_MODE_11A:
814 		wlmode = ATH9K_MODE_11A;
815 		break;
816 	case IEEE80211_MODE_11B:
817 		wlmode = ATH9K_MODE_11B;
818 		break;
819 	case IEEE80211_MODE_11G:
820 		wlmode = ATH9K_MODE_11B;
821 		break;
822 	default:
823 		break;
824 	}
825 	if (wlmode != sc->sc_curmode)
826 		arn_setcurmode(sc, wlmode);
827 
828 }
829 
830 /*
831  * Set/change channels.  If the channel is really being changed, it's done
832  * by reseting the chip.  To accomplish this we must first cleanup any pending
833  * DMA, then restart stuff.
834  */
835 static int
836 arn_set_channel(struct arn_softc *sc, struct ath9k_channel *hchan)
837 {
838 	struct ath_hal *ah = sc->sc_ah;
839 	ieee80211com_t *ic = &sc->sc_isc;
840 	boolean_t fastcc = B_TRUE;
841 	boolean_t  stopped;
842 	struct ieee80211_channel chan;
843 	enum wireless_mode curmode;
844 
845 	if (sc->sc_flags & SC_OP_INVALID)
846 		return (EIO);
847 
848 	if (hchan->channel != sc->sc_ah->ah_curchan->channel ||
849 	    hchan->channelFlags != sc->sc_ah->ah_curchan->channelFlags ||
850 	    (sc->sc_flags & SC_OP_CHAINMASK_UPDATE) ||
851 	    (sc->sc_flags & SC_OP_FULL_RESET)) {
852 		int status;
853 
854 		/*
855 		 * This is only performed if the channel settings have
856 		 * actually changed.
857 		 *
858 		 * To switch channels clear any pending DMA operations;
859 		 * wait long enough for the RX fifo to drain, reset the
860 		 * hardware at the new frequency, and then re-enable
861 		 * the relevant bits of the h/w.
862 		 */
863 		(void) ath9k_hw_set_interrupts(ah, 0);	/* disable interrupts */
864 		arn_draintxq(sc, B_FALSE);	/* clear pending tx frames */
865 		stopped = arn_stoprecv(sc);	/* turn off frame recv */
866 
867 		/*
868 		 * XXX: do not flush receive queue here. We don't want
869 		 * to flush data frames already in queue because of
870 		 * changing channel.
871 		 */
872 
873 		if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET))
874 			fastcc = B_FALSE;
875 
876 		ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_set_channel(): "
877 		    "(%u MHz) -> (%u MHz), cflags:%x, chanwidth: %d\n",
878 		    sc->sc_ah->ah_curchan->channel,
879 		    hchan->channel, hchan->channelFlags, sc->tx_chan_width));
880 
881 		if (!ath9k_hw_reset(ah, hchan, sc->tx_chan_width,
882 		    sc->sc_tx_chainmask, sc->sc_rx_chainmask,
883 		    sc->sc_ht_extprotspacing, fastcc, &status)) {
884 			ARN_DBG((ARN_DBG_FATAL, "arn: arn_set_channel(): "
885 			    "unable to reset channel %u (%uMhz) "
886 			    "flags 0x%x hal status %u\n",
887 			    ath9k_hw_mhz2ieee(ah, hchan->channel,
888 			    hchan->channelFlags),
889 			    hchan->channel, hchan->channelFlags, status));
890 			return (EIO);
891 		}
892 
893 		sc->sc_curchan = *hchan;
894 
895 		sc->sc_flags &= ~SC_OP_CHAINMASK_UPDATE;
896 		sc->sc_flags &= ~SC_OP_FULL_RESET;
897 
898 		if (arn_startrecv(sc) != 0) {
899 			arn_problem("arn: arn_set_channel(): "
900 			    "unable to restart recv logic\n");
901 			return (EIO);
902 		}
903 
904 		chan.ich_freq = hchan->channel;
905 		chan.ich_flags = hchan->channelFlags;
906 		ic->ic_ibss_chan = &chan;
907 
908 		/*
909 		 * Change channels and update the h/w rate map
910 		 * if we're switching; e.g. 11a to 11b/g.
911 		 */
912 		curmode = arn_chan2mode(hchan);
913 		if (curmode != sc->sc_curmode)
914 			arn_setcurmode(sc, arn_chan2mode(hchan));
915 
916 		arn_update_txpow(sc);
917 
918 		(void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
919 	}
920 
921 	return (0);
922 }
923 
924 /*
925  *  This routine performs the periodic noise floor calibration function
926  *  that is used to adjust and optimize the chip performance.  This
927  *  takes environmental changes (location, temperature) into account.
928  *  When the task is complete, it reschedules itself depending on the
929  *  appropriate interval that was calculated.
930  */
931 static void
932 arn_ani_calibrate(void *arg)
933 {
934 	ieee80211com_t *ic = (ieee80211com_t *)arg;
935 	struct arn_softc *sc = (struct arn_softc *)ic;
936 	struct ath_hal *ah = sc->sc_ah;
937 	boolean_t longcal = B_FALSE;
938 	boolean_t shortcal = B_FALSE;
939 	boolean_t aniflag = B_FALSE;
940 	unsigned int timestamp = drv_hztousec(ddi_get_lbolt())/1000;
941 	uint32_t cal_interval;
942 
943 	/*
944 	 * don't calibrate when we're scanning.
945 	 * we are most likely not on our home channel.
946 	 */
947 	if (ic->ic_state != IEEE80211_S_RUN)
948 		goto settimer;
949 
950 	/* Long calibration runs independently of short calibration. */
951 	if ((timestamp - sc->sc_ani.sc_longcal_timer) >= ATH_LONG_CALINTERVAL) {
952 		longcal = B_TRUE;
953 		ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
954 		    "%s: longcal @%lu\n", __func__, drv_hztousec));
955 		sc->sc_ani.sc_longcal_timer = timestamp;
956 	}
957 
958 	/* Short calibration applies only while sc_caldone is FALSE */
959 	if (!sc->sc_ani.sc_caldone) {
960 		if ((timestamp - sc->sc_ani.sc_shortcal_timer) >=
961 		    ATH_SHORT_CALINTERVAL) {
962 			shortcal = B_TRUE;
963 			ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
964 			    "%s: shortcal @%lu\n",
965 			    __func__, drv_hztousec));
966 			sc->sc_ani.sc_shortcal_timer = timestamp;
967 			sc->sc_ani.sc_resetcal_timer = timestamp;
968 		}
969 	} else {
970 		if ((timestamp - sc->sc_ani.sc_resetcal_timer) >=
971 		    ATH_RESTART_CALINTERVAL) {
972 			ath9k_hw_reset_calvalid(ah, ah->ah_curchan,
973 			    &sc->sc_ani.sc_caldone);
974 			if (sc->sc_ani.sc_caldone)
975 				sc->sc_ani.sc_resetcal_timer = timestamp;
976 		}
977 	}
978 
979 	/* Verify whether we must check ANI */
980 	if ((timestamp - sc->sc_ani.sc_checkani_timer) >=
981 	    ATH_ANI_POLLINTERVAL) {
982 		aniflag = B_TRUE;
983 		sc->sc_ani.sc_checkani_timer = timestamp;
984 	}
985 
986 	/* Skip all processing if there's nothing to do. */
987 	if (longcal || shortcal || aniflag) {
988 		/* Call ANI routine if necessary */
989 		if (aniflag)
990 			ath9k_hw_ani_monitor(ah, &sc->sc_halstats,
991 			    ah->ah_curchan);
992 
993 		/* Perform calibration if necessary */
994 		if (longcal || shortcal) {
995 			boolean_t iscaldone = B_FALSE;
996 
997 			if (ath9k_hw_calibrate(ah, ah->ah_curchan,
998 			    sc->sc_rx_chainmask, longcal, &iscaldone)) {
999 				if (longcal)
1000 					sc->sc_ani.sc_noise_floor =
1001 					    ath9k_hw_getchan_noise(ah,
1002 					    ah->ah_curchan);
1003 
1004 				ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
1005 				    "%s: calibrate chan %u/%x nf: %d\n",
1006 				    __func__,
1007 				    ah->ah_curchan->channel,
1008 				    ah->ah_curchan->channelFlags,
1009 				    sc->sc_ani.sc_noise_floor));
1010 			} else {
1011 				ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
1012 				    "%s: calibrate chan %u/%x failed\n",
1013 				    __func__,
1014 				    ah->ah_curchan->channel,
1015 				    ah->ah_curchan->channelFlags));
1016 			}
1017 			sc->sc_ani.sc_caldone = iscaldone;
1018 		}
1019 	}
1020 
1021 settimer:
1022 	/*
1023 	 * Set timer interval based on previous results.
1024 	 * The interval must be the shortest necessary to satisfy ANI,
1025 	 * short calibration and long calibration.
1026 	 */
1027 	cal_interval = ATH_LONG_CALINTERVAL;
1028 	if (sc->sc_ah->ah_config.enable_ani)
1029 		cal_interval =
1030 		    min(cal_interval, (uint32_t)ATH_ANI_POLLINTERVAL);
1031 
1032 	if (!sc->sc_ani.sc_caldone)
1033 		cal_interval = min(cal_interval,
1034 		    (uint32_t)ATH_SHORT_CALINTERVAL);
1035 
1036 	sc->sc_scan_timer = 0;
1037 	sc->sc_scan_timer = timeout(arn_ani_calibrate, (void *)sc,
1038 	    drv_usectohz(cal_interval * 1000));
1039 }
1040 
1041 static void
1042 arn_stop_caltimer(struct arn_softc *sc)
1043 {
1044 	timeout_id_t tmp_id = 0;
1045 
1046 	while ((sc->sc_cal_timer != 0) && (tmp_id != sc->sc_cal_timer)) {
1047 		tmp_id = sc->sc_cal_timer;
1048 		(void) untimeout(tmp_id);
1049 	}
1050 	sc->sc_cal_timer = 0;
1051 }
1052 
1053 static uint_t
1054 arn_isr(caddr_t arg)
1055 {
1056 	/* LINTED E_BAD_PTR_CAST_ALIGN */
1057 	struct arn_softc *sc = (struct arn_softc *)arg;
1058 	struct ath_hal *ah = sc->sc_ah;
1059 	enum ath9k_int status;
1060 	ieee80211com_t *ic = (ieee80211com_t *)sc;
1061 
1062 	ARN_LOCK(sc);
1063 
1064 	if (sc->sc_flags & SC_OP_INVALID) {
1065 		/*
1066 		 * The hardware is not ready/present, don't
1067 		 * touch anything. Note this can happen early
1068 		 * on if the IRQ is shared.
1069 		 */
1070 		ARN_UNLOCK(sc);
1071 		return (DDI_INTR_UNCLAIMED);
1072 	}
1073 	if (!ath9k_hw_intrpend(ah)) {	/* shared irq, not for us */
1074 		ARN_UNLOCK(sc);
1075 		return (DDI_INTR_UNCLAIMED);
1076 	}
1077 
1078 	/*
1079 	 * Figure out the reason(s) for the interrupt. Note
1080 	 * that the hal returns a pseudo-ISR that may include
1081 	 * bits we haven't explicitly enabled so we mask the
1082 	 * value to insure we only process bits we requested.
1083 	 */
1084 	(void) ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */
1085 
1086 	status &= sc->sc_imask; /* discard unasked-for bits */
1087 
1088 	/*
1089 	 * If there are no status bits set, then this interrupt was not
1090 	 * for me (should have been caught above).
1091 	 */
1092 	if (!status) {
1093 		ARN_UNLOCK(sc);
1094 		return (DDI_INTR_UNCLAIMED);
1095 	}
1096 
1097 	sc->sc_intrstatus = status;
1098 
1099 	if (status & ATH9K_INT_FATAL) {
1100 		/* need a chip reset */
1101 		ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1102 		    "ATH9K_INT_FATAL\n"));
1103 		goto reset;
1104 	} else if (status & ATH9K_INT_RXORN) {
1105 		/* need a chip reset */
1106 		ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1107 		    "ATH9K_INT_RXORN\n"));
1108 		goto reset;
1109 	} else {
1110 		if (status & ATH9K_INT_RXEOL) {
1111 			/*
1112 			 * NB: the hardware should re-read the link when
1113 			 * RXE bit is written, but it doesn't work
1114 			 * at least on older hardware revs.
1115 			 */
1116 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1117 			    "ATH9K_INT_RXEOL\n"));
1118 			sc->sc_rxlink = NULL;
1119 		}
1120 		if (status & ATH9K_INT_TXURN) {
1121 			/* bump tx trigger level */
1122 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1123 			    "ATH9K_INT_TXURN\n"));
1124 			(void) ath9k_hw_updatetxtriglevel(ah, B_TRUE);
1125 		}
1126 		/* XXX: optimize this */
1127 		if (status & ATH9K_INT_RX) {
1128 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1129 			    "ATH9K_INT_RX\n"));
1130 			sc->sc_rx_pend = 1;
1131 			ddi_trigger_softintr(sc->sc_softint_id);
1132 		}
1133 		if (status & ATH9K_INT_TX) {
1134 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1135 			    "ATH9K_INT_TX\n"));
1136 			if (ddi_taskq_dispatch(sc->sc_tq,
1137 			    arn_tx_int_proc, sc, DDI_NOSLEEP) !=
1138 			    DDI_SUCCESS) {
1139 				arn_problem("arn: arn_isr(): "
1140 				    "No memory for tx taskq\n");
1141 				}
1142 			}
1143 #ifdef ARN_ATH9K_INT_MIB
1144 		if (status & ATH9K_INT_MIB) {
1145 			/*
1146 			 * Disable interrupts until we service the MIB
1147 			 * interrupt; otherwise it will continue to
1148 			 * fire.
1149 			 */
1150 			(void) ath9k_hw_set_interrupts(ah, 0);
1151 			/*
1152 			 * Let the hal handle the event. We assume
1153 			 * it will clear whatever condition caused
1154 			 * the interrupt.
1155 			 */
1156 			ath9k_hw_procmibevent(ah, &sc->sc_halstats);
1157 			(void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
1158 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1159 			    "ATH9K_INT_MIB\n"));
1160 		}
1161 #endif
1162 
1163 #ifdef ARN_ATH9K_INT_TIM_TIMER
1164 		if (status & ATH9K_INT_TIM_TIMER) {
1165 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1166 			    "ATH9K_INT_TIM_TIMER\n"));
1167 			if (!(ah->ah_caps.hw_caps &
1168 			    ATH9K_HW_CAP_AUTOSLEEP)) {
1169 				/*
1170 				 * Clear RxAbort bit so that we can
1171 				 * receive frames
1172 				 */
1173 				ath9k_hw_setrxabort(ah, 0);
1174 				goto reset;
1175 			}
1176 		}
1177 #endif
1178 
1179 		if (status & ATH9K_INT_BMISS) {
1180 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1181 			    "ATH9K_INT_BMISS\n"));
1182 #ifdef ARN_HW_BEACON_MISS_HANDLE
1183 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1184 			    "handle beacon mmiss by H/W mechanism\n"));
1185 			if (ddi_taskq_dispatch(sc->sc_tq, arn_bmiss_proc,
1186 			    sc, DDI_NOSLEEP) != DDI_SUCCESS) {
1187 				arn_problem("arn: arn_isr(): "
1188 				    "No memory available for bmiss taskq\n");
1189 			}
1190 #else
1191 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1192 			    "handle beacon mmiss by S/W mechanism\n"));
1193 #endif /* ARN_HW_BEACON_MISS_HANDLE */
1194 		}
1195 
1196 		ARN_UNLOCK(sc);
1197 
1198 #ifdef ARN_ATH9K_INT_CST
1199 		/* carrier sense timeout */
1200 		if (status & ATH9K_INT_CST) {
1201 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1202 			    "ATH9K_INT_CST\n"));
1203 			return (DDI_INTR_CLAIMED);
1204 		}
1205 #endif
1206 
1207 		if (status & ATH9K_INT_SWBA) {
1208 			ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
1209 			    "ATH9K_INT_SWBA\n"));
1210 			/* This will occur only in Host-AP or Ad-Hoc mode */
1211 			return (DDI_INTR_CLAIMED);
1212 		}
1213 	}
1214 
1215 	return (DDI_INTR_CLAIMED);
1216 reset:
1217 	ARN_DBG((ARN_DBG_INTERRUPT, "Rset for fatal err\n"));
1218 	(void) arn_reset(ic);
1219 	ARN_UNLOCK(sc);
1220 	return (DDI_INTR_CLAIMED);
1221 }
1222 
1223 static int
1224 arn_get_channel(struct arn_softc *sc, struct ieee80211_channel *chan)
1225 {
1226 	int i;
1227 
1228 	for (i = 0; i < sc->sc_ah->ah_nchan; i++) {
1229 		if (sc->sc_ah->ah_channels[i].channel == chan->ich_freq)
1230 			return (i);
1231 	}
1232 
1233 	return (-1);
1234 }
1235 
1236 int
1237 arn_reset(ieee80211com_t *ic)
1238 {
1239 	struct arn_softc *sc = (struct arn_softc *)ic;
1240 	struct ath_hal *ah = sc->sc_ah;
1241 	int status;
1242 	int error = 0;
1243 
1244 	(void) ath9k_hw_set_interrupts(ah, 0);
1245 	arn_draintxq(sc, 0);
1246 	(void) arn_stoprecv(sc);
1247 
1248 	if (!ath9k_hw_reset(ah, sc->sc_ah->ah_curchan, sc->tx_chan_width,
1249 	    sc->sc_tx_chainmask, sc->sc_rx_chainmask,
1250 	    sc->sc_ht_extprotspacing, B_FALSE, &status)) {
1251 		ARN_DBG((ARN_DBG_RESET, "arn: arn_reset(): "
1252 		    "unable to reset hardware; hal status %u\n", status));
1253 		error = EIO;
1254 	}
1255 
1256 	if (arn_startrecv(sc) != 0)
1257 		ARN_DBG((ARN_DBG_RESET, "arn: arn_reset(): "
1258 		    "unable to start recv logic\n"));
1259 
1260 	/*
1261 	 * We may be doing a reset in response to a request
1262 	 * that changes the channel so update any state that
1263 	 * might change as a result.
1264 	 */
1265 	arn_setcurmode(sc, arn_chan2mode(sc->sc_ah->ah_curchan));
1266 
1267 	arn_update_txpow(sc);
1268 
1269 	if (sc->sc_flags & SC_OP_BEACONS)
1270 		arn_beacon_config(sc);	/* restart beacons */
1271 
1272 	(void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
1273 
1274 	return (error);
1275 }
1276 
1277 int
1278 arn_get_hal_qnum(uint16_t queue, struct arn_softc *sc)
1279 {
1280 	int qnum;
1281 
1282 	switch (queue) {
1283 	case WME_AC_VO:
1284 		qnum = sc->sc_haltype2q[ATH9K_WME_AC_VO];
1285 		break;
1286 	case WME_AC_VI:
1287 		qnum = sc->sc_haltype2q[ATH9K_WME_AC_VI];
1288 		break;
1289 	case WME_AC_BE:
1290 		qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE];
1291 		break;
1292 	case WME_AC_BK:
1293 		qnum = sc->sc_haltype2q[ATH9K_WME_AC_BK];
1294 		break;
1295 	default:
1296 		qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE];
1297 		break;
1298 	}
1299 
1300 	return (qnum);
1301 }
1302 
1303 static struct {
1304 	uint32_t version;
1305 	const char *name;
1306 } ath_mac_bb_names[] = {
1307 	{ AR_SREV_VERSION_5416_PCI,	"5416" },
1308 	{ AR_SREV_VERSION_5416_PCIE,	"5418" },
1309 	{ AR_SREV_VERSION_9100,		"9100" },
1310 	{ AR_SREV_VERSION_9160,		"9160" },
1311 	{ AR_SREV_VERSION_9280,		"9280" },
1312 	{ AR_SREV_VERSION_9285,		"9285" }
1313 };
1314 
1315 static struct {
1316 	uint16_t version;
1317 	const char *name;
1318 } ath_rf_names[] = {
1319 	{ 0,				"5133" },
1320 	{ AR_RAD5133_SREV_MAJOR,	"5133" },
1321 	{ AR_RAD5122_SREV_MAJOR,	"5122" },
1322 	{ AR_RAD2133_SREV_MAJOR,	"2133" },
1323 	{ AR_RAD2122_SREV_MAJOR,	"2122" }
1324 };
1325 
1326 /*
1327  * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown.
1328  */
1329 
1330 static const char *
1331 arn_mac_bb_name(uint32_t mac_bb_version)
1332 {
1333 	int i;
1334 
1335 	for (i = 0; i < ARRAY_SIZE(ath_mac_bb_names); i++) {
1336 		if (ath_mac_bb_names[i].version == mac_bb_version) {
1337 			return (ath_mac_bb_names[i].name);
1338 		}
1339 	}
1340 
1341 	return ("????");
1342 }
1343 
1344 /*
1345  * Return the RF name. "????" is returned if the RF is unknown.
1346  */
1347 
1348 static const char *
1349 arn_rf_name(uint16_t rf_version)
1350 {
1351 	int i;
1352 
1353 	for (i = 0; i < ARRAY_SIZE(ath_rf_names); i++) {
1354 		if (ath_rf_names[i].version == rf_version) {
1355 			return (ath_rf_names[i].name);
1356 		}
1357 	}
1358 
1359 	return ("????");
1360 }
1361 
1362 static void
1363 arn_next_scan(void *arg)
1364 {
1365 	ieee80211com_t *ic = arg;
1366 	struct arn_softc *sc = (struct arn_softc *)ic;
1367 
1368 	sc->sc_scan_timer = 0;
1369 	if (ic->ic_state == IEEE80211_S_SCAN) {
1370 		sc->sc_scan_timer = timeout(arn_next_scan, (void *)sc,
1371 		    drv_usectohz(arn_dwelltime * 1000));
1372 		ieee80211_next_scan(ic);
1373 	}
1374 }
1375 
1376 static void
1377 arn_stop_scantimer(struct arn_softc *sc)
1378 {
1379 	timeout_id_t tmp_id = 0;
1380 
1381 	while ((sc->sc_scan_timer != 0) && (tmp_id != sc->sc_scan_timer)) {
1382 		tmp_id = sc->sc_scan_timer;
1383 		(void) untimeout(tmp_id);
1384 	}
1385 	sc->sc_scan_timer = 0;
1386 }
1387 
1388 static int32_t
1389 arn_newstate(ieee80211com_t *ic, enum ieee80211_state nstate, int arg)
1390 {
1391 	struct arn_softc *sc = (struct arn_softc *)ic;
1392 	struct ath_hal *ah = sc->sc_ah;
1393 	struct ieee80211_node *in;
1394 	int32_t i, error;
1395 	uint8_t *bssid;
1396 	uint32_t rfilt;
1397 	enum ieee80211_state ostate;
1398 	struct ath9k_channel *channel;
1399 	int pos;
1400 
1401 	/* Should set up & init LED here */
1402 
1403 	if (sc->sc_flags & SC_OP_INVALID)
1404 		return (0);
1405 
1406 	ostate = ic->ic_state;
1407 	ARN_DBG((ARN_DBG_INIT, "arn: arn_newstate(): "
1408 	    "%x -> %x!\n", ostate, nstate));
1409 
1410 	ARN_LOCK(sc);
1411 
1412 	if (nstate != IEEE80211_S_SCAN)
1413 		arn_stop_scantimer(sc);
1414 	if (nstate != IEEE80211_S_RUN)
1415 		arn_stop_caltimer(sc);
1416 
1417 	/* Should set LED here */
1418 
1419 	if (nstate == IEEE80211_S_INIT) {
1420 		sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
1421 		/*
1422 		 * Disable interrupts.
1423 		 */
1424 		(void) ath9k_hw_set_interrupts
1425 		    (ah, sc->sc_imask &~ ATH9K_INT_GLOBAL);
1426 
1427 #ifdef ARN_IBSS
1428 		if (ic->ic_opmode == IEEE80211_M_IBSS) {
1429 			(void) ath9k_hw_stoptxdma(ah, sc->sc_beaconq);
1430 			arn_beacon_return(sc);
1431 		}
1432 #endif
1433 		ARN_UNLOCK(sc);
1434 		ieee80211_stop_watchdog(ic);
1435 		goto done;
1436 	}
1437 	in = ic->ic_bss;
1438 
1439 	pos = arn_get_channel(sc, ic->ic_curchan);
1440 
1441 	if (pos == -1) {
1442 		ARN_DBG((ARN_DBG_FATAL, "arn: "
1443 		    "%s: Invalid channel\n", __func__));
1444 		error = EINVAL;
1445 		ARN_UNLOCK(sc);
1446 		goto bad;
1447 	}
1448 
1449 	if (in->in_htcap & IEEE80211_HTCAP_CHWIDTH40) {
1450 		arn_update_chainmask(sc);
1451 		sc->tx_chan_width = ATH9K_HT_MACMODE_2040;
1452 	} else
1453 		sc->tx_chan_width = ATH9K_HT_MACMODE_20;
1454 
1455 	sc->sc_ah->ah_channels[pos].chanmode =
1456 	    arn_chan2flags(ic, ic->ic_curchan);
1457 	channel = &sc->sc_ah->ah_channels[pos];
1458 	if (channel == NULL) {
1459 		arn_problem("arn_newstate(): channel == NULL");
1460 		ARN_UNLOCK(sc);
1461 		goto bad;
1462 	}
1463 	error = arn_set_channel(sc, channel);
1464 	if (error != 0) {
1465 		if (nstate != IEEE80211_S_SCAN) {
1466 			ARN_UNLOCK(sc);
1467 			ieee80211_reset_chan(ic);
1468 			goto bad;
1469 		}
1470 	}
1471 
1472 	/*
1473 	 * Get the receive filter according to the
1474 	 * operating mode and state
1475 	 */
1476 	rfilt = arn_calcrxfilter(sc);
1477 
1478 	if (nstate == IEEE80211_S_SCAN)
1479 		bssid = ic->ic_macaddr;
1480 	else
1481 		bssid = in->in_bssid;
1482 
1483 	ath9k_hw_setrxfilter(ah, rfilt);
1484 
1485 	if (nstate == IEEE80211_S_RUN && ic->ic_opmode != IEEE80211_M_IBSS)
1486 		ath9k_hw_write_associd(ah, bssid, in->in_associd);
1487 	else
1488 		ath9k_hw_write_associd(ah, bssid, 0);
1489 
1490 	/* Check for WLAN_CAPABILITY_PRIVACY ? */
1491 	if (ic->ic_flags & IEEE80211_F_PRIVACY) {
1492 		for (i = 0; i < IEEE80211_WEP_NKID; i++) {
1493 			if (ath9k_hw_keyisvalid(ah, (uint16_t)i))
1494 				(void) ath9k_hw_keysetmac(ah, (uint16_t)i,
1495 				    bssid);
1496 		}
1497 	}
1498 
1499 	if (nstate == IEEE80211_S_RUN) {
1500 		switch (ic->ic_opmode) {
1501 #ifdef ARN_IBSS
1502 		case IEEE80211_M_IBSS:
1503 			/*
1504 			 * Allocate and setup the beacon frame.
1505 			 * Stop any previous beacon DMA.
1506 			 */
1507 			(void) ath9k_hw_stoptxdma(ah, sc->sc_beaconq);
1508 			arn_beacon_return(sc);
1509 			error = arn_beacon_alloc(sc, in);
1510 			if (error != 0) {
1511 				ARN_UNLOCK(sc);
1512 				goto bad;
1513 			}
1514 			/*
1515 			 * If joining an adhoc network defer beacon timer
1516 			 * configuration to the next beacon frame so we
1517 			 * have a current TSF to use.  Otherwise we're
1518 			 * starting an ibss/bss so there's no need to delay.
1519 			 */
1520 			if (ic->ic_opmode == IEEE80211_M_IBSS &&
1521 			    ic->ic_bss->in_tstamp.tsf != 0) {
1522 				sc->sc_bsync = 1;
1523 			} else {
1524 				arn_beacon_config(sc);
1525 			}
1526 			break;
1527 #endif /* ARN_IBSS */
1528 		case IEEE80211_M_STA:
1529 			if (ostate != IEEE80211_S_RUN) {
1530 				/*
1531 				 * Defer beacon timer configuration to the next
1532 				 * beacon frame so we have a current TSF to use.
1533 				 * Any TSF collected when scanning is likely old
1534 				 */
1535 #ifdef ARN_IBSS
1536 				sc->sc_bsync = 1;
1537 #else
1538 				/* Configure the beacon and sleep timers. */
1539 				arn_beacon_config(sc);
1540 				/* Reset rssi stats */
1541 				sc->sc_halstats.ns_avgbrssi =
1542 				    ATH_RSSI_DUMMY_MARKER;
1543 				sc->sc_halstats.ns_avgrssi =
1544 				    ATH_RSSI_DUMMY_MARKER;
1545 				sc->sc_halstats.ns_avgtxrssi =
1546 				    ATH_RSSI_DUMMY_MARKER;
1547 				sc->sc_halstats.ns_avgtxrate =
1548 				    ATH_RATE_DUMMY_MARKER;
1549 /* end */
1550 
1551 #endif /* ARN_IBSS */
1552 			}
1553 			break;
1554 		default:
1555 			break;
1556 		}
1557 	} else {
1558 		sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
1559 		(void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
1560 	}
1561 
1562 	/*
1563 	 * Reset the rate control state.
1564 	 */
1565 	arn_rate_ctl_reset(sc, nstate);
1566 
1567 	ARN_UNLOCK(sc);
1568 done:
1569 	/*
1570 	 * Invoke the parent method to complete the work.
1571 	 */
1572 	error = sc->sc_newstate(ic, nstate, arg);
1573 
1574 	/*
1575 	 * Finally, start any timers.
1576 	 */
1577 	if (nstate == IEEE80211_S_RUN) {
1578 		ieee80211_start_watchdog(ic, 1);
1579 		ASSERT(sc->sc_cal_timer == 0);
1580 		sc->sc_cal_timer = timeout(arn_ani_calibrate, (void *)sc,
1581 		    drv_usectohz(100 * 1000));
1582 	} else if ((nstate == IEEE80211_S_SCAN) && (ostate != nstate)) {
1583 		/* start ap/neighbor scan timer */
1584 		/* ASSERT(sc->sc_scan_timer == 0); */
1585 		if (sc->sc_scan_timer != 0) {
1586 			(void) untimeout(sc->sc_scan_timer);
1587 			sc->sc_scan_timer = 0;
1588 		}
1589 		sc->sc_scan_timer = timeout(arn_next_scan, (void *)sc,
1590 		    drv_usectohz(arn_dwelltime * 1000));
1591 	}
1592 
1593 bad:
1594 	return (error);
1595 }
1596 
1597 static void
1598 arn_watchdog(void *arg)
1599 {
1600 	struct arn_softc *sc = arg;
1601 	ieee80211com_t *ic = &sc->sc_isc;
1602 	int ntimer = 0;
1603 
1604 	ARN_LOCK(sc);
1605 	ic->ic_watchdog_timer = 0;
1606 	if (sc->sc_flags & SC_OP_INVALID) {
1607 		ARN_UNLOCK(sc);
1608 		return;
1609 	}
1610 
1611 	if (ic->ic_state == IEEE80211_S_RUN) {
1612 		/*
1613 		 * Start the background rate control thread if we
1614 		 * are not configured to use a fixed xmit rate.
1615 		 */
1616 #ifdef ARN_LEGACY_RC
1617 		if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) {
1618 			sc->sc_stats.ast_rate_calls ++;
1619 			if (ic->ic_opmode == IEEE80211_M_STA)
1620 				arn_rate_ctl(ic, ic->ic_bss);
1621 			else
1622 				ieee80211_iterate_nodes(&ic->ic_sta,
1623 				    arn_rate_ctl, sc);
1624 		}
1625 #endif /* ARN_LEGACY_RC */
1626 
1627 #ifdef ARN_HW_BEACON_MISS_HANDLE
1628 	/* nothing to do here */
1629 #else
1630 	/* currently set 10 seconds as beacon miss threshold */
1631 	if (ic->ic_beaconmiss++ > 100) {
1632 		ARN_DBG((ARN_DBG_BEACON, "arn_watchdog():"
1633 		    "Beacon missed for 10 seconds, run"
1634 		    "ieee80211_new_state(ic, IEEE80211_S_INIT, -1)\n"));
1635 		ARN_UNLOCK(sc);
1636 		(void) ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
1637 		return;
1638 	}
1639 #endif /* ARN_HW_BEACON_MISS_HANDLE */
1640 
1641 		ntimer = 1;
1642 	}
1643 	ARN_UNLOCK(sc);
1644 
1645 	ieee80211_watchdog(ic);
1646 	if (ntimer != 0)
1647 		ieee80211_start_watchdog(ic, ntimer);
1648 }
1649 
1650 /* ARGSUSED */
1651 static struct ieee80211_node *
1652 arn_node_alloc(ieee80211com_t *ic)
1653 {
1654 	struct ath_node *an;
1655 #ifdef ARN_TX_AGGREGATION
1656 	struct arn_softc *sc = (struct arn_softc *)ic;
1657 #endif
1658 
1659 	an = kmem_zalloc(sizeof (struct ath_node), KM_SLEEP);
1660 
1661 	/* legacy rate control */
1662 #ifdef ARN_LEGACY_RC
1663 	arn_rate_update(sc, &an->an_node, 0);
1664 #endif
1665 
1666 #ifdef ARN_TX_AGGREGATION
1667 	if (sc->sc_flags & SC_OP_TXAGGR) {
1668 		arn_tx_node_init(sc, an);
1669 	}
1670 #endif /* ARN_TX_AGGREGATION */
1671 
1672 	an->last_rssi = ATH_RSSI_DUMMY_MARKER;
1673 
1674 	return ((an != NULL) ? &an->an_node : NULL);
1675 }
1676 
1677 static void
1678 arn_node_free(struct ieee80211_node *in)
1679 {
1680 	ieee80211com_t *ic = in->in_ic;
1681 	struct arn_softc *sc = (struct arn_softc *)ic;
1682 	struct ath_buf *bf;
1683 	struct ath_txq *txq;
1684 	int32_t i;
1685 
1686 #ifdef ARN_TX_AGGREGATION
1687 	if (sc->sc_flags & SC_OP_TXAGGR)
1688 		arn_tx_node_cleanup(sc, in);
1689 #endif /* TX_AGGREGATION */
1690 
1691 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
1692 		if (ARN_TXQ_SETUP(sc, i)) {
1693 			txq = &sc->sc_txq[i];
1694 			mutex_enter(&txq->axq_lock);
1695 			bf = list_head(&txq->axq_list);
1696 			while (bf != NULL) {
1697 				if (bf->bf_in == in) {
1698 					bf->bf_in = NULL;
1699 				}
1700 				bf = list_next(&txq->axq_list, bf);
1701 			}
1702 			mutex_exit(&txq->axq_lock);
1703 		}
1704 	}
1705 
1706 	ic->ic_node_cleanup(in);
1707 
1708 	if (in->in_wpa_ie != NULL)
1709 		ieee80211_free(in->in_wpa_ie);
1710 
1711 	if (in->in_wme_ie != NULL)
1712 		ieee80211_free(in->in_wme_ie);
1713 
1714 	if (in->in_htcap_ie != NULL)
1715 		ieee80211_free(in->in_htcap_ie);
1716 
1717 	kmem_free(in, sizeof (struct ath_node));
1718 }
1719 
1720 /*
1721  * Allocate tx/rx key slots for TKIP.  We allocate one slot for
1722  * each key. MIC is right after the decrypt/encrypt key.
1723  */
1724 static uint16_t
1725 arn_key_alloc_pair(struct arn_softc *sc, ieee80211_keyix *txkeyix,
1726     ieee80211_keyix *rxkeyix)
1727 {
1728 	uint16_t i, keyix;
1729 
1730 	ASSERT(!sc->sc_splitmic);
1731 	for (i = 0; i < ARRAY_SIZE(sc->sc_keymap)/4; i++) {
1732 		uint8_t b = sc->sc_keymap[i];
1733 		if (b == 0xff)
1734 			continue;
1735 		for (keyix = i * NBBY; keyix < (i + 1) * NBBY;
1736 		    keyix++, b >>= 1) {
1737 			if ((b & 1) || is_set(keyix+64, sc->sc_keymap)) {
1738 				/* full pair unavailable */
1739 				continue;
1740 			}
1741 			set_bit(keyix, sc->sc_keymap);
1742 			set_bit(keyix+64, sc->sc_keymap);
1743 			ARN_DBG((ARN_DBG_KEYCACHE,
1744 			    "arn_key_alloc_pair(): key pair %u,%u\n",
1745 			    keyix, keyix+64));
1746 			*txkeyix = *rxkeyix = keyix;
1747 			return (1);
1748 		}
1749 	}
1750 	ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_pair():"
1751 	    " out of pair space\n"));
1752 
1753 	return (0);
1754 }
1755 
1756 /*
1757  * Allocate tx/rx key slots for TKIP.  We allocate two slots for
1758  * each key, one for decrypt/encrypt and the other for the MIC.
1759  */
1760 static int
1761 arn_key_alloc_2pair(struct arn_softc *sc, ieee80211_keyix *txkeyix,
1762     ieee80211_keyix *rxkeyix)
1763 {
1764 	uint16_t i, keyix;
1765 
1766 	ASSERT(sc->sc_splitmic);
1767 	for (i = 0; i < ARRAY_SIZE(sc->sc_keymap)/4; i++) {
1768 		uint8_t b = sc->sc_keymap[i];
1769 		if (b != 0xff) {
1770 			/*
1771 			 * One or more slots in this byte are free.
1772 			 */
1773 			keyix = i*NBBY;
1774 			while (b & 1) {
1775 		again:
1776 				keyix++;
1777 				b >>= 1;
1778 			}
1779 			/* XXX IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV */
1780 			if (is_set(keyix+32, sc->sc_keymap) ||
1781 			    is_set(keyix+64, sc->sc_keymap) ||
1782 			    is_set(keyix+32+64, sc->sc_keymap)) {
1783 				/* full pair unavailable */
1784 				if (keyix == (i+1)*NBBY) {
1785 					/* no slots were appropriate, advance */
1786 					continue;
1787 				}
1788 				goto again;
1789 			}
1790 			set_bit(keyix, sc->sc_keymap);
1791 			set_bit(keyix+64, sc->sc_keymap);
1792 			set_bit(keyix+32, sc->sc_keymap);
1793 			set_bit(keyix+32+64, sc->sc_keymap);
1794 			ARN_DBG((ARN_DBG_KEYCACHE,
1795 			    "arn_key_alloc_2pair(): key pair %u,%u %u,%u\n",
1796 			    keyix, keyix+64,
1797 			    keyix+32, keyix+32+64));
1798 			*txkeyix = *rxkeyix = keyix;
1799 			return (1);
1800 		}
1801 	}
1802 	ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_2pair(): "
1803 	    " out of pair space\n"));
1804 
1805 	return (0);
1806 }
1807 /*
1808  * Allocate a single key cache slot.
1809  */
1810 static int
1811 arn_key_alloc_single(struct arn_softc *sc, ieee80211_keyix *txkeyix,
1812     ieee80211_keyix *rxkeyix)
1813 {
1814 	uint16_t i, keyix;
1815 
1816 	/* try i,i+32,i+64,i+32+64 to minimize key pair conflicts */
1817 	for (i = 0; i < ARRAY_SIZE(sc->sc_keymap); i++) {
1818 		uint8_t b = sc->sc_keymap[i];
1819 
1820 		if (b != 0xff) {
1821 			/*
1822 			 * One or more slots are free.
1823 			 */
1824 			keyix = i*NBBY;
1825 			while (b & 1)
1826 				keyix++, b >>= 1;
1827 			set_bit(keyix, sc->sc_keymap);
1828 			ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_single(): "
1829 			    "key %u\n", keyix));
1830 			*txkeyix = *rxkeyix = keyix;
1831 			return (1);
1832 		}
1833 	}
1834 	return (0);
1835 }
1836 
1837 /*
1838  * Allocate one or more key cache slots for a unicast key.  The
1839  * key itself is needed only to identify the cipher.  For hardware
1840  * TKIP with split cipher+MIC keys we allocate two key cache slot
1841  * pairs so that we can setup separate TX and RX MIC keys.  Note
1842  * that the MIC key for a TKIP key at slot i is assumed by the
1843  * hardware to be at slot i+64.  This limits TKIP keys to the first
1844  * 64 entries.
1845  */
1846 /* ARGSUSED */
1847 int
1848 arn_key_alloc(ieee80211com_t *ic, const struct ieee80211_key *k,
1849     ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix)
1850 {
1851 	struct arn_softc *sc = (struct arn_softc *)ic;
1852 
1853 	/*
1854 	 * We allocate two pair for TKIP when using the h/w to do
1855 	 * the MIC.  For everything else, including software crypto,
1856 	 * we allocate a single entry.  Note that s/w crypto requires
1857 	 * a pass-through slot on the 5211 and 5212.  The 5210 does
1858 	 * not support pass-through cache entries and we map all
1859 	 * those requests to slot 0.
1860 	 */
1861 	if (k->wk_flags & IEEE80211_KEY_SWCRYPT) {
1862 		return (arn_key_alloc_single(sc, keyix, rxkeyix));
1863 	} else if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP &&
1864 	    (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) {
1865 		if (sc->sc_splitmic)
1866 			return (arn_key_alloc_2pair(sc, keyix, rxkeyix));
1867 		else
1868 			return (arn_key_alloc_pair(sc, keyix, rxkeyix));
1869 	} else {
1870 		return (arn_key_alloc_single(sc, keyix, rxkeyix));
1871 	}
1872 }
1873 
1874 /*
1875  * Delete an entry in the key cache allocated by ath_key_alloc.
1876  */
1877 int
1878 arn_key_delete(ieee80211com_t *ic, const struct ieee80211_key *k)
1879 {
1880 	struct arn_softc *sc = (struct arn_softc *)ic;
1881 	struct ath_hal *ah = sc->sc_ah;
1882 	const struct ieee80211_cipher *cip = k->wk_cipher;
1883 	ieee80211_keyix keyix = k->wk_keyix;
1884 
1885 	ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_delete():"
1886 	    " delete key %u ic_cipher=0x%x\n", keyix, cip->ic_cipher));
1887 
1888 	(void) ath9k_hw_keyreset(ah, keyix);
1889 	/*
1890 	 * Handle split tx/rx keying required for TKIP with h/w MIC.
1891 	 */
1892 	if (cip->ic_cipher == IEEE80211_CIPHER_TKIP &&
1893 	    (k->wk_flags & IEEE80211_KEY_SWMIC) == 0 && sc->sc_splitmic)
1894 		(void) ath9k_hw_keyreset(ah, keyix+32);		/* RX key */
1895 
1896 	if (keyix >= IEEE80211_WEP_NKID) {
1897 		/*
1898 		 * Don't touch keymap entries for global keys so
1899 		 * they are never considered for dynamic allocation.
1900 		 */
1901 		clr_bit(keyix, sc->sc_keymap);
1902 		if (cip->ic_cipher == IEEE80211_CIPHER_TKIP &&
1903 		    (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) {
1904 			/*
1905 			 * If splitmic is true +64 is TX key MIC,
1906 			 * else +64 is RX key + RX key MIC.
1907 			 */
1908 			clr_bit(keyix+64, sc->sc_keymap);
1909 			if (sc->sc_splitmic) {
1910 				/* Rx key */
1911 				clr_bit(keyix+32, sc->sc_keymap);
1912 				/* RX key MIC */
1913 				clr_bit(keyix+32+64, sc->sc_keymap);
1914 			}
1915 		}
1916 	}
1917 	return (1);
1918 }
1919 
1920 /*
1921  * Set a TKIP key into the hardware.  This handles the
1922  * potential distribution of key state to multiple key
1923  * cache slots for TKIP.
1924  */
1925 static int
1926 arn_keyset_tkip(struct arn_softc *sc, const struct ieee80211_key *k,
1927     struct ath9k_keyval *hk, const uint8_t mac[IEEE80211_ADDR_LEN])
1928 {
1929 	uint8_t *key_rxmic = NULL;
1930 	uint8_t *key_txmic = NULL;
1931 	uint8_t  *key = (uint8_t *)&(k->wk_key[0]);
1932 	struct ath_hal *ah = sc->sc_ah;
1933 
1934 	key_txmic = key + 16;
1935 	key_rxmic = key + 24;
1936 
1937 	if (mac == NULL) {
1938 		/* Group key installation */
1939 		(void) memcpy(hk->kv_mic,  key_rxmic, sizeof (hk->kv_mic));
1940 		return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk,
1941 		    mac, B_FALSE));
1942 	}
1943 	if (!sc->sc_splitmic) {
1944 		/*
1945 		 * data key goes at first index,
1946 		 * the hal handles the MIC keys at index+64.
1947 		 */
1948 		(void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic));
1949 		(void) memcpy(hk->kv_txmic, key_txmic, sizeof (hk->kv_txmic));
1950 		return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk,
1951 		    mac, B_FALSE));
1952 	}
1953 	/*
1954 	 * TX key goes at first index, RX key at +32.
1955 	 * The hal handles the MIC keys at index+64.
1956 	 */
1957 	(void) memcpy(hk->kv_mic, key_txmic, sizeof (hk->kv_mic));
1958 	if (!(ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, NULL,
1959 	    B_FALSE))) {
1960 		/* Txmic entry failed. No need to proceed further */
1961 		ARN_DBG((ARN_DBG_KEYCACHE,
1962 		    "%s Setting TX MIC Key Failed\n", __func__));
1963 		return (0);
1964 	}
1965 
1966 	(void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic));
1967 
1968 	/* XXX delete tx key on failure? */
1969 	return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, mac, B_FALSE));
1970 
1971 }
1972 
1973 int
1974 arn_key_set(ieee80211com_t *ic, const struct ieee80211_key *k,
1975     const uint8_t mac[IEEE80211_ADDR_LEN])
1976 {
1977 	struct arn_softc *sc = (struct arn_softc *)ic;
1978 	const struct ieee80211_cipher *cip = k->wk_cipher;
1979 	struct ath9k_keyval hk;
1980 
1981 	/* cipher table */
1982 	static const uint8_t ciphermap[] = {
1983 		ATH9K_CIPHER_WEP,		/* IEEE80211_CIPHER_WEP */
1984 		ATH9K_CIPHER_TKIP,		/* IEEE80211_CIPHER_TKIP */
1985 		ATH9K_CIPHER_AES_OCB,	/* IEEE80211_CIPHER_AES_OCB */
1986 		ATH9K_CIPHER_AES_CCM,	/* IEEE80211_CIPHER_AES_CCM */
1987 		ATH9K_CIPHER_CKIP,		/* IEEE80211_CIPHER_CKIP */
1988 		ATH9K_CIPHER_CLR,		/* IEEE80211_CIPHER_NONE */
1989 	};
1990 
1991 	bzero(&hk, sizeof (hk));
1992 
1993 	/*
1994 	 * Software crypto uses a "clear key" so non-crypto
1995 	 * state kept in the key cache are maintainedd so that
1996 	 * rx frames have an entry to match.
1997 	 */
1998 	if ((k->wk_flags & IEEE80211_KEY_SWCRYPT) == 0) {
1999 		ASSERT(cip->ic_cipher < 6);
2000 		hk.kv_type = ciphermap[cip->ic_cipher];
2001 		hk.kv_len = k->wk_keylen;
2002 		bcopy(k->wk_key, hk.kv_val, k->wk_keylen);
2003 	} else {
2004 		hk.kv_type = ATH9K_CIPHER_CLR;
2005 	}
2006 
2007 	if (hk.kv_type == ATH9K_CIPHER_TKIP &&
2008 	    (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) {
2009 		return (arn_keyset_tkip(sc, k, &hk, mac));
2010 	} else {
2011 		return (ath9k_hw_set_keycache_entry(sc->sc_ah,
2012 		    k->wk_keyix, &hk, mac, B_FALSE));
2013 	}
2014 }
2015 
2016 /*
2017  * Enable/Disable short slot timing
2018  */
2019 void
2020 arn_set_shortslot(ieee80211com_t *ic, int onoff)
2021 {
2022 	struct ath_hal *ah = ((struct arn_softc *)ic)->sc_ah;
2023 
2024 	if (onoff)
2025 		(void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_9);
2026 	else
2027 		(void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_20);
2028 }
2029 
2030 static int
2031 arn_open(struct arn_softc *sc)
2032 {
2033 	ieee80211com_t *ic = (ieee80211com_t *)sc;
2034 	struct ieee80211_channel *curchan = ic->ic_curchan;
2035 	struct ath9k_channel *init_channel;
2036 	int error = 0, pos, status;
2037 
2038 	ARN_LOCK_ASSERT(sc);
2039 
2040 	pos = arn_get_channel(sc, curchan);
2041 	if (pos == -1) {
2042 		ARN_DBG((ARN_DBG_FATAL, "arn: "
2043 		    "%s: Invalid channel\n", __func__));
2044 		error = EINVAL;
2045 		goto error;
2046 	}
2047 
2048 	sc->tx_chan_width = ATH9K_HT_MACMODE_20;
2049 
2050 	if (sc->sc_curmode == ATH9K_MODE_11A) {
2051 		sc->sc_ah->ah_channels[pos].chanmode = CHANNEL_A;
2052 	} else {
2053 		sc->sc_ah->ah_channels[pos].chanmode = CHANNEL_G;
2054 	}
2055 
2056 	init_channel = &sc->sc_ah->ah_channels[pos];
2057 
2058 	/* Reset SERDES registers */
2059 	ath9k_hw_configpcipowersave(sc->sc_ah, 0);
2060 
2061 	/*
2062 	 * The basic interface to setting the hardware in a good
2063 	 * state is ``reset''.	On return the hardware is known to
2064 	 * be powered up and with interrupts disabled.	This must
2065 	 * be followed by initialization of the appropriate bits
2066 	 * and then setup of the interrupt mask.
2067 	 */
2068 	if (!ath9k_hw_reset(sc->sc_ah, init_channel,
2069 	    sc->tx_chan_width, sc->sc_tx_chainmask,
2070 	    sc->sc_rx_chainmask, sc->sc_ht_extprotspacing,
2071 	    B_FALSE, &status)) {
2072 		ARN_DBG((ARN_DBG_FATAL, "arn: "
2073 		    "%s: unable to reset hardware; hal status %u "
2074 		    "(freq %u flags 0x%x)\n", __func__, status,
2075 		    init_channel->channel, init_channel->channelFlags));
2076 
2077 		error = EIO;
2078 		goto error;
2079 	}
2080 
2081 	/*
2082 	 * This is needed only to setup initial state
2083 	 * but it's best done after a reset.
2084 	 */
2085 	arn_update_txpow(sc);
2086 
2087 	/*
2088 	 * Setup the hardware after reset:
2089 	 * The receive engine is set going.
2090 	 * Frame transmit is handled entirely
2091 	 * in the frame output path; there's nothing to do
2092 	 * here except setup the interrupt mask.
2093 	 */
2094 	if (arn_startrecv(sc) != 0) {
2095 		ARN_DBG((ARN_DBG_INIT, "arn: "
2096 		    "%s: unable to start recv logic\n", __func__));
2097 		error = EIO;
2098 		goto error;
2099 	}
2100 
2101 	/* Setup our intr mask. */
2102 	sc->sc_imask = ATH9K_INT_RX | ATH9K_INT_TX |
2103 	    ATH9K_INT_RXEOL | ATH9K_INT_RXORN |
2104 	    ATH9K_INT_FATAL | ATH9K_INT_GLOBAL;
2105 #ifdef ARN_ATH9K_HW_CAP_GTT
2106 	if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_GTT)
2107 		sc->sc_imask |= ATH9K_INT_GTT;
2108 #endif
2109 
2110 #ifdef ARN_ATH9K_HW_CAP_GTT
2111 	if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT)
2112 		sc->sc_imask |= ATH9K_INT_CST;
2113 #endif
2114 
2115 	/*
2116 	 * Enable MIB interrupts when there are hardware phy counters.
2117 	 * Note we only do this (at the moment) for station mode.
2118 	 */
2119 #ifdef ARN_ATH9K_INT_MIB
2120 	if (ath9k_hw_phycounters(sc->sc_ah) &&
2121 	    ((sc->sc_ah->ah_opmode == ATH9K_M_STA) ||
2122 	    (sc->sc_ah->ah_opmode == ATH9K_M_IBSS)))
2123 		sc->sc_imask |= ATH9K_INT_MIB;
2124 #endif
2125 	/*
2126 	 * Some hardware processes the TIM IE and fires an
2127 	 * interrupt when the TIM bit is set.  For hardware
2128 	 * that does, if not overridden by configuration,
2129 	 * enable the TIM interrupt when operating as station.
2130 	 */
2131 #ifdef ARN_ATH9K_INT_TIM
2132 	if ((sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_ENHANCEDPM) &&
2133 	    (sc->sc_ah->ah_opmode == ATH9K_M_STA) &&
2134 	    !sc->sc_config.swBeaconProcess)
2135 		sc->sc_imask |= ATH9K_INT_TIM;
2136 #endif
2137 	if (arn_chan2mode(init_channel) != sc->sc_curmode)
2138 		arn_setcurmode(sc, arn_chan2mode(init_channel));
2139 	ARN_DBG((ARN_DBG_INIT, "arn: "
2140 	    "%s: current mode after arn_setcurmode is %d\n",
2141 	    __func__, sc->sc_curmode));
2142 
2143 	sc->sc_isrunning = 1;
2144 
2145 	/* Disable BMISS interrupt when we're not associated */
2146 	sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
2147 	(void) ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_imask);
2148 
2149 	return (0);
2150 
2151 error:
2152 	return (error);
2153 }
2154 
2155 static void
2156 arn_close(struct arn_softc *sc)
2157 {
2158 	ieee80211com_t *ic = (ieee80211com_t *)sc;
2159 	struct ath_hal *ah = sc->sc_ah;
2160 
2161 	ARN_LOCK_ASSERT(sc);
2162 
2163 	if (!sc->sc_isrunning)
2164 		return;
2165 
2166 	/*
2167 	 * Shutdown the hardware and driver
2168 	 * Note that some of this work is not possible if the
2169 	 * hardware is gone (invalid).
2170 	 */
2171 	ARN_UNLOCK(sc);
2172 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2173 	ieee80211_stop_watchdog(ic);
2174 	ARN_LOCK(sc);
2175 
2176 	/*
2177 	 * make sure h/w will not generate any interrupt
2178 	 * before setting the invalid flag.
2179 	 */
2180 	(void) ath9k_hw_set_interrupts(ah, 0);
2181 
2182 	if (!(sc->sc_flags & SC_OP_INVALID)) {
2183 		arn_draintxq(sc, 0);
2184 		(void) arn_stoprecv(sc);
2185 		(void) ath9k_hw_phy_disable(ah);
2186 	} else {
2187 		sc->sc_rxlink = NULL;
2188 	}
2189 
2190 	sc->sc_isrunning = 0;
2191 }
2192 
2193 /*
2194  * MAC callback functions
2195  */
2196 static int
2197 arn_m_stat(void *arg, uint_t stat, uint64_t *val)
2198 {
2199 	struct arn_softc *sc = arg;
2200 	ieee80211com_t *ic = (ieee80211com_t *)sc;
2201 	struct ieee80211_node *in;
2202 	struct ieee80211_rateset *rs;
2203 
2204 	ARN_LOCK(sc);
2205 	switch (stat) {
2206 	case MAC_STAT_IFSPEED:
2207 		in = ic->ic_bss;
2208 		rs = &in->in_rates;
2209 		*val = (rs->ir_rates[in->in_txrate] & IEEE80211_RATE_VAL) / 2 *
2210 		    1000000ull;
2211 		break;
2212 	case MAC_STAT_NOXMTBUF:
2213 		*val = sc->sc_stats.ast_tx_nobuf +
2214 		    sc->sc_stats.ast_tx_nobufmgt;
2215 		break;
2216 	case MAC_STAT_IERRORS:
2217 		*val = sc->sc_stats.ast_rx_tooshort;
2218 		break;
2219 	case MAC_STAT_RBYTES:
2220 		*val = ic->ic_stats.is_rx_bytes;
2221 		break;
2222 	case MAC_STAT_IPACKETS:
2223 		*val = ic->ic_stats.is_rx_frags;
2224 		break;
2225 	case MAC_STAT_OBYTES:
2226 		*val = ic->ic_stats.is_tx_bytes;
2227 		break;
2228 	case MAC_STAT_OPACKETS:
2229 		*val = ic->ic_stats.is_tx_frags;
2230 		break;
2231 	case MAC_STAT_OERRORS:
2232 	case WIFI_STAT_TX_FAILED:
2233 		*val = sc->sc_stats.ast_tx_fifoerr +
2234 		    sc->sc_stats.ast_tx_xretries +
2235 		    sc->sc_stats.ast_tx_discard;
2236 		break;
2237 	case WIFI_STAT_TX_RETRANS:
2238 		*val = sc->sc_stats.ast_tx_xretries;
2239 		break;
2240 	case WIFI_STAT_FCS_ERRORS:
2241 		*val = sc->sc_stats.ast_rx_crcerr;
2242 		break;
2243 	case WIFI_STAT_WEP_ERRORS:
2244 		*val = sc->sc_stats.ast_rx_badcrypt;
2245 		break;
2246 	case WIFI_STAT_TX_FRAGS:
2247 	case WIFI_STAT_MCAST_TX:
2248 	case WIFI_STAT_RTS_SUCCESS:
2249 	case WIFI_STAT_RTS_FAILURE:
2250 	case WIFI_STAT_ACK_FAILURE:
2251 	case WIFI_STAT_RX_FRAGS:
2252 	case WIFI_STAT_MCAST_RX:
2253 	case WIFI_STAT_RX_DUPS:
2254 		ARN_UNLOCK(sc);
2255 		return (ieee80211_stat(ic, stat, val));
2256 	default:
2257 		ARN_UNLOCK(sc);
2258 		return (ENOTSUP);
2259 	}
2260 	ARN_UNLOCK(sc);
2261 
2262 	return (0);
2263 }
2264 
2265 int
2266 arn_m_start(void *arg)
2267 {
2268 	struct arn_softc *sc = arg;
2269 	int err = 0;
2270 
2271 	ARN_LOCK(sc);
2272 
2273 	/*
2274 	 * Stop anything previously setup.  This is safe
2275 	 * whether this is the first time through or not.
2276 	 */
2277 
2278 	arn_close(sc);
2279 
2280 	if ((err = arn_open(sc)) != 0) {
2281 		ARN_UNLOCK(sc);
2282 		return (err);
2283 	}
2284 
2285 	/* H/W is reday now */
2286 	sc->sc_flags &= ~SC_OP_INVALID;
2287 
2288 	ARN_UNLOCK(sc);
2289 
2290 	return (0);
2291 }
2292 
2293 static void
2294 arn_m_stop(void *arg)
2295 {
2296 	struct arn_softc *sc = arg;
2297 
2298 	ARN_LOCK(sc);
2299 	arn_close(sc);
2300 
2301 	/* disable HAL and put h/w to sleep */
2302 	(void) ath9k_hw_disable(sc->sc_ah);
2303 	ath9k_hw_configpcipowersave(sc->sc_ah, 1);
2304 
2305 	/* XXX: hardware will not be ready in suspend state */
2306 	sc->sc_flags |= SC_OP_INVALID;
2307 	ARN_UNLOCK(sc);
2308 }
2309 
2310 static int
2311 arn_m_promisc(void *arg, boolean_t on)
2312 {
2313 	struct arn_softc *sc = arg;
2314 	struct ath_hal *ah = sc->sc_ah;
2315 	uint32_t rfilt;
2316 
2317 	ARN_LOCK(sc);
2318 
2319 	rfilt = ath9k_hw_getrxfilter(ah);
2320 	if (on)
2321 		rfilt |= ATH9K_RX_FILTER_PROM;
2322 	else
2323 		rfilt &= ~ATH9K_RX_FILTER_PROM;
2324 	sc->sc_promisc = on;
2325 	ath9k_hw_setrxfilter(ah, rfilt);
2326 
2327 	ARN_UNLOCK(sc);
2328 
2329 	return (0);
2330 }
2331 
2332 static int
2333 arn_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
2334 {
2335 	struct arn_softc *sc = arg;
2336 	struct ath_hal *ah = sc->sc_ah;
2337 	uint32_t val, index, bit;
2338 	uint8_t pos;
2339 	uint32_t *mfilt = sc->sc_mcast_hash;
2340 
2341 	ARN_LOCK(sc);
2342 
2343 	/* calculate XOR of eight 6bit values */
2344 	val = ARN_LE_READ_32(mca + 0);
2345 	pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
2346 	val = ARN_LE_READ_32(mca + 3);
2347 	pos ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
2348 	pos &= 0x3f;
2349 	index = pos / 32;
2350 	bit = 1 << (pos % 32);
2351 
2352 	if (add) {	/* enable multicast */
2353 		sc->sc_mcast_refs[pos]++;
2354 		mfilt[index] |= bit;
2355 	} else {	/* disable multicast */
2356 		if (--sc->sc_mcast_refs[pos] == 0)
2357 			mfilt[index] &= ~bit;
2358 	}
2359 	ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]);
2360 
2361 	ARN_UNLOCK(sc);
2362 	return (0);
2363 }
2364 
2365 static int
2366 arn_m_unicst(void *arg, const uint8_t *macaddr)
2367 {
2368 	struct arn_softc *sc = arg;
2369 	struct ath_hal *ah = sc->sc_ah;
2370 	ieee80211com_t *ic = (ieee80211com_t *)sc;
2371 
2372 	ARN_DBG((ARN_DBG_XMIT, "ath: ath_gld_saddr(): "
2373 	    "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
2374 	    macaddr[0], macaddr[1], macaddr[2],
2375 	    macaddr[3], macaddr[4], macaddr[5]));
2376 
2377 	ARN_LOCK(sc);
2378 	IEEE80211_ADDR_COPY(sc->sc_isc.ic_macaddr, macaddr);
2379 	(void) ath9k_hw_setmac(ah, sc->sc_isc.ic_macaddr);
2380 	(void) arn_reset(ic);
2381 	ARN_UNLOCK(sc);
2382 	return (0);
2383 }
2384 
2385 static mblk_t *
2386 arn_m_tx(void *arg, mblk_t *mp)
2387 {
2388 	struct arn_softc *sc = arg;
2389 	int error = 0;
2390 	mblk_t *next;
2391 	ieee80211com_t *ic = (ieee80211com_t *)sc;
2392 
2393 	/*
2394 	 * No data frames go out unless we're associated; this
2395 	 * should not happen as the 802.11 layer does not enable
2396 	 * the xmit queue until we enter the RUN state.
2397 	 */
2398 	if (ic->ic_state != IEEE80211_S_RUN) {
2399 		ARN_DBG((ARN_DBG_XMIT, "arn: arn_m_tx(): "
2400 		    "discard, state %u\n", ic->ic_state));
2401 		sc->sc_stats.ast_tx_discard++;
2402 		freemsgchain(mp);
2403 		return (NULL);
2404 	}
2405 
2406 	while (mp != NULL) {
2407 		next = mp->b_next;
2408 		mp->b_next = NULL;
2409 		error = arn_tx(ic, mp, IEEE80211_FC0_TYPE_DATA);
2410 		if (error != 0) {
2411 			mp->b_next = next;
2412 			if (error == ENOMEM) {
2413 				break;
2414 			} else {
2415 				freemsgchain(mp);
2416 				return (NULL);
2417 			}
2418 		}
2419 		mp = next;
2420 	}
2421 
2422 	return (mp);
2423 }
2424 
2425 static void
2426 arn_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
2427 {
2428 	struct arn_softc *sc = arg;
2429 	int32_t err;
2430 
2431 	err = ieee80211_ioctl(&sc->sc_isc, wq, mp);
2432 
2433 	ARN_LOCK(sc);
2434 	if (err == ENETRESET) {
2435 		if (!(sc->sc_flags & SC_OP_INVALID)) {
2436 			ARN_UNLOCK(sc);
2437 
2438 			(void) arn_m_start(sc);
2439 
2440 			(void) ieee80211_new_state(&sc->sc_isc,
2441 			    IEEE80211_S_SCAN, -1);
2442 			ARN_LOCK(sc);
2443 		}
2444 	}
2445 	ARN_UNLOCK(sc);
2446 }
2447 
2448 static int
2449 arn_m_setprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
2450     uint_t wldp_length, const void *wldp_buf)
2451 {
2452 	struct arn_softc *sc = arg;
2453 	int	err;
2454 
2455 	err = ieee80211_setprop(&sc->sc_isc, pr_name, wldp_pr_num,
2456 	    wldp_length, wldp_buf);
2457 
2458 	ARN_LOCK(sc);
2459 
2460 	if (err == ENETRESET) {
2461 		if (!(sc->sc_flags & SC_OP_INVALID)) {
2462 			ARN_UNLOCK(sc);
2463 			(void) arn_m_start(sc);
2464 			(void) ieee80211_new_state(&sc->sc_isc,
2465 			    IEEE80211_S_SCAN, -1);
2466 			ARN_LOCK(sc);
2467 		}
2468 		err = 0;
2469 	}
2470 
2471 	ARN_UNLOCK(sc);
2472 
2473 	return (err);
2474 }
2475 
2476 /* ARGSUSED */
2477 static int
2478 arn_m_getprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
2479     uint_t wldp_length, void *wldp_buf)
2480 {
2481 	struct arn_softc *sc = arg;
2482 	int	err = 0;
2483 
2484 	err = ieee80211_getprop(&sc->sc_isc, pr_name, wldp_pr_num,
2485 	    wldp_length, wldp_buf);
2486 
2487 	return (err);
2488 }
2489 
2490 static void
2491 arn_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
2492     mac_prop_info_handle_t prh)
2493 {
2494 	struct arn_softc *sc = arg;
2495 
2496 	ieee80211_propinfo(&sc->sc_isc, pr_name, wldp_pr_num, prh);
2497 }
2498 
2499 /* return bus cachesize in 4B word units */
2500 static void
2501 arn_pci_config_cachesize(struct arn_softc *sc)
2502 {
2503 	uint8_t csz;
2504 
2505 	/*
2506 	 * Cache line size is used to size and align various
2507 	 * structures used to communicate with the hardware.
2508 	 */
2509 	csz = pci_config_get8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ);
2510 	if (csz == 0) {
2511 		/*
2512 		 * We must have this setup properly for rx buffer
2513 		 * DMA to work so force a reasonable value here if it
2514 		 * comes up zero.
2515 		 */
2516 		csz = ATH_DEF_CACHE_BYTES / sizeof (uint32_t);
2517 		pci_config_put8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ,
2518 		    csz);
2519 	}
2520 	sc->sc_cachelsz = csz << 2;
2521 }
2522 
2523 static int
2524 arn_pci_setup(struct arn_softc *sc)
2525 {
2526 	uint16_t command;
2527 
2528 	/*
2529 	 * Enable memory mapping and bus mastering
2530 	 */
2531 	ASSERT(sc != NULL);
2532 	command = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_COMM);
2533 	command	|= PCI_COMM_MAE | PCI_COMM_ME;
2534 	pci_config_put16(sc->sc_cfg_handle, PCI_CONF_COMM, command);
2535 	command = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_COMM);
2536 	if ((command & PCI_COMM_MAE) == 0) {
2537 		arn_problem("arn: arn_pci_setup(): "
2538 		    "failed to enable memory mapping\n");
2539 		return (EIO);
2540 	}
2541 	if ((command & PCI_COMM_ME) == 0) {
2542 		arn_problem("arn: arn_pci_setup(): "
2543 		    "failed to enable bus mastering\n");
2544 		return (EIO);
2545 	}
2546 	ARN_DBG((ARN_DBG_INIT, "arn: arn_pci_setup(): "
2547 	    "set command reg to 0x%x \n", command));
2548 
2549 	return (0);
2550 }
2551 
2552 static void
2553 arn_get_hw_encap(struct arn_softc *sc)
2554 {
2555 	ieee80211com_t *ic;
2556 	struct ath_hal *ah;
2557 
2558 	ic = (ieee80211com_t *)sc;
2559 	ah = sc->sc_ah;
2560 
2561 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
2562 	    ATH9K_CIPHER_AES_CCM, NULL))
2563 		ic->ic_caps |= IEEE80211_C_AES_CCM;
2564 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
2565 	    ATH9K_CIPHER_AES_OCB, NULL))
2566 		ic->ic_caps |= IEEE80211_C_AES;
2567 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
2568 	    ATH9K_CIPHER_TKIP, NULL))
2569 		ic->ic_caps |= IEEE80211_C_TKIP;
2570 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
2571 	    ATH9K_CIPHER_WEP, NULL))
2572 		ic->ic_caps |= IEEE80211_C_WEP;
2573 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
2574 	    ATH9K_CIPHER_MIC, NULL))
2575 		ic->ic_caps |= IEEE80211_C_TKIPMIC;
2576 }
2577 
2578 static void
2579 arn_setup_ht_cap(struct arn_softc *sc)
2580 {
2581 #define	ATH9K_HT_CAP_MAXRXAMPDU_65536 0x3	/* 2 ^ 16 */
2582 #define	ATH9K_HT_CAP_MPDUDENSITY_8 0x6		/* 8 usec */
2583 
2584 	uint8_t rx_streams;
2585 
2586 	arn_ht_conf *ht_info = &sc->sc_ht_conf;
2587 
2588 	ht_info->ht_supported = B_TRUE;
2589 
2590 	/* Todo: IEEE80211_HTCAP_SMPS */
2591 	ht_info->cap = IEEE80211_HTCAP_CHWIDTH40|
2592 	    IEEE80211_HTCAP_SHORTGI40 |
2593 	    IEEE80211_HTCAP_DSSSCCK40;
2594 
2595 	ht_info->ampdu_factor = ATH9K_HT_CAP_MAXRXAMPDU_65536;
2596 	ht_info->ampdu_density = ATH9K_HT_CAP_MPDUDENSITY_8;
2597 
2598 	/* set up supported mcs set */
2599 	(void) memset(&ht_info->rx_mcs_mask, 0, sizeof (ht_info->rx_mcs_mask));
2600 	rx_streams = ISP2(sc->sc_ah->ah_caps.rx_chainmask) ? 1 : 2;
2601 
2602 	ht_info->rx_mcs_mask[0] = 0xff;
2603 	if (rx_streams >= 2)
2604 		ht_info->rx_mcs_mask[1] = 0xff;
2605 }
2606 
2607 /* xxx should be used for ht rate set negotiating ? */
2608 static void
2609 arn_overwrite_11n_rateset(struct arn_softc *sc)
2610 {
2611 	uint8_t *ht_rs = sc->sc_ht_conf.rx_mcs_mask;
2612 	int mcs_idx, mcs_count = 0;
2613 	int i, j;
2614 
2615 	(void) memset(&ieee80211_rateset_11n, 0,
2616 	    sizeof (ieee80211_rateset_11n));
2617 	for (i = 0; i < 10; i++) {
2618 		for (j = 0; j < 8; j++) {
2619 			if (ht_rs[i] & (1 << j)) {
2620 				mcs_idx = i * 8 + j;
2621 				if (mcs_idx >= IEEE80211_HTRATE_MAXSIZE) {
2622 					break;
2623 				}
2624 
2625 				ieee80211_rateset_11n.rs_rates[mcs_idx] =
2626 				    (uint8_t)mcs_idx;
2627 				mcs_count++;
2628 			}
2629 		}
2630 	}
2631 
2632 	ieee80211_rateset_11n.rs_nrates = (uint8_t)mcs_count;
2633 
2634 	ARN_DBG((ARN_DBG_RATE, "arn_overwrite_11n_rateset(): "
2635 	    "MCS rate set supported by this station is as follows:\n"));
2636 
2637 	for (i = 0; i < ieee80211_rateset_11n.rs_nrates; i++) {
2638 		ARN_DBG((ARN_DBG_RATE, "MCS rate %d is %d\n",
2639 		    i, ieee80211_rateset_11n.rs_rates[i]));
2640 	}
2641 
2642 }
2643 
2644 /*
2645  * Update WME parameters for a transmit queue.
2646  */
2647 static int
2648 arn_tx_queue_update(struct arn_softc *sc, int ac)
2649 {
2650 #define	ATH_EXPONENT_TO_VALUE(v)	((1<<v)-1)
2651 #define	ATH_TXOP_TO_US(v)		(v<<5)
2652 	ieee80211com_t *ic = (ieee80211com_t *)sc;
2653 	struct ath_txq *txq;
2654 	struct wmeParams *wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
2655 	struct ath_hal *ah = sc->sc_ah;
2656 	struct ath9k_tx_queue_info qi;
2657 
2658 	txq = &sc->sc_txq[arn_get_hal_qnum(ac, sc)];
2659 	(void) ath9k_hw_get_txq_props(ah, txq->axq_qnum, &qi);
2660 
2661 	/*
2662 	 * TXQ_FLAG_TXOKINT_ENABLE = 0x0001
2663 	 * TXQ_FLAG_TXERRINT_ENABLE = 0x0001
2664 	 * TXQ_FLAG_TXDESCINT_ENABLE = 0x0002
2665 	 * TXQ_FLAG_TXEOLINT_ENABLE = 0x0004
2666 	 * TXQ_FLAG_TXURNINT_ENABLE = 0x0008
2667 	 * TXQ_FLAG_BACKOFF_DISABLE = 0x0010
2668 	 * TXQ_FLAG_COMPRESSION_ENABLE = 0x0020
2669 	 * TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040
2670 	 * TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080
2671 	 */
2672 
2673 	/* xxx should update these flags here? */
2674 #if 0
2675 	qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE |
2676 	    TXQ_FLAG_TXERRINT_ENABLE |
2677 	    TXQ_FLAG_TXDESCINT_ENABLE |
2678 	    TXQ_FLAG_TXURNINT_ENABLE;
2679 #endif
2680 
2681 	qi.tqi_aifs = wmep->wmep_aifsn;
2682 	qi.tqi_cwmin = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmin);
2683 	qi.tqi_cwmax = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmax);
2684 	qi.tqi_readyTime = 0;
2685 	qi.tqi_burstTime = ATH_TXOP_TO_US(wmep->wmep_txopLimit);
2686 
2687 	ARN_DBG((ARN_DBG_INIT,
2688 	    "%s:"
2689 	    "Q%u"
2690 	    "qflags 0x%x"
2691 	    "aifs %u"
2692 	    "cwmin %u"
2693 	    "cwmax %u"
2694 	    "burstTime %u\n",
2695 	    __func__,
2696 	    txq->axq_qnum,
2697 	    qi.tqi_qflags,
2698 	    qi.tqi_aifs,
2699 	    qi.tqi_cwmin,
2700 	    qi.tqi_cwmax,
2701 	    qi.tqi_burstTime));
2702 
2703 	if (!ath9k_hw_set_txq_props(ah, txq->axq_qnum, &qi)) {
2704 		arn_problem("unable to update hardware queue "
2705 		    "parameters for %s traffic!\n",
2706 		    ieee80211_wme_acnames[ac]);
2707 		return (0);
2708 	} else {
2709 		/* push to H/W */
2710 		(void) ath9k_hw_resettxqueue(ah, txq->axq_qnum);
2711 		return (1);
2712 	}
2713 
2714 #undef ATH_TXOP_TO_US
2715 #undef ATH_EXPONENT_TO_VALUE
2716 }
2717 
2718 /* Update WME parameters */
2719 static int
2720 arn_wme_update(ieee80211com_t *ic)
2721 {
2722 	struct arn_softc *sc = (struct arn_softc *)ic;
2723 
2724 	/* updateing */
2725 	return (!arn_tx_queue_update(sc, WME_AC_BE) ||
2726 	    !arn_tx_queue_update(sc, WME_AC_BK) ||
2727 	    !arn_tx_queue_update(sc, WME_AC_VI) ||
2728 	    !arn_tx_queue_update(sc, WME_AC_VO) ? EIO : 0);
2729 }
2730 
2731 /*
2732  * Update tx/rx chainmask. For legacy association,
2733  * hard code chainmask to 1x1, for 11n association, use
2734  * the chainmask configuration.
2735  */
2736 void
2737 arn_update_chainmask(struct arn_softc *sc)
2738 {
2739 	boolean_t is_ht = B_FALSE;
2740 	sc->sc_flags |= SC_OP_CHAINMASK_UPDATE;
2741 
2742 	is_ht = sc->sc_ht_conf.ht_supported;
2743 	if (is_ht) {
2744 		sc->sc_tx_chainmask = sc->sc_ah->ah_caps.tx_chainmask;
2745 		sc->sc_rx_chainmask = sc->sc_ah->ah_caps.rx_chainmask;
2746 	} else {
2747 		sc->sc_tx_chainmask = 1;
2748 		sc->sc_rx_chainmask = 1;
2749 	}
2750 
2751 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2752 	    "tx_chainmask = %d, rx_chainmask = %d\n",
2753 	    sc->sc_tx_chainmask, sc->sc_rx_chainmask));
2754 }
2755 
2756 static int
2757 arn_resume(dev_info_t *devinfo)
2758 {
2759 	struct arn_softc *sc;
2760 	int ret = DDI_SUCCESS;
2761 
2762 	sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
2763 	if (sc == NULL) {
2764 		ARN_DBG((ARN_DBG_INIT, "ath: ath_resume(): "
2765 		    "failed to get soft state\n"));
2766 		return (DDI_FAILURE);
2767 	}
2768 
2769 	ARN_LOCK(sc);
2770 	/*
2771 	 * Set up config space command register(s). Refuse
2772 	 * to resume on failure.
2773 	 */
2774 	if (arn_pci_setup(sc) != 0) {
2775 		ARN_DBG((ARN_DBG_INIT, "ath: ath_resume(): "
2776 		    "ath_pci_setup() failed\n"));
2777 		ARN_UNLOCK(sc);
2778 		return (DDI_FAILURE);
2779 	}
2780 
2781 	if (!(sc->sc_flags & SC_OP_INVALID))
2782 		ret = arn_open(sc);
2783 	ARN_UNLOCK(sc);
2784 
2785 	return (ret);
2786 }
2787 
2788 static int
2789 arn_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
2790 {
2791 	struct arn_softc *sc;
2792 	int		instance;
2793 	int		status;
2794 	int32_t		err;
2795 	uint16_t	vendor_id;
2796 	uint16_t	device_id;
2797 	uint32_t	i;
2798 	uint32_t	val;
2799 	char		strbuf[32];
2800 	ieee80211com_t *ic;
2801 	struct ath_hal *ah;
2802 	wifi_data_t wd = { 0 };
2803 	mac_register_t *macp;
2804 
2805 	switch (cmd) {
2806 	case DDI_ATTACH:
2807 		break;
2808 	case DDI_RESUME:
2809 		return (arn_resume(devinfo));
2810 	default:
2811 		return (DDI_FAILURE);
2812 	}
2813 
2814 	instance = ddi_get_instance(devinfo);
2815 	if (ddi_soft_state_zalloc(arn_soft_state_p, instance) != DDI_SUCCESS) {
2816 		ARN_DBG((ARN_DBG_ATTACH, "arn: "
2817 		    "%s: Unable to alloc softstate\n", __func__));
2818 		return (DDI_FAILURE);
2819 	}
2820 
2821 	sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
2822 	ic = (ieee80211com_t *)sc;
2823 	sc->sc_dev = devinfo;
2824 
2825 	mutex_init(&sc->sc_genlock, NULL, MUTEX_DRIVER, NULL);
2826 	mutex_init(&sc->sc_serial_rw, NULL, MUTEX_DRIVER, NULL);
2827 	mutex_init(&sc->sc_txbuflock, NULL, MUTEX_DRIVER, NULL);
2828 	mutex_init(&sc->sc_rxbuflock, NULL, MUTEX_DRIVER, NULL);
2829 	mutex_init(&sc->sc_resched_lock, NULL, MUTEX_DRIVER, NULL);
2830 #ifdef ARN_IBSS
2831 	mutex_init(&sc->sc_bcbuflock, NULL, MUTEX_DRIVER, NULL);
2832 #endif
2833 
2834 	sc->sc_flags |= SC_OP_INVALID;
2835 
2836 	err = pci_config_setup(devinfo, &sc->sc_cfg_handle);
2837 	if (err != DDI_SUCCESS) {
2838 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2839 		    "pci_config_setup() failed"));
2840 		goto attach_fail0;
2841 	}
2842 
2843 	if (arn_pci_setup(sc) != 0)
2844 		goto attach_fail1;
2845 
2846 	/* Cache line size set up */
2847 	arn_pci_config_cachesize(sc);
2848 
2849 	vendor_id = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_VENID);
2850 	device_id = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_DEVID);
2851 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): vendor 0x%x, "
2852 	    "device id 0x%x, cache size %d\n",
2853 	    vendor_id, device_id,
2854 	    pci_config_get8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ)));
2855 
2856 	pci_config_put8(sc->sc_cfg_handle, PCI_CONF_LATENCY_TIMER, 0xa8);
2857 	val = pci_config_get32(sc->sc_cfg_handle, 0x40);
2858 	if ((val & 0x0000ff00) != 0)
2859 		pci_config_put32(sc->sc_cfg_handle, 0x40, val & 0xffff00ff);
2860 
2861 	err = ddi_regs_map_setup(devinfo, 1,
2862 	    &sc->mem, 0, 0, &arn_reg_accattr, &sc->sc_io_handle);
2863 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2864 	    "regs map1 = %x err=%d\n", sc->mem, err));
2865 	if (err != DDI_SUCCESS) {
2866 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2867 		    "ddi_regs_map_setup() failed"));
2868 		goto attach_fail1;
2869 	}
2870 
2871 	ah = ath9k_hw_attach(device_id, sc, sc->mem, &status);
2872 	if (ah == NULL) {
2873 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2874 		    "unable to attach hw: H/W status %u\n",
2875 		    status));
2876 		goto attach_fail2;
2877 	}
2878 	sc->sc_ah = ah;
2879 
2880 	ath9k_hw_getmac(ah, ic->ic_macaddr);
2881 
2882 	/* Get the hardware key cache size. */
2883 	sc->sc_keymax = ah->ah_caps.keycache_size;
2884 	if (sc->sc_keymax > ATH_KEYMAX) {
2885 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2886 		    "Warning, using only %u entries in %u key cache\n",
2887 		    ATH_KEYMAX, sc->sc_keymax));
2888 		sc->sc_keymax = ATH_KEYMAX;
2889 	}
2890 
2891 	/*
2892 	 * Reset the key cache since some parts do not
2893 	 * reset the contents on initial power up.
2894 	 */
2895 	for (i = 0; i < sc->sc_keymax; i++)
2896 		(void) ath9k_hw_keyreset(ah, (uint16_t)i);
2897 	/*
2898 	 * Mark key cache slots associated with global keys
2899 	 * as in use.  If we knew TKIP was not to be used we
2900 	 * could leave the +32, +64, and +32+64 slots free.
2901 	 * XXX only for splitmic.
2902 	 */
2903 	for (i = 0; i < IEEE80211_WEP_NKID; i++) {
2904 		set_bit(i, sc->sc_keymap);
2905 		set_bit(i + 32, sc->sc_keymap);
2906 		set_bit(i + 64, sc->sc_keymap);
2907 		set_bit(i + 32 + 64, sc->sc_keymap);
2908 	}
2909 
2910 	/* Collect the channel list using the default country code */
2911 	err = arn_setup_channels(sc);
2912 	if (err == EINVAL) {
2913 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2914 		    "ERR:arn_setup_channels\n"));
2915 		goto attach_fail3;
2916 	}
2917 
2918 	/* default to STA mode */
2919 	sc->sc_ah->ah_opmode = ATH9K_M_STA;
2920 
2921 	/* Setup rate tables */
2922 	arn_rate_attach(sc);
2923 	arn_setup_rates(sc, IEEE80211_MODE_11A);
2924 	arn_setup_rates(sc, IEEE80211_MODE_11B);
2925 	arn_setup_rates(sc, IEEE80211_MODE_11G);
2926 
2927 	/* Setup current mode here */
2928 	arn_setcurmode(sc, ATH9K_MODE_11G);
2929 
2930 	/* 802.11g features */
2931 	if (sc->sc_have11g)
2932 		ic->ic_caps |= IEEE80211_C_SHPREAMBLE |
2933 		    IEEE80211_C_SHSLOT;		/* short slot time */
2934 
2935 	/* Temp workaround */
2936 	sc->sc_mrretry = 1;
2937 	sc->sc_config.ath_aggr_prot = 0;
2938 
2939 	/* Setup tx/rx descriptors */
2940 	err = arn_desc_alloc(devinfo, sc);
2941 	if (err != DDI_SUCCESS) {
2942 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2943 		    "failed to allocate descriptors: %d\n", err));
2944 		goto attach_fail3;
2945 	}
2946 
2947 	if ((sc->sc_tq = ddi_taskq_create(devinfo, "ath_taskq", 1,
2948 	    TASKQ_DEFAULTPRI, 0)) == NULL) {
2949 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2950 		    "ERR:ddi_taskq_create\n"));
2951 		goto attach_fail4;
2952 	}
2953 
2954 	/*
2955 	 * Allocate hardware transmit queues: one queue for
2956 	 * beacon frames and one data queue for each QoS
2957 	 * priority.  Note that the hal handles reseting
2958 	 * these queues at the needed time.
2959 	 */
2960 #ifdef ARN_IBSS
2961 	sc->sc_beaconq = arn_beaconq_setup(ah);
2962 	if (sc->sc_beaconq == (-1)) {
2963 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2964 		    "unable to setup a beacon xmit queue\n"));
2965 		goto attach_fail4;
2966 	}
2967 #endif
2968 #ifdef ARN_HOSTAP
2969 	sc->sc_cabq = arn_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
2970 	if (sc->sc_cabq == NULL) {
2971 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2972 		    "unable to setup CAB xmit queue\n"));
2973 		goto attach_fail4;
2974 	}
2975 
2976 	sc->sc_config.cabqReadytime = ATH_CABQ_READY_TIME;
2977 	ath_cabq_update(sc);
2978 #endif
2979 
2980 	for (i = 0; i < ARRAY_SIZE(sc->sc_haltype2q); i++)
2981 		sc->sc_haltype2q[i] = -1;
2982 
2983 	/* Setup data queues */
2984 	/* NB: ensure BK queue is the lowest priority h/w queue */
2985 	if (!arn_tx_setup(sc, ATH9K_WME_AC_BK)) {
2986 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2987 		    "unable to setup xmit queue for BK traffic\n"));
2988 		goto attach_fail4;
2989 	}
2990 	if (!arn_tx_setup(sc, ATH9K_WME_AC_BE)) {
2991 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2992 		    "unable to setup xmit queue for BE traffic\n"));
2993 		goto attach_fail4;
2994 	}
2995 	if (!arn_tx_setup(sc, ATH9K_WME_AC_VI)) {
2996 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
2997 		    "unable to setup xmit queue for VI traffic\n"));
2998 		goto attach_fail4;
2999 	}
3000 	if (!arn_tx_setup(sc, ATH9K_WME_AC_VO)) {
3001 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3002 		    "unable to setup xmit queue for VO traffic\n"));
3003 		goto attach_fail4;
3004 	}
3005 
3006 	/*
3007 	 * Initializes the noise floor to a reasonable default value.
3008 	 * Later on this will be updated during ANI processing.
3009 	 */
3010 
3011 	sc->sc_ani.sc_noise_floor = ATH_DEFAULT_NOISE_FLOOR;
3012 
3013 
3014 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
3015 	    ATH9K_CIPHER_TKIP, NULL)) {
3016 		/*
3017 		 * Whether we should enable h/w TKIP MIC.
3018 		 * XXX: if we don't support WME TKIP MIC, then we wouldn't
3019 		 * report WMM capable, so it's always safe to turn on
3020 		 * TKIP MIC in this case.
3021 		 */
3022 		(void) ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_TKIP_MIC,
3023 		    0, 1, NULL);
3024 	}
3025 
3026 	/* Get cipher releated capability information */
3027 	arn_get_hw_encap(sc);
3028 
3029 	/*
3030 	 * Check whether the separate key cache entries
3031 	 * are required to handle both tx+rx MIC keys.
3032 	 * With split mic keys the number of stations is limited
3033 	 * to 27 otherwise 59.
3034 	 */
3035 	if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
3036 	    ATH9K_CIPHER_TKIP, NULL) &&
3037 	    ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
3038 	    ATH9K_CIPHER_MIC, NULL) &&
3039 	    ath9k_hw_getcapability(ah, ATH9K_CAP_TKIP_SPLIT,
3040 	    0, NULL))
3041 		sc->sc_splitmic = 1;
3042 
3043 	/* turn on mcast key search if possible */
3044 	if (!ath9k_hw_getcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 0, NULL))
3045 		(void) ath9k_hw_setcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 1,
3046 		    1, NULL);
3047 
3048 	sc->sc_config.txpowlimit = ATH_TXPOWER_MAX;
3049 	sc->sc_config.txpowlimit_override = 0;
3050 
3051 	/* 11n Capabilities */
3052 	if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) {
3053 		sc->sc_flags |= SC_OP_TXAGGR;
3054 		sc->sc_flags |= SC_OP_RXAGGR;
3055 		arn_setup_ht_cap(sc);
3056 		arn_overwrite_11n_rateset(sc);
3057 	}
3058 
3059 	sc->sc_tx_chainmask = 1;
3060 	sc->sc_rx_chainmask = 1;
3061 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3062 	    "tx_chainmask = %d, rx_chainmask = %d\n",
3063 	    sc->sc_tx_chainmask, sc->sc_rx_chainmask));
3064 
3065 	/* arn_update_chainmask(sc); */
3066 
3067 	(void) ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, B_TRUE, NULL);
3068 	sc->sc_defant = ath9k_hw_getdefantenna(ah);
3069 
3070 	ath9k_hw_getmac(ah, sc->sc_myaddr);
3071 	if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) {
3072 		ath9k_hw_getbssidmask(ah, sc->sc_bssidmask);
3073 		ATH_SET_VAP_BSSID_MASK(sc->sc_bssidmask);
3074 		(void) ath9k_hw_setbssidmask(ah, sc->sc_bssidmask);
3075 	}
3076 
3077 	/* set default value to short slot time */
3078 	sc->sc_slottime = ATH9K_SLOT_TIME_9;
3079 	(void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_9);
3080 
3081 	/* initialize beacon slots */
3082 	for (i = 0; i < ARRAY_SIZE(sc->sc_bslot); i++)
3083 		sc->sc_bslot[i] = ATH_IF_ID_ANY;
3084 
3085 	/* Save MISC configurations */
3086 	sc->sc_config.swBeaconProcess = 1;
3087 
3088 	/* Support QoS/WME */
3089 	ic->ic_caps |= IEEE80211_C_WME;
3090 	ic->ic_wme.wme_update = arn_wme_update;
3091 
3092 	/* Support 802.11n/HT */
3093 	if (sc->sc_ht_conf.ht_supported) {
3094 		ic->ic_htcaps =
3095 		    IEEE80211_HTCAP_CHWIDTH40 |
3096 		    IEEE80211_HTCAP_SHORTGI40 |
3097 		    IEEE80211_HTCAP_DSSSCCK40 |
3098 		    IEEE80211_HTCAP_MAXAMSDU_7935 |
3099 		    IEEE80211_HTC_HT |
3100 		    IEEE80211_HTC_AMSDU |
3101 		    IEEE80211_HTCAP_RXSTBC_2STREAM;
3102 
3103 #ifdef ARN_TX_AGGREGATION
3104 	ic->ic_htcaps |= IEEE80211_HTC_AMPDU;
3105 #endif
3106 	}
3107 
3108 	/* Header padding requested by driver */
3109 	ic->ic_flags |= IEEE80211_F_DATAPAD;
3110 	/* Support WPA/WPA2 */
3111 	ic->ic_caps |= IEEE80211_C_WPA;
3112 #if 0
3113 	ic->ic_caps |= IEEE80211_C_TXFRAG; /* handle tx frags */
3114 	ic->ic_caps |= IEEE80211_C_BGSCAN; /* capable of bg scanning */
3115 #endif
3116 	ic->ic_phytype = IEEE80211_T_HT;
3117 	ic->ic_opmode = IEEE80211_M_STA;
3118 	ic->ic_state = IEEE80211_S_INIT;
3119 	ic->ic_maxrssi = ARN_MAX_RSSI;
3120 	ic->ic_set_shortslot = arn_set_shortslot;
3121 	ic->ic_xmit = arn_tx;
3122 	ieee80211_attach(ic);
3123 
3124 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3125 	    "ic->ic_curchan->ich_freq: %d\n", ic->ic_curchan->ich_freq));
3126 
3127 	/* different instance has different WPA door */
3128 	(void) snprintf(ic->ic_wpadoor, MAX_IEEE80211STR, "%s_%s%d", WPA_DOOR,
3129 	    ddi_driver_name(devinfo),
3130 	    ddi_get_instance(devinfo));
3131 
3132 	if (sc->sc_ht_conf.ht_supported) {
3133 		sc->sc_recv_action = ic->ic_recv_action;
3134 		ic->ic_recv_action = arn_ampdu_recv_action;
3135 		// sc->sc_send_action = ic->ic_send_action;
3136 		// ic->ic_send_action = arn_ampdu_send_action;
3137 
3138 		ic->ic_ampdu_rxmax = sc->sc_ht_conf.ampdu_factor;
3139 		ic->ic_ampdu_density = sc->sc_ht_conf.ampdu_density;
3140 		ic->ic_ampdu_limit = ic->ic_ampdu_rxmax;
3141 	}
3142 
3143 	/* Override 80211 default routines */
3144 	sc->sc_newstate = ic->ic_newstate;
3145 	ic->ic_newstate = arn_newstate;
3146 #ifdef ARN_IBSS
3147 	sc->sc_recv_mgmt = ic->ic_recv_mgmt;
3148 	ic->ic_recv_mgmt = arn_recv_mgmt;
3149 #endif
3150 	ic->ic_watchdog = arn_watchdog;
3151 	ic->ic_node_alloc = arn_node_alloc;
3152 	ic->ic_node_free = arn_node_free;
3153 	ic->ic_crypto.cs_key_alloc = arn_key_alloc;
3154 	ic->ic_crypto.cs_key_delete = arn_key_delete;
3155 	ic->ic_crypto.cs_key_set = arn_key_set;
3156 
3157 	ieee80211_media_init(ic);
3158 
3159 	/*
3160 	 * initialize default tx key
3161 	 */
3162 	ic->ic_def_txkey = 0;
3163 
3164 	sc->sc_rx_pend = 0;
3165 	(void) ath9k_hw_set_interrupts(sc->sc_ah, 0);
3166 	err = ddi_add_softintr(devinfo, DDI_SOFTINT_LOW,
3167 	    &sc->sc_softint_id, NULL, 0, arn_softint_handler, (caddr_t)sc);
3168 	if (err != DDI_SUCCESS) {
3169 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3170 		    "ddi_add_softintr() failed....\n"));
3171 		goto attach_fail5;
3172 	}
3173 
3174 	if (ddi_get_iblock_cookie(devinfo, 0, &sc->sc_iblock)
3175 	    != DDI_SUCCESS) {
3176 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3177 		    "Can not get iblock cookie for INT\n"));
3178 		goto attach_fail6;
3179 	}
3180 
3181 	if (ddi_add_intr(devinfo, 0, NULL, NULL, arn_isr,
3182 	    (caddr_t)sc) != DDI_SUCCESS) {
3183 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3184 		    "Can not set intr for ARN driver\n"));
3185 		goto attach_fail6;
3186 	}
3187 
3188 	/*
3189 	 * Provide initial settings for the WiFi plugin; whenever this
3190 	 * information changes, we need to call mac_plugindata_update()
3191 	 */
3192 	wd.wd_opmode = ic->ic_opmode;
3193 	wd.wd_secalloc = WIFI_SEC_NONE;
3194 	IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid);
3195 
3196 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3197 	    "IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid)"
3198 	    "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
3199 	    wd.wd_bssid[0], wd.wd_bssid[1], wd.wd_bssid[2],
3200 	    wd.wd_bssid[3], wd.wd_bssid[4], wd.wd_bssid[5]));
3201 
3202 	if ((macp = mac_alloc(MAC_VERSION)) == NULL) {
3203 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3204 		    "MAC version mismatch\n"));
3205 		goto attach_fail7;
3206 	}
3207 
3208 	macp->m_type_ident	= MAC_PLUGIN_IDENT_WIFI;
3209 	macp->m_driver		= sc;
3210 	macp->m_dip		= devinfo;
3211 	macp->m_src_addr	= ic->ic_macaddr;
3212 	macp->m_callbacks	= &arn_m_callbacks;
3213 	macp->m_min_sdu		= 0;
3214 	macp->m_max_sdu		= IEEE80211_MTU;
3215 	macp->m_pdata		= &wd;
3216 	macp->m_pdata_size	= sizeof (wd);
3217 
3218 	err = mac_register(macp, &ic->ic_mach);
3219 	mac_free(macp);
3220 	if (err != 0) {
3221 		ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3222 		    "mac_register err %x\n", err));
3223 		goto attach_fail7;
3224 	}
3225 
3226 	/* Create minor node of type DDI_NT_NET_WIFI */
3227 	(void) snprintf(strbuf, sizeof (strbuf), "%s%d",
3228 	    ARN_NODENAME, instance);
3229 	err = ddi_create_minor_node(devinfo, strbuf, S_IFCHR,
3230 	    instance + 1, DDI_NT_NET_WIFI, 0);
3231 	if (err != DDI_SUCCESS)
3232 		ARN_DBG((ARN_DBG_ATTACH, "WARN: arn: arn_attach(): "
3233 		    "Create minor node failed - %d\n", err));
3234 
3235 	/* Notify link is down now */
3236 	mac_link_update(ic->ic_mach, LINK_STATE_DOWN);
3237 
3238 	sc->sc_promisc = B_FALSE;
3239 	bzero(sc->sc_mcast_refs, sizeof (sc->sc_mcast_refs));
3240 	bzero(sc->sc_mcast_hash, sizeof (sc->sc_mcast_hash));
3241 
3242 	ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
3243 	    "Atheros AR%s MAC/BB Rev:%x "
3244 	    "AR%s RF Rev:%x: mem=0x%lx\n",
3245 	    arn_mac_bb_name(ah->ah_macVersion),
3246 	    ah->ah_macRev,
3247 	    arn_rf_name((ah->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR)),
3248 	    ah->ah_phyRev,
3249 	    (unsigned long)sc->mem));
3250 
3251 	/* XXX: hardware will not be ready until arn_open() being called */
3252 	sc->sc_flags |= SC_OP_INVALID;
3253 	sc->sc_isrunning = 0;
3254 
3255 	return (DDI_SUCCESS);
3256 
3257 attach_fail7:
3258 	ddi_remove_intr(devinfo, 0, sc->sc_iblock);
3259 attach_fail6:
3260 	ddi_remove_softintr(sc->sc_softint_id);
3261 attach_fail5:
3262 	(void) ieee80211_detach(ic);
3263 attach_fail4:
3264 	arn_desc_free(sc);
3265 	if (sc->sc_tq)
3266 		ddi_taskq_destroy(sc->sc_tq);
3267 attach_fail3:
3268 	ath9k_hw_detach(ah);
3269 attach_fail2:
3270 	ddi_regs_map_free(&sc->sc_io_handle);
3271 attach_fail1:
3272 	pci_config_teardown(&sc->sc_cfg_handle);
3273 attach_fail0:
3274 	sc->sc_flags |= SC_OP_INVALID;
3275 	/* cleanup tx queues */
3276 	mutex_destroy(&sc->sc_txbuflock);
3277 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
3278 		if (ARN_TXQ_SETUP(sc, i)) {
3279 			/* arn_tx_cleanupq(asc, &asc->sc_txq[i]); */
3280 			mutex_destroy(&((&sc->sc_txq[i])->axq_lock));
3281 		}
3282 	}
3283 	mutex_destroy(&sc->sc_rxbuflock);
3284 	mutex_destroy(&sc->sc_serial_rw);
3285 	mutex_destroy(&sc->sc_genlock);
3286 	mutex_destroy(&sc->sc_resched_lock);
3287 #ifdef ARN_IBSS
3288 	mutex_destroy(&sc->sc_bcbuflock);
3289 #endif
3290 
3291 	ddi_soft_state_free(arn_soft_state_p, instance);
3292 
3293 	return (DDI_FAILURE);
3294 
3295 }
3296 
3297 /*
3298  * Suspend transmit/receive for powerdown
3299  */
3300 static int
3301 arn_suspend(struct arn_softc *sc)
3302 {
3303 	ARN_LOCK(sc);
3304 	arn_close(sc);
3305 	ARN_UNLOCK(sc);
3306 
3307 	return (DDI_SUCCESS);
3308 }
3309 
3310 static int32_t
3311 arn_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
3312 {
3313 	struct arn_softc *sc;
3314 	int i;
3315 
3316 	sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
3317 	ASSERT(sc != NULL);
3318 
3319 	switch (cmd) {
3320 	case DDI_DETACH:
3321 		break;
3322 
3323 	case DDI_SUSPEND:
3324 		return (arn_suspend(sc));
3325 
3326 	default:
3327 		return (DDI_FAILURE);
3328 	}
3329 
3330 	if (mac_disable(sc->sc_isc.ic_mach) != 0)
3331 		return (DDI_FAILURE);
3332 
3333 	arn_stop_scantimer(sc);
3334 	arn_stop_caltimer(sc);
3335 
3336 	/* disable interrupts */
3337 	(void) ath9k_hw_set_interrupts(sc->sc_ah, 0);
3338 
3339 	/*
3340 	 * Unregister from the MAC layer subsystem
3341 	 */
3342 	(void) mac_unregister(sc->sc_isc.ic_mach);
3343 
3344 	/* free intterrupt resources */
3345 	ddi_remove_intr(devinfo, 0, sc->sc_iblock);
3346 	ddi_remove_softintr(sc->sc_softint_id);
3347 
3348 	/*
3349 	 * NB: the order of these is important:
3350 	 * o call the 802.11 layer before detaching the hal to
3351 	 *   insure callbacks into the driver to delete global
3352 	 *   key cache entries can be handled
3353 	 * o reclaim the tx queue data structures after calling
3354 	 *   the 802.11 layer as we'll get called back to reclaim
3355 	 *   node state and potentially want to use them
3356 	 * o to cleanup the tx queues the hal is called, so detach
3357 	 *   it last
3358 	 */
3359 	ieee80211_detach(&sc->sc_isc);
3360 
3361 	arn_desc_free(sc);
3362 
3363 	ddi_taskq_destroy(sc->sc_tq);
3364 
3365 	if (!(sc->sc_flags & SC_OP_INVALID))
3366 		(void) ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
3367 
3368 	/* cleanup tx queues */
3369 	mutex_destroy(&sc->sc_txbuflock);
3370 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
3371 		if (ARN_TXQ_SETUP(sc, i)) {
3372 			arn_tx_cleanupq(sc, &sc->sc_txq[i]);
3373 			mutex_destroy(&((&sc->sc_txq[i])->axq_lock));
3374 		}
3375 	}
3376 
3377 	ath9k_hw_detach(sc->sc_ah);
3378 
3379 	/* free io handle */
3380 	ddi_regs_map_free(&sc->sc_io_handle);
3381 	pci_config_teardown(&sc->sc_cfg_handle);
3382 
3383 	/* destroy locks */
3384 	mutex_destroy(&sc->sc_genlock);
3385 	mutex_destroy(&sc->sc_serial_rw);
3386 	mutex_destroy(&sc->sc_rxbuflock);
3387 	mutex_destroy(&sc->sc_resched_lock);
3388 #ifdef ARN_IBSS
3389 	mutex_destroy(&sc->sc_bcbuflock);
3390 #endif
3391 
3392 	ddi_remove_minor_node(devinfo, NULL);
3393 	ddi_soft_state_free(arn_soft_state_p, ddi_get_instance(devinfo));
3394 
3395 	return (DDI_SUCCESS);
3396 }
3397 
3398 /*
3399  * quiesce(9E) entry point.
3400  *
3401  * This function is called when the system is single-threaded at high
3402  * PIL with preemption disabled. Therefore, this function must not be
3403  * blocked.
3404  *
3405  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
3406  * DDI_FAILURE indicates an error condition and should almost never happen.
3407  */
3408 static int32_t
3409 arn_quiesce(dev_info_t *devinfo)
3410 {
3411 	struct arn_softc *sc;
3412 	int i;
3413 	struct ath_hal *ah;
3414 
3415 	sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
3416 
3417 	if (sc == NULL || (ah = sc->sc_ah) == NULL)
3418 		return (DDI_FAILURE);
3419 
3420 	/*
3421 	 * Disable interrupts
3422 	 */
3423 	(void) ath9k_hw_set_interrupts(ah, 0);
3424 
3425 	/*
3426 	 * Disable TX HW
3427 	 */
3428 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
3429 		if (ARN_TXQ_SETUP(sc, i))
3430 			(void) ath9k_hw_stoptxdma(ah, sc->sc_txq[i].axq_qnum);
3431 	}
3432 
3433 	/*
3434 	 * Disable RX HW
3435 	 */
3436 	ath9k_hw_stoppcurecv(ah);
3437 	ath9k_hw_setrxfilter(ah, 0);
3438 	(void) ath9k_hw_stopdmarecv(ah);
3439 	drv_usecwait(3000);
3440 
3441 	/*
3442 	 * Power down HW
3443 	 */
3444 	(void) ath9k_hw_phy_disable(ah);
3445 
3446 	return (DDI_SUCCESS);
3447 }
3448 
3449 DDI_DEFINE_STREAM_OPS(arn_dev_ops, nulldev, nulldev, arn_attach, arn_detach,
3450     nodev, NULL, D_MP, NULL, arn_quiesce);
3451 
3452 static struct modldrv arn_modldrv = {
3453 	&mod_driverops, /* Type of module.  This one is a driver */
3454 	"Atheros 9000 series driver", /* short description */
3455 	&arn_dev_ops /* driver specific ops */
3456 };
3457 
3458 static struct modlinkage modlinkage = {
3459 	MODREV_1, (void *)&arn_modldrv, NULL
3460 };
3461 
3462 int
3463 _info(struct modinfo *modinfop)
3464 {
3465 	return (mod_info(&modlinkage, modinfop));
3466 }
3467 
3468 int
3469 _init(void)
3470 {
3471 	int status;
3472 
3473 	status = ddi_soft_state_init
3474 	    (&arn_soft_state_p, sizeof (struct arn_softc), 1);
3475 	if (status != 0)
3476 		return (status);
3477 
3478 	mutex_init(&arn_loglock, NULL, MUTEX_DRIVER, NULL);
3479 	mac_init_ops(&arn_dev_ops, "arn");
3480 	status = mod_install(&modlinkage);
3481 	if (status != 0) {
3482 		mac_fini_ops(&arn_dev_ops);
3483 		mutex_destroy(&arn_loglock);
3484 		ddi_soft_state_fini(&arn_soft_state_p);
3485 	}
3486 
3487 	return (status);
3488 }
3489 
3490 int
3491 _fini(void)
3492 {
3493 	int status;
3494 
3495 	status = mod_remove(&modlinkage);
3496 	if (status == 0) {
3497 		mac_fini_ops(&arn_dev_ops);
3498 		mutex_destroy(&arn_loglock);
3499 		ddi_soft_state_fini(&arn_soft_state_p);
3500 	}
3501 	return (status);
3502 }
3503