Home | History | Annotate | Line # | Download | only in pci
if_iwi.c revision 1.10.2.1
      1  1.10.2.1    yamt /*	$NetBSD: if_iwi.c,v 1.10.2.1 2006/06/21 15:05:04 yamt Exp $  */
      2       1.1   skrll 
      3       1.1   skrll /*-
      4       1.1   skrll  * Copyright (c) 2004, 2005
      5       1.1   skrll  *      Damien Bergamini <damien.bergamini (at) free.fr>. All rights reserved.
      6       1.1   skrll  *
      7       1.1   skrll  * Redistribution and use in source and binary forms, with or without
      8       1.1   skrll  * modification, are permitted provided that the following conditions
      9       1.1   skrll  * are met:
     10       1.1   skrll  * 1. Redistributions of source code must retain the above copyright
     11       1.1   skrll  *    notice unmodified, this list of conditions, and the following
     12       1.1   skrll  *    disclaimer.
     13       1.1   skrll  * 2. Redistributions in binary form must reproduce the above copyright
     14       1.1   skrll  *    notice, this list of conditions and the following disclaimer in the
     15       1.1   skrll  *    documentation and/or other materials provided with the distribution.
     16       1.1   skrll  *
     17       1.1   skrll  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     18       1.1   skrll  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19       1.1   skrll  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20       1.1   skrll  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     21       1.1   skrll  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22       1.1   skrll  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23       1.1   skrll  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24       1.1   skrll  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25       1.1   skrll  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26       1.1   skrll  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27       1.1   skrll  * SUCH DAMAGE.
     28       1.1   skrll  */
     29       1.1   skrll 
     30       1.1   skrll #include <sys/cdefs.h>
     31  1.10.2.1    yamt __KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.10.2.1 2006/06/21 15:05:04 yamt Exp $");
     32       1.1   skrll 
     33       1.1   skrll /*-
     34  1.10.2.1    yamt  * Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver
     35       1.1   skrll  * http://www.intel.com/network/connectivity/products/wireless/prowireless_mobile.htm
     36       1.1   skrll  */
     37       1.1   skrll 
     38       1.1   skrll #include "bpfilter.h"
     39       1.1   skrll 
     40       1.1   skrll #include <sys/param.h>
     41       1.1   skrll #include <sys/sockio.h>
     42       1.1   skrll #include <sys/sysctl.h>
     43       1.1   skrll #include <sys/mbuf.h>
     44       1.1   skrll #include <sys/kernel.h>
     45       1.1   skrll #include <sys/socket.h>
     46       1.1   skrll #include <sys/systm.h>
     47       1.1   skrll #include <sys/malloc.h>
     48       1.1   skrll #include <sys/conf.h>
     49  1.10.2.1    yamt #include <sys/kauth.h>
     50       1.1   skrll 
     51       1.1   skrll #include <machine/bus.h>
     52       1.1   skrll #include <machine/endian.h>
     53       1.1   skrll #include <machine/intr.h>
     54       1.1   skrll 
     55       1.1   skrll #include <dev/pci/pcireg.h>
     56       1.1   skrll #include <dev/pci/pcivar.h>
     57       1.1   skrll #include <dev/pci/pcidevs.h>
     58       1.1   skrll 
     59       1.1   skrll #if NBPFILTER > 0
     60       1.1   skrll #include <net/bpf.h>
     61       1.1   skrll #endif
     62       1.1   skrll #include <net/if.h>
     63       1.1   skrll #include <net/if_arp.h>
     64       1.1   skrll #include <net/if_dl.h>
     65       1.1   skrll #include <net/if_ether.h>
     66       1.1   skrll #include <net/if_media.h>
     67       1.1   skrll #include <net/if_types.h>
     68       1.1   skrll 
     69       1.1   skrll #include <net80211/ieee80211_var.h>
     70       1.1   skrll #include <net80211/ieee80211_radiotap.h>
     71       1.1   skrll 
     72       1.1   skrll #include <netinet/in.h>
     73       1.1   skrll #include <netinet/in_systm.h>
     74       1.1   skrll #include <netinet/in_var.h>
     75       1.1   skrll #include <netinet/ip.h>
     76       1.1   skrll 
     77       1.1   skrll #include <crypto/arc4/arc4.h>
     78       1.1   skrll 
     79       1.1   skrll #include <dev/pci/if_iwireg.h>
     80       1.1   skrll #include <dev/pci/if_iwivar.h>
     81       1.1   skrll 
     82  1.10.2.1    yamt #ifdef IWI_DEBUG
     83  1.10.2.1    yamt #define DPRINTF(x)	if (iwi_debug > 0) printf x
     84  1.10.2.1    yamt #define DPRINTFN(n, x)	if (iwi_debug >= (n)) printf x
     85  1.10.2.1    yamt int iwi_debug = 4;
     86  1.10.2.1    yamt #else
     87  1.10.2.1    yamt #define DPRINTF(x)
     88  1.10.2.1    yamt #define DPRINTFN(n, x)
     89  1.10.2.1    yamt #endif
     90  1.10.2.1    yamt 
     91  1.10.2.1    yamt static int	iwi_match(struct device *, struct cfdata *, void *);
     92  1.10.2.1    yamt static void	iwi_attach(struct device *, struct device *, void *);
     93  1.10.2.1    yamt static int	iwi_detach(struct device *, int);
     94  1.10.2.1    yamt 
     95  1.10.2.1    yamt static void	iwi_shutdown(void *);
     96  1.10.2.1    yamt static int	iwi_suspend(struct iwi_softc *);
     97  1.10.2.1    yamt static int	iwi_resume(struct iwi_softc *);
     98  1.10.2.1    yamt static void	iwi_powerhook(int, void *);
     99  1.10.2.1    yamt 
    100  1.10.2.1    yamt static int	iwi_alloc_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *,
    101  1.10.2.1    yamt     int);
    102  1.10.2.1    yamt static void	iwi_reset_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
    103  1.10.2.1    yamt static void	iwi_free_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
    104  1.10.2.1    yamt static int	iwi_alloc_tx_ring(struct iwi_softc *, struct iwi_tx_ring *,
    105  1.10.2.1    yamt     int, bus_addr_t, bus_addr_t);
    106  1.10.2.1    yamt static void	iwi_reset_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
    107  1.10.2.1    yamt static void	iwi_free_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
    108  1.10.2.1    yamt static struct mbuf *
    109  1.10.2.1    yamt 		iwi_alloc_rx_buf(struct iwi_softc *sc);
    110  1.10.2.1    yamt static int	iwi_alloc_rx_ring(struct iwi_softc *, struct iwi_rx_ring *,
    111  1.10.2.1    yamt     int);
    112  1.10.2.1    yamt static void	iwi_reset_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
    113  1.10.2.1    yamt static void	iwi_free_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
    114  1.10.2.1    yamt 
    115  1.10.2.1    yamt static struct	ieee80211_node *iwi_node_alloc(struct ieee80211_node_table *);
    116  1.10.2.1    yamt static void	iwi_node_free(struct ieee80211_node *);
    117  1.10.2.1    yamt 
    118  1.10.2.1    yamt static int	iwi_media_change(struct ifnet *);
    119  1.10.2.1    yamt static void	iwi_media_status(struct ifnet *, struct ifmediareq *);
    120  1.10.2.1    yamt static int	iwi_wme_update(struct ieee80211com *);
    121  1.10.2.1    yamt static uint16_t	iwi_read_prom_word(struct iwi_softc *, uint8_t);
    122  1.10.2.1    yamt static int	iwi_newstate(struct ieee80211com *, enum ieee80211_state, int);
    123  1.10.2.1    yamt static void	iwi_fix_channel(struct ieee80211com *, struct mbuf *);
    124  1.10.2.1    yamt static void	iwi_frame_intr(struct iwi_softc *, struct iwi_rx_data *, int,
    125  1.10.2.1    yamt     struct iwi_frame *);
    126  1.10.2.1    yamt static void	iwi_notification_intr(struct iwi_softc *, struct iwi_notif *);
    127  1.10.2.1    yamt static void	iwi_cmd_intr(struct iwi_softc *);
    128  1.10.2.1    yamt static void	iwi_rx_intr(struct iwi_softc *);
    129  1.10.2.1    yamt static void	iwi_tx_intr(struct iwi_softc *, struct iwi_tx_ring *);
    130  1.10.2.1    yamt static int	iwi_intr(void *);
    131  1.10.2.1    yamt static int	iwi_cmd(struct iwi_softc *, uint8_t, void *, uint8_t, int);
    132  1.10.2.1    yamt static void	iwi_write_ibssnode(struct iwi_softc *, const struct iwi_node *);
    133  1.10.2.1    yamt static int	iwi_tx_start(struct ifnet *, struct mbuf *, struct ieee80211_node *,
    134  1.10.2.1    yamt     int);
    135  1.10.2.1    yamt static void	iwi_start(struct ifnet *);
    136  1.10.2.1    yamt static void	iwi_watchdog(struct ifnet *);
    137  1.10.2.1    yamt 
    138  1.10.2.1    yamt static int	iwi_alloc_unr(struct iwi_softc *);
    139  1.10.2.1    yamt static void	iwi_free_unr(struct iwi_softc *, int);
    140  1.10.2.1    yamt 
    141  1.10.2.1    yamt static int	iwi_get_table0(struct iwi_softc *, uint32_t *);
    142  1.10.2.1    yamt static int	iwi_get_radio(struct iwi_softc *, int *);
    143  1.10.2.1    yamt 
    144  1.10.2.1    yamt static int	iwi_ioctl(struct ifnet *, u_long, caddr_t);
    145  1.10.2.1    yamt static void	iwi_stop_master(struct iwi_softc *);
    146  1.10.2.1    yamt static int	iwi_reset(struct iwi_softc *);
    147  1.10.2.1    yamt static int	iwi_load_ucode(struct iwi_softc *, void *, int);
    148  1.10.2.1    yamt static int	iwi_load_firmware(struct iwi_softc *, void *, int);
    149  1.10.2.1    yamt static int	iwi_cache_firmware(struct iwi_softc *, void *);
    150  1.10.2.1    yamt static void	iwi_free_firmware(struct iwi_softc *);
    151  1.10.2.1    yamt static int	iwi_config(struct iwi_softc *);
    152  1.10.2.1    yamt static int	iwi_set_chan(struct iwi_softc *, struct ieee80211_channel *);
    153  1.10.2.1    yamt static int	iwi_scan(struct iwi_softc *);
    154  1.10.2.1    yamt static int	iwi_auth_and_assoc(struct iwi_softc *);
    155  1.10.2.1    yamt static int	iwi_init(struct ifnet *);
    156  1.10.2.1    yamt static void	iwi_stop(struct ifnet *, int);
    157  1.10.2.1    yamt static void	iwi_led_set(struct iwi_softc *, uint32_t, int);
    158  1.10.2.1    yamt static void	iwi_error_log(struct iwi_softc *);
    159  1.10.2.1    yamt 
    160  1.10.2.1    yamt /*
    161  1.10.2.1    yamt  * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
    162  1.10.2.1    yamt  */
    163       1.1   skrll static const struct ieee80211_rateset iwi_rateset_11a =
    164       1.1   skrll 	{ 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
    165       1.1   skrll 
    166       1.1   skrll static const struct ieee80211_rateset iwi_rateset_11b =
    167       1.1   skrll 	{ 4, { 2, 4, 11, 22 } };
    168       1.1   skrll 
    169       1.1   skrll static const struct ieee80211_rateset iwi_rateset_11g =
    170       1.1   skrll 	{ 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
    171       1.1   skrll 
    172  1.10.2.1    yamt static inline uint8_t
    173  1.10.2.1    yamt MEM_READ_1(struct iwi_softc *sc, uint32_t addr)
    174       1.1   skrll {
    175       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_INDIRECT_ADDR, addr);
    176       1.1   skrll 	return CSR_READ_1(sc, IWI_CSR_INDIRECT_DATA);
    177       1.1   skrll }
    178       1.1   skrll 
    179  1.10.2.1    yamt static inline uint32_t
    180  1.10.2.1    yamt MEM_READ_4(struct iwi_softc *sc, uint32_t addr)
    181       1.1   skrll {
    182       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_INDIRECT_ADDR, addr);
    183       1.1   skrll 	return CSR_READ_4(sc, IWI_CSR_INDIRECT_DATA);
    184       1.1   skrll }
    185       1.1   skrll 
    186  1.10.2.1    yamt static void
    187  1.10.2.1    yamt MEM_CPY(struct iwi_softc *sc, void *dst, uint32_t base, size_t sz)
    188  1.10.2.1    yamt {
    189  1.10.2.1    yamt 	KASSERT(sz % 4 == 0);
    190  1.10.2.1    yamt 	int j;
    191  1.10.2.1    yamt 
    192  1.10.2.1    yamt 	uint32_t *p = dst;
    193  1.10.2.1    yamt 
    194  1.10.2.1    yamt 	for (j = 0; j < sz / 4; j++)
    195  1.10.2.1    yamt 		p[j] = MEM_READ_4(sc, base + j * sizeof(uint32_t));
    196  1.10.2.1    yamt }
    197       1.1   skrll 
    198       1.1   skrll CFATTACH_DECL(iwi, sizeof (struct iwi_softc), iwi_match, iwi_attach,
    199       1.1   skrll     iwi_detach, NULL);
    200       1.1   skrll 
    201       1.1   skrll static int
    202       1.1   skrll iwi_match(struct device *parent, struct cfdata *match, void *aux)
    203       1.1   skrll {
    204       1.1   skrll 	struct pci_attach_args *pa = aux;
    205       1.5   perry 
    206       1.1   skrll 	if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
    207       1.1   skrll 		return 0;
    208       1.1   skrll 
    209       1.1   skrll 	if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2200BG ||
    210  1.10.2.1    yamt 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2225BG ||
    211  1.10.2.1    yamt 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 ||
    212  1.10.2.1    yamt 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2)
    213       1.1   skrll 		return 1;
    214       1.5   perry 
    215       1.1   skrll 	return 0;
    216       1.1   skrll }
    217       1.1   skrll 
    218       1.1   skrll /* Base Address Register */
    219       1.1   skrll #define IWI_PCI_BAR0	0x10
    220       1.1   skrll 
    221       1.1   skrll static void
    222       1.1   skrll iwi_attach(struct device *parent, struct device *self, void *aux)
    223       1.1   skrll {
    224       1.1   skrll 	struct iwi_softc *sc = (struct iwi_softc *)self;
    225       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
    226       1.9  dyoung 	struct ifnet *ifp = &sc->sc_if;
    227       1.1   skrll 	struct pci_attach_args *pa = aux;
    228       1.1   skrll 	const char *intrstr;
    229       1.1   skrll 	char devinfo[256];
    230       1.1   skrll 	bus_space_tag_t memt;
    231       1.1   skrll 	bus_space_handle_t memh;
    232       1.1   skrll 	bus_addr_t base;
    233       1.1   skrll 	pci_intr_handle_t ih;
    234       1.1   skrll 	pcireg_t data;
    235  1.10.2.1    yamt 	uint16_t val;
    236       1.1   skrll 	int error, revision, i;
    237       1.1   skrll 
    238       1.1   skrll 	sc->sc_pct = pa->pa_pc;
    239       1.1   skrll 	sc->sc_pcitag = pa->pa_tag;
    240       1.1   skrll 
    241       1.1   skrll 	pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof devinfo);
    242       1.1   skrll 	revision = PCI_REVISION(pa->pa_class);
    243       1.1   skrll 	aprint_normal(": %s (rev. 0x%02x)\n", devinfo, revision);
    244       1.1   skrll 
    245       1.1   skrll 	/* clear device specific PCI configuration register 0x41 */
    246       1.1   skrll 	data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
    247       1.1   skrll 	data &= ~0x0000ff00;
    248       1.1   skrll 	pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data);
    249       1.1   skrll 
    250  1.10.2.1    yamt 	/* clear unit numbers allocated to IBSS */
    251  1.10.2.1    yamt 	sc->sc_unr = 0;
    252  1.10.2.1    yamt 
    253  1.10.2.1    yamt 	/* power up chip */
    254  1.10.2.1    yamt 	if ((error = pci_activate(pa->pa_pc, pa->pa_tag, sc,
    255  1.10.2.1    yamt 	    NULL)) && error != EOPNOTSUPP) {
    256  1.10.2.1    yamt 		aprint_error("%s: cannot activate %d\n", sc->sc_dev.dv_xname,
    257  1.10.2.1    yamt 		    error);
    258  1.10.2.1    yamt 		return;
    259  1.10.2.1    yamt 	}
    260  1.10.2.1    yamt 
    261       1.1   skrll 	/* enable bus-mastering */
    262       1.1   skrll 	data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG);
    263       1.1   skrll 	data |= PCI_COMMAND_MASTER_ENABLE;
    264       1.1   skrll 	pci_conf_write(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG, data);
    265       1.1   skrll 
    266       1.1   skrll 	/* map the register window */
    267       1.1   skrll 	error = pci_mapreg_map(pa, IWI_PCI_BAR0, PCI_MAPREG_TYPE_MEM |
    268       1.1   skrll 	    PCI_MAPREG_MEM_TYPE_32BIT, 0, &memt, &memh, &base, &sc->sc_sz);
    269       1.1   skrll 	if (error != 0) {
    270       1.1   skrll 		aprint_error("%s: could not map memory space\n",
    271       1.1   skrll 		    sc->sc_dev.dv_xname);
    272       1.1   skrll 		return;
    273       1.1   skrll 	}
    274       1.1   skrll 
    275       1.1   skrll 	sc->sc_st = memt;
    276       1.1   skrll 	sc->sc_sh = memh;
    277       1.1   skrll 	sc->sc_dmat = pa->pa_dmat;
    278       1.1   skrll 
    279       1.1   skrll 	/* disable interrupts */
    280       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
    281       1.1   skrll 
    282       1.1   skrll 	if (pci_intr_map(pa, &ih) != 0) {
    283       1.1   skrll 		aprint_error("%s: could not map interrupt\n",
    284       1.1   skrll 		    sc->sc_dev.dv_xname);
    285       1.1   skrll 		return;
    286       1.1   skrll 	}
    287       1.1   skrll 
    288       1.1   skrll 	intrstr = pci_intr_string(sc->sc_pct, ih);
    289       1.1   skrll 	sc->sc_ih = pci_intr_establish(sc->sc_pct, ih, IPL_NET, iwi_intr, sc);
    290       1.1   skrll 	if (sc->sc_ih == NULL) {
    291       1.1   skrll 		aprint_error("%s: could not establish interrupt",
    292       1.1   skrll 		    sc->sc_dev.dv_xname);
    293       1.1   skrll 		if (intrstr != NULL)
    294       1.1   skrll 			aprint_error(" at %s", intrstr);
    295       1.1   skrll 		aprint_error("\n");
    296       1.1   skrll 		return;
    297       1.1   skrll 	}
    298       1.1   skrll 	aprint_normal("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
    299       1.1   skrll 
    300       1.1   skrll 	if (iwi_reset(sc) != 0) {
    301       1.1   skrll 		aprint_error("%s: could not reset adapter\n",
    302       1.1   skrll 		    sc->sc_dev.dv_xname);
    303       1.1   skrll 		return;
    304       1.1   skrll 	}
    305       1.1   skrll 
    306  1.10.2.1    yamt 	/*
    307  1.10.2.1    yamt 	 * Allocate rings.
    308  1.10.2.1    yamt 	 */
    309  1.10.2.1    yamt 	if (iwi_alloc_cmd_ring(sc, &sc->cmdq, IWI_CMD_RING_COUNT) != 0) {
    310  1.10.2.1    yamt 		aprint_error("%s: could not allocate command ring\n",
    311       1.1   skrll 		    sc->sc_dev.dv_xname);
    312  1.10.2.1    yamt 		goto fail;
    313  1.10.2.1    yamt 	}
    314  1.10.2.1    yamt 
    315  1.10.2.1    yamt 	error = iwi_alloc_tx_ring(sc, &sc->txq[0], IWI_TX_RING_COUNT,
    316  1.10.2.1    yamt 	    IWI_CSR_TX1_RIDX, IWI_CSR_TX1_WIDX);
    317  1.10.2.1    yamt 	if (error != 0) {
    318  1.10.2.1    yamt 		aprint_error("%s: could not allocate Tx ring 1\n",
    319  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    320  1.10.2.1    yamt 		goto fail;
    321  1.10.2.1    yamt 	}
    322  1.10.2.1    yamt 
    323  1.10.2.1    yamt 	error = iwi_alloc_tx_ring(sc, &sc->txq[1], IWI_TX_RING_COUNT,
    324  1.10.2.1    yamt 	    IWI_CSR_TX2_RIDX, IWI_CSR_TX2_WIDX);
    325  1.10.2.1    yamt 	if (error != 0) {
    326  1.10.2.1    yamt 		aprint_error("%s: could not allocate Tx ring 2\n",
    327  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    328  1.10.2.1    yamt 		goto fail;
    329  1.10.2.1    yamt 	}
    330  1.10.2.1    yamt 
    331  1.10.2.1    yamt 	error = iwi_alloc_tx_ring(sc, &sc->txq[2], IWI_TX_RING_COUNT,
    332  1.10.2.1    yamt 	    IWI_CSR_TX3_RIDX, IWI_CSR_TX3_WIDX);
    333  1.10.2.1    yamt 	if (error != 0) {
    334  1.10.2.1    yamt 		aprint_error("%s: could not allocate Tx ring 3\n",
    335  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    336  1.10.2.1    yamt 		goto fail;
    337  1.10.2.1    yamt 	}
    338  1.10.2.1    yamt 
    339  1.10.2.1    yamt 	error = iwi_alloc_tx_ring(sc, &sc->txq[3], IWI_TX_RING_COUNT,
    340  1.10.2.1    yamt 	    IWI_CSR_TX4_RIDX, IWI_CSR_TX4_WIDX);
    341  1.10.2.1    yamt 	if (error != 0) {
    342  1.10.2.1    yamt 		aprint_error("%s: could not allocate Tx ring 4\n",
    343  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    344  1.10.2.1    yamt 		goto fail;
    345  1.10.2.1    yamt 	}
    346  1.10.2.1    yamt 
    347  1.10.2.1    yamt 	if (iwi_alloc_rx_ring(sc, &sc->rxq, IWI_RX_RING_COUNT) != 0) {
    348  1.10.2.1    yamt 		aprint_error("%s: could not allocate Rx ring\n",
    349  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    350  1.10.2.1    yamt 		goto fail;
    351       1.1   skrll 	}
    352       1.1   skrll 
    353       1.9  dyoung 	ic->ic_ifp = ifp;
    354  1.10.2.1    yamt 	ic->ic_wme.wme_update = iwi_wme_update;
    355  1.10.2.1    yamt 	ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
    356  1.10.2.1    yamt 	ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
    357       1.1   skrll 	ic->ic_state = IEEE80211_S_INIT;
    358       1.1   skrll 
    359       1.1   skrll 	/* set device capabilities */
    360  1.10.2.1    yamt 	ic->ic_caps =
    361  1.10.2.1    yamt 	    IEEE80211_C_IBSS |		/* IBSS mode supported */
    362  1.10.2.1    yamt 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
    363  1.10.2.1    yamt 	    IEEE80211_C_TXPMGT |	/* tx power management */
    364  1.10.2.1    yamt 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
    365  1.10.2.1    yamt 	    IEEE80211_C_WPA |		/* 802.11i */
    366  1.10.2.1    yamt 	    IEEE80211_C_WME;		/* 802.11e */
    367       1.1   skrll 
    368       1.1   skrll 	/* read MAC address from EEPROM */
    369       1.1   skrll 	val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 0);
    370  1.10.2.1    yamt 	ic->ic_myaddr[0] = val & 0xff;
    371  1.10.2.1    yamt 	ic->ic_myaddr[1] = val >> 8;
    372       1.1   skrll 	val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 1);
    373  1.10.2.1    yamt 	ic->ic_myaddr[2] = val & 0xff;
    374  1.10.2.1    yamt 	ic->ic_myaddr[3] = val >> 8;
    375       1.1   skrll 	val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 2);
    376  1.10.2.1    yamt 	ic->ic_myaddr[4] = val & 0xff;
    377  1.10.2.1    yamt 	ic->ic_myaddr[5] = val >> 8;
    378       1.1   skrll 
    379       1.1   skrll 	aprint_normal("%s: 802.11 address %s\n", sc->sc_dev.dv_xname,
    380       1.1   skrll 	    ether_sprintf(ic->ic_myaddr));
    381       1.1   skrll 
    382  1.10.2.1    yamt 	/* read the NIC type from EEPROM */
    383  1.10.2.1    yamt 	val = iwi_read_prom_word(sc, IWI_EEPROM_NIC_TYPE);
    384  1.10.2.1    yamt 	sc->nictype = val & 0xff;
    385  1.10.2.1    yamt 
    386  1.10.2.1    yamt 	DPRINTF(("%s: NIC type %d\n", sc->sc_dev.dv_xname, sc->nictype));
    387  1.10.2.1    yamt 
    388  1.10.2.1    yamt 	if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 ||
    389  1.10.2.1    yamt 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2) {
    390  1.10.2.1    yamt 		/* set supported .11a rates (2915ABG only) */
    391       1.1   skrll 		ic->ic_sup_rates[IEEE80211_MODE_11A] = iwi_rateset_11a;
    392       1.1   skrll 
    393       1.1   skrll 		/* set supported .11a channels */
    394       1.1   skrll 		for (i = 36; i <= 64; i += 4) {
    395       1.1   skrll 			ic->ic_channels[i].ic_freq =
    396       1.1   skrll 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
    397       1.1   skrll 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
    398       1.1   skrll 		}
    399  1.10.2.1    yamt 		for (i = 149; i <= 165; i += 4) {
    400       1.1   skrll 			ic->ic_channels[i].ic_freq =
    401       1.1   skrll 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
    402       1.1   skrll 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
    403       1.1   skrll 		}
    404       1.1   skrll 	}
    405       1.1   skrll 
    406       1.1   skrll 	/* set supported .11b and .11g rates */
    407       1.1   skrll 	ic->ic_sup_rates[IEEE80211_MODE_11B] = iwi_rateset_11b;
    408       1.1   skrll 	ic->ic_sup_rates[IEEE80211_MODE_11G] = iwi_rateset_11g;
    409       1.1   skrll 
    410       1.1   skrll 	/* set supported .11b and .11g channels (1 through 14) */
    411       1.1   skrll 	for (i = 1; i <= 14; i++) {
    412       1.1   skrll 		ic->ic_channels[i].ic_freq =
    413       1.1   skrll 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
    414       1.1   skrll 		ic->ic_channels[i].ic_flags =
    415       1.1   skrll 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
    416       1.1   skrll 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
    417       1.1   skrll 	}
    418       1.1   skrll 
    419       1.1   skrll 	ifp->if_softc = sc;
    420       1.1   skrll 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    421       1.1   skrll 	ifp->if_init = iwi_init;
    422       1.1   skrll 	ifp->if_stop = iwi_stop;
    423       1.1   skrll 	ifp->if_ioctl = iwi_ioctl;
    424       1.1   skrll 	ifp->if_start = iwi_start;
    425       1.1   skrll 	ifp->if_watchdog = iwi_watchdog;
    426       1.1   skrll 	IFQ_SET_READY(&ifp->if_snd);
    427       1.1   skrll 	memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
    428       1.1   skrll 
    429       1.1   skrll 	if_attach(ifp);
    430       1.9  dyoung 	ieee80211_ifattach(ic);
    431  1.10.2.1    yamt 	/* override default methods */
    432  1.10.2.1    yamt 	ic->ic_node_alloc = iwi_node_alloc;
    433  1.10.2.1    yamt 	sc->sc_node_free = ic->ic_node_free;
    434  1.10.2.1    yamt 	ic->ic_node_free = iwi_node_free;
    435       1.1   skrll 	/* override state transition machine */
    436       1.1   skrll 	sc->sc_newstate = ic->ic_newstate;
    437       1.1   skrll 	ic->ic_newstate = iwi_newstate;
    438       1.9  dyoung 	ieee80211_media_init(ic, iwi_media_change, iwi_media_status);
    439       1.1   skrll 
    440       1.1   skrll #if NBPFILTER > 0
    441       1.1   skrll 	bpfattach2(ifp, DLT_IEEE802_11_RADIO,
    442       1.1   skrll 	    sizeof (struct ieee80211_frame) + 64, &sc->sc_drvbpf);
    443       1.1   skrll 
    444       1.1   skrll 	sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
    445       1.1   skrll 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
    446       1.1   skrll 	sc->sc_rxtap.wr_ihdr.it_present = htole32(IWI_RX_RADIOTAP_PRESENT);
    447       1.1   skrll 
    448       1.1   skrll 	sc->sc_txtap_len = sizeof sc->sc_txtapu;
    449       1.1   skrll 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
    450       1.1   skrll 	sc->sc_txtap.wt_ihdr.it_present = htole32(IWI_TX_RADIOTAP_PRESENT);
    451       1.1   skrll #endif
    452  1.10.2.1    yamt 
    453  1.10.2.1    yamt 	/*
    454  1.10.2.1    yamt 	 * Make sure the interface is shutdown during reboot.
    455  1.10.2.1    yamt 	 */
    456  1.10.2.1    yamt 	sc->sc_sdhook = shutdownhook_establish(iwi_shutdown, sc);
    457  1.10.2.1    yamt 	if (sc->sc_sdhook == NULL)
    458  1.10.2.1    yamt 		aprint_error("%s: WARNING: unable to establish shutdown hook\n",
    459  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    460  1.10.2.1    yamt 	sc->sc_powerhook = powerhook_establish(iwi_powerhook, sc);
    461  1.10.2.1    yamt 	if (sc->sc_powerhook == NULL)
    462  1.10.2.1    yamt 		printf("%s: WARNING: unable to establish power hook\n",
    463  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    464  1.10.2.1    yamt 
    465  1.10.2.1    yamt 	ieee80211_announce(ic);
    466  1.10.2.1    yamt 	/*
    467  1.10.2.1    yamt 	 * Add a few sysctl knobs.
    468  1.10.2.1    yamt 	 * XXX: Not yet.
    469  1.10.2.1    yamt 	 */
    470  1.10.2.1    yamt 	sc->dwelltime = 100;
    471  1.10.2.1    yamt 	sc->bluetooth = 1;
    472  1.10.2.1    yamt 	sc->antenna = 0;
    473  1.10.2.1    yamt 
    474  1.10.2.1    yamt 	return;
    475  1.10.2.1    yamt 
    476  1.10.2.1    yamt fail:	iwi_detach(self, 0);
    477       1.1   skrll }
    478       1.1   skrll 
    479       1.1   skrll static int
    480       1.1   skrll iwi_detach(struct device* self, int flags)
    481       1.1   skrll {
    482       1.1   skrll 	struct iwi_softc *sc = (struct iwi_softc *)self;
    483       1.9  dyoung 	struct ifnet *ifp = &sc->sc_if;
    484       1.1   skrll 
    485  1.10.2.1    yamt 	if (ifp != NULL)
    486  1.10.2.1    yamt 		iwi_stop(ifp, 1);
    487  1.10.2.1    yamt 
    488       1.1   skrll 	iwi_free_firmware(sc);
    489       1.1   skrll 
    490       1.1   skrll #if NBPFILTER > 0
    491  1.10.2.1    yamt 	if (ifp != NULL)
    492  1.10.2.1    yamt 		bpfdetach(ifp);
    493       1.1   skrll #endif
    494       1.9  dyoung 	ieee80211_ifdetach(&sc->sc_ic);
    495  1.10.2.1    yamt 	if (ifp != NULL)
    496  1.10.2.1    yamt 		if_detach(ifp);
    497       1.1   skrll 
    498  1.10.2.1    yamt 	iwi_free_cmd_ring(sc, &sc->cmdq);
    499  1.10.2.1    yamt 	iwi_free_tx_ring(sc, &sc->txq[0]);
    500  1.10.2.1    yamt 	iwi_free_tx_ring(sc, &sc->txq[1]);
    501  1.10.2.1    yamt 	iwi_free_tx_ring(sc, &sc->txq[2]);
    502  1.10.2.1    yamt 	iwi_free_tx_ring(sc, &sc->txq[3]);
    503  1.10.2.1    yamt 	iwi_free_rx_ring(sc, &sc->rxq);
    504       1.1   skrll 
    505       1.1   skrll 	if (sc->sc_ih != NULL) {
    506       1.1   skrll 		pci_intr_disestablish(sc->sc_pct, sc->sc_ih);
    507       1.1   skrll 		sc->sc_ih = NULL;
    508       1.1   skrll 	}
    509       1.1   skrll 
    510       1.1   skrll 	bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_sz);
    511       1.1   skrll 
    512  1.10.2.1    yamt 	powerhook_disestablish(sc->sc_powerhook);
    513  1.10.2.1    yamt 	shutdownhook_disestablish(sc->sc_sdhook);
    514  1.10.2.1    yamt 
    515       1.1   skrll 	return 0;
    516       1.1   skrll }
    517       1.1   skrll 
    518       1.1   skrll static int
    519  1.10.2.1    yamt iwi_alloc_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring,
    520  1.10.2.1    yamt     int count)
    521       1.1   skrll {
    522  1.10.2.1    yamt 	int error, nsegs;
    523  1.10.2.1    yamt 
    524  1.10.2.1    yamt 	ring->count = count;
    525  1.10.2.1    yamt 	ring->queued = 0;
    526  1.10.2.1    yamt 	ring->cur = ring->next = 0;
    527       1.1   skrll 
    528       1.1   skrll 	/*
    529  1.10.2.1    yamt 	 * Allocate and map command ring
    530       1.1   skrll 	 */
    531       1.1   skrll 	error = bus_dmamap_create(sc->sc_dmat,
    532  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE * count, 1,
    533  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE * count, 0,
    534  1.10.2.1    yamt 	    BUS_DMA_NOWAIT, &ring->desc_map);
    535       1.1   skrll 	if (error != 0) {
    536  1.10.2.1    yamt 		aprint_error("%s: could not create command ring DMA map\n",
    537       1.1   skrll 		    sc->sc_dev.dv_xname);
    538       1.1   skrll 		goto fail;
    539       1.1   skrll 	}
    540       1.1   skrll 
    541       1.1   skrll 	error = bus_dmamem_alloc(sc->sc_dmat,
    542  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE * count, PAGE_SIZE, 0,
    543  1.10.2.1    yamt 	    &sc->cmdq.desc_seg, 1, &nsegs, BUS_DMA_NOWAIT);
    544       1.1   skrll 	if (error != 0) {
    545  1.10.2.1    yamt 		aprint_error("%s: could not allocate command ring DMA memory\n",
    546       1.1   skrll 		    sc->sc_dev.dv_xname);
    547       1.1   skrll 		goto fail;
    548       1.1   skrll 	}
    549       1.1   skrll 
    550  1.10.2.1    yamt 	error = bus_dmamem_map(sc->sc_dmat, &sc->cmdq.desc_seg, nsegs,
    551  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE * count,
    552  1.10.2.1    yamt 	    (caddr_t *)&sc->cmdq.desc, BUS_DMA_NOWAIT);
    553       1.1   skrll 	if (error != 0) {
    554  1.10.2.1    yamt 		aprint_error("%s: could not map command ring DMA memory\n",
    555       1.1   skrll 		    sc->sc_dev.dv_xname);
    556       1.1   skrll 		goto fail;
    557       1.1   skrll 	}
    558       1.1   skrll 
    559  1.10.2.1    yamt 	error = bus_dmamap_load(sc->sc_dmat, sc->cmdq.desc_map, sc->cmdq.desc,
    560  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE * count, NULL,
    561       1.1   skrll 	    BUS_DMA_NOWAIT);
    562       1.1   skrll 	if (error != 0) {
    563  1.10.2.1    yamt 		aprint_error("%s: could not load command ring DMA map\n",
    564       1.1   skrll 		    sc->sc_dev.dv_xname);
    565       1.1   skrll 		goto fail;
    566       1.1   skrll 	}
    567       1.1   skrll 
    568  1.10.2.1    yamt 	memset(sc->cmdq.desc, 0,
    569  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE * count);
    570  1.10.2.1    yamt 
    571  1.10.2.1    yamt 	return 0;
    572  1.10.2.1    yamt 
    573  1.10.2.1    yamt fail:	iwi_free_cmd_ring(sc, ring);
    574  1.10.2.1    yamt 	return error;
    575  1.10.2.1    yamt }
    576  1.10.2.1    yamt 
    577  1.10.2.1    yamt static void
    578  1.10.2.1    yamt iwi_reset_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
    579  1.10.2.1    yamt {
    580  1.10.2.1    yamt 	int i;
    581  1.10.2.1    yamt 
    582  1.10.2.1    yamt 	for (i = ring->next; i != ring->cur;) {
    583  1.10.2.1    yamt 		bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
    584  1.10.2.1    yamt 		    i * IWI_CMD_DESC_SIZE, IWI_CMD_DESC_SIZE,
    585  1.10.2.1    yamt 		    BUS_DMASYNC_POSTWRITE);
    586  1.10.2.1    yamt 
    587  1.10.2.1    yamt 		wakeup(&ring->desc[i]);
    588  1.10.2.1    yamt 		i = (i + 1) % ring->count;
    589  1.10.2.1    yamt 	}
    590  1.10.2.1    yamt 
    591  1.10.2.1    yamt 	ring->queued = 0;
    592  1.10.2.1    yamt 	ring->cur = ring->next = 0;
    593  1.10.2.1    yamt }
    594  1.10.2.1    yamt 
    595  1.10.2.1    yamt static void
    596  1.10.2.1    yamt iwi_free_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
    597  1.10.2.1    yamt {
    598  1.10.2.1    yamt 	if (ring->desc_map != NULL) {
    599  1.10.2.1    yamt 		if (ring->desc != NULL) {
    600  1.10.2.1    yamt 			bus_dmamap_unload(sc->sc_dmat, ring->desc_map);
    601  1.10.2.1    yamt 			bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->desc,
    602  1.10.2.1    yamt 			    IWI_CMD_DESC_SIZE * ring->count);
    603  1.10.2.1    yamt 			bus_dmamem_free(sc->sc_dmat, &ring->desc_seg, 1);
    604  1.10.2.1    yamt 		}
    605  1.10.2.1    yamt 		bus_dmamap_destroy(sc->sc_dmat, ring->desc_map);
    606  1.10.2.1    yamt 	}
    607  1.10.2.1    yamt }
    608  1.10.2.1    yamt 
    609  1.10.2.1    yamt static int
    610  1.10.2.1    yamt iwi_alloc_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring,
    611  1.10.2.1    yamt     int count, bus_addr_t csr_ridx, bus_addr_t csr_widx)
    612  1.10.2.1    yamt {
    613  1.10.2.1    yamt 	int i, error, nsegs;
    614  1.10.2.1    yamt 
    615  1.10.2.1    yamt 	ring->count = count;
    616  1.10.2.1    yamt 	ring->queued = 0;
    617  1.10.2.1    yamt 	ring->cur = ring->next = 0;
    618  1.10.2.1    yamt 	ring->csr_ridx = csr_ridx;
    619  1.10.2.1    yamt 	ring->csr_widx = csr_widx;
    620       1.1   skrll 
    621       1.1   skrll 	/*
    622  1.10.2.1    yamt 	 * Allocate and map Tx ring
    623       1.1   skrll 	 */
    624       1.1   skrll 	error = bus_dmamap_create(sc->sc_dmat,
    625  1.10.2.1    yamt 	    IWI_TX_DESC_SIZE * count, 1,
    626  1.10.2.1    yamt 	    IWI_TX_DESC_SIZE * count, 0, BUS_DMA_NOWAIT,
    627  1.10.2.1    yamt 	    &ring->desc_map);
    628       1.1   skrll 	if (error != 0) {
    629  1.10.2.1    yamt 		aprint_error("%s: could not create tx ring DMA map\n",
    630       1.1   skrll 		    sc->sc_dev.dv_xname);
    631       1.1   skrll 		goto fail;
    632       1.1   skrll 	}
    633       1.1   skrll 
    634       1.1   skrll 	error = bus_dmamem_alloc(sc->sc_dmat,
    635  1.10.2.1    yamt 	    IWI_TX_DESC_SIZE * count, PAGE_SIZE, 0,
    636  1.10.2.1    yamt 	    &ring->desc_seg, 1, &nsegs, BUS_DMA_NOWAIT);
    637       1.1   skrll 	if (error != 0) {
    638  1.10.2.1    yamt 		aprint_error("%s: could not allocate tx ring DMA memory\n",
    639       1.1   skrll 		    sc->sc_dev.dv_xname);
    640       1.1   skrll 		goto fail;
    641       1.1   skrll 	}
    642       1.1   skrll 
    643  1.10.2.1    yamt 	error = bus_dmamem_map(sc->sc_dmat, &ring->desc_seg, nsegs,
    644  1.10.2.1    yamt 	    IWI_TX_DESC_SIZE * count,
    645  1.10.2.1    yamt 	    (caddr_t *)&ring->desc, BUS_DMA_NOWAIT);
    646       1.1   skrll 	if (error != 0) {
    647  1.10.2.1    yamt 		aprint_error("%s: could not map tx ring DMA memory\n",
    648       1.1   skrll 		    sc->sc_dev.dv_xname);
    649       1.1   skrll 		goto fail;
    650       1.1   skrll 	}
    651       1.1   skrll 
    652  1.10.2.1    yamt 	error = bus_dmamap_load(sc->sc_dmat, ring->desc_map, ring->desc,
    653  1.10.2.1    yamt 	    IWI_TX_DESC_SIZE * count, NULL,
    654       1.1   skrll 	    BUS_DMA_NOWAIT);
    655       1.1   skrll 	if (error != 0) {
    656  1.10.2.1    yamt 		aprint_error("%s: could not load tx ring DMA map\n",
    657       1.1   skrll 		    sc->sc_dev.dv_xname);
    658       1.1   skrll 		goto fail;
    659       1.1   skrll 	}
    660       1.1   skrll 
    661  1.10.2.1    yamt 	memset(ring->desc, 0, IWI_TX_DESC_SIZE * count);
    662  1.10.2.1    yamt 
    663  1.10.2.1    yamt 	ring->data = malloc(count * sizeof (struct iwi_tx_data), M_DEVBUF,
    664  1.10.2.1    yamt 	    M_NOWAIT | M_ZERO);
    665  1.10.2.1    yamt 	if (ring->data == NULL) {
    666  1.10.2.1    yamt 		aprint_error("%s: could not allocate soft data\n",
    667  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    668  1.10.2.1    yamt 		error = ENOMEM;
    669  1.10.2.1    yamt 		goto fail;
    670  1.10.2.1    yamt 	}
    671       1.1   skrll 
    672       1.1   skrll 	/*
    673       1.1   skrll 	 * Allocate Tx buffers DMA maps
    674       1.1   skrll 	 */
    675  1.10.2.1    yamt 	for (i = 0; i < count; i++) {
    676       1.1   skrll 		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, IWI_MAX_NSEG,
    677  1.10.2.1    yamt 		    MCLBYTES, 0, BUS_DMA_NOWAIT, &ring->data[i].map);
    678       1.1   skrll 		if (error != 0) {
    679       1.1   skrll 			aprint_error("%s: could not create tx buf DMA map",
    680       1.1   skrll 			    sc->sc_dev.dv_xname);
    681       1.1   skrll 			goto fail;
    682       1.1   skrll 		}
    683       1.1   skrll 	}
    684  1.10.2.1    yamt 	return 0;
    685  1.10.2.1    yamt 
    686  1.10.2.1    yamt fail:	iwi_free_tx_ring(sc, ring);
    687  1.10.2.1    yamt 	return error;
    688  1.10.2.1    yamt }
    689  1.10.2.1    yamt 
    690  1.10.2.1    yamt static void
    691  1.10.2.1    yamt iwi_reset_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
    692  1.10.2.1    yamt {
    693  1.10.2.1    yamt 	struct iwi_tx_data *data;
    694  1.10.2.1    yamt 	int i;
    695  1.10.2.1    yamt 
    696  1.10.2.1    yamt 	for (i = 0; i < ring->count; i++) {
    697  1.10.2.1    yamt 		data = &ring->data[i];
    698  1.10.2.1    yamt 
    699  1.10.2.1    yamt 		if (data->m != NULL) {
    700  1.10.2.1    yamt 			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
    701  1.10.2.1    yamt 			    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
    702  1.10.2.1    yamt 			bus_dmamap_unload(sc->sc_dmat, data->map);
    703  1.10.2.1    yamt 			m_freem(data->m);
    704  1.10.2.1    yamt 			data->m = NULL;
    705  1.10.2.1    yamt 		}
    706  1.10.2.1    yamt 
    707  1.10.2.1    yamt 		if (data->ni != NULL) {
    708  1.10.2.1    yamt 			ieee80211_free_node(data->ni);
    709  1.10.2.1    yamt 			data->ni = NULL;
    710  1.10.2.1    yamt 		}
    711  1.10.2.1    yamt 	}
    712  1.10.2.1    yamt 
    713  1.10.2.1    yamt 	ring->queued = 0;
    714  1.10.2.1    yamt 	ring->cur = ring->next = 0;
    715  1.10.2.1    yamt }
    716  1.10.2.1    yamt 
    717  1.10.2.1    yamt static void
    718  1.10.2.1    yamt iwi_free_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
    719  1.10.2.1    yamt {
    720  1.10.2.1    yamt 	int i;
    721  1.10.2.1    yamt 
    722  1.10.2.1    yamt 	if (ring->desc_map != NULL) {
    723  1.10.2.1    yamt 		if (ring->desc != NULL) {
    724  1.10.2.1    yamt 			bus_dmamap_unload(sc->sc_dmat, ring->desc_map);
    725  1.10.2.1    yamt 			bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->desc,
    726  1.10.2.1    yamt 			    IWI_TX_DESC_SIZE * ring->count);
    727  1.10.2.1    yamt 			bus_dmamem_free(sc->sc_dmat, &ring->desc_seg, 1);
    728  1.10.2.1    yamt 		}
    729  1.10.2.1    yamt 		bus_dmamap_destroy(sc->sc_dmat, ring->desc_map);
    730  1.10.2.1    yamt 	}
    731  1.10.2.1    yamt 
    732  1.10.2.1    yamt 	for (i = 0; i < ring->count; i++) {
    733  1.10.2.1    yamt 		if (ring->data[i].m != NULL) {
    734  1.10.2.1    yamt 			bus_dmamap_unload(sc->sc_dmat, ring->data[i].map);
    735  1.10.2.1    yamt 			m_freem(ring->data[i].m);
    736  1.10.2.1    yamt 		}
    737  1.10.2.1    yamt 		bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map);
    738  1.10.2.1    yamt 	}
    739  1.10.2.1    yamt }
    740  1.10.2.1    yamt 
    741  1.10.2.1    yamt static int
    742  1.10.2.1    yamt iwi_alloc_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring,
    743  1.10.2.1    yamt     int count)
    744  1.10.2.1    yamt {
    745  1.10.2.1    yamt 	int i, error;
    746  1.10.2.1    yamt 
    747  1.10.2.1    yamt 	ring->count = count;
    748  1.10.2.1    yamt 	ring->cur = 0;
    749  1.10.2.1    yamt 
    750  1.10.2.1    yamt 	ring->data = malloc(count * sizeof (struct iwi_rx_data), M_DEVBUF,
    751  1.10.2.1    yamt 	    M_NOWAIT | M_ZERO);
    752  1.10.2.1    yamt 	if (ring->data == NULL) {
    753  1.10.2.1    yamt 		aprint_error("%s: could not allocate soft data\n",
    754  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
    755  1.10.2.1    yamt 		error = ENOMEM;
    756  1.10.2.1    yamt 		goto fail;
    757  1.10.2.1    yamt 	}
    758       1.1   skrll 
    759       1.1   skrll 	/*
    760       1.1   skrll 	 * Allocate and map Rx buffers
    761       1.1   skrll 	 */
    762  1.10.2.1    yamt 	for (i = 0; i < count; i++) {
    763       1.1   skrll 
    764       1.1   skrll 		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
    765  1.10.2.1    yamt 		    0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &ring->data[i].map);
    766       1.1   skrll 		if (error != 0) {
    767       1.1   skrll 			aprint_error("%s: could not create rx buf DMA map",
    768       1.1   skrll 			    sc->sc_dev.dv_xname);
    769       1.1   skrll 			goto fail;
    770       1.1   skrll 		}
    771       1.1   skrll 
    772  1.10.2.1    yamt 		if ((ring->data[i].m = iwi_alloc_rx_buf(sc)) == NULL) {
    773       1.1   skrll 			error = ENOMEM;
    774       1.1   skrll 			goto fail;
    775       1.1   skrll 		}
    776       1.1   skrll 
    777  1.10.2.1    yamt 		error = bus_dmamap_load_mbuf(sc->sc_dmat, ring->data[i].map,
    778  1.10.2.1    yamt 		    ring->data[i].m, BUS_DMA_READ | BUS_DMA_NOWAIT);
    779       1.1   skrll 		if (error != 0) {
    780       1.1   skrll 			aprint_error("%s: could not load rx buffer DMA map\n",
    781       1.1   skrll 			    sc->sc_dev.dv_xname);
    782       1.1   skrll 			goto fail;
    783       1.1   skrll 		}
    784  1.10.2.1    yamt 
    785  1.10.2.1    yamt 		bus_dmamap_sync(sc->sc_dmat, ring->data[i].map, 0,
    786  1.10.2.1    yamt 		    ring->data[i].map->dm_mapsize, BUS_DMASYNC_PREREAD);
    787       1.1   skrll 	}
    788       1.1   skrll 
    789       1.1   skrll 	return 0;
    790       1.1   skrll 
    791  1.10.2.1    yamt fail:	iwi_free_rx_ring(sc, ring);
    792       1.1   skrll 	return error;
    793       1.1   skrll }
    794       1.1   skrll 
    795       1.1   skrll static void
    796  1.10.2.1    yamt iwi_reset_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
    797  1.10.2.1    yamt {
    798  1.10.2.1    yamt 	ring->cur = 0;
    799  1.10.2.1    yamt }
    800  1.10.2.1    yamt 
    801  1.10.2.1    yamt static void
    802  1.10.2.1    yamt iwi_free_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
    803       1.1   skrll {
    804       1.1   skrll 	int i;
    805       1.1   skrll 
    806  1.10.2.1    yamt 	for (i = 0; i < ring->count; i++) {
    807  1.10.2.1    yamt 		if (ring->data[i].m != NULL) {
    808  1.10.2.1    yamt 			bus_dmamap_unload(sc->sc_dmat, ring->data[i].map);
    809  1.10.2.1    yamt 			m_freem(ring->data[i].m);
    810       1.1   skrll 		}
    811  1.10.2.1    yamt 		bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map);
    812       1.1   skrll 	}
    813  1.10.2.1    yamt }
    814       1.1   skrll 
    815  1.10.2.1    yamt static void
    816  1.10.2.1    yamt iwi_shutdown(void *arg)
    817  1.10.2.1    yamt {
    818  1.10.2.1    yamt 	struct iwi_softc *sc = (struct iwi_softc *)arg;
    819  1.10.2.1    yamt 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
    820       1.1   skrll 
    821  1.10.2.1    yamt 	iwi_stop(ifp, 1);
    822  1.10.2.1    yamt }
    823  1.10.2.1    yamt 
    824  1.10.2.1    yamt static int
    825  1.10.2.1    yamt iwi_suspend(struct iwi_softc *sc)
    826  1.10.2.1    yamt {
    827  1.10.2.1    yamt 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
    828  1.10.2.1    yamt 
    829  1.10.2.1    yamt 	iwi_stop(ifp, 1);
    830  1.10.2.1    yamt 
    831  1.10.2.1    yamt 	return 0;
    832  1.10.2.1    yamt }
    833  1.10.2.1    yamt 
    834  1.10.2.1    yamt static int
    835  1.10.2.1    yamt iwi_resume(struct iwi_softc *sc)
    836  1.10.2.1    yamt {
    837  1.10.2.1    yamt 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
    838  1.10.2.1    yamt 	pcireg_t data;
    839  1.10.2.1    yamt 
    840  1.10.2.1    yamt 	/* clear device specific PCI configuration register 0x41 */
    841  1.10.2.1    yamt 	data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
    842  1.10.2.1    yamt 	data &= ~0x0000ff00;
    843  1.10.2.1    yamt 	pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data);
    844  1.10.2.1    yamt 
    845  1.10.2.1    yamt 	if (ifp->if_flags & IFF_UP) {
    846  1.10.2.1    yamt 		iwi_init(ifp);
    847  1.10.2.1    yamt 		if (ifp->if_flags & IFF_RUNNING)
    848  1.10.2.1    yamt 			iwi_start(ifp);
    849       1.1   skrll 	}
    850       1.1   skrll 
    851  1.10.2.1    yamt 	return 0;
    852  1.10.2.1    yamt }
    853  1.10.2.1    yamt 
    854  1.10.2.1    yamt static void
    855  1.10.2.1    yamt iwi_powerhook(int why, void *arg)
    856  1.10.2.1    yamt {
    857  1.10.2.1    yamt         struct iwi_softc *sc = arg;
    858  1.10.2.1    yamt 	pci_chipset_tag_t pc = sc->sc_pct;
    859  1.10.2.1    yamt 	pcitag_t tag = sc->sc_pcitag;
    860  1.10.2.1    yamt 	int s;
    861  1.10.2.1    yamt 
    862  1.10.2.1    yamt 	s = splnet();
    863  1.10.2.1    yamt 	switch (why) {
    864  1.10.2.1    yamt 	case PWR_SUSPEND:
    865  1.10.2.1    yamt 	case PWR_STANDBY:
    866  1.10.2.1    yamt 		pci_conf_capture(pc, tag, &sc->sc_pciconf);
    867  1.10.2.1    yamt 		break;
    868  1.10.2.1    yamt 	case PWR_RESUME:
    869  1.10.2.1    yamt 		pci_conf_restore(pc, tag, &sc->sc_pciconf);
    870  1.10.2.1    yamt 		break;
    871  1.10.2.1    yamt 	case PWR_SOFTSUSPEND:
    872  1.10.2.1    yamt 	case PWR_SOFTSTANDBY:
    873  1.10.2.1    yamt 		iwi_suspend(sc);
    874  1.10.2.1    yamt 		break;
    875  1.10.2.1    yamt 	case PWR_SOFTRESUME:
    876  1.10.2.1    yamt 		iwi_resume(sc);
    877  1.10.2.1    yamt 		break;
    878       1.1   skrll 	}
    879  1.10.2.1    yamt 	splx(s);
    880  1.10.2.1    yamt }
    881  1.10.2.1    yamt 
    882  1.10.2.1    yamt static struct ieee80211_node *
    883  1.10.2.1    yamt iwi_node_alloc(struct ieee80211_node_table *nt)
    884  1.10.2.1    yamt {
    885  1.10.2.1    yamt 	struct iwi_node *in;
    886  1.10.2.1    yamt 
    887  1.10.2.1    yamt 	in = malloc(sizeof (struct iwi_node), M_80211_NODE, M_NOWAIT | M_ZERO);
    888  1.10.2.1    yamt 	if (in == NULL)
    889  1.10.2.1    yamt 		return NULL;
    890  1.10.2.1    yamt 
    891  1.10.2.1    yamt 	in->in_station = -1;
    892  1.10.2.1    yamt 
    893  1.10.2.1    yamt 	return &in->in_node;
    894       1.1   skrll }
    895       1.1   skrll 
    896       1.1   skrll static int
    897  1.10.2.1    yamt iwi_alloc_unr(struct iwi_softc *sc)
    898  1.10.2.1    yamt {
    899  1.10.2.1    yamt 	int i;
    900  1.10.2.1    yamt 
    901  1.10.2.1    yamt 	for (i = 0; i < IWI_MAX_IBSSNODE - 1; i++)
    902  1.10.2.1    yamt 		if ((sc->sc_unr & (1 << i)) == 0) {
    903  1.10.2.1    yamt 			sc->sc_unr |= 1 << i;
    904  1.10.2.1    yamt 			return i;
    905  1.10.2.1    yamt 		}
    906  1.10.2.1    yamt 
    907  1.10.2.1    yamt 	return -1;
    908  1.10.2.1    yamt }
    909  1.10.2.1    yamt 
    910  1.10.2.1    yamt static void
    911  1.10.2.1    yamt iwi_free_unr(struct iwi_softc *sc, int r)
    912  1.10.2.1    yamt {
    913  1.10.2.1    yamt 
    914  1.10.2.1    yamt 	sc->sc_unr &= 1 << r;
    915  1.10.2.1    yamt }
    916  1.10.2.1    yamt 
    917  1.10.2.1    yamt static void
    918  1.10.2.1    yamt iwi_node_free(struct ieee80211_node *ni)
    919      1.10  dyoung {
    920  1.10.2.1    yamt 	struct ieee80211com *ic = ni->ni_ic;
    921  1.10.2.1    yamt 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
    922  1.10.2.1    yamt 	struct iwi_node *in = (struct iwi_node *)ni;
    923  1.10.2.1    yamt 
    924  1.10.2.1    yamt 	if (in->in_station != -1)
    925  1.10.2.1    yamt 		iwi_free_unr(sc, in->in_station);
    926      1.10  dyoung 
    927  1.10.2.1    yamt 	sc->sc_node_free(ni);
    928      1.10  dyoung }
    929      1.10  dyoung 
    930      1.10  dyoung static int
    931       1.1   skrll iwi_media_change(struct ifnet *ifp)
    932       1.1   skrll {
    933       1.1   skrll 	int error;
    934       1.1   skrll 
    935       1.1   skrll 	error = ieee80211_media_change(ifp);
    936       1.1   skrll 	if (error != ENETRESET)
    937       1.1   skrll 		return error;
    938       1.1   skrll 
    939       1.1   skrll 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
    940       1.1   skrll 		iwi_init(ifp);
    941       1.1   skrll 
    942       1.1   skrll 	return 0;
    943       1.1   skrll }
    944       1.1   skrll 
    945  1.10.2.1    yamt /*
    946  1.10.2.1    yamt  * The firmware automatically adapts the transmit speed.  We report its current
    947  1.10.2.1    yamt  * value here.
    948  1.10.2.1    yamt  */
    949       1.1   skrll static void
    950       1.1   skrll iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
    951       1.1   skrll {
    952       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
    953       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
    954       1.1   skrll #define N(a)	(sizeof (a) / sizeof (a[0]))
    955       1.1   skrll 	static const struct {
    956  1.10.2.1    yamt 		uint32_t	val;
    957       1.1   skrll 		int		rate;
    958       1.1   skrll 	} rates[] = {
    959       1.1   skrll 		{ IWI_RATE_DS1,      2 },
    960       1.1   skrll 		{ IWI_RATE_DS2,      4 },
    961       1.1   skrll 		{ IWI_RATE_DS5,     11 },
    962       1.1   skrll 		{ IWI_RATE_DS11,    22 },
    963       1.1   skrll 		{ IWI_RATE_OFDM6,   12 },
    964       1.1   skrll 		{ IWI_RATE_OFDM9,   18 },
    965       1.1   skrll 		{ IWI_RATE_OFDM12,  24 },
    966       1.1   skrll 		{ IWI_RATE_OFDM18,  36 },
    967       1.1   skrll 		{ IWI_RATE_OFDM24,  48 },
    968       1.1   skrll 		{ IWI_RATE_OFDM36,  72 },
    969       1.1   skrll 		{ IWI_RATE_OFDM48,  96 },
    970       1.1   skrll 		{ IWI_RATE_OFDM54, 108 },
    971       1.1   skrll 	};
    972  1.10.2.1    yamt 	uint32_t val;
    973       1.1   skrll 	int rate, i;
    974       1.1   skrll 
    975       1.1   skrll 	imr->ifm_status = IFM_AVALID;
    976       1.1   skrll 	imr->ifm_active = IFM_IEEE80211;
    977       1.1   skrll 	if (ic->ic_state == IEEE80211_S_RUN)
    978       1.1   skrll 		imr->ifm_status |= IFM_ACTIVE;
    979       1.1   skrll 
    980       1.1   skrll 	/* read current transmission rate from adapter */
    981       1.1   skrll 	val = CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE);
    982       1.1   skrll 
    983       1.1   skrll 	/* convert rate to 802.11 rate */
    984       1.1   skrll 	for (i = 0; i < N(rates) && rates[i].val != val; i++);
    985       1.1   skrll 	rate = (i < N(rates)) ? rates[i].rate : 0;
    986       1.1   skrll 
    987       1.1   skrll 	imr->ifm_active |= ieee80211_rate2media(ic, rate, ic->ic_curmode);
    988       1.1   skrll 	switch (ic->ic_opmode) {
    989       1.1   skrll 	case IEEE80211_M_STA:
    990       1.1   skrll 		break;
    991       1.1   skrll 
    992       1.1   skrll 	case IEEE80211_M_IBSS:
    993       1.1   skrll 		imr->ifm_active |= IFM_IEEE80211_ADHOC;
    994       1.1   skrll 		break;
    995       1.1   skrll 
    996       1.1   skrll 	case IEEE80211_M_MONITOR:
    997       1.1   skrll 		imr->ifm_active |= IFM_IEEE80211_MONITOR;
    998       1.1   skrll 		break;
    999       1.1   skrll 
   1000       1.1   skrll 	case IEEE80211_M_AHDEMO:
   1001       1.1   skrll 	case IEEE80211_M_HOSTAP:
   1002       1.1   skrll 		/* should not get there */
   1003       1.1   skrll 		break;
   1004       1.1   skrll 	}
   1005       1.1   skrll #undef N
   1006       1.1   skrll }
   1007       1.1   skrll 
   1008       1.1   skrll static int
   1009       1.1   skrll iwi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
   1010       1.1   skrll {
   1011       1.9  dyoung 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
   1012       1.1   skrll 
   1013       1.1   skrll 	switch (nstate) {
   1014       1.1   skrll 	case IEEE80211_S_SCAN:
   1015  1.10.2.1    yamt 		if (sc->flags & IWI_FLAG_SCANNING)
   1016  1.10.2.1    yamt 			break;
   1017  1.10.2.1    yamt 
   1018  1.10.2.1    yamt 		ieee80211_node_table_reset(&ic->ic_scan);
   1019  1.10.2.1    yamt 		ic->ic_flags |= IEEE80211_F_SCAN | IEEE80211_F_ASCAN;
   1020  1.10.2.1    yamt 		sc->flags |= IWI_FLAG_SCANNING;
   1021  1.10.2.1    yamt 		/* blink the led while scanning */
   1022  1.10.2.1    yamt 		iwi_led_set(sc, IWI_LED_ASSOCIATED, 1);
   1023       1.1   skrll 		iwi_scan(sc);
   1024       1.1   skrll 		break;
   1025       1.1   skrll 
   1026       1.1   skrll 	case IEEE80211_S_AUTH:
   1027       1.1   skrll 		iwi_auth_and_assoc(sc);
   1028       1.1   skrll 		break;
   1029       1.1   skrll 
   1030       1.1   skrll 	case IEEE80211_S_RUN:
   1031       1.1   skrll 		if (ic->ic_opmode == IEEE80211_M_IBSS)
   1032       1.1   skrll 			ieee80211_new_state(ic, IEEE80211_S_AUTH, -1);
   1033       1.8  sekiya 		else if (ic->ic_opmode == IEEE80211_M_MONITOR)
   1034       1.8  sekiya 			iwi_set_chan(sc, ic->ic_ibss_chan);
   1035  1.10.2.1    yamt 
   1036  1.10.2.1    yamt 		return (*sc->sc_newstate)(ic, nstate,
   1037  1.10.2.1    yamt 		    IEEE80211_FC0_SUBTYPE_ASSOC_RESP);
   1038       1.1   skrll 
   1039       1.1   skrll 	case IEEE80211_S_ASSOC:
   1040  1.10.2.1    yamt 		iwi_led_set(sc, IWI_LED_ASSOCIATED, 0);
   1041       1.1   skrll 		break;
   1042  1.10.2.1    yamt 
   1043  1.10.2.1    yamt 	case IEEE80211_S_INIT:
   1044  1.10.2.1    yamt 		sc->flags &= ~IWI_FLAG_SCANNING;
   1045  1.10.2.1    yamt 		return (*sc->sc_newstate)(ic, nstate, arg);
   1046       1.1   skrll 	}
   1047       1.1   skrll 
   1048       1.1   skrll 	ic->ic_state = nstate;
   1049       1.1   skrll 	return 0;
   1050       1.1   skrll }
   1051       1.1   skrll 
   1052       1.1   skrll /*
   1053  1.10.2.1    yamt  * WME parameters coming from IEEE 802.11e specification.  These values are
   1054  1.10.2.1    yamt  * already declared in ieee80211_proto.c, but they are static so they can't
   1055  1.10.2.1    yamt  * be reused here.
   1056  1.10.2.1    yamt  */
   1057  1.10.2.1    yamt static const struct wmeParams iwi_wme_cck_params[WME_NUM_AC] = {
   1058  1.10.2.1    yamt 	{ 0, 3, 5,  7,   0 },	/* WME_AC_BE */
   1059  1.10.2.1    yamt 	{ 0, 3, 5, 10,   0 },	/* WME_AC_BK */
   1060  1.10.2.1    yamt 	{ 0, 2, 4,  5, 188 },	/* WME_AC_VI */
   1061  1.10.2.1    yamt 	{ 0, 2, 3,  4, 102 }	/* WME_AC_VO */
   1062  1.10.2.1    yamt };
   1063  1.10.2.1    yamt 
   1064  1.10.2.1    yamt static const struct wmeParams iwi_wme_ofdm_params[WME_NUM_AC] = {
   1065  1.10.2.1    yamt 	{ 0, 3, 4,  6,   0 },	/* WME_AC_BE */
   1066  1.10.2.1    yamt 	{ 0, 3, 4, 10,   0 },	/* WME_AC_BK */
   1067  1.10.2.1    yamt 	{ 0, 2, 3,  4,  94 },	/* WME_AC_VI */
   1068  1.10.2.1    yamt 	{ 0, 2, 2,  3,  47 }	/* WME_AC_VO */
   1069  1.10.2.1    yamt };
   1070  1.10.2.1    yamt 
   1071  1.10.2.1    yamt static int
   1072  1.10.2.1    yamt iwi_wme_update(struct ieee80211com *ic)
   1073  1.10.2.1    yamt {
   1074  1.10.2.1    yamt #define IWI_EXP2(v)	htole16((1 << (v)) - 1)
   1075  1.10.2.1    yamt #define IWI_USEC(v)	htole16(IEEE80211_TXOP_TO_US(v))
   1076  1.10.2.1    yamt 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
   1077  1.10.2.1    yamt 	struct iwi_wme_params wme[3];
   1078  1.10.2.1    yamt 	const struct wmeParams *wmep;
   1079  1.10.2.1    yamt 	int ac;
   1080  1.10.2.1    yamt 
   1081  1.10.2.1    yamt 	/*
   1082  1.10.2.1    yamt 	 * We shall not override firmware default WME values if WME is not
   1083  1.10.2.1    yamt 	 * actually enabled.
   1084  1.10.2.1    yamt 	 */
   1085  1.10.2.1    yamt 	if (!(ic->ic_flags & IEEE80211_F_WME))
   1086  1.10.2.1    yamt 		return 0;
   1087  1.10.2.1    yamt 
   1088  1.10.2.1    yamt 	for (ac = 0; ac < WME_NUM_AC; ac++) {
   1089  1.10.2.1    yamt 		/* set WME values for current operating mode */
   1090  1.10.2.1    yamt 		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
   1091  1.10.2.1    yamt 		wme[0].aifsn[ac] = wmep->wmep_aifsn;
   1092  1.10.2.1    yamt 		wme[0].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
   1093  1.10.2.1    yamt 		wme[0].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
   1094  1.10.2.1    yamt 		wme[0].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
   1095  1.10.2.1    yamt 		wme[0].acm[ac]   = wmep->wmep_acm;
   1096  1.10.2.1    yamt 
   1097  1.10.2.1    yamt 		/* set WME values for CCK modulation */
   1098  1.10.2.1    yamt 		wmep = &iwi_wme_cck_params[ac];
   1099  1.10.2.1    yamt 		wme[1].aifsn[ac] = wmep->wmep_aifsn;
   1100  1.10.2.1    yamt 		wme[1].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
   1101  1.10.2.1    yamt 		wme[1].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
   1102  1.10.2.1    yamt 		wme[1].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
   1103  1.10.2.1    yamt 		wme[1].acm[ac]   = wmep->wmep_acm;
   1104  1.10.2.1    yamt 
   1105  1.10.2.1    yamt 		/* set WME values for OFDM modulation */
   1106  1.10.2.1    yamt 		wmep = &iwi_wme_ofdm_params[ac];
   1107  1.10.2.1    yamt 		wme[2].aifsn[ac] = wmep->wmep_aifsn;
   1108  1.10.2.1    yamt 		wme[2].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
   1109  1.10.2.1    yamt 		wme[2].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
   1110  1.10.2.1    yamt 		wme[2].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
   1111  1.10.2.1    yamt 		wme[2].acm[ac]   = wmep->wmep_acm;
   1112  1.10.2.1    yamt 	}
   1113  1.10.2.1    yamt 
   1114  1.10.2.1    yamt 	DPRINTF(("Setting WME parameters\n"));
   1115  1.10.2.1    yamt 	return iwi_cmd(sc, IWI_CMD_SET_WME_PARAMS, wme, sizeof wme, 1);
   1116  1.10.2.1    yamt #undef IWI_USEC
   1117  1.10.2.1    yamt #undef IWI_EXP2
   1118  1.10.2.1    yamt }
   1119  1.10.2.1    yamt 
   1120  1.10.2.1    yamt /*
   1121       1.1   skrll  * Read 16 bits at address 'addr' from the serial EEPROM.
   1122       1.1   skrll  */
   1123  1.10.2.1    yamt static uint16_t
   1124  1.10.2.1    yamt iwi_read_prom_word(struct iwi_softc *sc, uint8_t addr)
   1125       1.1   skrll {
   1126  1.10.2.1    yamt 	uint32_t tmp;
   1127  1.10.2.1    yamt 	uint16_t val;
   1128       1.1   skrll 	int n;
   1129       1.1   skrll 
   1130       1.1   skrll 	/* Clock C once before the first command */
   1131       1.1   skrll 	IWI_EEPROM_CTL(sc, 0);
   1132       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
   1133       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
   1134       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
   1135       1.1   skrll 
   1136       1.1   skrll 	/* Write start bit (1) */
   1137       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
   1138       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
   1139       1.1   skrll 
   1140       1.1   skrll 	/* Write READ opcode (10) */
   1141       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
   1142       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
   1143       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
   1144       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
   1145       1.1   skrll 
   1146       1.1   skrll 	/* Write address A7-A0 */
   1147       1.1   skrll 	for (n = 7; n >= 0; n--) {
   1148       1.1   skrll 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
   1149       1.1   skrll 		    (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D));
   1150       1.1   skrll 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
   1151       1.1   skrll 		    (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D) | IWI_EEPROM_C);
   1152       1.1   skrll 	}
   1153       1.1   skrll 
   1154       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
   1155       1.1   skrll 
   1156       1.1   skrll 	/* Read data Q15-Q0 */
   1157       1.1   skrll 	val = 0;
   1158       1.1   skrll 	for (n = 15; n >= 0; n--) {
   1159       1.1   skrll 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
   1160       1.1   skrll 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
   1161       1.1   skrll 		tmp = MEM_READ_4(sc, IWI_MEM_EEPROM_CTL);
   1162       1.1   skrll 		val |= ((tmp & IWI_EEPROM_Q) >> IWI_EEPROM_SHIFT_Q) << n;
   1163       1.1   skrll 	}
   1164       1.1   skrll 
   1165       1.1   skrll 	IWI_EEPROM_CTL(sc, 0);
   1166       1.1   skrll 
   1167       1.1   skrll 	/* Clear Chip Select and clock C */
   1168       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
   1169       1.1   skrll 	IWI_EEPROM_CTL(sc, 0);
   1170       1.1   skrll 	IWI_EEPROM_CTL(sc, IWI_EEPROM_C);
   1171       1.1   skrll 
   1172  1.10.2.1    yamt 	return val;
   1173       1.1   skrll }
   1174       1.1   skrll 
   1175       1.1   skrll /*
   1176       1.1   skrll  * XXX: Hack to set the current channel to the value advertised in beacons or
   1177       1.1   skrll  * probe responses. Only used during AP detection.
   1178       1.1   skrll  */
   1179       1.1   skrll static void
   1180       1.1   skrll iwi_fix_channel(struct ieee80211com *ic, struct mbuf *m)
   1181       1.1   skrll {
   1182       1.1   skrll 	struct ieee80211_frame *wh;
   1183  1.10.2.1    yamt 	uint8_t subtype;
   1184  1.10.2.1    yamt 	uint8_t *frm, *efrm;
   1185       1.1   skrll 
   1186       1.1   skrll 	wh = mtod(m, struct ieee80211_frame *);
   1187       1.1   skrll 
   1188       1.1   skrll 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_MGT)
   1189       1.1   skrll 		return;
   1190       1.1   skrll 
   1191       1.1   skrll 	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
   1192       1.1   skrll 
   1193       1.1   skrll 	if (subtype != IEEE80211_FC0_SUBTYPE_BEACON &&
   1194       1.1   skrll 	    subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
   1195       1.1   skrll 		return;
   1196       1.1   skrll 
   1197  1.10.2.1    yamt 	frm = (uint8_t *)(wh + 1);
   1198  1.10.2.1    yamt 	efrm = mtod(m, uint8_t *) + m->m_len;
   1199       1.1   skrll 
   1200       1.1   skrll 	frm += 12;	/* skip tstamp, bintval and capinfo fields */
   1201       1.1   skrll 	while (frm < efrm) {
   1202       1.1   skrll 		if (*frm == IEEE80211_ELEMID_DSPARMS)
   1203       1.1   skrll #if IEEE80211_CHAN_MAX < 255
   1204       1.1   skrll 		if (frm[2] <= IEEE80211_CHAN_MAX)
   1205       1.1   skrll #endif
   1206  1.10.2.1    yamt 			ic->ic_curchan = &ic->ic_channels[frm[2]];
   1207  1.10.2.1    yamt 
   1208  1.10.2.1    yamt 		frm += frm[1] + 2;
   1209  1.10.2.1    yamt 	}
   1210  1.10.2.1    yamt }
   1211  1.10.2.1    yamt 
   1212  1.10.2.1    yamt static struct mbuf *
   1213  1.10.2.1    yamt iwi_alloc_rx_buf(struct iwi_softc *sc)
   1214  1.10.2.1    yamt {
   1215  1.10.2.1    yamt 	struct mbuf *m;
   1216  1.10.2.1    yamt 
   1217  1.10.2.1    yamt 	MGETHDR(m, M_DONTWAIT, MT_DATA);
   1218  1.10.2.1    yamt 	if (m == NULL) {
   1219  1.10.2.1    yamt 		aprint_error("%s: could not allocate rx mbuf\n",
   1220  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
   1221  1.10.2.1    yamt 		return NULL;
   1222  1.10.2.1    yamt 	}
   1223       1.1   skrll 
   1224  1.10.2.1    yamt 	MCLGET(m, M_DONTWAIT);
   1225  1.10.2.1    yamt 	if (!(m->m_flags & M_EXT)) {
   1226  1.10.2.1    yamt 		aprint_error("%s: could not allocate rx mbuf cluster\n",
   1227  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
   1228  1.10.2.1    yamt 		m_freem(m);
   1229  1.10.2.1    yamt 		return NULL;
   1230       1.1   skrll 	}
   1231  1.10.2.1    yamt 
   1232  1.10.2.1    yamt 	m->m_pkthdr.len = m->m_len = m->m_ext.ext_size;
   1233  1.10.2.1    yamt 	return m;
   1234       1.1   skrll }
   1235       1.1   skrll 
   1236       1.1   skrll static void
   1237  1.10.2.1    yamt iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
   1238       1.1   skrll     struct iwi_frame *frame)
   1239       1.1   skrll {
   1240       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   1241  1.10.2.1    yamt 	struct ifnet *ifp = ic->ic_ifp;
   1242  1.10.2.1    yamt 	struct mbuf *m, *m_new;
   1243  1.10.2.1    yamt 	struct ieee80211_frame *wh;
   1244       1.1   skrll 	struct ieee80211_node *ni;
   1245       1.1   skrll 	int error;
   1246       1.1   skrll 
   1247  1.10.2.1    yamt 	DPRINTFN(5, ("received frame len=%u chan=%u rssi=%u\n",
   1248  1.10.2.1    yamt 	    le16toh(frame->len), frame->chan, frame->rssi_dbm));
   1249       1.1   skrll 
   1250  1.10.2.1    yamt 	if (le16toh(frame->len) < sizeof (struct ieee80211_frame) ||
   1251       1.1   skrll 	    le16toh(frame->len) > MCLBYTES) {
   1252  1.10.2.1    yamt 		DPRINTF(("%s: bad frame length\n", sc->sc_dev.dv_xname));
   1253  1.10.2.1    yamt 		ifp->if_ierrors++;
   1254  1.10.2.1    yamt 		return;
   1255  1.10.2.1    yamt 	}
   1256  1.10.2.1    yamt 
   1257  1.10.2.1    yamt 	/*
   1258  1.10.2.1    yamt 	 * Try to allocate a new mbuf for this ring element and
   1259  1.10.2.1    yamt 	 * load it before processing the current mbuf. If the ring
   1260  1.10.2.1    yamt 	 * element cannot be reloaded, drop the received packet
   1261  1.10.2.1    yamt 	 * and reuse the old mbuf. In the unlikely case that
   1262  1.10.2.1    yamt 	 * the old mbuf can't be reloaded either, explicitly panic.
   1263  1.10.2.1    yamt 	 *
   1264  1.10.2.1    yamt 	 * XXX Reorganize buffer by moving elements from the logical
   1265  1.10.2.1    yamt 	 * end of the ring to the front instead of dropping.
   1266  1.10.2.1    yamt 	 */
   1267  1.10.2.1    yamt 	if ((m_new = iwi_alloc_rx_buf(sc)) == NULL) {
   1268  1.10.2.1    yamt 		ifp->if_ierrors++;
   1269  1.10.2.1    yamt 		return;
   1270  1.10.2.1    yamt 	}
   1271  1.10.2.1    yamt 
   1272  1.10.2.1    yamt 	bus_dmamap_unload(sc->sc_dmat, data->map);
   1273  1.10.2.1    yamt 
   1274  1.10.2.1    yamt 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m_new,
   1275  1.10.2.1    yamt 	    BUS_DMA_READ | BUS_DMA_NOWAIT);
   1276  1.10.2.1    yamt 	if (error != 0) {
   1277  1.10.2.1    yamt 		aprint_error("%s: could not load rx buf DMA map\n",
   1278  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
   1279  1.10.2.1    yamt 		m_freem(m_new);
   1280  1.10.2.1    yamt 		ifp->if_ierrors++;
   1281  1.10.2.1    yamt 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map,
   1282  1.10.2.1    yamt 		    data->m, BUS_DMA_READ | BUS_DMA_NOWAIT);
   1283  1.10.2.1    yamt 		if (error)
   1284  1.10.2.1    yamt 			panic("%s: unable to remap rx buf",
   1285  1.10.2.1    yamt 			    sc->sc_dev.dv_xname);
   1286  1.10.2.1    yamt 		return;
   1287       1.1   skrll 	}
   1288       1.1   skrll 
   1289  1.10.2.1    yamt 	/*
   1290  1.10.2.1    yamt 	 * New mbuf successfully loaded, update RX ring and continue
   1291  1.10.2.1    yamt 	 * processing.
   1292  1.10.2.1    yamt 	 */
   1293  1.10.2.1    yamt 	m = data->m;
   1294  1.10.2.1    yamt 	data->m = m_new;
   1295  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4, data->map->dm_segs[0].ds_addr);
   1296       1.1   skrll 
   1297       1.1   skrll 	/* Finalize mbuf */
   1298       1.1   skrll 	m->m_pkthdr.rcvif = ifp;
   1299       1.1   skrll 	m->m_pkthdr.len = m->m_len = sizeof (struct iwi_hdr) +
   1300       1.1   skrll 	    sizeof (struct iwi_frame) + le16toh(frame->len);
   1301       1.1   skrll 
   1302       1.1   skrll 	m_adj(m, sizeof (struct iwi_hdr) + sizeof (struct iwi_frame));
   1303       1.1   skrll 
   1304  1.10.2.1    yamt 	if (ic->ic_state == IEEE80211_S_SCAN)
   1305  1.10.2.1    yamt 		iwi_fix_channel(ic, m);
   1306       1.1   skrll 
   1307       1.1   skrll #if NBPFILTER > 0
   1308       1.1   skrll 	if (sc->sc_drvbpf != NULL) {
   1309       1.1   skrll 		struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
   1310       1.1   skrll 
   1311  1.10.2.1    yamt 		tap->wr_flags = 0;
   1312  1.10.2.1    yamt 		tap->wr_rate = frame->rate;
   1313  1.10.2.1    yamt 		tap->wr_chan_freq =
   1314  1.10.2.1    yamt 		    htole16(ic->ic_channels[frame->chan].ic_freq);
   1315  1.10.2.1    yamt 		tap->wr_chan_flags =
   1316  1.10.2.1    yamt 		    htole16(ic->ic_channels[frame->chan].ic_flags);
   1317  1.10.2.1    yamt 		tap->wr_antsignal = frame->signal;
   1318  1.10.2.1    yamt 		tap->wr_antenna = frame->antenna;
   1319  1.10.2.1    yamt 
   1320  1.10.2.1    yamt 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
   1321       1.1   skrll 	}
   1322       1.1   skrll #endif
   1323       1.1   skrll 
   1324  1.10.2.1    yamt 	wh = mtod(m, struct ieee80211_frame *);
   1325  1.10.2.1    yamt 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
   1326       1.5   perry 
   1327       1.1   skrll 	/* Send the frame to the upper layer */
   1328  1.10.2.1    yamt 	ieee80211_input(ic, m, ni, frame->rssi_dbm, 0);
   1329       1.1   skrll 
   1330  1.10.2.1    yamt 	/* node is no longer needed */
   1331       1.9  dyoung 	ieee80211_free_node(ni);
   1332       1.1   skrll }
   1333       1.1   skrll 
   1334       1.1   skrll static void
   1335  1.10.2.1    yamt iwi_notification_intr(struct iwi_softc *sc, struct iwi_notif *notif)
   1336       1.1   skrll {
   1337       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   1338       1.1   skrll 	struct iwi_notif_scan_channel *chan;
   1339       1.1   skrll 	struct iwi_notif_scan_complete *scan;
   1340       1.1   skrll 	struct iwi_notif_authentication *auth;
   1341       1.1   skrll 	struct iwi_notif_association *assoc;
   1342       1.1   skrll 
   1343       1.1   skrll 	switch (notif->type) {
   1344       1.1   skrll 	case IWI_NOTIF_TYPE_SCAN_CHANNEL:
   1345       1.1   skrll 		chan = (struct iwi_notif_scan_channel *)(notif + 1);
   1346       1.1   skrll 
   1347  1.10.2.1    yamt 		DPRINTFN(2, ("Finished scanning channel (%u)\n", chan->nchan));
   1348       1.1   skrll 		break;
   1349       1.1   skrll 
   1350       1.1   skrll 	case IWI_NOTIF_TYPE_SCAN_COMPLETE:
   1351       1.1   skrll 		scan = (struct iwi_notif_scan_complete *)(notif + 1);
   1352       1.1   skrll 
   1353       1.1   skrll 		DPRINTFN(2, ("Scan completed (%u, %u)\n", scan->nchan,
   1354       1.1   skrll 		    scan->status));
   1355       1.1   skrll 
   1356       1.8  sekiya 		/* monitor mode uses scan to set the channel ... */
   1357  1.10.2.1    yamt 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
   1358  1.10.2.1    yamt 			sc->flags &= ~IWI_FLAG_SCANNING;
   1359       1.8  sekiya 			ieee80211_end_scan(ic);
   1360  1.10.2.1    yamt 		} else
   1361       1.8  sekiya 			iwi_set_chan(sc, ic->ic_ibss_chan);
   1362       1.1   skrll 		break;
   1363       1.1   skrll 
   1364       1.1   skrll 	case IWI_NOTIF_TYPE_AUTHENTICATION:
   1365       1.1   skrll 		auth = (struct iwi_notif_authentication *)(notif + 1);
   1366       1.1   skrll 
   1367       1.1   skrll 		DPRINTFN(2, ("Authentication (%u)\n", auth->state));
   1368       1.1   skrll 
   1369       1.1   skrll 		switch (auth->state) {
   1370       1.1   skrll 		case IWI_AUTHENTICATED:
   1371  1.10.2.1    yamt 			ieee80211_node_authorize(ic->ic_bss);
   1372       1.1   skrll 			ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
   1373       1.1   skrll 			break;
   1374       1.1   skrll 
   1375       1.1   skrll 		case IWI_DEAUTHENTICATED:
   1376       1.1   skrll 			break;
   1377       1.1   skrll 
   1378       1.1   skrll 		default:
   1379       1.1   skrll 			aprint_error("%s: unknown authentication state %u\n",
   1380       1.1   skrll 			    sc->sc_dev.dv_xname, auth->state);
   1381       1.1   skrll 		}
   1382       1.1   skrll 		break;
   1383       1.1   skrll 
   1384       1.1   skrll 	case IWI_NOTIF_TYPE_ASSOCIATION:
   1385       1.1   skrll 		assoc = (struct iwi_notif_association *)(notif + 1);
   1386       1.1   skrll 
   1387       1.1   skrll 		DPRINTFN(2, ("Association (%u, %u)\n", assoc->state,
   1388       1.1   skrll 		    assoc->status));
   1389       1.1   skrll 
   1390       1.1   skrll 		switch (assoc->state) {
   1391  1.10.2.1    yamt 		case IWI_AUTHENTICATED:
   1392  1.10.2.1    yamt 			/* re-association, do nothing */
   1393  1.10.2.1    yamt 			break;
   1394  1.10.2.1    yamt 
   1395       1.1   skrll 		case IWI_ASSOCIATED:
   1396       1.1   skrll 			ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
   1397       1.1   skrll 			break;
   1398       1.1   skrll 
   1399       1.1   skrll 		case IWI_DEASSOCIATED:
   1400  1.10.2.1    yamt 			ieee80211_begin_scan(ic, 1);
   1401       1.1   skrll 			break;
   1402       1.1   skrll 
   1403       1.1   skrll 		default:
   1404       1.1   skrll 			aprint_error("%s: unknown association state %u\n",
   1405       1.1   skrll 			    sc->sc_dev.dv_xname, assoc->state);
   1406       1.1   skrll 		}
   1407       1.1   skrll 		break;
   1408       1.1   skrll 
   1409       1.1   skrll 	case IWI_NOTIF_TYPE_CALIBRATION:
   1410       1.1   skrll 	case IWI_NOTIF_TYPE_BEACON:
   1411       1.1   skrll 	case IWI_NOTIF_TYPE_NOISE:
   1412       1.1   skrll 		DPRINTFN(5, ("Notification (%u)\n", notif->type));
   1413       1.1   skrll 		break;
   1414       1.1   skrll 
   1415       1.1   skrll 	default:
   1416       1.1   skrll 		aprint_error("%s: unknown notification type %u\n",
   1417       1.1   skrll 		    sc->sc_dev.dv_xname, notif->type);
   1418       1.1   skrll 	}
   1419       1.1   skrll }
   1420       1.1   skrll 
   1421       1.1   skrll static void
   1422  1.10.2.1    yamt iwi_cmd_intr(struct iwi_softc *sc)
   1423  1.10.2.1    yamt {
   1424  1.10.2.1    yamt 	uint32_t hw;
   1425  1.10.2.1    yamt 
   1426  1.10.2.1    yamt 	hw = CSR_READ_4(sc, IWI_CSR_CMD_RIDX);
   1427  1.10.2.1    yamt 
   1428  1.10.2.1    yamt 	for (; sc->cmdq.next != hw;) {
   1429  1.10.2.1    yamt 		bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
   1430  1.10.2.1    yamt 		    sc->cmdq.next * IWI_CMD_DESC_SIZE, IWI_CMD_DESC_SIZE,
   1431  1.10.2.1    yamt 		    BUS_DMASYNC_POSTWRITE);
   1432  1.10.2.1    yamt 
   1433  1.10.2.1    yamt 		wakeup(&sc->cmdq.desc[sc->cmdq.next]);
   1434  1.10.2.1    yamt 		sc->cmdq.next = (sc->cmdq.next + 1) % sc->cmdq.count;
   1435  1.10.2.1    yamt 	}
   1436  1.10.2.1    yamt }
   1437  1.10.2.1    yamt 
   1438  1.10.2.1    yamt static void
   1439       1.1   skrll iwi_rx_intr(struct iwi_softc *sc)
   1440       1.1   skrll {
   1441  1.10.2.1    yamt 	struct iwi_rx_data *data;
   1442       1.1   skrll 	struct iwi_hdr *hdr;
   1443  1.10.2.1    yamt 	uint32_t hw;
   1444       1.1   skrll 
   1445  1.10.2.1    yamt 	hw = CSR_READ_4(sc, IWI_CSR_RX_RIDX);
   1446       1.1   skrll 
   1447  1.10.2.1    yamt 	for (; sc->rxq.cur != hw;) {
   1448  1.10.2.1    yamt 		data = &sc->rxq.data[sc->rxq.cur];
   1449       1.1   skrll 
   1450  1.10.2.1    yamt 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
   1451  1.10.2.1    yamt 		    data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
   1452       1.1   skrll 
   1453  1.10.2.1    yamt 		hdr = mtod(data->m, struct iwi_hdr *);
   1454       1.1   skrll 
   1455       1.1   skrll 		switch (hdr->type) {
   1456       1.1   skrll 		case IWI_HDR_TYPE_FRAME:
   1457  1.10.2.1    yamt 			iwi_frame_intr(sc, data, sc->rxq.cur,
   1458       1.1   skrll 			    (struct iwi_frame *)(hdr + 1));
   1459       1.1   skrll 			break;
   1460       1.1   skrll 
   1461       1.1   skrll 		case IWI_HDR_TYPE_NOTIF:
   1462  1.10.2.1    yamt 			iwi_notification_intr(sc,
   1463       1.1   skrll 			    (struct iwi_notif *)(hdr + 1));
   1464       1.1   skrll 			break;
   1465       1.1   skrll 
   1466       1.1   skrll 		default:
   1467       1.1   skrll 			aprint_error("%s: unknown hdr type %u\n",
   1468       1.1   skrll 			    sc->sc_dev.dv_xname, hdr->type);
   1469       1.1   skrll 		}
   1470  1.10.2.1    yamt 
   1471  1.10.2.1    yamt 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
   1472  1.10.2.1    yamt 		    data->map->dm_mapsize, BUS_DMASYNC_PREREAD);
   1473  1.10.2.1    yamt 
   1474  1.10.2.1    yamt 		DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur));
   1475  1.10.2.1    yamt 
   1476  1.10.2.1    yamt 		sc->rxq.cur = (sc->rxq.cur + 1) % sc->rxq.count;
   1477       1.1   skrll 	}
   1478       1.1   skrll 
   1479  1.10.2.1    yamt 
   1480       1.1   skrll 	/* Tell the firmware what we have processed */
   1481  1.10.2.1    yamt 	hw = (hw == 0) ? sc->rxq.count - 1 : hw - 1;
   1482  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, hw);
   1483       1.1   skrll }
   1484       1.1   skrll 
   1485       1.1   skrll static void
   1486  1.10.2.1    yamt iwi_tx_intr(struct iwi_softc *sc, struct iwi_tx_ring *txq)
   1487       1.1   skrll {
   1488       1.9  dyoung 	struct ifnet *ifp = &sc->sc_if;
   1489  1.10.2.1    yamt 	struct iwi_tx_data *data;
   1490  1.10.2.1    yamt 	uint32_t hw;
   1491       1.1   skrll 
   1492  1.10.2.1    yamt 	hw = CSR_READ_4(sc, txq->csr_ridx);
   1493       1.1   skrll 
   1494  1.10.2.1    yamt 	for (; txq->next != hw;) {
   1495  1.10.2.1    yamt 		data = &txq->data[txq->next];
   1496       1.1   skrll 
   1497  1.10.2.1    yamt 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
   1498  1.10.2.1    yamt 		    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1499  1.10.2.1    yamt 		bus_dmamap_unload(sc->sc_dmat, data->map);
   1500  1.10.2.1    yamt 		m_freem(data->m);
   1501  1.10.2.1    yamt 		data->m = NULL;
   1502  1.10.2.1    yamt 		ieee80211_free_node(data->ni);
   1503  1.10.2.1    yamt 		data->ni = NULL;
   1504       1.1   skrll 
   1505  1.10.2.1    yamt 		DPRINTFN(15, ("tx done idx=%u\n", txq->next));
   1506       1.1   skrll 
   1507  1.10.2.1    yamt 		ifp->if_opackets++;
   1508       1.1   skrll 
   1509  1.10.2.1    yamt 		txq->queued--;
   1510  1.10.2.1    yamt 		txq->next = (txq->next + 1) % txq->count;
   1511       1.1   skrll 	}
   1512       1.1   skrll 
   1513  1.10.2.1    yamt 	sc->sc_tx_timer = 0;
   1514  1.10.2.1    yamt 	ifp->if_flags &= ~IFF_OACTIVE;
   1515       1.1   skrll 
   1516       1.1   skrll 	/* Call start() since some buffer descriptors have been released */
   1517       1.1   skrll 	(*ifp->if_start)(ifp);
   1518       1.1   skrll }
   1519       1.1   skrll 
   1520       1.1   skrll static int
   1521       1.1   skrll iwi_intr(void *arg)
   1522       1.1   skrll {
   1523       1.1   skrll 	struct iwi_softc *sc = arg;
   1524  1.10.2.1    yamt 	uint32_t r;
   1525       1.1   skrll 
   1526       1.1   skrll 	if ((r = CSR_READ_4(sc, IWI_CSR_INTR)) == 0 || r == 0xffffffff)
   1527       1.1   skrll 		return 0;
   1528       1.1   skrll 
   1529  1.10.2.1    yamt 	/* Acknowledge interrupts */
   1530  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_INTR, r);
   1531       1.1   skrll 
   1532       1.1   skrll 	if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
   1533       1.1   skrll 		aprint_error("%s: fatal error\n", sc->sc_dev.dv_xname);
   1534  1.10.2.1    yamt 		if (r & IWI_INTR_FATAL_ERROR)
   1535  1.10.2.1    yamt 			iwi_error_log(sc);
   1536  1.10.2.1    yamt 		sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
   1537       1.9  dyoung 		iwi_stop(&sc->sc_if, 1);
   1538  1.10.2.1    yamt 		return (1);
   1539       1.1   skrll 	}
   1540       1.1   skrll 
   1541       1.1   skrll 	if (r & IWI_INTR_FW_INITED) {
   1542       1.1   skrll 		if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
   1543       1.1   skrll 			wakeup(sc);
   1544       1.1   skrll 	}
   1545       1.1   skrll 
   1546       1.1   skrll 	if (r & IWI_INTR_RADIO_OFF) {
   1547       1.1   skrll 		DPRINTF(("radio transmitter off\n"));
   1548  1.10.2.1    yamt 		sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
   1549       1.9  dyoung 		iwi_stop(&sc->sc_if, 1);
   1550  1.10.2.1    yamt 		return (1);
   1551       1.1   skrll 	}
   1552       1.1   skrll 
   1553  1.10.2.1    yamt 	if (r & IWI_INTR_CMD_DONE)
   1554  1.10.2.1    yamt 		iwi_cmd_intr(sc);
   1555       1.1   skrll 
   1556  1.10.2.1    yamt 	if (r & IWI_INTR_TX1_DONE)
   1557  1.10.2.1    yamt 		iwi_tx_intr(sc, &sc->txq[0]);
   1558       1.1   skrll 
   1559  1.10.2.1    yamt 	if (r & IWI_INTR_TX2_DONE)
   1560  1.10.2.1    yamt 		iwi_tx_intr(sc, &sc->txq[1]);
   1561       1.1   skrll 
   1562  1.10.2.1    yamt 	if (r & IWI_INTR_TX3_DONE)
   1563  1.10.2.1    yamt 		iwi_tx_intr(sc, &sc->txq[2]);
   1564       1.1   skrll 
   1565  1.10.2.1    yamt 	if (r & IWI_INTR_TX4_DONE)
   1566  1.10.2.1    yamt 		iwi_tx_intr(sc, &sc->txq[3]);
   1567  1.10.2.1    yamt 
   1568  1.10.2.1    yamt 	if (r & IWI_INTR_RX_DONE)
   1569  1.10.2.1    yamt 		iwi_rx_intr(sc);
   1570       1.1   skrll 
   1571       1.1   skrll 	return 1;
   1572       1.1   skrll }
   1573       1.1   skrll 
   1574       1.1   skrll static int
   1575  1.10.2.1    yamt iwi_cmd(struct iwi_softc *sc, uint8_t type, void *data, uint8_t len,
   1576       1.1   skrll     int async)
   1577       1.1   skrll {
   1578       1.1   skrll 	struct iwi_cmd_desc *desc;
   1579       1.1   skrll 
   1580  1.10.2.1    yamt 	desc = &sc->cmdq.desc[sc->cmdq.cur];
   1581       1.1   skrll 
   1582       1.1   skrll 	desc->hdr.type = IWI_HDR_TYPE_COMMAND;
   1583       1.1   skrll 	desc->hdr.flags = IWI_HDR_FLAG_IRQ;
   1584       1.1   skrll 	desc->type = type;
   1585       1.1   skrll 	desc->len = len;
   1586       1.1   skrll 	memcpy(desc->data, data, len);
   1587       1.1   skrll 
   1588  1.10.2.1    yamt 	bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
   1589  1.10.2.1    yamt 	    sc->cmdq.cur * IWI_CMD_DESC_SIZE,
   1590  1.10.2.1    yamt 	    IWI_CMD_DESC_SIZE, BUS_DMASYNC_PREWRITE);
   1591  1.10.2.1    yamt 
   1592  1.10.2.1    yamt 	DPRINTFN(2, ("sending command idx=%u type=%u len=%u\n", sc->cmdq.cur,
   1593  1.10.2.1    yamt 	    type, len));
   1594  1.10.2.1    yamt 
   1595  1.10.2.1    yamt 	sc->cmdq.cur = (sc->cmdq.cur + 1) % sc->cmdq.count;
   1596  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
   1597       1.1   skrll 
   1598  1.10.2.1    yamt 	return async ? 0 : tsleep(desc, 0, "iwicmd", hz);
   1599  1.10.2.1    yamt }
   1600  1.10.2.1    yamt 
   1601  1.10.2.1    yamt static void
   1602  1.10.2.1    yamt iwi_write_ibssnode(struct iwi_softc *sc, const struct iwi_node *in)
   1603  1.10.2.1    yamt {
   1604  1.10.2.1    yamt 	struct iwi_ibssnode node;
   1605       1.1   skrll 
   1606  1.10.2.1    yamt 	/* write node information into NIC memory */
   1607  1.10.2.1    yamt 	memset(&node, 0, sizeof node);
   1608  1.10.2.1    yamt 	IEEE80211_ADDR_COPY(node.bssid, in->in_node.ni_macaddr);
   1609  1.10.2.1    yamt 
   1610  1.10.2.1    yamt 	CSR_WRITE_REGION_1(sc,
   1611  1.10.2.1    yamt 	    IWI_CSR_NODE_BASE + in->in_station * sizeof node,
   1612  1.10.2.1    yamt 	    (uint8_t *)&node, sizeof node);
   1613       1.1   skrll }
   1614       1.1   skrll 
   1615       1.1   skrll static int
   1616  1.10.2.1    yamt iwi_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni,
   1617  1.10.2.1    yamt     int ac)
   1618       1.1   skrll {
   1619       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
   1620       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   1621  1.10.2.1    yamt 	struct iwi_node *in = (struct iwi_node *)ni;
   1622       1.1   skrll 	struct ieee80211_frame *wh;
   1623  1.10.2.1    yamt 	struct ieee80211_key *k;
   1624  1.10.2.1    yamt 	const struct chanAccParams *cap;
   1625  1.10.2.1    yamt 	struct iwi_tx_ring *txq = &sc->txq[ac];
   1626  1.10.2.1    yamt 	struct iwi_tx_data *data;
   1627       1.1   skrll 	struct iwi_tx_desc *desc;
   1628       1.1   skrll 	struct mbuf *mnew;
   1629  1.10.2.1    yamt 	int error, hdrlen, i, noack = 0;
   1630  1.10.2.1    yamt 
   1631  1.10.2.1    yamt 	wh = mtod(m0, struct ieee80211_frame *);
   1632  1.10.2.1    yamt 
   1633  1.10.2.1    yamt 	if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) {
   1634  1.10.2.1    yamt 		hdrlen = sizeof (struct ieee80211_qosframe);
   1635  1.10.2.1    yamt 		cap = &ic->ic_wme.wme_chanParams;
   1636  1.10.2.1    yamt 		noack = cap->cap_wmeParams[ac].wmep_noackPolicy;
   1637  1.10.2.1    yamt 	} else
   1638  1.10.2.1    yamt 		hdrlen = sizeof (struct ieee80211_frame);
   1639  1.10.2.1    yamt 
   1640  1.10.2.1    yamt 	/*
   1641  1.10.2.1    yamt 	 * This is only used in IBSS mode where the firmware expect an index
   1642  1.10.2.1    yamt 	 * in a h/w table instead of a destination address.
   1643  1.10.2.1    yamt 	 */
   1644  1.10.2.1    yamt 	if (ic->ic_opmode == IEEE80211_M_IBSS && in->in_station == -1) {
   1645  1.10.2.1    yamt 		in->in_station = iwi_alloc_unr(sc);
   1646  1.10.2.1    yamt 
   1647  1.10.2.1    yamt 		if (in->in_station == -1) {	/* h/w table is full */
   1648  1.10.2.1    yamt 			m_freem(m0);
   1649  1.10.2.1    yamt 			ieee80211_free_node(ni);
   1650  1.10.2.1    yamt 			ifp->if_oerrors++;
   1651  1.10.2.1    yamt 			return 0;
   1652  1.10.2.1    yamt 		}
   1653  1.10.2.1    yamt 		iwi_write_ibssnode(sc, in);
   1654  1.10.2.1    yamt 	}
   1655  1.10.2.1    yamt 
   1656  1.10.2.1    yamt 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
   1657  1.10.2.1    yamt 		k = ieee80211_crypto_encap(ic, ni, m0);
   1658  1.10.2.1    yamt 		if (k == NULL) {
   1659  1.10.2.1    yamt 			m_freem(m0);
   1660  1.10.2.1    yamt 			return ENOBUFS;
   1661  1.10.2.1    yamt 		}
   1662  1.10.2.1    yamt 
   1663  1.10.2.1    yamt 		/* packet header may have moved, reset our local pointer */
   1664  1.10.2.1    yamt 		wh = mtod(m0, struct ieee80211_frame *);
   1665  1.10.2.1    yamt 	}
   1666       1.1   skrll 
   1667       1.1   skrll #if NBPFILTER > 0
   1668       1.1   skrll 	if (sc->sc_drvbpf != NULL) {
   1669       1.1   skrll 		struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
   1670       1.1   skrll 
   1671       1.1   skrll 		tap->wt_flags = 0;
   1672  1.10.2.1    yamt 		tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
   1673  1.10.2.1    yamt 		tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
   1674       1.1   skrll 
   1675       1.1   skrll 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
   1676       1.1   skrll 	}
   1677       1.1   skrll #endif
   1678       1.1   skrll 
   1679  1.10.2.1    yamt 	data = &txq->data[txq->cur];
   1680  1.10.2.1    yamt 	desc = &txq->desc[txq->cur];
   1681       1.1   skrll 
   1682  1.10.2.1    yamt 	/* save and trim IEEE802.11 header */
   1683  1.10.2.1    yamt 	m_copydata(m0, 0, hdrlen, (caddr_t)&desc->wh);
   1684  1.10.2.1    yamt 	m_adj(m0, hdrlen);
   1685       1.1   skrll 
   1686  1.10.2.1    yamt 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
   1687  1.10.2.1    yamt 	    BUS_DMA_WRITE | BUS_DMA_NOWAIT);
   1688       1.1   skrll 	if (error != 0 && error != EFBIG) {
   1689       1.1   skrll 		aprint_error("%s: could not map mbuf (error %d)\n",
   1690       1.1   skrll 		    sc->sc_dev.dv_xname, error);
   1691       1.1   skrll 		m_freem(m0);
   1692       1.1   skrll 		return error;
   1693       1.1   skrll 	}
   1694       1.1   skrll 	if (error != 0) {
   1695       1.1   skrll 		/* too many fragments, linearize */
   1696       1.1   skrll 
   1697       1.1   skrll 		MGETHDR(mnew, M_DONTWAIT, MT_DATA);
   1698       1.1   skrll 		if (mnew == NULL) {
   1699       1.1   skrll 			m_freem(m0);
   1700       1.1   skrll 			return ENOMEM;
   1701       1.1   skrll 		}
   1702       1.1   skrll 
   1703       1.1   skrll 		M_COPY_PKTHDR(mnew, m0);
   1704       1.1   skrll 
   1705  1.10.2.1    yamt 		/* If the data won't fit in the header, get a cluster */
   1706  1.10.2.1    yamt 		if (m0->m_pkthdr.len > MHLEN) {
   1707  1.10.2.1    yamt 			MCLGET(mnew, M_DONTWAIT);
   1708  1.10.2.1    yamt 			if (!(mnew->m_flags & M_EXT)) {
   1709  1.10.2.1    yamt 				m_freem(m0);
   1710  1.10.2.1    yamt 				m_freem(mnew);
   1711  1.10.2.1    yamt 				return ENOMEM;
   1712  1.10.2.1    yamt 			}
   1713  1.10.2.1    yamt 		}
   1714       1.1   skrll 		m_copydata(m0, 0, m0->m_pkthdr.len, mtod(mnew, caddr_t));
   1715       1.1   skrll 		m_freem(m0);
   1716       1.1   skrll 		mnew->m_len = mnew->m_pkthdr.len;
   1717       1.1   skrll 		m0 = mnew;
   1718       1.1   skrll 
   1719  1.10.2.1    yamt 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
   1720  1.10.2.1    yamt 		    BUS_DMA_WRITE | BUS_DMA_NOWAIT);
   1721       1.1   skrll 		if (error != 0) {
   1722       1.1   skrll 			aprint_error("%s: could not map mbuf (error %d)\n",
   1723       1.1   skrll 			    sc->sc_dev.dv_xname, error);
   1724       1.1   skrll 			m_freem(m0);
   1725       1.1   skrll 			return error;
   1726       1.1   skrll 		}
   1727       1.1   skrll 	}
   1728       1.1   skrll 
   1729  1.10.2.1    yamt 	data->m = m0;
   1730  1.10.2.1    yamt 	data->ni = ni;
   1731       1.1   skrll 
   1732       1.1   skrll 	desc->hdr.type = IWI_HDR_TYPE_DATA;
   1733       1.1   skrll 	desc->hdr.flags = IWI_HDR_FLAG_IRQ;
   1734  1.10.2.1    yamt 	desc->station =
   1735  1.10.2.1    yamt 	    (ic->ic_opmode == IEEE80211_M_IBSS) ? in->in_station : 0;
   1736       1.1   skrll 	desc->cmd = IWI_DATA_CMD_TX;
   1737       1.1   skrll 	desc->len = htole16(m0->m_pkthdr.len);
   1738       1.1   skrll 	desc->flags = 0;
   1739  1.10.2.1    yamt 	desc->xflags = 0;
   1740  1.10.2.1    yamt 
   1741  1.10.2.1    yamt 	if (!noack && !IEEE80211_IS_MULTICAST(desc->wh.i_addr1))
   1742       1.1   skrll 		desc->flags |= IWI_DATA_FLAG_NEED_ACK;
   1743       1.1   skrll 
   1744  1.10.2.1    yamt #if 0
   1745       1.1   skrll 	if (ic->ic_flags & IEEE80211_F_PRIVACY) {
   1746  1.10.2.1    yamt 		desc->wh.i_fc[1] |= IEEE80211_FC1_WEP;
   1747  1.10.2.1    yamt 		desc->wep_txkey = ic->ic_crypto.cs_def_txkey;
   1748       1.1   skrll 	} else
   1749  1.10.2.1    yamt #endif
   1750       1.1   skrll 		desc->flags |= IWI_DATA_FLAG_NO_WEP;
   1751       1.1   skrll 
   1752       1.1   skrll 	if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
   1753       1.1   skrll 		desc->flags |= IWI_DATA_FLAG_SHPREAMBLE;
   1754       1.1   skrll 
   1755  1.10.2.1    yamt 	if (desc->wh.i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS)
   1756  1.10.2.1    yamt 		desc->xflags |= IWI_DATA_XFLAG_QOS;
   1757  1.10.2.1    yamt 
   1758  1.10.2.1    yamt 	desc->nseg = htole32(data->map->dm_nsegs);
   1759  1.10.2.1    yamt 	for (i = 0; i < data->map->dm_nsegs; i++) {
   1760  1.10.2.1    yamt 		desc->seg_addr[i] = htole32(data->map->dm_segs[i].ds_addr);
   1761  1.10.2.1    yamt 		desc->seg_len[i]  = htole16(data->map->dm_segs[i].ds_len);
   1762       1.1   skrll 	}
   1763       1.1   skrll 
   1764  1.10.2.1    yamt 	bus_dmamap_sync(sc->sc_dmat, txq->desc_map,
   1765  1.10.2.1    yamt 	    txq->cur * IWI_TX_DESC_SIZE,
   1766  1.10.2.1    yamt 	    IWI_TX_DESC_SIZE, BUS_DMASYNC_PREWRITE);
   1767       1.1   skrll 
   1768  1.10.2.1    yamt 	bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
   1769       1.1   skrll 	    BUS_DMASYNC_PREWRITE);
   1770       1.1   skrll 
   1771  1.10.2.1    yamt 	DPRINTFN(5, ("sending data frame txq=%u idx=%u len=%u nseg=%u\n",
   1772  1.10.2.1    yamt 	    ac, txq->cur, le16toh(desc->len), le32toh(desc->nseg)));
   1773       1.1   skrll 
   1774       1.1   skrll 	/* Inform firmware about this new packet */
   1775  1.10.2.1    yamt 	txq->queued++;
   1776  1.10.2.1    yamt 	txq->cur = (txq->cur + 1) % txq->count;
   1777  1.10.2.1    yamt 	CSR_WRITE_4(sc, txq->csr_widx, txq->cur);
   1778       1.1   skrll 
   1779       1.1   skrll 	return 0;
   1780       1.1   skrll }
   1781       1.1   skrll 
   1782       1.1   skrll static void
   1783       1.1   skrll iwi_start(struct ifnet *ifp)
   1784       1.1   skrll {
   1785       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
   1786       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   1787       1.1   skrll 	struct mbuf *m0;
   1788  1.10.2.1    yamt 	struct ether_header *eh;
   1789       1.1   skrll 	struct ieee80211_node *ni;
   1790  1.10.2.1    yamt 	int ac;
   1791       1.1   skrll 
   1792       1.1   skrll 	if (ic->ic_state != IEEE80211_S_RUN)
   1793       1.1   skrll 		return;
   1794       1.1   skrll 
   1795       1.1   skrll 	for (;;) {
   1796       1.1   skrll 		IF_DEQUEUE(&ifp->if_snd, m0);
   1797       1.1   skrll 		if (m0 == NULL)
   1798       1.1   skrll 			break;
   1799       1.1   skrll 
   1800  1.10.2.1    yamt 		if (m0->m_len < sizeof (struct ether_header) &&
   1801  1.10.2.1    yamt 		    (m0 = m_pullup(m0, sizeof (struct ether_header))) == NULL) {
   1802  1.10.2.1    yamt 			ifp->if_oerrors++;
   1803  1.10.2.1    yamt 			continue;
   1804  1.10.2.1    yamt 		}
   1805  1.10.2.1    yamt 
   1806  1.10.2.1    yamt 		eh = mtod(m0, struct ether_header *);
   1807  1.10.2.1    yamt 		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
   1808  1.10.2.1    yamt 		if (ni == NULL) {
   1809  1.10.2.1    yamt 			m_freem(m0);
   1810  1.10.2.1    yamt 			ifp->if_oerrors++;
   1811  1.10.2.1    yamt 			continue;
   1812  1.10.2.1    yamt 		}
   1813  1.10.2.1    yamt 
   1814  1.10.2.1    yamt 		/* classify mbuf so we can find which tx ring to use */
   1815  1.10.2.1    yamt 		if (ieee80211_classify(ic, m0, ni) != 0) {
   1816  1.10.2.1    yamt 			m_freem(m0);
   1817  1.10.2.1    yamt 			ieee80211_free_node(ni);
   1818  1.10.2.1    yamt 			ifp->if_oerrors++;
   1819  1.10.2.1    yamt 			continue;
   1820  1.10.2.1    yamt 		}
   1821  1.10.2.1    yamt 
   1822  1.10.2.1    yamt 		/* no QoS encapsulation for EAPOL frames */
   1823  1.10.2.1    yamt 		ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
   1824  1.10.2.1    yamt 		    M_WME_GETAC(m0) : WME_AC_BE;
   1825  1.10.2.1    yamt 
   1826  1.10.2.1    yamt 		if (sc->txq[ac].queued > sc->txq[ac].count - 8) {
   1827  1.10.2.1    yamt 			/* there is no place left in this ring */
   1828       1.1   skrll 			IF_PREPEND(&ifp->if_snd, m0);
   1829       1.1   skrll 			ifp->if_flags |= IFF_OACTIVE;
   1830       1.1   skrll 			break;
   1831       1.1   skrll 		}
   1832       1.1   skrll 
   1833       1.1   skrll #if NBPFILTER > 0
   1834       1.1   skrll 		if (ifp->if_bpf != NULL)
   1835       1.1   skrll 			bpf_mtap(ifp->if_bpf, m0);
   1836       1.1   skrll #endif
   1837       1.1   skrll 
   1838       1.9  dyoung 		m0 = ieee80211_encap(ic, m0, ni);
   1839  1.10.2.1    yamt 		if (m0 == NULL) {
   1840  1.10.2.1    yamt 			ieee80211_free_node(ni);
   1841  1.10.2.1    yamt 			ifp->if_oerrors++;
   1842       1.1   skrll 			continue;
   1843  1.10.2.1    yamt 		}
   1844       1.1   skrll 
   1845       1.1   skrll #if NBPFILTER > 0
   1846       1.1   skrll 		if (ic->ic_rawbpf != NULL)
   1847       1.1   skrll 			bpf_mtap(ic->ic_rawbpf, m0);
   1848       1.1   skrll #endif
   1849       1.1   skrll 
   1850  1.10.2.1    yamt 		if (iwi_tx_start(ifp, m0, ni, ac) != 0) {
   1851  1.10.2.1    yamt 			ieee80211_free_node(ni);
   1852  1.10.2.1    yamt 			ifp->if_oerrors++;
   1853       1.1   skrll 			break;
   1854       1.1   skrll 		}
   1855       1.1   skrll 
   1856       1.1   skrll 		/* start watchdog timer */
   1857       1.1   skrll 		sc->sc_tx_timer = 5;
   1858       1.1   skrll 		ifp->if_timer = 1;
   1859       1.1   skrll 	}
   1860       1.1   skrll }
   1861       1.1   skrll 
   1862       1.1   skrll static void
   1863       1.1   skrll iwi_watchdog(struct ifnet *ifp)
   1864       1.1   skrll {
   1865       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
   1866       1.1   skrll 
   1867       1.1   skrll 	ifp->if_timer = 0;
   1868       1.1   skrll 
   1869       1.1   skrll 	if (sc->sc_tx_timer > 0) {
   1870       1.1   skrll 		if (--sc->sc_tx_timer == 0) {
   1871       1.1   skrll 			aprint_error("%s: device timeout\n",
   1872       1.1   skrll 			    sc->sc_dev.dv_xname);
   1873  1.10.2.1    yamt 			ifp->if_oerrors++;
   1874  1.10.2.1    yamt 			ifp->if_flags &= ~IFF_UP;
   1875       1.1   skrll 			iwi_stop(ifp, 1);
   1876       1.1   skrll 			return;
   1877       1.1   skrll 		}
   1878       1.1   skrll 		ifp->if_timer = 1;
   1879       1.1   skrll 	}
   1880       1.1   skrll 
   1881       1.9  dyoung 	ieee80211_watchdog(&sc->sc_ic);
   1882       1.1   skrll }
   1883       1.1   skrll 
   1884       1.1   skrll static int
   1885  1.10.2.1    yamt iwi_get_table0(struct iwi_softc *sc, uint32_t *tbl)
   1886       1.1   skrll {
   1887  1.10.2.1    yamt 	uint32_t size, buf[128];
   1888       1.1   skrll 
   1889       1.1   skrll 	if (!(sc->flags & IWI_FLAG_FW_INITED)) {
   1890       1.1   skrll 		memset(buf, 0, sizeof buf);
   1891       1.1   skrll 		return copyout(buf, tbl, sizeof buf);
   1892       1.1   skrll 	}
   1893       1.1   skrll 
   1894       1.1   skrll 	size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1);
   1895       1.1   skrll 	CSR_READ_REGION_4(sc, IWI_CSR_TABLE0_BASE, &buf[1], size);
   1896       1.1   skrll 
   1897       1.1   skrll 	return copyout(buf, tbl, sizeof buf);
   1898       1.1   skrll }
   1899       1.1   skrll 
   1900       1.1   skrll static int
   1901       1.1   skrll iwi_get_radio(struct iwi_softc *sc, int *ret)
   1902       1.1   skrll {
   1903       1.1   skrll 	int val;
   1904       1.1   skrll 
   1905       1.1   skrll 	val = (CSR_READ_4(sc, IWI_CSR_IO) & IWI_IO_RADIO_ENABLED) ? 1 : 0;
   1906       1.1   skrll 	return copyout(&val, ret, sizeof val);
   1907       1.1   skrll }
   1908       1.1   skrll 
   1909       1.1   skrll static int
   1910       1.1   skrll iwi_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
   1911       1.1   skrll {
   1912  1.10.2.1    yamt #define	IS_RUNNING(ifp) \
   1913  1.10.2.1    yamt 	((ifp->if_flags & IFF_UP) && (ifp->if_flags & IFF_RUNNING))
   1914  1.10.2.1    yamt 
   1915       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
   1916  1.10.2.1    yamt 	struct ieee80211com *ic = &sc->sc_ic;
   1917  1.10.2.1    yamt 	struct ifreq *ifr = (struct ifreq *)data;
   1918       1.1   skrll 	int s, error = 0;
   1919       1.1   skrll 
   1920       1.1   skrll 	s = splnet();
   1921       1.1   skrll 
   1922       1.1   skrll 	switch (cmd) {
   1923       1.1   skrll 	case SIOCSIFFLAGS:
   1924       1.1   skrll 		if (ifp->if_flags & IFF_UP) {
   1925       1.1   skrll 			if (!(ifp->if_flags & IFF_RUNNING))
   1926       1.1   skrll 				iwi_init(ifp);
   1927       1.1   skrll 		} else {
   1928       1.1   skrll 			if (ifp->if_flags & IFF_RUNNING)
   1929       1.1   skrll 				iwi_stop(ifp, 1);
   1930       1.1   skrll 		}
   1931       1.1   skrll 		break;
   1932       1.1   skrll 
   1933  1.10.2.1    yamt 	case SIOCADDMULTI:
   1934  1.10.2.1    yamt 	case SIOCDELMULTI:
   1935  1.10.2.1    yamt 		error = (cmd == SIOCADDMULTI) ?
   1936  1.10.2.1    yamt 		    ether_addmulti(ifr, &sc->sc_ec) :
   1937  1.10.2.1    yamt 		    ether_delmulti(ifr, &sc->sc_ec);
   1938  1.10.2.1    yamt 		if (error == ENETRESET) {
   1939  1.10.2.1    yamt 			/* setup multicast filter, etc */
   1940  1.10.2.1    yamt 			error = 0;
   1941  1.10.2.1    yamt 		}
   1942  1.10.2.1    yamt 		break;
   1943  1.10.2.1    yamt 
   1944       1.1   skrll 	case SIOCGTABLE0:
   1945  1.10.2.1    yamt 		error = iwi_get_table0(sc, (uint32_t *)ifr->ifr_data);
   1946       1.1   skrll 		break;
   1947       1.1   skrll 
   1948       1.1   skrll 	case SIOCGRADIO:
   1949       1.1   skrll 		error = iwi_get_radio(sc, (int *)ifr->ifr_data);
   1950       1.1   skrll 		break;
   1951       1.1   skrll 
   1952       1.1   skrll 	case SIOCSLOADFW:
   1953       1.1   skrll 		/* only super-user can do that! */
   1954  1.10.2.1    yamt 		if ((error = kauth_authorize_generic(curproc->p_cred, KAUTH_GENERIC_ISSUSER,
   1955  1.10.2.1    yamt 					       &curproc->p_acflag)) != 0)
   1956       1.1   skrll 			break;
   1957       1.1   skrll 
   1958       1.1   skrll 		error = iwi_cache_firmware(sc, ifr->ifr_data);
   1959       1.1   skrll 		break;
   1960       1.1   skrll 
   1961       1.1   skrll 	case SIOCSKILLFW:
   1962       1.1   skrll 		/* only super-user can do that! */
   1963  1.10.2.1    yamt 		if ((error = kauth_authorize_generic(curproc->p_cred, KAUTH_GENERIC_ISSUSER,
   1964  1.10.2.1    yamt 					       &curproc->p_acflag)) != 0)
   1965       1.1   skrll 			break;
   1966       1.1   skrll 
   1967  1.10.2.1    yamt 		ifp->if_flags &= ~IFF_UP;
   1968       1.1   skrll 		iwi_stop(ifp, 1);
   1969       1.1   skrll 		iwi_free_firmware(sc);
   1970       1.1   skrll 		break;
   1971       1.1   skrll 
   1972       1.1   skrll 	default:
   1973       1.9  dyoung 		error = ieee80211_ioctl(&sc->sc_ic, cmd, data);
   1974       1.1   skrll 
   1975  1.10.2.1    yamt 		if (error == ENETRESET) {
   1976  1.10.2.1    yamt 			if (IS_RUNNING(ifp) &&
   1977  1.10.2.1    yamt 			    (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
   1978  1.10.2.1    yamt 				iwi_init(ifp);
   1979  1.10.2.1    yamt 			error = 0;
   1980  1.10.2.1    yamt 		}
   1981       1.1   skrll 	}
   1982       1.1   skrll 
   1983       1.1   skrll 	splx(s);
   1984       1.1   skrll 	return error;
   1985  1.10.2.1    yamt #undef IS_RUNNING
   1986       1.1   skrll }
   1987       1.1   skrll 
   1988       1.1   skrll static void
   1989       1.1   skrll iwi_stop_master(struct iwi_softc *sc)
   1990       1.1   skrll {
   1991       1.1   skrll 	int ntries;
   1992       1.1   skrll 
   1993       1.1   skrll 	/* Disable interrupts */
   1994       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
   1995       1.1   skrll 
   1996       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_STOP_MASTER);
   1997       1.1   skrll 	for (ntries = 0; ntries < 5; ntries++) {
   1998       1.1   skrll 		if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
   1999       1.1   skrll 			break;
   2000       1.1   skrll 		DELAY(10);
   2001       1.1   skrll 	}
   2002       1.1   skrll 	if (ntries == 5)
   2003       1.1   skrll 		aprint_error("%s: timeout waiting for master\n",
   2004       1.1   skrll 		    sc->sc_dev.dv_xname);
   2005       1.1   skrll 
   2006       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
   2007       1.1   skrll 	    IWI_RST_PRINCETON_RESET);
   2008       1.1   skrll 
   2009       1.1   skrll 	sc->flags &= ~IWI_FLAG_FW_INITED;
   2010       1.1   skrll }
   2011       1.1   skrll 
   2012       1.1   skrll static int
   2013       1.1   skrll iwi_reset(struct iwi_softc *sc)
   2014       1.1   skrll {
   2015       1.1   skrll 	int i, ntries;
   2016       1.1   skrll 
   2017       1.1   skrll 	iwi_stop_master(sc);
   2018       1.1   skrll 
   2019       1.1   skrll 	/* Move adapter to D0 state */
   2020       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
   2021       1.1   skrll 	    IWI_CTL_INIT);
   2022       1.1   skrll 
   2023       1.1   skrll 	/* Initialize Phase-Locked Level  (PLL) */
   2024       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_READ_INT, IWI_READ_INT_INIT_HOST);
   2025       1.1   skrll 
   2026       1.1   skrll 	/* Wait for clock stabilization */
   2027       1.1   skrll 	for (ntries = 0; ntries < 1000; ntries++) {
   2028       1.1   skrll 		if (CSR_READ_4(sc, IWI_CSR_CTL) & IWI_CTL_CLOCK_READY)
   2029       1.1   skrll 			break;
   2030       1.1   skrll 		DELAY(200);
   2031       1.1   skrll 	}
   2032  1.10.2.1    yamt 	if (ntries == 1000) {
   2033  1.10.2.1    yamt 		aprint_error("%s: timeout waiting for clock stabilization\n",
   2034  1.10.2.1    yamt 		    sc->sc_dev.dv_xname);
   2035       1.1   skrll 		return EIO;
   2036  1.10.2.1    yamt 	}
   2037       1.1   skrll 
   2038       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
   2039       1.1   skrll 	    IWI_RST_SW_RESET);
   2040       1.1   skrll 
   2041       1.1   skrll 	DELAY(10);
   2042       1.1   skrll 
   2043       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
   2044       1.1   skrll 	    IWI_CTL_INIT);
   2045       1.1   skrll 
   2046       1.1   skrll 	/* Clear NIC memory */
   2047       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0);
   2048       1.1   skrll 	for (i = 0; i < 0xc000; i++)
   2049       1.1   skrll 		CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
   2050       1.1   skrll 
   2051       1.1   skrll 	return 0;
   2052       1.1   skrll }
   2053       1.1   skrll 
   2054       1.1   skrll static int
   2055       1.1   skrll iwi_load_ucode(struct iwi_softc *sc, void *uc, int size)
   2056       1.1   skrll {
   2057  1.10.2.1    yamt 	uint16_t *w;
   2058       1.1   skrll 	int ntries, i;
   2059       1.1   skrll 
   2060       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
   2061       1.1   skrll 	    IWI_RST_STOP_MASTER);
   2062       1.1   skrll 	for (ntries = 0; ntries < 5; ntries++) {
   2063       1.1   skrll 		if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
   2064       1.1   skrll 			break;
   2065       1.1   skrll 		DELAY(10);
   2066       1.1   skrll 	}
   2067       1.1   skrll 	if (ntries == 5) {
   2068       1.1   skrll 		aprint_error("%s: timeout waiting for master\n",
   2069       1.1   skrll 		    sc->sc_dev.dv_xname);
   2070       1.1   skrll 		return EIO;
   2071       1.1   skrll 	}
   2072       1.1   skrll 
   2073       1.1   skrll 	MEM_WRITE_4(sc, 0x3000e0, 0x80000000);
   2074       1.1   skrll 	DELAY(5000);
   2075       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
   2076       1.1   skrll 	    ~IWI_RST_PRINCETON_RESET);
   2077       1.1   skrll 	DELAY(5000);
   2078       1.1   skrll 	MEM_WRITE_4(sc, 0x3000e0, 0);
   2079       1.1   skrll 	DELAY(1000);
   2080       1.1   skrll 	MEM_WRITE_4(sc, 0x300004, 1);
   2081       1.1   skrll 	DELAY(1000);
   2082       1.1   skrll 	MEM_WRITE_4(sc, 0x300004, 0);
   2083       1.1   skrll 	DELAY(1000);
   2084       1.1   skrll 	MEM_WRITE_1(sc, 0x200000, 0x00);
   2085       1.1   skrll 	MEM_WRITE_1(sc, 0x200000, 0x40);
   2086  1.10.2.1    yamt 	DELAY(1000);
   2087       1.1   skrll 
   2088       1.1   skrll 	/* Adapter is buggy, we must set the address for each word */
   2089       1.1   skrll 	for (w = uc; size > 0; w++, size -= 2)
   2090  1.10.2.1    yamt 		MEM_WRITE_2(sc, 0x200010, htole16(*w));
   2091       1.1   skrll 
   2092       1.1   skrll 	MEM_WRITE_1(sc, 0x200000, 0x00);
   2093       1.1   skrll 	MEM_WRITE_1(sc, 0x200000, 0x80);
   2094       1.1   skrll 
   2095       1.1   skrll 	/* Wait until we get a response in the uc queue */
   2096       1.1   skrll 	for (ntries = 0; ntries < 100; ntries++) {
   2097       1.1   skrll 		if (MEM_READ_1(sc, 0x200000) & 1)
   2098       1.1   skrll 			break;
   2099       1.1   skrll 		DELAY(100);
   2100       1.1   skrll 	}
   2101       1.1   skrll 	if (ntries == 100) {
   2102       1.1   skrll 		aprint_error("%s: timeout waiting for ucode to initialize\n",
   2103       1.1   skrll 		    sc->sc_dev.dv_xname);
   2104       1.1   skrll 		return EIO;
   2105       1.1   skrll 	}
   2106       1.1   skrll 
   2107       1.1   skrll 	/* Empty the uc queue or the firmware will not initialize properly */
   2108       1.1   skrll 	for (i = 0; i < 7; i++)
   2109       1.1   skrll 		MEM_READ_4(sc, 0x200004);
   2110       1.1   skrll 
   2111       1.1   skrll 	MEM_WRITE_1(sc, 0x200000, 0x00);
   2112       1.1   skrll 
   2113       1.1   skrll 	return 0;
   2114       1.1   skrll }
   2115       1.1   skrll 
   2116       1.1   skrll /* macro to handle unaligned little endian data in firmware image */
   2117       1.1   skrll #define GETLE32(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
   2118       1.1   skrll static int
   2119       1.1   skrll iwi_load_firmware(struct iwi_softc *sc, void *fw, int size)
   2120       1.1   skrll {
   2121       1.1   skrll 	bus_dmamap_t map;
   2122       1.1   skrll 	u_char *p, *end;
   2123  1.10.2.1    yamt 	uint32_t sentinel, ctl, sum;
   2124  1.10.2.1    yamt 	uint32_t cs, sl, cd, cl;
   2125       1.1   skrll 	int ntries, nsegs, error;
   2126  1.10.2.1    yamt 	int sn;
   2127       1.1   skrll 
   2128  1.10.2.1    yamt 	nsegs = (size + PAGE_SIZE - 1) / PAGE_SIZE;
   2129  1.10.2.1    yamt 
   2130  1.10.2.1    yamt 	/* Create a DMA map for the firmware image */
   2131  1.10.2.1    yamt 	error = bus_dmamap_create(sc->sc_dmat, size, nsegs, size, 0,
   2132       1.1   skrll 	    BUS_DMA_NOWAIT, &map);
   2133       1.1   skrll 	if (error != 0) {
   2134       1.1   skrll 		aprint_error("%s: could not create firmware DMA map\n",
   2135       1.1   skrll 		    sc->sc_dev.dv_xname);
   2136       1.1   skrll 		goto fail1;
   2137       1.1   skrll 	}
   2138       1.1   skrll 
   2139  1.10.2.1    yamt 	error = bus_dmamap_load(sc->sc_dmat, map, fw, size, NULL,
   2140  1.10.2.1    yamt 	    BUS_DMA_NOWAIT | BUS_DMA_WRITE);
   2141       1.1   skrll 	if (error != 0) {
   2142  1.10.2.1    yamt 		aprint_error("%s: could not load fw dma map(%d)\n",
   2143  1.10.2.1    yamt 		    sc->sc_dev.dv_xname, error);
   2144       1.1   skrll 		goto fail2;
   2145       1.1   skrll 	}
   2146       1.1   skrll 
   2147       1.1   skrll 	/* Make sure the adapter will get up-to-date values */
   2148       1.1   skrll 	bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_PREWRITE);
   2149       1.1   skrll 
   2150       1.1   skrll 	/* Tell the adapter where the command blocks are stored */
   2151       1.1   skrll 	MEM_WRITE_4(sc, 0x3000a0, 0x27000);
   2152       1.1   skrll 
   2153       1.1   skrll 	/*
   2154       1.1   skrll 	 * Store command blocks into adapter's internal memory using register
   2155       1.1   skrll 	 * indirections. The adapter will read the firmware image through DMA
   2156       1.1   skrll 	 * using information stored in command blocks.
   2157       1.1   skrll 	 */
   2158  1.10.2.1    yamt 	p = fw;
   2159       1.1   skrll 	end = p + size;
   2160       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0x27000);
   2161       1.1   skrll 
   2162  1.10.2.1    yamt 	sn = 0;
   2163  1.10.2.1    yamt 	sl = cl = 0;
   2164  1.10.2.1    yamt 	cs = cd = 0;
   2165       1.1   skrll 	while (p < end) {
   2166  1.10.2.1    yamt 		if (sl == 0) {
   2167  1.10.2.1    yamt 			cs = map->dm_segs[sn].ds_addr;
   2168  1.10.2.1    yamt 			sl = map->dm_segs[sn].ds_len;
   2169  1.10.2.1    yamt 			sn++;
   2170  1.10.2.1    yamt 		}
   2171  1.10.2.1    yamt 		if (cl == 0) {
   2172  1.10.2.1    yamt 			cd = GETLE32(p); p += 4; cs += 4; sl -= 4;
   2173  1.10.2.1    yamt 			cl = GETLE32(p); p += 4; cs += 4; sl -= 4;
   2174  1.10.2.1    yamt 		}
   2175  1.10.2.1    yamt 		while (sl > 0 && cl > 0) {
   2176  1.10.2.1    yamt 			int len = min(cl, sl);
   2177  1.10.2.1    yamt 
   2178  1.10.2.1    yamt 			sl -= len;
   2179  1.10.2.1    yamt 			cl -= len;
   2180  1.10.2.1    yamt 			p += len;
   2181  1.10.2.1    yamt 
   2182  1.10.2.1    yamt 			while (len > 0) {
   2183  1.10.2.1    yamt 				int mlen = min(len, IWI_CB_MAXDATALEN);
   2184  1.10.2.1    yamt 
   2185  1.10.2.1    yamt 				ctl = IWI_CB_DEFAULT_CTL | mlen;
   2186  1.10.2.1    yamt 				sum = ctl ^ cs ^ cd;
   2187  1.10.2.1    yamt 
   2188  1.10.2.1    yamt 				/* Write a command block */
   2189  1.10.2.1    yamt 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, ctl);
   2190  1.10.2.1    yamt 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cs);
   2191  1.10.2.1    yamt 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cd);
   2192  1.10.2.1    yamt 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, sum);
   2193  1.10.2.1    yamt 
   2194  1.10.2.1    yamt 				cs += mlen;
   2195  1.10.2.1    yamt 				cd += mlen;
   2196  1.10.2.1    yamt 				len -= mlen;
   2197  1.10.2.1    yamt 			}
   2198       1.1   skrll 		}
   2199       1.1   skrll 	}
   2200       1.1   skrll 
   2201       1.1   skrll 	/* Write a fictive final command block (sentinel) */
   2202       1.1   skrll 	sentinel = CSR_READ_4(sc, IWI_CSR_AUTOINC_ADDR);
   2203       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
   2204       1.1   skrll 
   2205       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
   2206       1.1   skrll 	    ~(IWI_RST_MASTER_DISABLED | IWI_RST_STOP_MASTER));
   2207       1.1   skrll 
   2208       1.1   skrll 	/* Tell the adapter to start processing command blocks */
   2209       1.1   skrll 	MEM_WRITE_4(sc, 0x3000a4, 0x540100);
   2210       1.1   skrll 
   2211       1.1   skrll 	/* Wait until the adapter has processed all command blocks */
   2212       1.1   skrll 	for (ntries = 0; ntries < 400; ntries++) {
   2213       1.1   skrll 		if (MEM_READ_4(sc, 0x3000d0) >= sentinel)
   2214       1.1   skrll 			break;
   2215       1.1   skrll 		DELAY(100);
   2216       1.1   skrll 	}
   2217       1.1   skrll 	if (ntries == 400) {
   2218       1.1   skrll 		aprint_error("%s: timeout processing cb\n",
   2219       1.1   skrll 		    sc->sc_dev.dv_xname);
   2220       1.1   skrll 		error = EIO;
   2221  1.10.2.1    yamt 		goto fail3;
   2222       1.1   skrll 	}
   2223       1.1   skrll 
   2224       1.1   skrll 	/* We're done with command blocks processing */
   2225       1.1   skrll 	MEM_WRITE_4(sc, 0x3000a4, 0x540c00);
   2226       1.1   skrll 
   2227       1.1   skrll 	/* Allow interrupts so we know when the firmware is inited */
   2228       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
   2229       1.1   skrll 
   2230       1.1   skrll 	/* Tell the adapter to initialize the firmware */
   2231       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, 0);
   2232       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
   2233       1.1   skrll 	    IWI_CTL_ALLOW_STANDBY);
   2234       1.1   skrll 
   2235       1.1   skrll 	/* Wait at most one second for firmware initialization to complete */
   2236       1.1   skrll 	if ((error = tsleep(sc, 0, "iwiinit", hz)) != 0) {
   2237       1.1   skrll 		aprint_error("%s: timeout waiting for firmware initialization "
   2238       1.1   skrll 		    "to complete\n", sc->sc_dev.dv_xname);
   2239  1.10.2.1    yamt 		goto fail3;
   2240       1.1   skrll 	}
   2241       1.1   skrll 
   2242  1.10.2.1    yamt fail3:
   2243  1.10.2.1    yamt 	bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_POSTWRITE);
   2244       1.1   skrll 	bus_dmamap_unload(sc->sc_dmat, map);
   2245  1.10.2.1    yamt fail2:
   2246  1.10.2.1    yamt 	bus_dmamap_destroy(sc->sc_dmat, map);
   2247       1.5   perry 
   2248  1.10.2.1    yamt fail1:
   2249  1.10.2.1    yamt 	return error;
   2250       1.1   skrll }
   2251       1.1   skrll 
   2252       1.1   skrll /*
   2253       1.1   skrll  * Store firmware into kernel memory so we can download it when we need to,
   2254       1.1   skrll  * e.g when the adapter wakes up from suspend mode.
   2255       1.1   skrll  */
   2256       1.1   skrll static int
   2257       1.1   skrll iwi_cache_firmware(struct iwi_softc *sc, void *data)
   2258       1.1   skrll {
   2259       1.1   skrll 	struct iwi_firmware *kfw = &sc->fw;
   2260       1.1   skrll 	struct iwi_firmware ufw;
   2261       1.1   skrll 	int error;
   2262       1.1   skrll 
   2263       1.1   skrll 	iwi_free_firmware(sc);
   2264       1.1   skrll 
   2265       1.1   skrll 	if ((error = copyin(data, &ufw, sizeof ufw)) != 0)
   2266       1.1   skrll 		goto fail1;
   2267       1.1   skrll 
   2268       1.1   skrll 	kfw->boot_size  = ufw.boot_size;
   2269       1.1   skrll 	kfw->ucode_size = ufw.ucode_size;
   2270       1.1   skrll 	kfw->main_size  = ufw.main_size;
   2271       1.1   skrll 
   2272       1.1   skrll 	kfw->boot = malloc(kfw->boot_size, M_DEVBUF, M_NOWAIT);
   2273       1.1   skrll 	if (kfw->boot == NULL) {
   2274       1.1   skrll 		error = ENOMEM;
   2275       1.1   skrll 		goto fail1;
   2276       1.1   skrll 	}
   2277       1.1   skrll 
   2278       1.1   skrll 	kfw->ucode = malloc(kfw->ucode_size, M_DEVBUF, M_NOWAIT);
   2279       1.1   skrll 	if (kfw->ucode == NULL) {
   2280       1.1   skrll 		error = ENOMEM;
   2281       1.1   skrll 		goto fail2;
   2282       1.1   skrll 	}
   2283       1.1   skrll 
   2284       1.1   skrll 	kfw->main = malloc(kfw->main_size, M_DEVBUF, M_NOWAIT);
   2285       1.1   skrll 	if (kfw->main == NULL) {
   2286       1.1   skrll 		error = ENOMEM;
   2287       1.1   skrll 		goto fail3;
   2288       1.1   skrll 	}
   2289       1.1   skrll 
   2290       1.1   skrll 	if ((error = copyin(ufw.boot, kfw->boot, kfw->boot_size)) != 0)
   2291       1.1   skrll 		goto fail4;
   2292       1.1   skrll 
   2293       1.1   skrll 	if ((error = copyin(ufw.ucode, kfw->ucode, kfw->ucode_size)) != 0)
   2294       1.1   skrll 		goto fail4;
   2295       1.1   skrll 
   2296       1.1   skrll 	if ((error = copyin(ufw.main, kfw->main, kfw->main_size)) != 0)
   2297       1.1   skrll 		goto fail4;
   2298       1.1   skrll 
   2299       1.1   skrll 	DPRINTF(("Firmware cached: boot %u, ucode %u, main %u\n",
   2300       1.1   skrll 	    kfw->boot_size, kfw->ucode_size, kfw->main_size));
   2301       1.1   skrll 
   2302       1.1   skrll 	sc->flags |= IWI_FLAG_FW_CACHED;
   2303       1.1   skrll 
   2304       1.1   skrll 	return 0;
   2305       1.1   skrll 
   2306       1.1   skrll fail4:	free(kfw->boot, M_DEVBUF);
   2307       1.1   skrll fail3:	free(kfw->ucode, M_DEVBUF);
   2308       1.1   skrll fail2:	free(kfw->main, M_DEVBUF);
   2309       1.1   skrll fail1:
   2310       1.1   skrll 	return error;
   2311       1.1   skrll }
   2312       1.1   skrll 
   2313       1.1   skrll static void
   2314       1.1   skrll iwi_free_firmware(struct iwi_softc *sc)
   2315       1.1   skrll {
   2316       1.1   skrll 	if (!(sc->flags & IWI_FLAG_FW_CACHED))
   2317       1.1   skrll 		return;
   2318       1.5   perry 
   2319       1.1   skrll 	free(sc->fw.boot, M_DEVBUF);
   2320       1.1   skrll 	free(sc->fw.ucode, M_DEVBUF);
   2321       1.1   skrll 	free(sc->fw.main, M_DEVBUF);
   2322       1.1   skrll 
   2323       1.1   skrll 	sc->flags &= ~IWI_FLAG_FW_CACHED;
   2324       1.1   skrll }
   2325       1.1   skrll 
   2326       1.1   skrll static int
   2327       1.1   skrll iwi_config(struct iwi_softc *sc)
   2328       1.1   skrll {
   2329       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   2330       1.9  dyoung 	struct ifnet *ifp = &sc->sc_if;
   2331       1.1   skrll 	struct iwi_configuration config;
   2332       1.1   skrll 	struct iwi_rateset rs;
   2333       1.1   skrll 	struct iwi_txpower power;
   2334  1.10.2.1    yamt 	struct ieee80211_key *wk;
   2335       1.1   skrll 	struct iwi_wep_key wepkey;
   2336  1.10.2.1    yamt 	uint32_t data;
   2337       1.1   skrll 	int error, i;
   2338       1.1   skrll 
   2339       1.1   skrll 	IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl));
   2340       1.1   skrll 	DPRINTF(("Setting MAC address to %s\n", ether_sprintf(ic->ic_myaddr)));
   2341       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
   2342       1.1   skrll 	    IEEE80211_ADDR_LEN, 0);
   2343       1.1   skrll 	if (error != 0)
   2344       1.1   skrll 		return error;
   2345       1.1   skrll 
   2346       1.1   skrll 	memset(&config, 0, sizeof config);
   2347  1.10.2.1    yamt 	config.bluetooth_coexistence = sc->bluetooth;
   2348  1.10.2.1    yamt 	config.antenna = sc->antenna;
   2349       1.1   skrll 	config.multicast_enabled = 1;
   2350  1.10.2.1    yamt 	config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
   2351  1.10.2.1    yamt 	config.disable_unicast_decryption = 1;
   2352  1.10.2.1    yamt 	config.disable_multicast_decryption = 1;
   2353       1.1   skrll 	DPRINTF(("Configuring adapter\n"));
   2354       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config, sizeof config,
   2355       1.1   skrll 	    0);
   2356       1.1   skrll 	if (error != 0)
   2357       1.1   skrll 		return error;
   2358       1.1   skrll 
   2359       1.1   skrll 	data = htole32(IWI_POWER_MODE_CAM);
   2360       1.1   skrll 	DPRINTF(("Setting power mode to %u\n", le32toh(data)));
   2361       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_POWER_MODE, &data, sizeof data, 0);
   2362       1.1   skrll 	if (error != 0)
   2363       1.1   skrll 		return error;
   2364       1.1   skrll 
   2365       1.1   skrll 	data = htole32(ic->ic_rtsthreshold);
   2366       1.1   skrll 	DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
   2367       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data, 0);
   2368       1.1   skrll 	if (error != 0)
   2369       1.1   skrll 		return error;
   2370       1.1   skrll 
   2371  1.10.2.1    yamt 	data = htole32(ic->ic_fragthreshold);
   2372  1.10.2.1    yamt 	DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
   2373  1.10.2.1    yamt 	error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data, 0);
   2374  1.10.2.1    yamt 	if (error != 0)
   2375  1.10.2.1    yamt 		return error;
   2376  1.10.2.1    yamt 
   2377       1.1   skrll 	if (ic->ic_opmode == IEEE80211_M_IBSS) {
   2378       1.1   skrll 		power.mode = IWI_MODE_11B;
   2379       1.1   skrll 		power.nchan = 11;
   2380       1.1   skrll 		for (i = 0; i < 11; i++) {
   2381       1.1   skrll 			power.chan[i].chan = i + 1;
   2382       1.1   skrll 			power.chan[i].power = IWI_TXPOWER_MAX;
   2383       1.1   skrll 		}
   2384       1.1   skrll 		DPRINTF(("Setting .11b channels tx power\n"));
   2385       1.1   skrll 		error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
   2386       1.1   skrll 		    0);
   2387       1.1   skrll 		if (error != 0)
   2388       1.1   skrll 			return error;
   2389       1.1   skrll 
   2390       1.1   skrll 		power.mode = IWI_MODE_11G;
   2391       1.1   skrll 		DPRINTF(("Setting .11g channels tx power\n"));
   2392       1.1   skrll 		error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
   2393       1.1   skrll 		    0);
   2394       1.1   skrll 		if (error != 0)
   2395       1.1   skrll 			return error;
   2396       1.1   skrll 	}
   2397       1.1   skrll 
   2398       1.1   skrll 	rs.mode = IWI_MODE_11G;
   2399       1.1   skrll 	rs.type = IWI_RATESET_TYPE_SUPPORTED;
   2400       1.1   skrll 	rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11G].rs_nrates;
   2401       1.1   skrll 	memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11G].rs_rates,
   2402       1.1   skrll 	    rs.nrates);
   2403       1.1   skrll 	DPRINTF(("Setting .11bg supported rates (%u)\n", rs.nrates));
   2404       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
   2405       1.1   skrll 	if (error != 0)
   2406       1.1   skrll 		return error;
   2407       1.1   skrll 
   2408       1.1   skrll 	rs.mode = IWI_MODE_11A;
   2409       1.1   skrll 	rs.type = IWI_RATESET_TYPE_SUPPORTED;
   2410       1.1   skrll 	rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11A].rs_nrates;
   2411       1.1   skrll 	memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11A].rs_rates,
   2412       1.1   skrll 	    rs.nrates);
   2413       1.1   skrll 	DPRINTF(("Setting .11a supported rates (%u)\n", rs.nrates));
   2414       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
   2415       1.1   skrll 	if (error != 0)
   2416       1.1   skrll 		return error;
   2417       1.1   skrll 
   2418  1.10.2.1    yamt 	/* if we have a desired ESSID, set it now */
   2419  1.10.2.1    yamt 	if (ic->ic_des_esslen != 0) {
   2420  1.10.2.1    yamt #ifdef IWI_DEBUG
   2421  1.10.2.1    yamt 		if (iwi_debug > 0) {
   2422  1.10.2.1    yamt 			printf("Setting desired ESSID to ");
   2423  1.10.2.1    yamt 			ieee80211_print_essid(ic->ic_des_essid,
   2424  1.10.2.1    yamt 			    ic->ic_des_esslen);
   2425  1.10.2.1    yamt 			printf("\n");
   2426  1.10.2.1    yamt 		}
   2427  1.10.2.1    yamt #endif
   2428  1.10.2.1    yamt 		error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ic->ic_des_essid,
   2429  1.10.2.1    yamt 		    ic->ic_des_esslen, 0);
   2430  1.10.2.1    yamt 		if (error != 0)
   2431  1.10.2.1    yamt 			return error;
   2432  1.10.2.1    yamt 	}
   2433  1.10.2.1    yamt 
   2434       1.1   skrll 	data = htole32(arc4random());
   2435       1.1   skrll 	DPRINTF(("Setting initialization vector to %u\n", le32toh(data)));
   2436       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data, 0);
   2437       1.1   skrll 	if (error != 0)
   2438       1.1   skrll 		return error;
   2439       1.1   skrll 
   2440  1.10.2.1    yamt 	for (i = 0; i < IEEE80211_WEP_NKID; i++) {
   2441  1.10.2.1    yamt 		wk = &ic->ic_crypto.cs_nw_keys[i];
   2442  1.10.2.1    yamt 
   2443  1.10.2.1    yamt 		wepkey.cmd = IWI_WEP_KEY_CMD_SETKEY;
   2444  1.10.2.1    yamt 		wepkey.idx = i;
   2445  1.10.2.1    yamt 		wepkey.len = wk->wk_keylen;
   2446  1.10.2.1    yamt 		memset(wepkey.key, 0, sizeof wepkey.key);
   2447  1.10.2.1    yamt 		memcpy(wepkey.key, wk->wk_key, wk->wk_keylen);
   2448  1.10.2.1    yamt 		DPRINTF(("Setting wep key index %u len %u\n",
   2449  1.10.2.1    yamt 		    wepkey.idx, wepkey.len));
   2450  1.10.2.1    yamt 		error = iwi_cmd(sc, IWI_CMD_SET_WEP_KEY, &wepkey,
   2451  1.10.2.1    yamt 		    sizeof wepkey, 0);
   2452  1.10.2.1    yamt 		if (error != 0)
   2453  1.10.2.1    yamt 			return error;
   2454       1.1   skrll 	}
   2455       1.1   skrll 
   2456       1.1   skrll 	/* Enable adapter */
   2457       1.1   skrll 	DPRINTF(("Enabling adapter\n"));
   2458       1.1   skrll 	return iwi_cmd(sc, IWI_CMD_ENABLE, NULL, 0, 0);
   2459       1.1   skrll }
   2460       1.1   skrll 
   2461       1.1   skrll static int
   2462       1.8  sekiya iwi_set_chan(struct iwi_softc *sc, struct ieee80211_channel *chan)
   2463       1.8  sekiya {
   2464       1.8  sekiya 	struct ieee80211com *ic = &sc->sc_ic;
   2465  1.10.2.1    yamt 	struct iwi_scan_v2 scan;
   2466  1.10.2.1    yamt 
   2467  1.10.2.1    yamt 	(void)memset(&scan, 0, sizeof scan);
   2468       1.8  sekiya 
   2469  1.10.2.1    yamt 	scan.dwelltime[IWI_SCAN_TYPE_PASSIVE] = htole16(2000);
   2470  1.10.2.1    yamt 	scan.channels[0] = 1 |
   2471  1.10.2.1    yamt 	    (IEEE80211_IS_CHAN_5GHZ(chan) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ);
   2472       1.8  sekiya 	scan.channels[1] = ieee80211_chan2ieee(ic, chan);
   2473  1.10.2.1    yamt 	iwi_scan_type_set(scan, 1, IWI_SCAN_TYPE_PASSIVE);
   2474       1.8  sekiya 
   2475       1.8  sekiya 	DPRINTF(("Setting channel to %u\n", ieee80211_chan2ieee(ic, chan)));
   2476  1.10.2.1    yamt 	return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
   2477       1.8  sekiya }
   2478       1.8  sekiya 
   2479       1.8  sekiya static int
   2480       1.1   skrll iwi_scan(struct iwi_softc *sc)
   2481       1.1   skrll {
   2482       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   2483  1.10.2.1    yamt 	struct iwi_scan_v2 scan;
   2484  1.10.2.1    yamt 	uint32_t type;
   2485  1.10.2.1    yamt 	uint8_t *p;
   2486  1.10.2.1    yamt 	int i, count, idx;
   2487  1.10.2.1    yamt 
   2488  1.10.2.1    yamt 	(void)memset(&scan, 0, sizeof scan);
   2489  1.10.2.1    yamt 	scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BROADCAST] =
   2490  1.10.2.1    yamt 	    htole16(sc->dwelltime);
   2491  1.10.2.1    yamt 	scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BDIRECT] =
   2492  1.10.2.1    yamt 	    htole16(sc->dwelltime);
   2493  1.10.2.1    yamt 
   2494  1.10.2.1    yamt 	/* tell the firmware about the desired essid */
   2495  1.10.2.1    yamt 	if (ic->ic_des_esslen) {
   2496  1.10.2.1    yamt 		int error;
   2497  1.10.2.1    yamt 
   2498  1.10.2.1    yamt 		DPRINTF(("%s: Setting adapter desired ESSID to %s\n",
   2499  1.10.2.1    yamt 		    __func__, ic->ic_des_essid));
   2500  1.10.2.1    yamt 
   2501  1.10.2.1    yamt 		error = iwi_cmd(sc, IWI_CMD_SET_ESSID,
   2502  1.10.2.1    yamt 		    ic->ic_des_essid, ic->ic_des_esslen, 1);
   2503  1.10.2.1    yamt 		if (error)
   2504  1.10.2.1    yamt 			return error;
   2505       1.1   skrll 
   2506  1.10.2.1    yamt 		type = IWI_SCAN_TYPE_ACTIVE_BDIRECT;
   2507  1.10.2.1    yamt 	} else {
   2508  1.10.2.1    yamt 		type = IWI_SCAN_TYPE_ACTIVE_BROADCAST;
   2509  1.10.2.1    yamt 	}
   2510  1.10.2.1    yamt 
   2511  1.10.2.1    yamt 	p = &scan.channels[0];
   2512  1.10.2.1    yamt 	count = idx = 0;
   2513       1.1   skrll 	for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
   2514       1.1   skrll 		if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
   2515       1.1   skrll 		    isset(ic->ic_chan_active, i)) {
   2516       1.1   skrll 			*++p = i;
   2517       1.1   skrll 			count++;
   2518  1.10.2.1    yamt 			idx++;
   2519  1.10.2.1    yamt  			iwi_scan_type_set(scan, idx, type);
   2520       1.1   skrll 		}
   2521       1.1   skrll 	}
   2522  1.10.2.1    yamt 	if (count) {
   2523  1.10.2.1    yamt 		*(p - count) = IWI_CHAN_5GHZ | count;
   2524  1.10.2.1    yamt 		p++;
   2525  1.10.2.1    yamt 	}
   2526       1.1   skrll 
   2527       1.1   skrll 	count = 0;
   2528       1.1   skrll 	for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
   2529       1.1   skrll 		if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
   2530       1.1   skrll 		    isset(ic->ic_chan_active, i)) {
   2531       1.1   skrll 			*++p = i;
   2532       1.1   skrll 			count++;
   2533  1.10.2.1    yamt 			idx++;
   2534  1.10.2.1    yamt 			iwi_scan_type_set(scan, idx, type);
   2535       1.1   skrll 		}
   2536       1.1   skrll 	}
   2537       1.1   skrll 	*(p - count) = IWI_CHAN_2GHZ | count;
   2538       1.1   skrll 
   2539       1.1   skrll 	DPRINTF(("Start scanning\n"));
   2540  1.10.2.1    yamt 	return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
   2541       1.1   skrll }
   2542       1.1   skrll 
   2543       1.1   skrll static int
   2544       1.1   skrll iwi_auth_and_assoc(struct iwi_softc *sc)
   2545       1.1   skrll {
   2546       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   2547       1.1   skrll 	struct ieee80211_node *ni = ic->ic_bss;
   2548  1.10.2.1    yamt 	struct ifnet *ifp = &sc->sc_if;
   2549  1.10.2.1    yamt 	struct ieee80211_wme_info wme;
   2550       1.1   skrll 	struct iwi_configuration config;
   2551       1.1   skrll 	struct iwi_associate assoc;
   2552       1.1   skrll 	struct iwi_rateset rs;
   2553  1.10.2.1    yamt 	uint16_t capinfo;
   2554  1.10.2.1    yamt 	uint32_t data;
   2555       1.1   skrll 	int error;
   2556       1.1   skrll 
   2557       1.1   skrll 	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
   2558       1.1   skrll 		memset(&config, 0, sizeof config);
   2559  1.10.2.1    yamt 		config.bluetooth_coexistence = sc->bluetooth;
   2560  1.10.2.1    yamt 		config.antenna = sc->antenna;
   2561       1.1   skrll 		config.multicast_enabled = 1;
   2562  1.10.2.1    yamt 		config.use_protection = 1;
   2563  1.10.2.1    yamt 		config.answer_pbreq =
   2564  1.10.2.1    yamt 		    (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
   2565  1.10.2.1    yamt 		config.disable_unicast_decryption = 1;
   2566  1.10.2.1    yamt 		config.disable_multicast_decryption = 1;
   2567       1.1   skrll 		DPRINTF(("Configuring adapter\n"));
   2568       1.1   skrll 		error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config,
   2569       1.1   skrll 		    sizeof config, 1);
   2570       1.1   skrll 		if (error != 0)
   2571       1.1   skrll 			return error;
   2572       1.1   skrll 	}
   2573       1.1   skrll 
   2574       1.1   skrll #ifdef IWI_DEBUG
   2575       1.1   skrll 	if (iwi_debug > 0) {
   2576       1.1   skrll 		printf("Setting ESSID to ");
   2577       1.1   skrll 		ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
   2578       1.1   skrll 		printf("\n");
   2579       1.1   skrll 	}
   2580       1.1   skrll #endif
   2581       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ni->ni_essid, ni->ni_esslen, 1);
   2582       1.1   skrll 	if (error != 0)
   2583       1.1   skrll 		return error;
   2584       1.1   skrll 
   2585  1.10.2.1    yamt 	/* the rate set has already been "negotiated" */
   2586       1.1   skrll 	rs.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
   2587       1.1   skrll 	    IWI_MODE_11G;
   2588  1.10.2.1    yamt 	rs.type = IWI_RATESET_TYPE_NEGOTIATED;
   2589       1.1   skrll 	rs.nrates = ni->ni_rates.rs_nrates;
   2590       1.1   skrll 	memcpy(rs.rates, ni->ni_rates.rs_rates, rs.nrates);
   2591  1.10.2.1    yamt 	DPRINTF(("Setting negotiated rates (%u)\n", rs.nrates));
   2592       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 1);
   2593       1.1   skrll 	if (error != 0)
   2594       1.1   skrll 		return error;
   2595       1.1   skrll 
   2596  1.10.2.1    yamt 	if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL) {
   2597  1.10.2.1    yamt 		wme.wme_id = IEEE80211_ELEMID_VENDOR;
   2598  1.10.2.1    yamt 		wme.wme_len = sizeof (struct ieee80211_wme_info) - 2;
   2599  1.10.2.1    yamt 		wme.wme_oui[0] = 0x00;
   2600  1.10.2.1    yamt 		wme.wme_oui[1] = 0x50;
   2601  1.10.2.1    yamt 		wme.wme_oui[2] = 0xf2;
   2602  1.10.2.1    yamt 		wme.wme_type = WME_OUI_TYPE;
   2603  1.10.2.1    yamt 		wme.wme_subtype = WME_INFO_OUI_SUBTYPE;
   2604  1.10.2.1    yamt 		wme.wme_version = WME_VERSION;
   2605  1.10.2.1    yamt 		wme.wme_info = 0;
   2606  1.10.2.1    yamt 
   2607  1.10.2.1    yamt 		DPRINTF(("Setting WME IE (len=%u)\n", wme.wme_len));
   2608  1.10.2.1    yamt 		error = iwi_cmd(sc, IWI_CMD_SET_WMEIE, &wme, sizeof wme, 1);
   2609  1.10.2.1    yamt 		if (error != 0)
   2610  1.10.2.1    yamt 			return error;
   2611  1.10.2.1    yamt 	}
   2612  1.10.2.1    yamt 
   2613  1.10.2.1    yamt 	if (ic->ic_opt_ie != NULL) {
   2614  1.10.2.1    yamt 		DPRINTF(("Setting optional IE (len=%u)\n", ic->ic_opt_ie_len));
   2615  1.10.2.1    yamt 		error = iwi_cmd(sc, IWI_CMD_SET_OPTIE, ic->ic_opt_ie,
   2616  1.10.2.1    yamt 		    ic->ic_opt_ie_len, 1);
   2617  1.10.2.1    yamt 		if (error != 0)
   2618  1.10.2.1    yamt 			return error;
   2619  1.10.2.1    yamt 	}
   2620       1.1   skrll 	data = htole32(ni->ni_rssi);
   2621       1.1   skrll 	DPRINTF(("Setting sensitivity to %d\n", (int8_t)ni->ni_rssi));
   2622       1.1   skrll 	error = iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &data, sizeof data, 1);
   2623       1.1   skrll 	if (error != 0)
   2624       1.1   skrll 		return error;
   2625       1.1   skrll 
   2626       1.1   skrll 	memset(&assoc, 0, sizeof assoc);
   2627       1.1   skrll 	assoc.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
   2628       1.1   skrll 	    IWI_MODE_11G;
   2629       1.1   skrll 	assoc.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
   2630  1.10.2.1    yamt 	if (ni->ni_authmode == IEEE80211_AUTH_SHARED)
   2631  1.10.2.1    yamt 		assoc.auth = (ic->ic_crypto.cs_def_txkey << 4) | IWI_AUTH_SHARED;
   2632  1.10.2.1    yamt 	if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL)
   2633  1.10.2.1    yamt 		assoc.policy |= htole16(IWI_POLICY_WME);
   2634  1.10.2.1    yamt 	if (ic->ic_flags & IEEE80211_F_WPA)
   2635  1.10.2.1    yamt 		assoc.policy |= htole16(IWI_POLICY_WPA);
   2636       1.9  dyoung 	memcpy(assoc.tstamp, ni->ni_tstamp.data, 8);
   2637  1.10.2.1    yamt 
   2638  1.10.2.1    yamt 	if (ic->ic_opmode == IEEE80211_M_IBSS)
   2639  1.10.2.1    yamt 		capinfo = IEEE80211_CAPINFO_IBSS;
   2640  1.10.2.1    yamt 	else
   2641  1.10.2.1    yamt 		capinfo = IEEE80211_CAPINFO_ESS;
   2642  1.10.2.1    yamt 	if (ic->ic_flags & IEEE80211_F_PRIVACY)
   2643  1.10.2.1    yamt 		capinfo |= IEEE80211_CAPINFO_PRIVACY;
   2644  1.10.2.1    yamt 	if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
   2645  1.10.2.1    yamt 	    IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
   2646  1.10.2.1    yamt 		capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
   2647  1.10.2.1    yamt 	if (ic->ic_flags & IEEE80211_F_SHSLOT)
   2648  1.10.2.1    yamt 		capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
   2649  1.10.2.1    yamt 	assoc.capinfo = htole16(capinfo);
   2650  1.10.2.1    yamt 
   2651       1.1   skrll 	assoc.lintval = htole16(ic->ic_lintval);
   2652       1.1   skrll 	assoc.intval = htole16(ni->ni_intval);
   2653       1.1   skrll 	IEEE80211_ADDR_COPY(assoc.bssid, ni->ni_bssid);
   2654  1.10.2.1    yamt 	if (ic->ic_opmode == IEEE80211_M_IBSS)
   2655  1.10.2.1    yamt 		IEEE80211_ADDR_COPY(assoc.dst, ifp->if_broadcastaddr);
   2656  1.10.2.1    yamt 	else
   2657  1.10.2.1    yamt 		IEEE80211_ADDR_COPY(assoc.dst, ni->ni_bssid);
   2658       1.1   skrll 	DPRINTF(("Trying to associate to %s channel %u auth %u\n",
   2659       1.1   skrll 	    ether_sprintf(assoc.bssid), assoc.chan, assoc.auth));
   2660       1.1   skrll 	return iwi_cmd(sc, IWI_CMD_ASSOCIATE, &assoc, sizeof assoc, 1);
   2661       1.1   skrll }
   2662       1.1   skrll 
   2663       1.1   skrll static int
   2664       1.1   skrll iwi_init(struct ifnet *ifp)
   2665       1.1   skrll {
   2666       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
   2667       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   2668       1.1   skrll 	struct iwi_firmware *fw = &sc->fw;
   2669       1.1   skrll 	int i, error;
   2670       1.1   skrll 
   2671       1.1   skrll 	/* exit immediately if firmware has not been ioctl'd */
   2672       1.1   skrll 	if (!(sc->flags & IWI_FLAG_FW_CACHED)) {
   2673  1.10.2.1    yamt 		if (!(sc->flags & IWI_FLAG_FW_WARNED))
   2674  1.10.2.1    yamt 			aprint_error("%s: Firmware not loaded\n",
   2675  1.10.2.1    yamt 			    sc->sc_dev.dv_xname);
   2676  1.10.2.1    yamt 		sc->flags |= IWI_FLAG_FW_WARNED;
   2677       1.1   skrll 		ifp->if_flags &= ~IFF_UP;
   2678       1.1   skrll 		return EIO;
   2679       1.1   skrll 	}
   2680       1.1   skrll 
   2681  1.10.2.1    yamt 	iwi_stop(ifp, 0);
   2682  1.10.2.1    yamt 
   2683       1.1   skrll 	if ((error = iwi_reset(sc)) != 0) {
   2684       1.1   skrll 		aprint_error("%s: could not reset adapter\n",
   2685       1.1   skrll 		    sc->sc_dev.dv_xname);
   2686       1.1   skrll 		goto fail;
   2687       1.1   skrll 	}
   2688       1.1   skrll 
   2689       1.1   skrll 	if ((error = iwi_load_firmware(sc, fw->boot, fw->boot_size)) != 0) {
   2690       1.1   skrll 		aprint_error("%s: could not load boot firmware\n",
   2691       1.1   skrll 		    sc->sc_dev.dv_xname);
   2692       1.1   skrll 		goto fail;
   2693       1.1   skrll 	}
   2694       1.1   skrll 
   2695       1.1   skrll 	if ((error = iwi_load_ucode(sc, fw->ucode, fw->ucode_size)) != 0) {
   2696       1.1   skrll 		aprint_error("%s: could not load microcode\n",
   2697       1.1   skrll 		    sc->sc_dev.dv_xname);
   2698       1.1   skrll 		goto fail;
   2699       1.1   skrll 	}
   2700       1.1   skrll 
   2701       1.1   skrll 	iwi_stop_master(sc);
   2702       1.1   skrll 
   2703  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_CMD_BASE, sc->cmdq.desc_map->dm_segs[0].ds_addr);
   2704  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_CMD_SIZE, sc->cmdq.count);
   2705  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
   2706  1.10.2.1    yamt 
   2707  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX1_BASE, sc->txq[0].desc_map->dm_segs[0].ds_addr);
   2708  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX1_SIZE, sc->txq[0].count);
   2709  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq[0].cur);
   2710  1.10.2.1    yamt 
   2711  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX2_BASE, sc->txq[1].desc_map->dm_segs[0].ds_addr);
   2712  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX2_SIZE, sc->txq[1].count);
   2713  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX2_WIDX, sc->txq[1].cur);
   2714  1.10.2.1    yamt 
   2715  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX3_BASE, sc->txq[2].desc_map->dm_segs[0].ds_addr);
   2716  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX3_SIZE, sc->txq[2].count);
   2717  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX3_WIDX, sc->txq[2].cur);
   2718  1.10.2.1    yamt 
   2719  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX4_BASE, sc->txq[3].desc_map->dm_segs[0].ds_addr);
   2720  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX4_SIZE, sc->txq[3].count);
   2721  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_TX4_WIDX, sc->txq[3].cur);
   2722       1.1   skrll 
   2723  1.10.2.1    yamt 	for (i = 0; i < sc->rxq.count; i++)
   2724       1.1   skrll 		CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4,
   2725  1.10.2.1    yamt 		    sc->rxq.data[i].map->dm_segs[0].ds_addr);
   2726       1.1   skrll 
   2727  1.10.2.1    yamt 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, sc->rxq.count -1);
   2728       1.1   skrll 
   2729       1.1   skrll 	if ((error = iwi_load_firmware(sc, fw->main, fw->main_size)) != 0) {
   2730       1.1   skrll 		aprint_error("%s: could not load main firmware\n",
   2731       1.1   skrll 		    sc->sc_dev.dv_xname);
   2732       1.1   skrll 		goto fail;
   2733       1.1   skrll 	}
   2734       1.1   skrll 
   2735       1.1   skrll 	sc->flags |= IWI_FLAG_FW_INITED;
   2736       1.1   skrll 
   2737       1.1   skrll 	if ((error = iwi_config(sc)) != 0) {
   2738       1.1   skrll 		aprint_error("%s: device configuration failed\n",
   2739       1.1   skrll 		    sc->sc_dev.dv_xname);
   2740       1.1   skrll 		goto fail;
   2741       1.1   skrll 	}
   2742       1.1   skrll 
   2743  1.10.2.1    yamt 	ic->ic_state = IEEE80211_S_INIT;
   2744       1.1   skrll 
   2745       1.1   skrll 	ifp->if_flags &= ~IFF_OACTIVE;
   2746       1.1   skrll 	ifp->if_flags |= IFF_RUNNING;
   2747       1.1   skrll 
   2748  1.10.2.1    yamt 	if (ic->ic_opmode != IEEE80211_M_MONITOR) {
   2749  1.10.2.1    yamt 		if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
   2750  1.10.2.1    yamt 			ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
   2751  1.10.2.1    yamt 	} else
   2752  1.10.2.1    yamt 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
   2753  1.10.2.1    yamt 
   2754       1.1   skrll 	return 0;
   2755       1.1   skrll 
   2756  1.10.2.1    yamt fail:	ifp->if_flags &= ~IFF_UP;
   2757  1.10.2.1    yamt 	iwi_stop(ifp, 0);
   2758       1.1   skrll 
   2759       1.1   skrll 	return error;
   2760       1.1   skrll }
   2761       1.1   skrll 
   2762       1.1   skrll static void
   2763       1.1   skrll iwi_stop(struct ifnet *ifp, int disable)
   2764       1.1   skrll {
   2765       1.1   skrll 	struct iwi_softc *sc = ifp->if_softc;
   2766       1.1   skrll 	struct ieee80211com *ic = &sc->sc_ic;
   2767  1.10.2.1    yamt 
   2768  1.10.2.1    yamt 	IWI_LED_OFF(sc);
   2769       1.1   skrll 
   2770       1.1   skrll 	iwi_stop_master(sc);
   2771       1.1   skrll 	CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_SW_RESET);
   2772       1.1   skrll 
   2773  1.10.2.1    yamt 	/* reset rings */
   2774  1.10.2.1    yamt 	iwi_reset_cmd_ring(sc, &sc->cmdq);
   2775  1.10.2.1    yamt 	iwi_reset_tx_ring(sc, &sc->txq[0]);
   2776  1.10.2.1    yamt 	iwi_reset_tx_ring(sc, &sc->txq[1]);
   2777  1.10.2.1    yamt 	iwi_reset_tx_ring(sc, &sc->txq[2]);
   2778  1.10.2.1    yamt 	iwi_reset_tx_ring(sc, &sc->txq[3]);
   2779  1.10.2.1    yamt 	iwi_reset_rx_ring(sc, &sc->rxq);
   2780       1.1   skrll 
   2781       1.1   skrll 	ifp->if_timer = 0;
   2782       1.1   skrll 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   2783       1.1   skrll 
   2784       1.1   skrll 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
   2785       1.1   skrll }
   2786  1.10.2.1    yamt 
   2787  1.10.2.1    yamt static void
   2788  1.10.2.1    yamt iwi_led_set(struct iwi_softc *sc, uint32_t state, int toggle)
   2789  1.10.2.1    yamt {
   2790  1.10.2.1    yamt 	uint32_t val;
   2791  1.10.2.1    yamt 
   2792  1.10.2.1    yamt 	val = MEM_READ_4(sc, IWI_MEM_EVENT_CTL);
   2793  1.10.2.1    yamt 
   2794  1.10.2.1    yamt 	switch (sc->nictype) {
   2795  1.10.2.1    yamt 	case 1:
   2796  1.10.2.1    yamt 		/* special NIC type: reversed leds */
   2797  1.10.2.1    yamt 		if (state == IWI_LED_ACTIVITY) {
   2798  1.10.2.1    yamt 			state &= ~IWI_LED_ACTIVITY;
   2799  1.10.2.1    yamt 			state |= IWI_LED_ASSOCIATED;
   2800  1.10.2.1    yamt 		} else if (state == IWI_LED_ASSOCIATED) {
   2801  1.10.2.1    yamt 			state &= ~IWI_LED_ASSOCIATED;
   2802  1.10.2.1    yamt 			state |= IWI_LED_ACTIVITY;
   2803  1.10.2.1    yamt 		}
   2804  1.10.2.1    yamt 		/* and ignore toggle effect */
   2805  1.10.2.1    yamt 		val |= state;
   2806  1.10.2.1    yamt 		break;
   2807  1.10.2.1    yamt 	case 0:
   2808  1.10.2.1    yamt 	case 2:
   2809  1.10.2.1    yamt 	case 3:
   2810  1.10.2.1    yamt 	case 4:
   2811  1.10.2.1    yamt 		val = (toggle && (val & state)) ? val & ~state : val | state;
   2812  1.10.2.1    yamt 		break;
   2813  1.10.2.1    yamt 	default:
   2814  1.10.2.1    yamt 		aprint_normal("%s: unknown NIC type %d\n",
   2815  1.10.2.1    yamt 		    sc->sc_dev.dv_xname, sc->nictype);
   2816  1.10.2.1    yamt 		return;
   2817  1.10.2.1    yamt 		break;
   2818  1.10.2.1    yamt 	}
   2819  1.10.2.1    yamt 
   2820  1.10.2.1    yamt 	MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, val);
   2821  1.10.2.1    yamt 
   2822  1.10.2.1    yamt 	return;
   2823  1.10.2.1    yamt }
   2824  1.10.2.1    yamt 
   2825  1.10.2.1    yamt static void
   2826  1.10.2.1    yamt iwi_error_log(struct iwi_softc *sc)
   2827  1.10.2.1    yamt {
   2828  1.10.2.1    yamt 	uint32_t b, n;
   2829  1.10.2.1    yamt 	int i;
   2830  1.10.2.1    yamt 
   2831  1.10.2.1    yamt 	static const char *const msg[] = {
   2832  1.10.2.1    yamt 		"no error",
   2833  1.10.2.1    yamt 		"failed",
   2834  1.10.2.1    yamt 		"memory range low",
   2835  1.10.2.1    yamt 		"memory range high",
   2836  1.10.2.1    yamt 		"bad parameter",
   2837  1.10.2.1    yamt 		"checksum",
   2838  1.10.2.1    yamt 		"NMI",
   2839  1.10.2.1    yamt 		"bad database",
   2840  1.10.2.1    yamt 		"allocation failed",
   2841  1.10.2.1    yamt 		"DMA underrun",
   2842  1.10.2.1    yamt 		"DMA status",
   2843  1.10.2.1    yamt 		"DINO",
   2844  1.10.2.1    yamt 		"EEPROM",
   2845  1.10.2.1    yamt 		"device assert",
   2846  1.10.2.1    yamt 		"fatal"
   2847  1.10.2.1    yamt 	};
   2848  1.10.2.1    yamt 
   2849  1.10.2.1    yamt 	b = CSR_READ_4(sc, IWI_CSR_ERRORLOG);
   2850  1.10.2.1    yamt 	n = MEM_READ_4(sc, b);
   2851  1.10.2.1    yamt 
   2852  1.10.2.1    yamt 	b += 4;
   2853  1.10.2.1    yamt 
   2854  1.10.2.1    yamt 	for (i = 0; i < n ; i++) {
   2855  1.10.2.1    yamt 		struct iwi_error fw_error;
   2856  1.10.2.1    yamt 
   2857  1.10.2.1    yamt 		MEM_CPY(sc, &fw_error, b, sizeof(fw_error));
   2858  1.10.2.1    yamt 
   2859  1.10.2.1    yamt 		printf("%s: %s\n", sc->sc_dev.dv_xname,
   2860  1.10.2.1    yamt 		    msg[fw_error.type]);
   2861  1.10.2.1    yamt 
   2862  1.10.2.1    yamt 		b += sizeof(fw_error);
   2863  1.10.2.1    yamt 	}
   2864  1.10.2.1    yamt }
   2865