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