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