Home | History | Annotate | Line # | Download | only in pci
if_rtwn.c revision 1.12
      1  1.12    nonaka /*	$NetBSD: if_rtwn.c,v 1.12 2017/05/18 01:32:46 nonaka Exp $	*/
      2   1.1    nonaka /*	$OpenBSD: if_rtwn.c,v 1.5 2015/06/14 08:02:47 stsp Exp $	*/
      3   1.1    nonaka #define	IEEE80211_NO_HT
      4   1.1    nonaka /*-
      5   1.1    nonaka  * Copyright (c) 2010 Damien Bergamini <damien.bergamini (at) free.fr>
      6   1.1    nonaka  * Copyright (c) 2015 Stefan Sperling <stsp (at) openbsd.org>
      7   1.1    nonaka  *
      8   1.1    nonaka  * Permission to use, copy, modify, and distribute this software for any
      9   1.1    nonaka  * purpose with or without fee is hereby granted, provided that the above
     10   1.1    nonaka  * copyright notice and this permission notice appear in all copies.
     11   1.1    nonaka  *
     12   1.1    nonaka  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     13   1.1    nonaka  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     14   1.1    nonaka  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     15   1.1    nonaka  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     16   1.1    nonaka  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     17   1.1    nonaka  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     18   1.1    nonaka  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     19   1.1    nonaka  */
     20   1.1    nonaka 
     21   1.1    nonaka /*
     22   1.1    nonaka  * Driver for Realtek RTL8188CE
     23   1.1    nonaka  */
     24   1.1    nonaka 
     25   1.1    nonaka #include <sys/cdefs.h>
     26  1.12    nonaka __KERNEL_RCSID(0, "$NetBSD: if_rtwn.c,v 1.12 2017/05/18 01:32:46 nonaka Exp $");
     27   1.1    nonaka 
     28   1.1    nonaka #include <sys/param.h>
     29   1.1    nonaka #include <sys/sockio.h>
     30   1.1    nonaka #include <sys/mbuf.h>
     31   1.1    nonaka #include <sys/kernel.h>
     32   1.1    nonaka #include <sys/socket.h>
     33   1.1    nonaka #include <sys/systm.h>
     34   1.1    nonaka #include <sys/callout.h>
     35   1.1    nonaka #include <sys/conf.h>
     36   1.1    nonaka #include <sys/device.h>
     37   1.1    nonaka #include <sys/endian.h>
     38   1.1    nonaka #include <sys/mutex.h>
     39   1.1    nonaka 
     40   1.1    nonaka #include <sys/bus.h>
     41   1.1    nonaka #include <sys/intr.h>
     42   1.1    nonaka 
     43   1.1    nonaka #include <net/bpf.h>
     44   1.1    nonaka #include <net/if.h>
     45   1.1    nonaka #include <net/if_arp.h>
     46   1.1    nonaka #include <net/if_dl.h>
     47   1.1    nonaka #include <net/if_ether.h>
     48   1.1    nonaka #include <net/if_media.h>
     49   1.1    nonaka #include <net/if_types.h>
     50   1.1    nonaka 
     51   1.1    nonaka #include <netinet/in.h>
     52   1.1    nonaka 
     53   1.1    nonaka #include <net80211/ieee80211_var.h>
     54   1.1    nonaka #include <net80211/ieee80211_radiotap.h>
     55   1.1    nonaka 
     56   1.1    nonaka #include <dev/firmload.h>
     57   1.1    nonaka 
     58   1.1    nonaka #include <dev/pci/pcireg.h>
     59   1.1    nonaka #include <dev/pci/pcivar.h>
     60   1.1    nonaka #include <dev/pci/pcidevs.h>
     61   1.1    nonaka 
     62   1.1    nonaka #include <dev/pci/if_rtwnreg.h>
     63   1.1    nonaka 
     64   1.1    nonaka #ifdef RTWN_DEBUG
     65   1.1    nonaka #define DPRINTF(x)	do { if (rtwn_debug) printf x; } while (0)
     66   1.1    nonaka #define DPRINTFN(n, x)	do { if (rtwn_debug >= (n)) printf x; } while (0)
     67   1.1    nonaka int rtwn_debug = 0;
     68   1.1    nonaka #else
     69   1.1    nonaka #define DPRINTF(x)
     70   1.1    nonaka #define DPRINTFN(n, x)
     71   1.1    nonaka #endif
     72   1.1    nonaka 
     73   1.1    nonaka /*
     74   1.1    nonaka  * PCI configuration space registers.
     75   1.1    nonaka  */
     76   1.1    nonaka #define	RTWN_PCI_IOBA		0x10	/* i/o mapped base */
     77   1.1    nonaka #define	RTWN_PCI_MMBA		0x18	/* memory mapped base */
     78   1.1    nonaka 
     79   1.1    nonaka #define RTWN_INT_ENABLE_TX						\
     80   1.1    nonaka 			(R92C_IMR_VODOK | R92C_IMR_VIDOK | R92C_IMR_BEDOK | \
     81   1.1    nonaka 			 R92C_IMR_BKDOK | R92C_IMR_MGNTDOK | \
     82   1.1    nonaka 			 R92C_IMR_HIGHDOK | R92C_IMR_BDOK)
     83   1.1    nonaka #define RTWN_INT_ENABLE_RX						\
     84   1.1    nonaka 			(R92C_IMR_ROK | R92C_IMR_RDU | R92C_IMR_RXFOVW)
     85   1.1    nonaka #define RTWN_INT_ENABLE	(RTWN_INT_ENABLE_TX | RTWN_INT_ENABLE_RX)
     86   1.1    nonaka 
     87   1.1    nonaka static const struct rtwn_device {
     88   1.1    nonaka 	pci_vendor_id_t		rd_vendor;
     89   1.1    nonaka 	pci_product_id_t	rd_product;
     90   1.1    nonaka } rtwn_devices[] = {
     91   1.1    nonaka 	{ PCI_VENDOR_REALTEK,	PCI_PRODUCT_REALTEK_RTL8188CE },
     92   1.1    nonaka 	{ PCI_VENDOR_REALTEK,	PCI_PRODUCT_REALTEK_RTL8192CE }
     93   1.1    nonaka };
     94   1.1    nonaka 
     95   1.1    nonaka static int	rtwn_match(device_t, cfdata_t, void *);
     96   1.1    nonaka static void	rtwn_attach(device_t, device_t, void *);
     97   1.1    nonaka static int	rtwn_detach(device_t, int);
     98   1.1    nonaka static int	rtwn_activate(device_t, enum devact);
     99   1.1    nonaka 
    100   1.1    nonaka CFATTACH_DECL_NEW(rtwn, sizeof(struct rtwn_softc), rtwn_match,
    101   1.1    nonaka     rtwn_attach, rtwn_detach, rtwn_activate);
    102   1.1    nonaka 
    103   1.1    nonaka static int	rtwn_alloc_rx_list(struct rtwn_softc *);
    104   1.1    nonaka static void	rtwn_reset_rx_list(struct rtwn_softc *);
    105   1.1    nonaka static void	rtwn_free_rx_list(struct rtwn_softc *);
    106   1.1    nonaka static void	rtwn_setup_rx_desc(struct rtwn_softc *, struct r92c_rx_desc *,
    107   1.1    nonaka 		    bus_addr_t, size_t, int);
    108   1.1    nonaka static int	rtwn_alloc_tx_list(struct rtwn_softc *, int);
    109   1.1    nonaka static void	rtwn_reset_tx_list(struct rtwn_softc *, int);
    110   1.1    nonaka static void	rtwn_free_tx_list(struct rtwn_softc *, int);
    111   1.1    nonaka static void	rtwn_write_1(struct rtwn_softc *, uint16_t, uint8_t);
    112   1.1    nonaka static void	rtwn_write_2(struct rtwn_softc *, uint16_t, uint16_t);
    113   1.1    nonaka static void	rtwn_write_4(struct rtwn_softc *, uint16_t, uint32_t);
    114   1.1    nonaka static uint8_t	rtwn_read_1(struct rtwn_softc *, uint16_t);
    115   1.1    nonaka static uint16_t	rtwn_read_2(struct rtwn_softc *, uint16_t);
    116   1.1    nonaka static uint32_t	rtwn_read_4(struct rtwn_softc *, uint16_t);
    117   1.1    nonaka static int	rtwn_fw_cmd(struct rtwn_softc *, uint8_t, const void *, int);
    118   1.1    nonaka static void	rtwn_rf_write(struct rtwn_softc *, int, uint8_t, uint32_t);
    119   1.1    nonaka static uint32_t	rtwn_rf_read(struct rtwn_softc *, int, uint8_t);
    120   1.1    nonaka static int	rtwn_llt_write(struct rtwn_softc *, uint32_t, uint32_t);
    121   1.1    nonaka static uint8_t	rtwn_efuse_read_1(struct rtwn_softc *, uint16_t);
    122   1.1    nonaka static void	rtwn_efuse_read(struct rtwn_softc *);
    123   1.1    nonaka static int	rtwn_read_chipid(struct rtwn_softc *);
    124   1.1    nonaka static void	rtwn_efuse_switch_power(struct rtwn_softc *);
    125   1.1    nonaka static void	rtwn_read_rom(struct rtwn_softc *);
    126   1.1    nonaka static int	rtwn_media_change(struct ifnet *);
    127   1.1    nonaka static int	rtwn_ra_init(struct rtwn_softc *);
    128   1.1    nonaka static int	rtwn_get_nettype(struct rtwn_softc *);
    129   1.1    nonaka static void	rtwn_set_nettype0_msr(struct rtwn_softc *, uint8_t);
    130   1.1    nonaka static void	rtwn_tsf_sync_enable(struct rtwn_softc *);
    131   1.1    nonaka static void	rtwn_set_led(struct rtwn_softc *, int, int);
    132   1.1    nonaka static void	rtwn_calib_to(void *);
    133   1.1    nonaka static void	rtwn_next_scan(void *);
    134   1.1    nonaka static void	rtwn_newassoc(struct ieee80211_node *, int);
    135   1.1    nonaka static int	rtwn_reset(struct ifnet *);
    136   1.1    nonaka static int	rtwn_newstate(struct ieee80211com *, enum ieee80211_state,
    137   1.1    nonaka 		    int);
    138   1.1    nonaka static int	rtwn_wme_update(struct ieee80211com *);
    139   1.1    nonaka static void	rtwn_update_avgrssi(struct rtwn_softc *, int, int8_t);
    140   1.1    nonaka static int8_t	rtwn_get_rssi(struct rtwn_softc *, int, void *);
    141   1.1    nonaka static void	rtwn_rx_frame(struct rtwn_softc *, struct r92c_rx_desc *,
    142   1.1    nonaka 		    struct rtwn_rx_data *, int);
    143   1.1    nonaka static int	rtwn_tx(struct rtwn_softc *, struct mbuf *,
    144   1.1    nonaka 		    struct ieee80211_node *);
    145   1.1    nonaka static void	rtwn_tx_done(struct rtwn_softc *, int);
    146   1.1    nonaka static void	rtwn_start(struct ifnet *);
    147   1.1    nonaka static void	rtwn_watchdog(struct ifnet *);
    148   1.1    nonaka static int	rtwn_ioctl(struct ifnet *, u_long, void *);
    149   1.1    nonaka static int	rtwn_power_on(struct rtwn_softc *);
    150   1.1    nonaka static int	rtwn_llt_init(struct rtwn_softc *);
    151   1.1    nonaka static void	rtwn_fw_reset(struct rtwn_softc *);
    152   1.1    nonaka static int	rtwn_fw_loadpage(struct rtwn_softc *, int, uint8_t *, int);
    153   1.1    nonaka static int	rtwn_load_firmware(struct rtwn_softc *);
    154   1.1    nonaka static int	rtwn_dma_init(struct rtwn_softc *);
    155   1.1    nonaka static void	rtwn_mac_init(struct rtwn_softc *);
    156   1.1    nonaka static void	rtwn_bb_init(struct rtwn_softc *);
    157   1.1    nonaka static void	rtwn_rf_init(struct rtwn_softc *);
    158   1.1    nonaka static void	rtwn_cam_init(struct rtwn_softc *);
    159   1.1    nonaka static void	rtwn_pa_bias_init(struct rtwn_softc *);
    160   1.1    nonaka static void	rtwn_rxfilter_init(struct rtwn_softc *);
    161   1.1    nonaka static void	rtwn_edca_init(struct rtwn_softc *);
    162   1.1    nonaka static void	rtwn_write_txpower(struct rtwn_softc *, int, uint16_t[]);
    163   1.1    nonaka static void	rtwn_get_txpower(struct rtwn_softc *, int,
    164   1.1    nonaka 		    struct ieee80211_channel *, struct ieee80211_channel *,
    165   1.1    nonaka 		    uint16_t[]);
    166   1.1    nonaka static void	rtwn_set_txpower(struct rtwn_softc *,
    167   1.1    nonaka 		    struct ieee80211_channel *, struct ieee80211_channel *);
    168   1.1    nonaka static void	rtwn_set_chan(struct rtwn_softc *,
    169   1.1    nonaka 		    struct ieee80211_channel *, struct ieee80211_channel *);
    170   1.1    nonaka static void	rtwn_iq_calib(struct rtwn_softc *);
    171   1.1    nonaka static void	rtwn_lc_calib(struct rtwn_softc *);
    172   1.1    nonaka static void	rtwn_temp_calib(struct rtwn_softc *);
    173   1.1    nonaka static int	rtwn_init(struct ifnet *);
    174   1.1    nonaka static void	rtwn_init_task(void *);
    175   1.1    nonaka static void	rtwn_stop(struct ifnet *, int);
    176   1.1    nonaka static int	rtwn_intr(void *);
    177  1.11    nonaka static void	rtwn_softintr(void *);
    178   1.1    nonaka 
    179   1.1    nonaka /* Aliases. */
    180   1.1    nonaka #define	rtwn_bb_write	rtwn_write_4
    181   1.1    nonaka #define rtwn_bb_read	rtwn_read_4
    182   1.1    nonaka 
    183   1.1    nonaka static const struct rtwn_device *
    184   1.1    nonaka rtwn_lookup(const struct pci_attach_args *pa)
    185   1.1    nonaka {
    186   1.1    nonaka 	const struct rtwn_device *rd;
    187   1.1    nonaka 	int i;
    188   1.1    nonaka 
    189   1.1    nonaka 	for (i = 0; i < __arraycount(rtwn_devices); i++) {
    190   1.1    nonaka 		rd = &rtwn_devices[i];
    191   1.1    nonaka 		if (PCI_VENDOR(pa->pa_id) == rd->rd_vendor &&
    192   1.1    nonaka 		    PCI_PRODUCT(pa->pa_id) == rd->rd_product)
    193   1.1    nonaka 			return rd;
    194   1.1    nonaka 	}
    195   1.1    nonaka 	return NULL;
    196   1.1    nonaka }
    197   1.1    nonaka 
    198   1.1    nonaka static int
    199   1.1    nonaka rtwn_match(device_t parent, cfdata_t match, void *aux)
    200   1.1    nonaka {
    201   1.1    nonaka 	struct pci_attach_args *pa = aux;
    202   1.1    nonaka 
    203   1.1    nonaka 	if (rtwn_lookup(pa) != NULL)
    204   1.1    nonaka 		return 1;
    205   1.1    nonaka 	return 0;
    206   1.1    nonaka }
    207   1.1    nonaka 
    208   1.1    nonaka static void
    209   1.1    nonaka rtwn_attach(device_t parent, device_t self, void *aux)
    210   1.1    nonaka {
    211   1.1    nonaka 	struct rtwn_softc *sc = device_private(self);
    212   1.1    nonaka 	struct pci_attach_args *pa = aux;
    213   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
    214   1.1    nonaka 	struct ifnet *ifp = GET_IFP(sc);
    215   1.1    nonaka 	int i, error;
    216   1.1    nonaka 	pcireg_t memtype;
    217   1.1    nonaka 	const char *intrstr;
    218   1.1    nonaka 	char intrbuf[PCI_INTRSTR_LEN];
    219   1.1    nonaka 
    220   1.1    nonaka 	sc->sc_dev = self;
    221   1.1    nonaka 	sc->sc_dmat = pa->pa_dmat;
    222   1.1    nonaka 	sc->sc_pc = pa->pa_pc;
    223   1.1    nonaka 	sc->sc_tag = pa->pa_tag;
    224   1.1    nonaka 
    225   1.1    nonaka 	pci_aprint_devinfo(pa, NULL);
    226   1.1    nonaka 
    227   1.1    nonaka 	callout_init(&sc->scan_to, 0);
    228   1.1    nonaka 	callout_setfunc(&sc->scan_to, rtwn_next_scan, sc);
    229   1.1    nonaka 	callout_init(&sc->calib_to, 0);
    230   1.1    nonaka 	callout_setfunc(&sc->calib_to, rtwn_calib_to, sc);
    231   1.1    nonaka 
    232  1.11    nonaka 	sc->sc_soft_ih = softint_establish(SOFTINT_NET, rtwn_softintr, sc);
    233   1.1    nonaka 	sc->init_task = softint_establish(SOFTINT_NET, rtwn_init_task, sc);
    234   1.1    nonaka 
    235   1.1    nonaka 	/* Power up the device */
    236   1.1    nonaka 	pci_set_powerstate(pa->pa_pc, pa->pa_tag, PCI_PMCSR_STATE_D0);
    237   1.1    nonaka 
    238   1.1    nonaka 	/* Map control/status registers. */
    239   1.1    nonaka 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, RTWN_PCI_MMBA);
    240   1.1    nonaka 	error = pci_mapreg_map(pa, RTWN_PCI_MMBA, memtype, 0, &sc->sc_st,
    241   1.1    nonaka 	    &sc->sc_sh, NULL, &sc->sc_mapsize);
    242   1.1    nonaka 	if (error != 0) {
    243   1.1    nonaka 		aprint_error_dev(self, "can't map mem space\n");
    244   1.1    nonaka 		return;
    245   1.1    nonaka 	}
    246   1.1    nonaka 
    247   1.1    nonaka 	/* Install interrupt handler. */
    248   1.1    nonaka 	if (pci_intr_alloc(pa, &sc->sc_pihp, NULL, 0)) {
    249   1.1    nonaka 		aprint_error_dev(self, "can't map interrupt\n");
    250   1.1    nonaka 		return;
    251   1.1    nonaka 	}
    252   1.1    nonaka 	intrstr = pci_intr_string(sc->sc_pc, sc->sc_pihp[0], intrbuf,
    253   1.1    nonaka 	    sizeof(intrbuf));
    254   1.1    nonaka 	sc->sc_ih = pci_intr_establish(sc->sc_pc, sc->sc_pihp[0], IPL_NET,
    255   1.1    nonaka 	    rtwn_intr, sc);
    256   1.1    nonaka 	if (sc->sc_ih == NULL) {
    257   1.1    nonaka 		aprint_error_dev(self, "can't establish interrupt");
    258   1.1    nonaka 		if (intrstr != NULL)
    259   1.1    nonaka 			aprint_error(" at %s", intrstr);
    260   1.1    nonaka 		aprint_error("\n");
    261   1.1    nonaka 		return;
    262   1.1    nonaka 	}
    263   1.1    nonaka 	aprint_normal_dev(self, "interrupting at %s\n", intrstr);
    264   1.1    nonaka 
    265   1.1    nonaka 	error = rtwn_read_chipid(sc);
    266   1.1    nonaka 	if (error != 0) {
    267   1.1    nonaka 		aprint_error_dev(self, "unsupported test or unknown chip\n");
    268   1.1    nonaka 		return;
    269   1.1    nonaka 	}
    270   1.1    nonaka 
    271   1.1    nonaka 	/* Disable PCIe Active State Power Management (ASPM). */
    272   1.1    nonaka 	if (pci_get_capability(sc->sc_pc, sc->sc_tag, PCI_CAP_PCIEXPRESS,
    273   1.1    nonaka 	    &sc->sc_cap_off, NULL)) {
    274   1.1    nonaka 		uint32_t lcsr = pci_conf_read(sc->sc_pc, sc->sc_tag,
    275   1.1    nonaka 		    sc->sc_cap_off + PCIE_LCSR);
    276   1.1    nonaka 		lcsr &= ~(PCIE_LCSR_ASPM_L0S | PCIE_LCSR_ASPM_L1);
    277   1.1    nonaka 		pci_conf_write(sc->sc_pc, sc->sc_tag,
    278   1.1    nonaka 		    sc->sc_cap_off + PCIE_LCSR, lcsr);
    279   1.1    nonaka 	}
    280   1.1    nonaka 
    281   1.1    nonaka 	/* Allocate Tx/Rx buffers. */
    282   1.1    nonaka 	error = rtwn_alloc_rx_list(sc);
    283   1.1    nonaka 	if (error != 0) {
    284   1.1    nonaka 		aprint_error_dev(self, "could not allocate Rx buffers\n");
    285   1.1    nonaka 		return;
    286   1.1    nonaka 	}
    287   1.1    nonaka 	for (i = 0; i < RTWN_NTXQUEUES; i++) {
    288   1.1    nonaka 		error = rtwn_alloc_tx_list(sc, i);
    289   1.1    nonaka 		if (error != 0) {
    290   1.1    nonaka 			aprint_error_dev(self,
    291   1.1    nonaka 			    "could not allocate Tx buffers\n");
    292   1.1    nonaka 			return;
    293   1.1    nonaka 		}
    294   1.1    nonaka 	}
    295   1.1    nonaka 
    296   1.1    nonaka 	/* Determine number of Tx/Rx chains. */
    297   1.1    nonaka 	if (sc->chip & RTWN_CHIP_92C) {
    298   1.1    nonaka 		sc->ntxchains = (sc->chip & RTWN_CHIP_92C_1T2R) ? 1 : 2;
    299   1.1    nonaka 		sc->nrxchains = 2;
    300   1.1    nonaka 	} else {
    301   1.1    nonaka 		sc->ntxchains = 1;
    302   1.1    nonaka 		sc->nrxchains = 1;
    303   1.1    nonaka 	}
    304   1.1    nonaka 	rtwn_read_rom(sc);
    305   1.1    nonaka 
    306   1.1    nonaka 	aprint_normal_dev(self, "MAC/BB RTL%s, RF 6052 %dT%dR, address %s\n",
    307   1.1    nonaka 	    (sc->chip & RTWN_CHIP_92C) ? "8192CE" : "8188CE",
    308   1.1    nonaka 	    sc->ntxchains, sc->nrxchains, ether_sprintf(ic->ic_myaddr));
    309   1.1    nonaka 
    310   1.1    nonaka 	/*
    311   1.1    nonaka 	 * Setup the 802.11 device.
    312   1.1    nonaka 	 */
    313   1.1    nonaka 	ic->ic_ifp = ifp;
    314   1.1    nonaka 	ic->ic_phytype = IEEE80211_T_OFDM;	/* Not only, but not used. */
    315   1.1    nonaka 	ic->ic_opmode = IEEE80211_M_STA;	/* Default to BSS mode. */
    316   1.1    nonaka 	ic->ic_state = IEEE80211_S_INIT;
    317   1.1    nonaka 
    318   1.1    nonaka 	/* Set device capabilities. */
    319   1.1    nonaka 	ic->ic_caps =
    320   1.1    nonaka 	    IEEE80211_C_MONITOR |	/* Monitor mode supported. */
    321   1.1    nonaka 	    IEEE80211_C_IBSS |		/* IBSS mode supported */
    322   1.1    nonaka 	    IEEE80211_C_HOSTAP |	/* HostAp mode supported */
    323   1.1    nonaka 	    IEEE80211_C_SHPREAMBLE |	/* Short preamble supported. */
    324   1.1    nonaka 	    IEEE80211_C_SHSLOT |	/* Short slot time supported. */
    325   1.1    nonaka 	    IEEE80211_C_WME |		/* 802.11e */
    326   1.1    nonaka 	    IEEE80211_C_WPA;		/* WPA/RSN. */
    327   1.1    nonaka 
    328   1.1    nonaka #ifndef IEEE80211_NO_HT
    329   1.1    nonaka 	/* Set HT capabilities. */
    330   1.1    nonaka 	ic->ic_htcaps =
    331   1.1    nonaka 	    IEEE80211_HTCAP_CBW20_40 |
    332   1.1    nonaka 	    IEEE80211_HTCAP_DSSSCCK40;
    333   1.1    nonaka 	/* Set supported HT rates. */
    334   1.1    nonaka 	for (i = 0; i < sc->nrxchains; i++)
    335   1.1    nonaka 		ic->ic_sup_mcs[i] = 0xff;
    336   1.1    nonaka #endif
    337   1.1    nonaka 
    338   1.1    nonaka 	/* Set supported .11b and .11g rates. */
    339   1.1    nonaka 	ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
    340   1.1    nonaka 	ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
    341   1.1    nonaka 
    342   1.1    nonaka 	/* Set supported .11b and .11g channels (1 through 14). */
    343   1.1    nonaka 	for (i = 1; i <= 14; i++) {
    344   1.1    nonaka 		ic->ic_channels[i].ic_freq =
    345   1.1    nonaka 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
    346   1.1    nonaka 		ic->ic_channels[i].ic_flags =
    347   1.1    nonaka 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
    348   1.1    nonaka 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
    349   1.1    nonaka 	}
    350   1.1    nonaka 
    351   1.1    nonaka 	ifp->if_softc = sc;
    352   1.1    nonaka 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    353   1.1    nonaka 	ifp->if_init = rtwn_init;
    354   1.1    nonaka 	ifp->if_ioctl = rtwn_ioctl;
    355   1.1    nonaka 	ifp->if_start = rtwn_start;
    356   1.1    nonaka 	ifp->if_watchdog = rtwn_watchdog;
    357   1.1    nonaka 	IFQ_SET_READY(&ifp->if_snd);
    358   1.1    nonaka 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    359   1.1    nonaka 
    360   1.1    nonaka 	if_initialize(ifp);
    361   1.1    nonaka 	ieee80211_ifattach(ic);
    362   1.5     ozaki 	/* Use common softint-based if_input */
    363   1.5     ozaki 	ifp->if_percpuq = if_percpuq_create(ifp);
    364   1.9     ozaki 	if_register(ifp);
    365   1.1    nonaka 
    366   1.1    nonaka 	/* override default methods */
    367   1.1    nonaka 	ic->ic_newassoc = rtwn_newassoc;
    368   1.1    nonaka 	ic->ic_reset = rtwn_reset;
    369   1.1    nonaka 	ic->ic_wme.wme_update = rtwn_wme_update;
    370   1.1    nonaka 
    371   1.1    nonaka 	/* Override state transition machine. */
    372   1.1    nonaka 	sc->sc_newstate = ic->ic_newstate;
    373   1.1    nonaka 	ic->ic_newstate = rtwn_newstate;
    374   1.1    nonaka 	ieee80211_media_init(ic, rtwn_media_change, ieee80211_media_status);
    375   1.1    nonaka 
    376   1.1    nonaka 	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
    377   1.1    nonaka 	    sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
    378   1.1    nonaka 	    &sc->sc_drvbpf);
    379   1.1    nonaka 
    380   1.1    nonaka 	sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
    381   1.1    nonaka 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
    382   1.1    nonaka 	sc->sc_rxtap.wr_ihdr.it_present = htole32(RTWN_RX_RADIOTAP_PRESENT);
    383   1.1    nonaka 
    384   1.1    nonaka 	sc->sc_txtap_len = sizeof(sc->sc_txtapu);
    385   1.1    nonaka 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
    386   1.1    nonaka 	sc->sc_txtap.wt_ihdr.it_present = htole32(RTWN_TX_RADIOTAP_PRESENT);
    387   1.1    nonaka 
    388   1.1    nonaka 	ieee80211_announce(ic);
    389   1.1    nonaka 
    390   1.1    nonaka 	if (!pmf_device_register(self, NULL, NULL))
    391   1.1    nonaka 		aprint_error_dev(self, "couldn't establish power handler\n");
    392   1.1    nonaka }
    393   1.1    nonaka 
    394   1.1    nonaka static int
    395   1.1    nonaka rtwn_detach(device_t self, int flags)
    396   1.1    nonaka {
    397   1.1    nonaka 	struct rtwn_softc *sc = device_private(self);
    398   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
    399   1.1    nonaka 	struct ifnet *ifp = GET_IFP(sc);
    400   1.1    nonaka 	int s, i;
    401   1.1    nonaka 
    402   1.1    nonaka 	callout_stop(&sc->scan_to);
    403   1.1    nonaka 	callout_stop(&sc->calib_to);
    404   1.1    nonaka 
    405   1.1    nonaka 	s = splnet();
    406   1.1    nonaka 
    407   1.1    nonaka 	if (ifp->if_softc != NULL) {
    408   1.1    nonaka 		rtwn_stop(ifp, 0);
    409   1.1    nonaka 
    410   1.1    nonaka 		ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
    411   1.1    nonaka 		bpf_detach(ifp);
    412   1.1    nonaka 		ieee80211_ifdetach(ic);
    413   1.1    nonaka 		if_detach(ifp);
    414   1.1    nonaka 	}
    415   1.1    nonaka 
    416   1.1    nonaka 	/* Free Tx/Rx buffers. */
    417   1.1    nonaka 	for (i = 0; i < RTWN_NTXQUEUES; i++)
    418   1.1    nonaka 		rtwn_free_tx_list(sc, i);
    419   1.1    nonaka 	rtwn_free_rx_list(sc);
    420   1.1    nonaka 
    421   1.1    nonaka 	splx(s);
    422   1.1    nonaka 
    423   1.1    nonaka 	callout_destroy(&sc->scan_to);
    424   1.1    nonaka 	callout_destroy(&sc->calib_to);
    425   1.1    nonaka 
    426   1.1    nonaka 	if (sc->init_task != NULL)
    427   1.1    nonaka 		softint_disestablish(sc->init_task);
    428  1.11    nonaka 	if (sc->sc_soft_ih != NULL)
    429  1.11    nonaka 		softint_disestablish(sc->sc_soft_ih);
    430   1.1    nonaka 
    431   1.1    nonaka 	if (sc->sc_ih != NULL) {
    432   1.1    nonaka 		pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
    433   1.1    nonaka 		pci_intr_release(sc->sc_pc, sc->sc_pihp, 1);
    434   1.1    nonaka 	}
    435   1.1    nonaka 
    436   1.1    nonaka 	pmf_device_deregister(self);
    437   1.1    nonaka 
    438   1.1    nonaka 	return 0;
    439   1.1    nonaka }
    440   1.1    nonaka 
    441   1.1    nonaka static int
    442   1.1    nonaka rtwn_activate(device_t self, enum devact act)
    443   1.1    nonaka {
    444   1.1    nonaka 	struct rtwn_softc *sc = device_private(self);
    445   1.1    nonaka 	struct ifnet *ifp = GET_IFP(sc);
    446   1.1    nonaka 
    447   1.1    nonaka 	switch (act) {
    448   1.1    nonaka 	case DVACT_DEACTIVATE:
    449   1.1    nonaka 		if (ifp->if_flags & IFF_RUNNING)
    450   1.1    nonaka 			rtwn_stop(ifp, 0);
    451   1.1    nonaka 		return 0;
    452   1.1    nonaka 	default:
    453   1.1    nonaka 		return EOPNOTSUPP;
    454   1.1    nonaka 	}
    455   1.1    nonaka }
    456   1.1    nonaka 
    457   1.1    nonaka static void
    458   1.1    nonaka rtwn_setup_rx_desc(struct rtwn_softc *sc, struct r92c_rx_desc *desc,
    459   1.1    nonaka     bus_addr_t addr, size_t len, int idx)
    460   1.1    nonaka {
    461   1.1    nonaka 
    462   1.1    nonaka 	memset(desc, 0, sizeof(*desc));
    463   1.1    nonaka 	desc->rxdw0 = htole32(SM(R92C_RXDW0_PKTLEN, len) |
    464   1.1    nonaka 		((idx == RTWN_RX_LIST_COUNT - 1) ? R92C_RXDW0_EOR : 0));
    465   1.1    nonaka 	desc->rxbufaddr = htole32(addr);
    466   1.1    nonaka 	bus_space_barrier(sc->sc_st, sc->sc_sh, 0, sc->sc_mapsize,
    467   1.1    nonaka 	    BUS_SPACE_BARRIER_WRITE);
    468   1.1    nonaka 	desc->rxdw0 |= htole32(R92C_RXDW0_OWN);
    469   1.1    nonaka }
    470   1.1    nonaka 
    471   1.1    nonaka static int
    472   1.1    nonaka rtwn_alloc_rx_list(struct rtwn_softc *sc)
    473   1.1    nonaka {
    474   1.1    nonaka 	struct rtwn_rx_ring *rx_ring = &sc->rx_ring;
    475   1.1    nonaka 	struct rtwn_rx_data *rx_data;
    476   1.1    nonaka 	const size_t size = sizeof(struct r92c_rx_desc) * RTWN_RX_LIST_COUNT;
    477   1.1    nonaka 	int i, error = 0;
    478   1.1    nonaka 
    479   1.1    nonaka 	/* Allocate Rx descriptors. */
    480   1.1    nonaka 	error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, BUS_DMA_NOWAIT,
    481   1.1    nonaka 		&rx_ring->map);
    482   1.1    nonaka 	if (error != 0) {
    483   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    484   1.1    nonaka 		    "could not create rx desc DMA map\n");
    485   1.1    nonaka 		rx_ring->map = NULL;
    486   1.1    nonaka 		goto fail;
    487   1.1    nonaka 	}
    488   1.1    nonaka 
    489   1.1    nonaka 	error = bus_dmamem_alloc(sc->sc_dmat, size, 0, 0, &rx_ring->seg, 1,
    490   1.1    nonaka 	    &rx_ring->nsegs, BUS_DMA_NOWAIT);
    491   1.1    nonaka 	if (error != 0) {
    492   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not allocate rx desc\n");
    493   1.1    nonaka 		goto fail;
    494   1.1    nonaka 	}
    495   1.1    nonaka 
    496   1.1    nonaka 	error = bus_dmamem_map(sc->sc_dmat, &rx_ring->seg, rx_ring->nsegs,
    497   1.1    nonaka 	    size, (void **)&rx_ring->desc, BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
    498   1.1    nonaka 	if (error != 0) {
    499   1.1    nonaka 		bus_dmamem_free(sc->sc_dmat, &rx_ring->seg, rx_ring->nsegs);
    500   1.1    nonaka 		rx_ring->desc = NULL;
    501   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not map rx desc\n");
    502   1.1    nonaka 		goto fail;
    503   1.1    nonaka 	}
    504   1.1    nonaka 	memset(rx_ring->desc, 0, size);
    505   1.1    nonaka 
    506   1.1    nonaka 	error = bus_dmamap_load_raw(sc->sc_dmat, rx_ring->map, &rx_ring->seg,
    507   1.1    nonaka 	    1, size, BUS_DMA_NOWAIT);
    508   1.1    nonaka 	if (error != 0) {
    509   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not load rx desc\n");
    510   1.1    nonaka 		goto fail;
    511   1.1    nonaka 	}
    512   1.1    nonaka 
    513   1.1    nonaka 	/* Allocate Rx buffers. */
    514   1.1    nonaka 	for (i = 0; i < RTWN_RX_LIST_COUNT; i++) {
    515   1.1    nonaka 		rx_data = &rx_ring->rx_data[i];
    516   1.1    nonaka 
    517   1.1    nonaka 		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
    518   1.1    nonaka 		    0, BUS_DMA_NOWAIT, &rx_data->map);
    519   1.1    nonaka 		if (error != 0) {
    520   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    521   1.1    nonaka 			    "could not create rx buf DMA map\n");
    522   1.1    nonaka 			goto fail;
    523   1.1    nonaka 		}
    524   1.1    nonaka 
    525   1.1    nonaka 		MGETHDR(rx_data->m, M_DONTWAIT, MT_DATA);
    526   1.1    nonaka 		if (__predict_false(rx_data->m == NULL)) {
    527   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    528   1.1    nonaka 			    "couldn't allocate rx mbuf\n");
    529   1.1    nonaka 			error = ENOMEM;
    530   1.1    nonaka 			goto fail;
    531   1.1    nonaka 		}
    532   1.1    nonaka 		MCLGET(rx_data->m, M_DONTWAIT);
    533   1.1    nonaka 		if (__predict_false(!(rx_data->m->m_flags & M_EXT))) {
    534   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    535   1.1    nonaka 			    "couldn't allocate rx mbuf cluster\n");
    536   1.1    nonaka 			m_free(rx_data->m);
    537   1.1    nonaka 			rx_data->m = NULL;
    538   1.1    nonaka 			error = ENOMEM;
    539   1.1    nonaka 			goto fail;
    540   1.1    nonaka 		}
    541   1.1    nonaka 
    542   1.1    nonaka 		error = bus_dmamap_load(sc->sc_dmat, rx_data->map,
    543   1.1    nonaka 		    mtod(rx_data->m, void *), MCLBYTES, NULL,
    544   1.1    nonaka 		    BUS_DMA_NOWAIT | BUS_DMA_READ);
    545   1.1    nonaka 		if (error != 0) {
    546   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    547   1.1    nonaka 			    "could not load rx buf DMA map\n");
    548   1.1    nonaka 			goto fail;
    549   1.1    nonaka 		}
    550   1.1    nonaka 
    551   1.1    nonaka 		bus_dmamap_sync(sc->sc_dmat, rx_data->map, 0, MCLBYTES,
    552   1.1    nonaka 		    BUS_DMASYNC_PREREAD);
    553   1.1    nonaka 
    554   1.1    nonaka 		rtwn_setup_rx_desc(sc, &rx_ring->desc[i],
    555   1.1    nonaka 		    rx_data->map->dm_segs[0].ds_addr, MCLBYTES, i);
    556   1.1    nonaka 	}
    557   1.1    nonaka fail:	if (error != 0)
    558   1.1    nonaka 		rtwn_free_rx_list(sc);
    559   1.1    nonaka 	return error;
    560   1.1    nonaka }
    561   1.1    nonaka 
    562   1.1    nonaka static void
    563   1.1    nonaka rtwn_reset_rx_list(struct rtwn_softc *sc)
    564   1.1    nonaka {
    565   1.1    nonaka 	struct rtwn_rx_ring *rx_ring = &sc->rx_ring;
    566   1.1    nonaka 	struct rtwn_rx_data *rx_data;
    567   1.1    nonaka 	int i;
    568   1.1    nonaka 
    569   1.1    nonaka 	for (i = 0; i < RTWN_RX_LIST_COUNT; i++) {
    570   1.1    nonaka 		rx_data = &rx_ring->rx_data[i];
    571   1.1    nonaka 		rtwn_setup_rx_desc(sc, &rx_ring->desc[i],
    572   1.1    nonaka 		    rx_data->map->dm_segs[0].ds_addr, MCLBYTES, i);
    573   1.1    nonaka 	}
    574   1.1    nonaka }
    575   1.1    nonaka 
    576   1.1    nonaka static void
    577   1.1    nonaka rtwn_free_rx_list(struct rtwn_softc *sc)
    578   1.1    nonaka {
    579   1.1    nonaka 	struct rtwn_rx_ring *rx_ring = &sc->rx_ring;
    580   1.1    nonaka 	struct rtwn_rx_data *rx_data;
    581   1.1    nonaka 	int i, s;
    582   1.1    nonaka 
    583   1.1    nonaka 	s = splnet();
    584   1.1    nonaka 
    585   1.1    nonaka 	if (rx_ring->map) {
    586   1.1    nonaka 		if (rx_ring->desc) {
    587   1.1    nonaka 			bus_dmamap_unload(sc->sc_dmat, rx_ring->map);
    588   1.1    nonaka 			bus_dmamem_unmap(sc->sc_dmat, rx_ring->desc,
    589   1.1    nonaka 			    sizeof (struct r92c_rx_desc) * RTWN_RX_LIST_COUNT);
    590   1.1    nonaka 			bus_dmamem_free(sc->sc_dmat, &rx_ring->seg,
    591   1.1    nonaka 			    rx_ring->nsegs);
    592   1.1    nonaka 			rx_ring->desc = NULL;
    593   1.1    nonaka 		}
    594   1.1    nonaka 		bus_dmamap_destroy(sc->sc_dmat, rx_ring->map);
    595   1.1    nonaka 		rx_ring->map = NULL;
    596   1.1    nonaka 	}
    597   1.1    nonaka 
    598   1.1    nonaka 	for (i = 0; i < RTWN_RX_LIST_COUNT; i++) {
    599   1.1    nonaka 		rx_data = &rx_ring->rx_data[i];
    600   1.1    nonaka 
    601   1.1    nonaka 		if (rx_data->m != NULL) {
    602   1.1    nonaka 			bus_dmamap_unload(sc->sc_dmat, rx_data->map);
    603   1.1    nonaka 			m_freem(rx_data->m);
    604   1.1    nonaka 			rx_data->m = NULL;
    605   1.1    nonaka 		}
    606   1.1    nonaka 		bus_dmamap_destroy(sc->sc_dmat, rx_data->map);
    607   1.1    nonaka 		rx_data->map = NULL;
    608   1.1    nonaka 	}
    609   1.1    nonaka 
    610   1.1    nonaka 	splx(s);
    611   1.1    nonaka }
    612   1.1    nonaka 
    613   1.1    nonaka static int
    614   1.1    nonaka rtwn_alloc_tx_list(struct rtwn_softc *sc, int qid)
    615   1.1    nonaka {
    616   1.1    nonaka 	struct rtwn_tx_ring *tx_ring = &sc->tx_ring[qid];
    617   1.1    nonaka 	struct rtwn_tx_data *tx_data;
    618   1.1    nonaka 	const size_t size = sizeof(struct r92c_tx_desc) * RTWN_TX_LIST_COUNT;
    619   1.1    nonaka 	int i = 0, error = 0;
    620   1.1    nonaka 
    621   1.1    nonaka 	error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, BUS_DMA_NOWAIT,
    622   1.1    nonaka 	    &tx_ring->map);
    623   1.1    nonaka 	if (error != 0) {
    624   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    625   1.1    nonaka 		    "could not create tx ring DMA map\n");
    626   1.1    nonaka 		goto fail;
    627   1.1    nonaka 	}
    628   1.1    nonaka 
    629   1.1    nonaka 	error = bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0,
    630   1.1    nonaka 	    &tx_ring->seg, 1, &tx_ring->nsegs, BUS_DMA_NOWAIT);
    631   1.1    nonaka 	if (error != 0) {
    632   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    633   1.1    nonaka 		    "could not allocate tx ring DMA memory\n");
    634   1.1    nonaka 		goto fail;
    635   1.1    nonaka 	}
    636   1.1    nonaka 
    637   1.1    nonaka 	error = bus_dmamem_map(sc->sc_dmat, &tx_ring->seg, tx_ring->nsegs,
    638   1.1    nonaka 	    size, (void **)&tx_ring->desc, BUS_DMA_NOWAIT);
    639   1.1    nonaka 	if (error != 0) {
    640   1.1    nonaka 		bus_dmamem_free(sc->sc_dmat, &tx_ring->seg, tx_ring->nsegs);
    641   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "can't map tx ring DMA memory\n");
    642   1.1    nonaka 		goto fail;
    643   1.1    nonaka 	}
    644   1.1    nonaka 	memset(tx_ring->desc, 0, size);
    645   1.1    nonaka 
    646   1.1    nonaka 	error = bus_dmamap_load(sc->sc_dmat, tx_ring->map, tx_ring->desc,
    647   1.1    nonaka 	    size, NULL, BUS_DMA_NOWAIT);
    648   1.1    nonaka 	if (error != 0) {
    649   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    650   1.1    nonaka 		    "could not load tx ring DMA map\n");
    651   1.1    nonaka 		goto fail;
    652   1.1    nonaka 	}
    653   1.1    nonaka 
    654   1.1    nonaka 	for (i = 0; i < RTWN_TX_LIST_COUNT; i++) {
    655   1.1    nonaka 		struct r92c_tx_desc *desc = &tx_ring->desc[i];
    656   1.1    nonaka 
    657   1.1    nonaka 		/* setup tx desc */
    658   1.1    nonaka 		desc->nextdescaddr = htole32(tx_ring->map->dm_segs[0].ds_addr
    659   1.1    nonaka 		  + sizeof(*desc) * ((i + 1) % RTWN_TX_LIST_COUNT));
    660   1.1    nonaka 
    661   1.1    nonaka 		tx_data = &tx_ring->tx_data[i];
    662   1.1    nonaka 		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
    663   1.1    nonaka 		    0, BUS_DMA_NOWAIT, &tx_data->map);
    664   1.1    nonaka 		if (error != 0) {
    665   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    666   1.1    nonaka 			    "could not create tx buf DMA map\n");
    667   1.1    nonaka 			goto fail;
    668   1.1    nonaka 		}
    669   1.1    nonaka 		tx_data->m = NULL;
    670   1.1    nonaka 		tx_data->ni = NULL;
    671   1.1    nonaka 	}
    672   1.1    nonaka 
    673   1.1    nonaka fail:
    674   1.1    nonaka 	if (error != 0)
    675   1.1    nonaka 		rtwn_free_tx_list(sc, qid);
    676   1.1    nonaka 	return error;
    677   1.1    nonaka }
    678   1.1    nonaka 
    679   1.1    nonaka static void
    680   1.1    nonaka rtwn_reset_tx_list(struct rtwn_softc *sc, int qid)
    681   1.1    nonaka {
    682   1.1    nonaka 	struct rtwn_tx_ring *tx_ring = &sc->tx_ring[qid];
    683   1.1    nonaka 	int i;
    684   1.1    nonaka 
    685   1.1    nonaka 	for (i = 0; i < RTWN_TX_LIST_COUNT; i++) {
    686   1.1    nonaka 		struct r92c_tx_desc *desc = &tx_ring->desc[i];
    687   1.1    nonaka 		struct rtwn_tx_data *tx_data = &tx_ring->tx_data[i];
    688   1.1    nonaka 
    689   1.1    nonaka 		memset(desc, 0, sizeof(*desc) -
    690   1.1    nonaka 		    (sizeof(desc->reserved) + sizeof(desc->nextdescaddr64) +
    691   1.1    nonaka 		    sizeof(desc->nextdescaddr)));
    692   1.1    nonaka 
    693   1.1    nonaka 		if (tx_data->m != NULL) {
    694   1.1    nonaka 			bus_dmamap_unload(sc->sc_dmat, tx_data->map);
    695   1.1    nonaka 			m_freem(tx_data->m);
    696   1.1    nonaka 			tx_data->m = NULL;
    697   1.1    nonaka 			ieee80211_free_node(tx_data->ni);
    698   1.1    nonaka 			tx_data->ni = NULL;
    699   1.1    nonaka 		}
    700   1.1    nonaka 	}
    701   1.1    nonaka 
    702   1.1    nonaka 	sc->qfullmsk &= ~(1 << qid);
    703   1.1    nonaka 	tx_ring->queued = 0;
    704   1.1    nonaka 	tx_ring->cur = 0;
    705   1.1    nonaka }
    706   1.1    nonaka 
    707   1.1    nonaka static void
    708   1.1    nonaka rtwn_free_tx_list(struct rtwn_softc *sc, int qid)
    709   1.1    nonaka {
    710   1.1    nonaka 	struct rtwn_tx_ring *tx_ring = &sc->tx_ring[qid];
    711   1.1    nonaka 	struct rtwn_tx_data *tx_data;
    712   1.1    nonaka 	int i;
    713   1.1    nonaka 
    714   1.1    nonaka 	if (tx_ring->map != NULL) {
    715   1.1    nonaka 		if (tx_ring->desc != NULL) {
    716   1.1    nonaka 			bus_dmamap_unload(sc->sc_dmat, tx_ring->map);
    717   1.1    nonaka 			bus_dmamem_unmap(sc->sc_dmat, tx_ring->desc,
    718   1.1    nonaka 			    sizeof (struct r92c_tx_desc) * RTWN_TX_LIST_COUNT);
    719   1.1    nonaka 			bus_dmamem_free(sc->sc_dmat, &tx_ring->seg,
    720   1.1    nonaka 			    tx_ring->nsegs);
    721   1.1    nonaka 		}
    722   1.1    nonaka 		bus_dmamap_destroy(sc->sc_dmat, tx_ring->map);
    723   1.1    nonaka 	}
    724   1.1    nonaka 
    725   1.1    nonaka 	for (i = 0; i < RTWN_TX_LIST_COUNT; i++) {
    726   1.1    nonaka 		tx_data = &tx_ring->tx_data[i];
    727   1.1    nonaka 
    728   1.1    nonaka 		if (tx_data->m != NULL) {
    729   1.1    nonaka 			bus_dmamap_unload(sc->sc_dmat, tx_data->map);
    730   1.1    nonaka 			m_freem(tx_data->m);
    731   1.1    nonaka 			tx_data->m = NULL;
    732   1.1    nonaka 		}
    733   1.1    nonaka 		bus_dmamap_destroy(sc->sc_dmat, tx_data->map);
    734   1.1    nonaka 	}
    735   1.1    nonaka 
    736   1.1    nonaka 	sc->qfullmsk &= ~(1 << qid);
    737   1.1    nonaka 	tx_ring->queued = 0;
    738   1.1    nonaka 	tx_ring->cur = 0;
    739   1.1    nonaka }
    740   1.1    nonaka 
    741   1.1    nonaka static void
    742   1.1    nonaka rtwn_write_1(struct rtwn_softc *sc, uint16_t addr, uint8_t val)
    743   1.1    nonaka {
    744   1.1    nonaka 	bus_space_write_1(sc->sc_st, sc->sc_sh, addr, val);
    745   1.1    nonaka }
    746   1.1    nonaka 
    747   1.1    nonaka static void
    748   1.1    nonaka rtwn_write_2(struct rtwn_softc *sc, uint16_t addr, uint16_t val)
    749   1.1    nonaka {
    750   1.1    nonaka 	bus_space_write_2(sc->sc_st, sc->sc_sh, addr, htole16(val));
    751   1.1    nonaka }
    752   1.1    nonaka 
    753   1.1    nonaka static void
    754   1.1    nonaka rtwn_write_4(struct rtwn_softc *sc, uint16_t addr, uint32_t val)
    755   1.1    nonaka {
    756   1.1    nonaka 	bus_space_write_4(sc->sc_st, sc->sc_sh, addr, htole32(val));
    757   1.1    nonaka }
    758   1.1    nonaka 
    759   1.1    nonaka static uint8_t
    760   1.1    nonaka rtwn_read_1(struct rtwn_softc *sc, uint16_t addr)
    761   1.1    nonaka {
    762   1.1    nonaka 	return bus_space_read_1(sc->sc_st, sc->sc_sh, addr);
    763   1.1    nonaka }
    764   1.1    nonaka 
    765   1.1    nonaka static uint16_t
    766   1.1    nonaka rtwn_read_2(struct rtwn_softc *sc, uint16_t addr)
    767   1.1    nonaka {
    768   1.1    nonaka 	return le16toh(bus_space_read_2(sc->sc_st, sc->sc_sh, addr));
    769   1.1    nonaka }
    770   1.1    nonaka 
    771   1.1    nonaka static uint32_t
    772   1.1    nonaka rtwn_read_4(struct rtwn_softc *sc, uint16_t addr)
    773   1.1    nonaka {
    774   1.1    nonaka 	return le32toh(bus_space_read_4(sc->sc_st, sc->sc_sh, addr));
    775   1.1    nonaka }
    776   1.1    nonaka 
    777   1.1    nonaka static int
    778   1.1    nonaka rtwn_fw_cmd(struct rtwn_softc *sc, uint8_t id, const void *buf, int len)
    779   1.1    nonaka {
    780   1.1    nonaka 	struct r92c_fw_cmd cmd;
    781   1.1    nonaka 	uint8_t *cp;
    782   1.1    nonaka 	int fwcur;
    783   1.1    nonaka 	int ntries;
    784   1.1    nonaka 
    785   1.1    nonaka 	DPRINTFN(3, ("%s: %s: id=0x%02x, buf=%p, len=%d\n",
    786   1.1    nonaka 	    device_xname(sc->sc_dev), __func__, id, buf, len));
    787   1.1    nonaka 
    788   1.1    nonaka 	fwcur = sc->fwcur;
    789   1.1    nonaka 	sc->fwcur = (sc->fwcur + 1) % R92C_H2C_NBOX;
    790   1.1    nonaka 
    791   1.1    nonaka 	/* Wait for current FW box to be empty. */
    792   1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
    793   1.1    nonaka 		if (!(rtwn_read_1(sc, R92C_HMETFR) & (1 << sc->fwcur)))
    794   1.1    nonaka 			break;
    795   1.1    nonaka 		DELAY(1);
    796   1.1    nonaka 	}
    797   1.1    nonaka 	if (ntries == 100) {
    798   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    799   1.1    nonaka 		    "could not send firmware command %d\n", id);
    800   1.1    nonaka 		return ETIMEDOUT;
    801   1.1    nonaka 	}
    802   1.1    nonaka 
    803   1.1    nonaka 	memset(&cmd, 0, sizeof(cmd));
    804   1.1    nonaka 	KASSERT(len <= sizeof(cmd.msg));
    805   1.1    nonaka 	memcpy(cmd.msg, buf, len);
    806   1.1    nonaka 
    807   1.1    nonaka 	/* Write the first word last since that will trigger the FW. */
    808   1.1    nonaka 	cp = (uint8_t *)&cmd;
    809   1.1    nonaka 	if (len >= 4) {
    810   1.1    nonaka 		cmd.id = id | R92C_CMD_FLAG_EXT;
    811   1.1    nonaka 		rtwn_write_2(sc, R92C_HMEBOX_EXT(fwcur), cp[1] + (cp[2] << 8));
    812   1.1    nonaka 		rtwn_write_4(sc, R92C_HMEBOX(fwcur),
    813   1.1    nonaka 		    cp[0] + (cp[3] << 8) + (cp[4] << 16) + (cp[5] << 24));
    814   1.1    nonaka 	} else {
    815   1.1    nonaka 		cmd.id = id;
    816   1.1    nonaka 		rtwn_write_4(sc, R92C_HMEBOX(fwcur),
    817   1.1    nonaka 		    cp[0] + (cp[1] << 8) + (cp[2] << 16) + (cp[3] << 24));
    818   1.1    nonaka 	}
    819   1.1    nonaka 
    820   1.1    nonaka 	/* Give firmware some time for processing. */
    821   1.1    nonaka 	DELAY(2000);
    822   1.1    nonaka 
    823   1.1    nonaka 	return 0;
    824   1.1    nonaka }
    825   1.1    nonaka 
    826   1.1    nonaka static void
    827   1.1    nonaka rtwn_rf_write(struct rtwn_softc *sc, int chain, uint8_t addr, uint32_t val)
    828   1.1    nonaka {
    829   1.1    nonaka 
    830   1.1    nonaka 	rtwn_bb_write(sc, R92C_LSSI_PARAM(chain),
    831   1.1    nonaka 	    SM(R92C_LSSI_PARAM_ADDR, addr) | SM(R92C_LSSI_PARAM_DATA, val));
    832   1.1    nonaka }
    833   1.1    nonaka 
    834   1.1    nonaka static uint32_t
    835   1.1    nonaka rtwn_rf_read(struct rtwn_softc *sc, int chain, uint8_t addr)
    836   1.1    nonaka {
    837   1.1    nonaka 	uint32_t reg[R92C_MAX_CHAINS], val;
    838   1.1    nonaka 
    839   1.1    nonaka 	reg[0] = rtwn_bb_read(sc, R92C_HSSI_PARAM2(0));
    840   1.1    nonaka 	if (chain != 0)
    841   1.1    nonaka 		reg[chain] = rtwn_bb_read(sc, R92C_HSSI_PARAM2(chain));
    842   1.1    nonaka 
    843   1.1    nonaka 	rtwn_bb_write(sc, R92C_HSSI_PARAM2(0),
    844   1.1    nonaka 	    reg[0] & ~R92C_HSSI_PARAM2_READ_EDGE);
    845   1.1    nonaka 	DELAY(1000);
    846   1.1    nonaka 
    847   1.1    nonaka 	rtwn_bb_write(sc, R92C_HSSI_PARAM2(chain),
    848   1.1    nonaka 	    RW(reg[chain], R92C_HSSI_PARAM2_READ_ADDR, addr) |
    849   1.1    nonaka 	    R92C_HSSI_PARAM2_READ_EDGE);
    850   1.1    nonaka 	DELAY(1000);
    851   1.1    nonaka 
    852   1.1    nonaka 	rtwn_bb_write(sc, R92C_HSSI_PARAM2(0),
    853   1.1    nonaka 	    reg[0] | R92C_HSSI_PARAM2_READ_EDGE);
    854   1.1    nonaka 	DELAY(1000);
    855   1.1    nonaka 
    856   1.1    nonaka 	if (rtwn_bb_read(sc, R92C_HSSI_PARAM1(chain)) & R92C_HSSI_PARAM1_PI)
    857   1.1    nonaka 		val = rtwn_bb_read(sc, R92C_HSPI_READBACK(chain));
    858   1.1    nonaka 	else
    859   1.1    nonaka 		val = rtwn_bb_read(sc, R92C_LSSI_READBACK(chain));
    860   1.1    nonaka 	return MS(val, R92C_LSSI_READBACK_DATA);
    861   1.1    nonaka }
    862   1.1    nonaka 
    863   1.1    nonaka static int
    864   1.1    nonaka rtwn_llt_write(struct rtwn_softc *sc, uint32_t addr, uint32_t data)
    865   1.1    nonaka {
    866   1.1    nonaka 	int ntries;
    867   1.1    nonaka 
    868   1.1    nonaka 	rtwn_write_4(sc, R92C_LLT_INIT,
    869   1.1    nonaka 	    SM(R92C_LLT_INIT_OP, R92C_LLT_INIT_OP_WRITE) |
    870   1.1    nonaka 	    SM(R92C_LLT_INIT_ADDR, addr) |
    871   1.1    nonaka 	    SM(R92C_LLT_INIT_DATA, data));
    872   1.1    nonaka 	/* Wait for write operation to complete. */
    873   1.1    nonaka 	for (ntries = 0; ntries < 20; ntries++) {
    874   1.1    nonaka 		if (MS(rtwn_read_4(sc, R92C_LLT_INIT), R92C_LLT_INIT_OP) ==
    875   1.1    nonaka 		    R92C_LLT_INIT_OP_NO_ACTIVE)
    876   1.1    nonaka 			return 0;
    877   1.1    nonaka 		DELAY(5);
    878   1.1    nonaka 	}
    879   1.1    nonaka 	return ETIMEDOUT;
    880   1.1    nonaka }
    881   1.1    nonaka 
    882   1.1    nonaka static uint8_t
    883   1.1    nonaka rtwn_efuse_read_1(struct rtwn_softc *sc, uint16_t addr)
    884   1.1    nonaka {
    885   1.1    nonaka 	uint32_t reg;
    886   1.1    nonaka 	int ntries;
    887   1.1    nonaka 
    888   1.1    nonaka 	reg = rtwn_read_4(sc, R92C_EFUSE_CTRL);
    889   1.1    nonaka 	reg = RW(reg, R92C_EFUSE_CTRL_ADDR, addr);
    890   1.1    nonaka 	reg &= ~R92C_EFUSE_CTRL_VALID;
    891   1.1    nonaka 	rtwn_write_4(sc, R92C_EFUSE_CTRL, reg);
    892   1.1    nonaka 	/* Wait for read operation to complete. */
    893   1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
    894   1.1    nonaka 		reg = rtwn_read_4(sc, R92C_EFUSE_CTRL);
    895   1.1    nonaka 		if (reg & R92C_EFUSE_CTRL_VALID)
    896   1.1    nonaka 			return MS(reg, R92C_EFUSE_CTRL_DATA);
    897   1.1    nonaka 		DELAY(5);
    898   1.1    nonaka 	}
    899   1.1    nonaka 	aprint_error_dev(sc->sc_dev,
    900   1.1    nonaka 	    "could not read efuse byte at address 0x%x\n", addr);
    901   1.1    nonaka 	return 0xff;
    902   1.1    nonaka }
    903   1.1    nonaka 
    904   1.1    nonaka static void
    905   1.1    nonaka rtwn_efuse_read(struct rtwn_softc *sc)
    906   1.1    nonaka {
    907   1.1    nonaka 	uint8_t *rom = (uint8_t *)&sc->rom;
    908   1.1    nonaka 	uint32_t reg;
    909   1.1    nonaka 	uint16_t addr = 0;
    910   1.1    nonaka 	uint8_t off, msk;
    911   1.1    nonaka 	int i;
    912   1.1    nonaka 
    913   1.1    nonaka 	rtwn_efuse_switch_power(sc);
    914   1.1    nonaka 
    915   1.1    nonaka 	memset(&sc->rom, 0xff, sizeof(sc->rom));
    916   1.1    nonaka 	while (addr < 512) {
    917   1.1    nonaka 		reg = rtwn_efuse_read_1(sc, addr);
    918   1.1    nonaka 		if (reg == 0xff)
    919   1.1    nonaka 			break;
    920   1.1    nonaka 		addr++;
    921   1.1    nonaka 		off = reg >> 4;
    922   1.1    nonaka 		msk = reg & 0xf;
    923   1.1    nonaka 		for (i = 0; i < 4; i++) {
    924   1.1    nonaka 			if (msk & (1 << i))
    925   1.1    nonaka 				continue;
    926   1.1    nonaka 			rom[off * 8 + i * 2 + 0] = rtwn_efuse_read_1(sc, addr);
    927   1.1    nonaka 			addr++;
    928   1.1    nonaka 			rom[off * 8 + i * 2 + 1] = rtwn_efuse_read_1(sc, addr);
    929   1.1    nonaka 			addr++;
    930   1.1    nonaka 		}
    931   1.1    nonaka 	}
    932   1.1    nonaka #ifdef RTWN_DEBUG
    933   1.1    nonaka 	if (rtwn_debug >= 2) {
    934   1.1    nonaka 		/* Dump ROM content. */
    935   1.1    nonaka 		printf("\n");
    936   1.1    nonaka 		for (i = 0; i < sizeof(sc->rom); i++)
    937   1.1    nonaka 			printf("%02x:", rom[i]);
    938   1.1    nonaka 		printf("\n");
    939   1.1    nonaka 	}
    940   1.1    nonaka #endif
    941   1.1    nonaka }
    942   1.1    nonaka 
    943   1.1    nonaka static void
    944   1.1    nonaka rtwn_efuse_switch_power(struct rtwn_softc *sc)
    945   1.1    nonaka {
    946   1.1    nonaka 	uint32_t reg;
    947   1.1    nonaka 
    948   1.1    nonaka 	reg = rtwn_read_2(sc, R92C_SYS_ISO_CTRL);
    949   1.1    nonaka 	if (!(reg & R92C_SYS_ISO_CTRL_PWC_EV12V)) {
    950   1.1    nonaka 		rtwn_write_2(sc, R92C_SYS_ISO_CTRL,
    951   1.1    nonaka 		    reg | R92C_SYS_ISO_CTRL_PWC_EV12V);
    952   1.1    nonaka 	}
    953   1.1    nonaka 	reg = rtwn_read_2(sc, R92C_SYS_FUNC_EN);
    954   1.1    nonaka 	if (!(reg & R92C_SYS_FUNC_EN_ELDR)) {
    955   1.1    nonaka 		rtwn_write_2(sc, R92C_SYS_FUNC_EN,
    956   1.1    nonaka 		    reg | R92C_SYS_FUNC_EN_ELDR);
    957   1.1    nonaka 	}
    958   1.1    nonaka 	reg = rtwn_read_2(sc, R92C_SYS_CLKR);
    959   1.1    nonaka 	if ((reg & (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) !=
    960   1.1    nonaka 	    (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) {
    961   1.1    nonaka 		rtwn_write_2(sc, R92C_SYS_CLKR,
    962   1.1    nonaka 		    reg | R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M);
    963   1.1    nonaka 	}
    964   1.1    nonaka }
    965   1.1    nonaka 
    966   1.1    nonaka /* rtwn_read_chipid: reg=0x40073b chipid=0x0 */
    967   1.1    nonaka static int
    968   1.1    nonaka rtwn_read_chipid(struct rtwn_softc *sc)
    969   1.1    nonaka {
    970   1.1    nonaka 	uint32_t reg;
    971   1.1    nonaka 
    972   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
    973   1.1    nonaka 
    974   1.1    nonaka 	reg = rtwn_read_4(sc, R92C_SYS_CFG);
    975   1.1    nonaka 	DPRINTF(("%s: version=0x%08x\n", device_xname(sc->sc_dev), reg));
    976   1.1    nonaka 	if (reg & R92C_SYS_CFG_TRP_VAUX_EN)
    977   1.1    nonaka 		/* Unsupported test chip. */
    978   1.1    nonaka 		return EIO;
    979   1.1    nonaka 
    980   1.1    nonaka 	if (reg & R92C_SYS_CFG_TYPE_92C) {
    981   1.1    nonaka 		sc->chip |= RTWN_CHIP_92C;
    982   1.1    nonaka 		/* Check if it is a castrated 8192C. */
    983   1.1    nonaka 		if (MS(rtwn_read_4(sc, R92C_HPON_FSM),
    984   1.1    nonaka 		    R92C_HPON_FSM_CHIP_BONDING_ID) ==
    985   1.1    nonaka 		    R92C_HPON_FSM_CHIP_BONDING_ID_92C_1T2R)
    986   1.1    nonaka 			sc->chip |= RTWN_CHIP_92C_1T2R;
    987   1.1    nonaka 	}
    988   1.1    nonaka 	if (reg & R92C_SYS_CFG_VENDOR_UMC) {
    989   1.1    nonaka 		sc->chip |= RTWN_CHIP_UMC;
    990   1.1    nonaka 		if (MS(reg, R92C_SYS_CFG_CHIP_VER_RTL) == 0)
    991   1.1    nonaka 			sc->chip |= RTWN_CHIP_UMC_A_CUT;
    992   1.1    nonaka 	} else if (MS(reg, R92C_SYS_CFG_CHIP_VER_RTL) != 0) {
    993   1.1    nonaka 		if (MS(reg, R92C_SYS_CFG_CHIP_VER_RTL) == 1)
    994   1.1    nonaka 			sc->chip |= RTWN_CHIP_UMC | RTWN_CHIP_UMC_B_CUT;
    995   1.1    nonaka 		else
    996   1.1    nonaka 			/* Unsupported unknown chip. */
    997   1.1    nonaka 			return EIO;
    998   1.1    nonaka 	}
    999   1.1    nonaka 	return 0;
   1000   1.1    nonaka }
   1001   1.1    nonaka 
   1002   1.1    nonaka static void
   1003   1.1    nonaka rtwn_read_rom(struct rtwn_softc *sc)
   1004   1.1    nonaka {
   1005   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1006   1.1    nonaka 	struct r92c_rom *rom = &sc->rom;
   1007   1.1    nonaka 
   1008   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1009   1.1    nonaka 
   1010   1.1    nonaka 	/* Read full ROM image. */
   1011   1.1    nonaka 	rtwn_efuse_read(sc);
   1012   1.1    nonaka 
   1013   1.1    nonaka 	if (rom->id != 0x8129) {
   1014   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "invalid EEPROM ID 0x%x\n",
   1015   1.1    nonaka 		    rom->id);
   1016   1.1    nonaka 	}
   1017   1.1    nonaka 
   1018   1.1    nonaka 	/* XXX Weird but this is what the vendor driver does. */
   1019   1.1    nonaka 	sc->pa_setting = rtwn_efuse_read_1(sc, 0x1fa);
   1020   1.1    nonaka 	sc->board_type = MS(rom->rf_opt1, R92C_ROM_RF1_BOARD_TYPE);
   1021   1.1    nonaka 	sc->regulatory = MS(rom->rf_opt1, R92C_ROM_RF1_REGULATORY);
   1022   1.1    nonaka 
   1023   1.1    nonaka 	DPRINTF(("PA setting=0x%x, board=0x%x, regulatory=%d\n",
   1024   1.1    nonaka 	    sc->pa_setting, sc->board_type, sc->regulatory));
   1025   1.1    nonaka 
   1026   1.1    nonaka 	IEEE80211_ADDR_COPY(ic->ic_myaddr, rom->macaddr);
   1027   1.1    nonaka }
   1028   1.1    nonaka 
   1029   1.1    nonaka static int
   1030   1.1    nonaka rtwn_media_change(struct ifnet *ifp)
   1031   1.1    nonaka {
   1032   1.1    nonaka 	int error;
   1033   1.1    nonaka 
   1034   1.1    nonaka 	error = ieee80211_media_change(ifp);
   1035   1.1    nonaka 	if (error != ENETRESET)
   1036   1.1    nonaka 		return error;
   1037   1.1    nonaka 
   1038   1.1    nonaka 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
   1039   1.1    nonaka 	    (IFF_UP | IFF_RUNNING)) {
   1040   1.1    nonaka 		rtwn_stop(ifp, 0);
   1041   1.1    nonaka 		error = rtwn_init(ifp);
   1042   1.1    nonaka 	}
   1043   1.1    nonaka 	return error;
   1044   1.1    nonaka }
   1045   1.1    nonaka 
   1046   1.1    nonaka /*
   1047   1.1    nonaka  * Initialize rate adaptation in firmware.
   1048   1.1    nonaka  */
   1049   1.1    nonaka static int
   1050   1.1    nonaka rtwn_ra_init(struct rtwn_softc *sc)
   1051   1.1    nonaka {
   1052   1.1    nonaka 	static const uint8_t map[] = {
   1053   1.1    nonaka 		2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108
   1054   1.1    nonaka 	};
   1055   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1056   1.1    nonaka 	struct ieee80211_node *ni = ic->ic_bss;
   1057   1.1    nonaka 	struct ieee80211_rateset *rs = &ni->ni_rates;
   1058   1.1    nonaka 	struct r92c_fw_cmd_macid_cfg cmd;
   1059   1.1    nonaka 	uint32_t rates, basicrates;
   1060   1.1    nonaka 	uint8_t mode;
   1061   1.1    nonaka 	int maxrate, maxbasicrate, error, i, j;
   1062   1.1    nonaka 
   1063   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1064   1.1    nonaka 
   1065   1.1    nonaka 	/* Get normal and basic rates mask. */
   1066   1.1    nonaka 	rates = basicrates = 0;
   1067   1.1    nonaka 	maxrate = maxbasicrate = 0;
   1068   1.1    nonaka 	for (i = 0; i < rs->rs_nrates; i++) {
   1069   1.1    nonaka 		/* Convert 802.11 rate to HW rate index. */
   1070   1.1    nonaka 		for (j = 0; j < __arraycount(map); j++)
   1071   1.1    nonaka 			if ((rs->rs_rates[i] & IEEE80211_RATE_VAL) == map[j])
   1072   1.1    nonaka 				break;
   1073   1.1    nonaka 		if (j == __arraycount(map))	/* Unknown rate, skip. */
   1074   1.1    nonaka 			continue;
   1075   1.1    nonaka 		rates |= 1 << j;
   1076   1.1    nonaka 		if (j > maxrate)
   1077   1.1    nonaka 			maxrate = j;
   1078   1.1    nonaka 		if (rs->rs_rates[i] & IEEE80211_RATE_BASIC) {
   1079   1.1    nonaka 			basicrates |= 1 << j;
   1080   1.1    nonaka 			if (j > maxbasicrate)
   1081   1.1    nonaka 				maxbasicrate = j;
   1082   1.1    nonaka 		}
   1083   1.1    nonaka 	}
   1084   1.1    nonaka 	if (ic->ic_curmode == IEEE80211_MODE_11B)
   1085   1.1    nonaka 		mode = R92C_RAID_11B;
   1086   1.1    nonaka 	else
   1087   1.1    nonaka 		mode = R92C_RAID_11BG;
   1088   1.1    nonaka 	DPRINTF(("%s: mode=0x%x rates=0x%08x, basicrates=0x%08x\n",
   1089   1.1    nonaka 	    device_xname(sc->sc_dev), mode, rates, basicrates));
   1090   1.1    nonaka 	if (basicrates == 0)
   1091   1.1    nonaka 		basicrates |= 1;	/* add 1Mbps */
   1092   1.1    nonaka 
   1093   1.1    nonaka 	/* Set rates mask for group addressed frames. */
   1094   1.1    nonaka 	cmd.macid = RTWN_MACID_BC | RTWN_MACID_VALID;
   1095   1.1    nonaka 	cmd.mask = htole32((mode << 28) | basicrates);
   1096   1.1    nonaka 	error = rtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd));
   1097   1.1    nonaka 	if (error != 0) {
   1098   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   1099   1.1    nonaka 		    "could not add broadcast station\n");
   1100   1.1    nonaka 		return error;
   1101   1.1    nonaka 	}
   1102   1.1    nonaka 	/* Set initial MRR rate. */
   1103   1.1    nonaka 	DPRINTF(("%s: maxbasicrate=%d\n", device_xname(sc->sc_dev),
   1104   1.1    nonaka 	    maxbasicrate));
   1105   1.1    nonaka 	rtwn_write_1(sc, R92C_INIDATA_RATE_SEL(RTWN_MACID_BC), maxbasicrate);
   1106   1.1    nonaka 
   1107   1.1    nonaka 	/* Set rates mask for unicast frames. */
   1108   1.1    nonaka 	cmd.macid = RTWN_MACID_BSS | RTWN_MACID_VALID;
   1109   1.1    nonaka 	cmd.mask = htole32((mode << 28) | rates);
   1110   1.1    nonaka 	error = rtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd));
   1111   1.1    nonaka 	if (error != 0) {
   1112   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not add BSS station\n");
   1113   1.1    nonaka 		return error;
   1114   1.1    nonaka 	}
   1115   1.1    nonaka 	/* Set initial MRR rate. */
   1116   1.1    nonaka 	DPRINTF(("%s: maxrate=%d\n", device_xname(sc->sc_dev), maxrate));
   1117   1.1    nonaka 	rtwn_write_1(sc, R92C_INIDATA_RATE_SEL(RTWN_MACID_BSS), maxrate);
   1118   1.1    nonaka 
   1119   1.1    nonaka 	/* Configure Automatic Rate Fallback Register. */
   1120   1.1    nonaka 	if (ic->ic_curmode == IEEE80211_MODE_11B) {
   1121   1.1    nonaka 		if (rates & 0x0c)
   1122   1.1    nonaka 			rtwn_write_4(sc, R92C_ARFR(0), htole32(rates & 0x0d));
   1123   1.1    nonaka 		else
   1124   1.1    nonaka 			rtwn_write_4(sc, R92C_ARFR(0), htole32(rates & 0x0f));
   1125   1.1    nonaka 	} else
   1126   1.1    nonaka 		rtwn_write_4(sc, R92C_ARFR(0), htole32(rates & 0x0ff5));
   1127   1.1    nonaka 
   1128   1.1    nonaka 	/* Indicate highest supported rate. */
   1129   1.1    nonaka 	ni->ni_txrate = rs->rs_nrates - 1;
   1130   1.1    nonaka 	return 0;
   1131   1.1    nonaka }
   1132   1.1    nonaka 
   1133   1.1    nonaka static int
   1134   1.1    nonaka rtwn_get_nettype(struct rtwn_softc *sc)
   1135   1.1    nonaka {
   1136   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1137   1.1    nonaka 	int type;
   1138   1.1    nonaka 
   1139   1.1    nonaka 	switch (ic->ic_opmode) {
   1140   1.1    nonaka 	case IEEE80211_M_STA:
   1141   1.1    nonaka 		type = R92C_CR_NETTYPE_INFRA;
   1142   1.1    nonaka 		break;
   1143   1.1    nonaka 
   1144   1.1    nonaka 	case IEEE80211_M_HOSTAP:
   1145   1.1    nonaka 		type = R92C_CR_NETTYPE_AP;
   1146   1.1    nonaka 		break;
   1147   1.1    nonaka 
   1148   1.1    nonaka 	case IEEE80211_M_IBSS:
   1149   1.1    nonaka 		type = R92C_CR_NETTYPE_ADHOC;
   1150   1.1    nonaka 		break;
   1151   1.1    nonaka 
   1152   1.1    nonaka 	default:
   1153   1.1    nonaka 		type = R92C_CR_NETTYPE_NOLINK;
   1154   1.1    nonaka 		break;
   1155   1.1    nonaka 	}
   1156   1.1    nonaka 
   1157   1.1    nonaka 	return type;
   1158   1.1    nonaka }
   1159   1.1    nonaka 
   1160   1.1    nonaka static void
   1161   1.1    nonaka rtwn_set_nettype0_msr(struct rtwn_softc *sc, uint8_t type)
   1162   1.1    nonaka {
   1163   1.1    nonaka 	uint32_t reg;
   1164   1.1    nonaka 
   1165   1.1    nonaka 	reg = rtwn_read_4(sc, R92C_CR);
   1166   1.1    nonaka 	reg = RW(reg, R92C_CR_NETTYPE, type);
   1167   1.1    nonaka 	rtwn_write_4(sc, R92C_CR, reg);
   1168   1.1    nonaka }
   1169   1.1    nonaka 
   1170   1.1    nonaka static void
   1171   1.1    nonaka rtwn_tsf_sync_enable(struct rtwn_softc *sc)
   1172   1.1    nonaka {
   1173   1.1    nonaka 	struct ieee80211_node *ni = sc->sc_ic.ic_bss;
   1174   1.1    nonaka 	uint64_t tsf;
   1175   1.1    nonaka 
   1176   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1177   1.1    nonaka 
   1178   1.1    nonaka 	/* Enable TSF synchronization. */
   1179   1.1    nonaka 	rtwn_write_1(sc, R92C_BCN_CTRL,
   1180   1.1    nonaka 	    rtwn_read_1(sc, R92C_BCN_CTRL) & ~R92C_BCN_CTRL_DIS_TSF_UDT0);
   1181   1.1    nonaka 
   1182   1.1    nonaka 	rtwn_write_1(sc, R92C_BCN_CTRL,
   1183   1.1    nonaka 	    rtwn_read_1(sc, R92C_BCN_CTRL) & ~R92C_BCN_CTRL_EN_BCN);
   1184   1.1    nonaka 
   1185   1.1    nonaka 	/* Set initial TSF. */
   1186   1.1    nonaka 	tsf = ni->ni_tstamp.tsf;
   1187   1.1    nonaka 	tsf = le64toh(tsf);
   1188   1.1    nonaka 	tsf = tsf - (tsf % (ni->ni_intval * IEEE80211_DUR_TU));
   1189   1.1    nonaka 	tsf -= IEEE80211_DUR_TU;
   1190   1.1    nonaka 	rtwn_write_4(sc, R92C_TSFTR + 0, (uint32_t)tsf);
   1191   1.1    nonaka 	rtwn_write_4(sc, R92C_TSFTR + 4, (uint32_t)(tsf >> 32));
   1192   1.1    nonaka 
   1193   1.1    nonaka 	rtwn_write_1(sc, R92C_BCN_CTRL,
   1194   1.1    nonaka 	    rtwn_read_1(sc, R92C_BCN_CTRL) | R92C_BCN_CTRL_EN_BCN);
   1195   1.1    nonaka }
   1196   1.1    nonaka 
   1197   1.1    nonaka static void
   1198   1.1    nonaka rtwn_set_led(struct rtwn_softc *sc, int led, int on)
   1199   1.1    nonaka {
   1200   1.1    nonaka 	uint8_t reg;
   1201   1.1    nonaka 
   1202   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1203   1.1    nonaka 
   1204   1.1    nonaka 	if (led == RTWN_LED_LINK) {
   1205   1.1    nonaka 		reg = rtwn_read_1(sc, R92C_LEDCFG2) & 0xf0;
   1206   1.1    nonaka 		if (!on)
   1207   1.1    nonaka 			reg |= R92C_LEDCFG2_DIS;
   1208   1.1    nonaka 		else
   1209   1.1    nonaka 			reg |= R92C_LEDCFG2_EN;
   1210   1.1    nonaka 		rtwn_write_1(sc, R92C_LEDCFG2, reg);
   1211   1.1    nonaka 		sc->ledlink = on;	/* Save LED state. */
   1212   1.1    nonaka 	}
   1213   1.1    nonaka }
   1214   1.1    nonaka 
   1215   1.1    nonaka static void
   1216   1.1    nonaka rtwn_calib_to(void *arg)
   1217   1.1    nonaka {
   1218   1.1    nonaka 	struct rtwn_softc *sc = arg;
   1219   1.1    nonaka 	struct r92c_fw_cmd_rssi cmd;
   1220  1.11    nonaka 	int s;
   1221   1.1    nonaka 
   1222   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1223   1.1    nonaka 
   1224  1.11    nonaka 	s = splnet();
   1225  1.11    nonaka 
   1226   1.1    nonaka 	if (sc->sc_ic.ic_state != IEEE80211_S_RUN)
   1227   1.1    nonaka 		goto restart_timer;
   1228   1.1    nonaka 
   1229   1.1    nonaka 	if (sc->avg_pwdb != -1) {
   1230   1.1    nonaka 		/* Indicate Rx signal strength to FW for rate adaptation. */
   1231   1.1    nonaka 		memset(&cmd, 0, sizeof(cmd));
   1232   1.1    nonaka 		cmd.macid = 0;	/* BSS. */
   1233   1.1    nonaka 		cmd.pwdb = sc->avg_pwdb;
   1234   1.1    nonaka 		DPRINTFN(3, ("sending RSSI command avg=%d\n", sc->avg_pwdb));
   1235   1.1    nonaka 		rtwn_fw_cmd(sc, R92C_CMD_RSSI_SETTING, &cmd, sizeof(cmd));
   1236   1.1    nonaka 	}
   1237   1.1    nonaka 
   1238   1.1    nonaka 	/* Do temperature compensation. */
   1239   1.1    nonaka 	rtwn_temp_calib(sc);
   1240   1.1    nonaka 
   1241   1.1    nonaka  restart_timer:
   1242   1.1    nonaka 	callout_schedule(&sc->calib_to, mstohz(2000));
   1243  1.11    nonaka 
   1244  1.11    nonaka 	splx(s);
   1245   1.1    nonaka }
   1246   1.1    nonaka 
   1247   1.1    nonaka static void
   1248   1.1    nonaka rtwn_next_scan(void *arg)
   1249   1.1    nonaka {
   1250   1.1    nonaka 	struct rtwn_softc *sc = arg;
   1251   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1252   1.1    nonaka 	int s;
   1253   1.1    nonaka 
   1254   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1255   1.1    nonaka 
   1256   1.1    nonaka 	s = splnet();
   1257   1.1    nonaka 	if (ic->ic_state == IEEE80211_S_SCAN)
   1258   1.1    nonaka 		ieee80211_next_scan(ic);
   1259   1.1    nonaka 	splx(s);
   1260   1.1    nonaka }
   1261   1.1    nonaka 
   1262   1.1    nonaka static void
   1263   1.1    nonaka rtwn_newassoc(struct ieee80211_node *ni, int isnew)
   1264   1.1    nonaka {
   1265   1.1    nonaka 
   1266   1.1    nonaka 	DPRINTF(("%s: new node %s\n", __func__, ether_sprintf(ni->ni_macaddr)));
   1267   1.1    nonaka 
   1268   1.1    nonaka 	/* start with lowest Tx rate */
   1269   1.1    nonaka 	ni->ni_txrate = 0;
   1270   1.1    nonaka }
   1271   1.1    nonaka 
   1272   1.1    nonaka static int
   1273   1.1    nonaka rtwn_reset(struct ifnet *ifp)
   1274   1.1    nonaka {
   1275   1.1    nonaka 	struct rtwn_softc *sc = ifp->if_softc;
   1276   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1277   1.1    nonaka 
   1278   1.1    nonaka 	if (ic->ic_opmode != IEEE80211_M_MONITOR)
   1279   1.1    nonaka 		return ENETRESET;
   1280   1.1    nonaka 
   1281   1.1    nonaka 	rtwn_set_chan(sc, ic->ic_curchan, NULL);
   1282   1.1    nonaka 
   1283   1.1    nonaka 	return 0;
   1284   1.1    nonaka }
   1285   1.1    nonaka 
   1286   1.1    nonaka static int
   1287   1.1    nonaka rtwn_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
   1288   1.1    nonaka {
   1289   1.1    nonaka 	struct rtwn_softc *sc = IC2IFP(ic)->if_softc;
   1290   1.1    nonaka 	struct ieee80211_node *ni;
   1291   1.1    nonaka 	enum ieee80211_state ostate = ic->ic_state;
   1292   1.1    nonaka 	uint32_t reg;
   1293   1.1    nonaka 	int s;
   1294   1.1    nonaka 
   1295   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1296   1.1    nonaka 
   1297   1.1    nonaka 	s = splnet();
   1298   1.1    nonaka 
   1299   1.1    nonaka 	callout_stop(&sc->scan_to);
   1300   1.1    nonaka 	callout_stop(&sc->calib_to);
   1301   1.1    nonaka 
   1302   1.1    nonaka 	if (ostate != nstate) {
   1303   1.1    nonaka 		DPRINTF(("%s: %s -> %s\n", __func__,
   1304   1.1    nonaka 		    ieee80211_state_name[ostate],
   1305   1.1    nonaka 		    ieee80211_state_name[nstate]));
   1306   1.1    nonaka 	}
   1307   1.1    nonaka 
   1308   1.1    nonaka 	switch (ostate) {
   1309   1.1    nonaka 	case IEEE80211_S_INIT:
   1310   1.1    nonaka 		break;
   1311   1.1    nonaka 
   1312   1.1    nonaka 	case IEEE80211_S_SCAN:
   1313   1.1    nonaka 		if (nstate != IEEE80211_S_SCAN) {
   1314   1.1    nonaka 			/*
   1315   1.1    nonaka 			 * End of scanning
   1316   1.1    nonaka 			 */
   1317   1.1    nonaka 			/* flush 4-AC Queue after site_survey */
   1318   1.1    nonaka 			rtwn_write_1(sc, R92C_TXPAUSE, 0x0);
   1319   1.1    nonaka 
   1320   1.1    nonaka 			/* Allow Rx from our BSSID only. */
   1321   1.1    nonaka 			rtwn_write_4(sc, R92C_RCR,
   1322   1.1    nonaka 			    rtwn_read_4(sc, R92C_RCR) |
   1323   1.1    nonaka 			      R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN);
   1324   1.1    nonaka 		}
   1325   1.1    nonaka 		break;
   1326   1.1    nonaka 
   1327   1.1    nonaka 	case IEEE80211_S_AUTH:
   1328   1.1    nonaka 	case IEEE80211_S_ASSOC:
   1329   1.1    nonaka 		break;
   1330   1.1    nonaka 
   1331   1.1    nonaka 	case IEEE80211_S_RUN:
   1332   1.1    nonaka 		/* Turn link LED off. */
   1333   1.1    nonaka 		rtwn_set_led(sc, RTWN_LED_LINK, 0);
   1334   1.1    nonaka 
   1335   1.1    nonaka 		/* Set media status to 'No Link'. */
   1336   1.1    nonaka 		rtwn_set_nettype0_msr(sc, R92C_CR_NETTYPE_NOLINK);
   1337   1.1    nonaka 
   1338   1.1    nonaka 		/* Stop Rx of data frames. */
   1339   1.1    nonaka 		rtwn_write_2(sc, R92C_RXFLTMAP2, 0);
   1340   1.1    nonaka 
   1341   1.1    nonaka 		/* Rest TSF. */
   1342   1.1    nonaka 		rtwn_write_1(sc, R92C_DUAL_TSF_RST, 0x03);
   1343   1.1    nonaka 
   1344   1.1    nonaka 		/* Disable TSF synchronization. */
   1345   1.1    nonaka 		rtwn_write_1(sc, R92C_BCN_CTRL,
   1346   1.1    nonaka 		    rtwn_read_1(sc, R92C_BCN_CTRL) |
   1347   1.1    nonaka 		    R92C_BCN_CTRL_DIS_TSF_UDT0);
   1348   1.1    nonaka 
   1349   1.1    nonaka 		/* Back to 20MHz mode */
   1350   1.1    nonaka 		rtwn_set_chan(sc, ic->ic_curchan, NULL);
   1351   1.1    nonaka 
   1352   1.1    nonaka 		/* Reset EDCA parameters. */
   1353   1.1    nonaka 		rtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002f3217);
   1354   1.1    nonaka 		rtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005e4317);
   1355   1.1    nonaka 		rtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x00105320);
   1356   1.1    nonaka 		rtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a444);
   1357   1.1    nonaka 
   1358   1.1    nonaka 		/* flush all cam entries */
   1359   1.1    nonaka 		rtwn_cam_init(sc);
   1360   1.1    nonaka 		break;
   1361   1.1    nonaka 	}
   1362   1.1    nonaka 
   1363   1.1    nonaka 	switch (nstate) {
   1364   1.1    nonaka 	case IEEE80211_S_INIT:
   1365   1.1    nonaka 		/* Turn link LED off. */
   1366   1.1    nonaka 		rtwn_set_led(sc, RTWN_LED_LINK, 0);
   1367   1.1    nonaka 		break;
   1368   1.1    nonaka 
   1369   1.1    nonaka 	case IEEE80211_S_SCAN:
   1370   1.1    nonaka 		if (ostate != IEEE80211_S_SCAN) {
   1371   1.1    nonaka 			/*
   1372   1.1    nonaka 			 * Begin of scanning
   1373   1.1    nonaka 			 */
   1374   1.1    nonaka 
   1375   1.1    nonaka 			/* Set gain for scanning. */
   1376   1.1    nonaka 			reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
   1377   1.1    nonaka 			reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
   1378   1.1    nonaka 			rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
   1379   1.1    nonaka 
   1380   1.1    nonaka 			reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
   1381   1.1    nonaka 			reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
   1382   1.1    nonaka 			rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
   1383   1.1    nonaka 
   1384   1.1    nonaka 			/* Allow Rx from any BSSID. */
   1385   1.1    nonaka 			rtwn_write_4(sc, R92C_RCR,
   1386   1.1    nonaka 			    rtwn_read_4(sc, R92C_RCR) &
   1387   1.1    nonaka 			    ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN));
   1388   1.1    nonaka 
   1389   1.1    nonaka 			/* Stop Rx of data frames. */
   1390   1.1    nonaka 			rtwn_write_2(sc, R92C_RXFLTMAP2, 0);
   1391   1.1    nonaka 
   1392   1.1    nonaka 			/* Disable update TSF */
   1393   1.1    nonaka 			rtwn_write_1(sc, R92C_BCN_CTRL,
   1394   1.1    nonaka 			    rtwn_read_1(sc, R92C_BCN_CTRL) |
   1395   1.1    nonaka 			      R92C_BCN_CTRL_DIS_TSF_UDT0);
   1396   1.1    nonaka 		}
   1397   1.1    nonaka 
   1398   1.1    nonaka 		/* Make link LED blink during scan. */
   1399   1.1    nonaka 		rtwn_set_led(sc, RTWN_LED_LINK, !sc->ledlink);
   1400   1.1    nonaka 
   1401   1.1    nonaka 		/* Pause AC Tx queues. */
   1402   1.1    nonaka 		rtwn_write_1(sc, R92C_TXPAUSE,
   1403   1.1    nonaka 		    rtwn_read_1(sc, R92C_TXPAUSE) | 0x0f);
   1404   1.1    nonaka 
   1405   1.1    nonaka 		rtwn_set_chan(sc, ic->ic_curchan, NULL);
   1406   1.1    nonaka 
   1407   1.1    nonaka 		/* Start periodic scan. */
   1408   1.1    nonaka 		callout_schedule(&sc->scan_to, mstohz(200));
   1409   1.1    nonaka 		break;
   1410   1.1    nonaka 
   1411   1.1    nonaka 	case IEEE80211_S_AUTH:
   1412   1.1    nonaka 		/* Set initial gain under link. */
   1413   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
   1414   1.1    nonaka #ifdef doaslinux
   1415   1.1    nonaka 		reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x32);
   1416   1.1    nonaka #else
   1417   1.1    nonaka 		reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
   1418   1.1    nonaka #endif
   1419   1.1    nonaka 		rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
   1420   1.1    nonaka 
   1421   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
   1422   1.1    nonaka #ifdef doaslinux
   1423   1.1    nonaka 		reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x32);
   1424   1.1    nonaka #else
   1425   1.1    nonaka 		reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
   1426   1.1    nonaka #endif
   1427   1.1    nonaka 		rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
   1428   1.1    nonaka 
   1429   1.1    nonaka 		/* Set media status to 'No Link'. */
   1430   1.1    nonaka 		rtwn_set_nettype0_msr(sc, R92C_CR_NETTYPE_NOLINK);
   1431   1.1    nonaka 
   1432   1.1    nonaka 		/* Allow Rx from any BSSID. */
   1433   1.1    nonaka 		rtwn_write_4(sc, R92C_RCR,
   1434   1.1    nonaka 		    rtwn_read_4(sc, R92C_RCR) &
   1435   1.1    nonaka 		      ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN));
   1436   1.1    nonaka 
   1437   1.1    nonaka 		rtwn_set_chan(sc, ic->ic_curchan, NULL);
   1438   1.1    nonaka 		break;
   1439   1.1    nonaka 
   1440   1.1    nonaka 	case IEEE80211_S_ASSOC:
   1441   1.1    nonaka 		break;
   1442   1.1    nonaka 
   1443   1.1    nonaka 	case IEEE80211_S_RUN:
   1444   1.1    nonaka 		ni = ic->ic_bss;
   1445   1.1    nonaka 
   1446   1.1    nonaka 		rtwn_set_chan(sc, ic->ic_curchan, NULL);
   1447   1.1    nonaka 
   1448   1.1    nonaka 		if (ic->ic_opmode == IEEE80211_M_MONITOR) {
   1449   1.1    nonaka 			/* Back to 20Mhz mode */
   1450   1.1    nonaka 			rtwn_set_chan(sc, ic->ic_curchan, NULL);
   1451   1.1    nonaka 
   1452   1.1    nonaka 			/* Set media status to 'No Link'. */
   1453   1.1    nonaka 			rtwn_set_nettype0_msr(sc, R92C_CR_NETTYPE_NOLINK);
   1454   1.1    nonaka 
   1455   1.1    nonaka 			/* Enable Rx of data frames. */
   1456   1.1    nonaka 			rtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
   1457   1.1    nonaka 
   1458   1.1    nonaka 			/* Allow Rx from any BSSID. */
   1459   1.1    nonaka 			rtwn_write_4(sc, R92C_RCR,
   1460   1.1    nonaka 			    rtwn_read_4(sc, R92C_RCR) &
   1461   1.1    nonaka 			    ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN));
   1462   1.1    nonaka 
   1463   1.1    nonaka 			/* Accept Rx data/control/management frames */
   1464   1.1    nonaka 			rtwn_write_4(sc, R92C_RCR,
   1465   1.1    nonaka 			    rtwn_read_4(sc, R92C_RCR) |
   1466   1.1    nonaka 			    R92C_RCR_ADF | R92C_RCR_ACF | R92C_RCR_AMF);
   1467   1.1    nonaka 
   1468   1.1    nonaka 			/* Turn link LED on. */
   1469   1.1    nonaka 			rtwn_set_led(sc, RTWN_LED_LINK, 1);
   1470   1.1    nonaka 			break;
   1471   1.1    nonaka 		}
   1472   1.1    nonaka 
   1473   1.1    nonaka 		/* Set media status to 'Associated'. */
   1474   1.1    nonaka 		rtwn_set_nettype0_msr(sc, rtwn_get_nettype(sc));
   1475   1.1    nonaka 
   1476   1.1    nonaka 		/* Set BSSID. */
   1477   1.1    nonaka 		rtwn_write_4(sc, R92C_BSSID + 0, LE_READ_4(&ni->ni_bssid[0]));
   1478   1.1    nonaka 		rtwn_write_4(sc, R92C_BSSID + 4, LE_READ_2(&ni->ni_bssid[4]));
   1479   1.1    nonaka 
   1480   1.1    nonaka 		if (ic->ic_curmode == IEEE80211_MODE_11B)
   1481   1.1    nonaka 			rtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0);
   1482   1.1    nonaka 		else	/* 802.11b/g */
   1483   1.1    nonaka 			rtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3);
   1484   1.1    nonaka 
   1485   1.1    nonaka 		/* Enable Rx of data frames. */
   1486   1.1    nonaka 		rtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
   1487   1.1    nonaka 
   1488   1.1    nonaka 		/* Flush all AC queues. */
   1489   1.1    nonaka 		rtwn_write_1(sc, R92C_TXPAUSE, 0);
   1490   1.1    nonaka 
   1491   1.1    nonaka 		/* Set beacon interval. */
   1492   1.1    nonaka 		rtwn_write_2(sc, R92C_BCN_INTERVAL, ni->ni_intval);
   1493   1.1    nonaka 
   1494   1.1    nonaka 		switch (ic->ic_opmode) {
   1495   1.1    nonaka 		case IEEE80211_M_STA:
   1496   1.1    nonaka 			/* Allow Rx from our BSSID only. */
   1497   1.1    nonaka 			rtwn_write_4(sc, R92C_RCR,
   1498   1.1    nonaka 			    rtwn_read_4(sc, R92C_RCR) |
   1499   1.1    nonaka 			      R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN);
   1500   1.1    nonaka 
   1501   1.1    nonaka 			/* Enable TSF synchronization. */
   1502   1.1    nonaka 			rtwn_tsf_sync_enable(sc);
   1503   1.1    nonaka 			break;
   1504   1.1    nonaka 
   1505   1.1    nonaka 		case IEEE80211_M_HOSTAP:
   1506   1.1    nonaka 			rtwn_write_2(sc, R92C_BCNTCFG, 0x000f);
   1507   1.1    nonaka 
   1508   1.1    nonaka 			/* Allow Rx from any BSSID. */
   1509   1.1    nonaka 			rtwn_write_4(sc, R92C_RCR,
   1510   1.1    nonaka 			    rtwn_read_4(sc, R92C_RCR) &
   1511   1.1    nonaka 			    ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN));
   1512   1.1    nonaka 
   1513   1.1    nonaka 			/* Reset TSF timer to zero. */
   1514   1.1    nonaka 			reg = rtwn_read_4(sc, R92C_TCR);
   1515   1.1    nonaka 			reg &= ~0x01;
   1516   1.1    nonaka 			rtwn_write_4(sc, R92C_TCR, reg);
   1517   1.1    nonaka 			reg |= 0x01;
   1518   1.1    nonaka 			rtwn_write_4(sc, R92C_TCR, reg);
   1519   1.1    nonaka 			break;
   1520   1.1    nonaka 
   1521   1.1    nonaka 		case IEEE80211_M_MONITOR:
   1522   1.1    nonaka 		default:
   1523   1.1    nonaka 			break;
   1524   1.1    nonaka 		}
   1525   1.1    nonaka 
   1526   1.1    nonaka 		rtwn_write_1(sc, R92C_SIFS_CCK + 1, 10);
   1527   1.1    nonaka 		rtwn_write_1(sc, R92C_SIFS_OFDM + 1, 10);
   1528   1.1    nonaka 		rtwn_write_1(sc, R92C_SPEC_SIFS + 1, 10);
   1529   1.1    nonaka 		rtwn_write_1(sc, R92C_MAC_SPEC_SIFS + 1, 10);
   1530   1.1    nonaka 		rtwn_write_1(sc, R92C_R2T_SIFS + 1, 10);
   1531   1.1    nonaka 		rtwn_write_1(sc, R92C_T2T_SIFS + 1, 10);
   1532   1.1    nonaka 
   1533   1.1    nonaka 		/* Intialize rate adaptation. */
   1534   1.1    nonaka 		rtwn_ra_init(sc);
   1535   1.1    nonaka 
   1536   1.1    nonaka 		/* Turn link LED on. */
   1537   1.1    nonaka 		rtwn_set_led(sc, RTWN_LED_LINK, 1);
   1538   1.1    nonaka 
   1539   1.1    nonaka 		/* Reset average RSSI. */
   1540   1.1    nonaka 		sc->avg_pwdb = -1;
   1541   1.1    nonaka 
   1542   1.1    nonaka 		/* Reset temperature calibration state machine. */
   1543   1.1    nonaka 		sc->thcal_state = 0;
   1544   1.1    nonaka 		sc->thcal_lctemp = 0;
   1545   1.1    nonaka 
   1546   1.1    nonaka 		/* Start periodic calibration. */
   1547   1.1    nonaka 		callout_schedule(&sc->calib_to, mstohz(2000));
   1548   1.1    nonaka 		break;
   1549   1.1    nonaka 	}
   1550   1.1    nonaka 
   1551   1.1    nonaka 	(void)sc->sc_newstate(ic, nstate, arg);
   1552   1.1    nonaka 
   1553   1.1    nonaka 	splx(s);
   1554   1.1    nonaka 
   1555   1.1    nonaka 	return 0;
   1556   1.1    nonaka }
   1557   1.1    nonaka 
   1558   1.1    nonaka static int
   1559   1.1    nonaka rtwn_wme_update(struct ieee80211com *ic)
   1560   1.1    nonaka {
   1561   1.1    nonaka 	static const uint16_t aci2reg[WME_NUM_AC] = {
   1562   1.1    nonaka 		R92C_EDCA_BE_PARAM,
   1563   1.1    nonaka 		R92C_EDCA_BK_PARAM,
   1564   1.1    nonaka 		R92C_EDCA_VI_PARAM,
   1565   1.1    nonaka 		R92C_EDCA_VO_PARAM
   1566   1.1    nonaka 	};
   1567   1.1    nonaka 	struct rtwn_softc *sc = IC2IFP(ic)->if_softc;
   1568   1.1    nonaka 	const struct wmeParams *wmep;
   1569   1.1    nonaka 	int s, aci, aifs, slottime;
   1570   1.1    nonaka 
   1571   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1572   1.1    nonaka 
   1573   1.1    nonaka 	s = splnet();
   1574   1.1    nonaka 	slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
   1575   1.1    nonaka 	for (aci = 0; aci < WME_NUM_AC; aci++) {
   1576   1.1    nonaka 		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[aci];
   1577   1.1    nonaka 		/* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */
   1578   1.1    nonaka 		aifs = wmep->wmep_aifsn * slottime + 10;
   1579   1.1    nonaka 		rtwn_write_4(sc, aci2reg[aci],
   1580   1.1    nonaka 		    SM(R92C_EDCA_PARAM_TXOP, wmep->wmep_txopLimit) |
   1581   1.1    nonaka 		    SM(R92C_EDCA_PARAM_ECWMIN, wmep->wmep_logcwmin) |
   1582   1.1    nonaka 		    SM(R92C_EDCA_PARAM_ECWMAX, wmep->wmep_logcwmax) |
   1583   1.1    nonaka 		    SM(R92C_EDCA_PARAM_AIFS, aifs));
   1584   1.1    nonaka 	}
   1585   1.1    nonaka 	splx(s);
   1586   1.1    nonaka 
   1587   1.1    nonaka 	return 0;
   1588   1.1    nonaka }
   1589   1.1    nonaka 
   1590   1.1    nonaka static void
   1591   1.1    nonaka rtwn_update_avgrssi(struct rtwn_softc *sc, int rate, int8_t rssi)
   1592   1.1    nonaka {
   1593   1.1    nonaka 	int pwdb;
   1594   1.1    nonaka 
   1595   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1596   1.1    nonaka 
   1597   1.1    nonaka 	/* Convert antenna signal to percentage. */
   1598   1.1    nonaka 	if (rssi <= -100 || rssi >= 20)
   1599   1.1    nonaka 		pwdb = 0;
   1600   1.1    nonaka 	else if (rssi >= 0)
   1601   1.1    nonaka 		pwdb = 100;
   1602   1.1    nonaka 	else
   1603   1.1    nonaka 		pwdb = 100 + rssi;
   1604   1.1    nonaka 	if (rate <= 3) {
   1605   1.1    nonaka 		/* CCK gain is smaller than OFDM/MCS gain. */
   1606   1.1    nonaka 		pwdb += 6;
   1607   1.1    nonaka 		if (pwdb > 100)
   1608   1.1    nonaka 			pwdb = 100;
   1609   1.1    nonaka 		if (pwdb <= 14)
   1610   1.1    nonaka 			pwdb -= 4;
   1611   1.1    nonaka 		else if (pwdb <= 26)
   1612   1.1    nonaka 			pwdb -= 8;
   1613   1.1    nonaka 		else if (pwdb <= 34)
   1614   1.1    nonaka 			pwdb -= 6;
   1615   1.1    nonaka 		else if (pwdb <= 42)
   1616   1.1    nonaka 			pwdb -= 2;
   1617   1.1    nonaka 	}
   1618   1.1    nonaka 	if (sc->avg_pwdb == -1)	/* Init. */
   1619   1.1    nonaka 		sc->avg_pwdb = pwdb;
   1620   1.1    nonaka 	else if (sc->avg_pwdb < pwdb)
   1621   1.1    nonaka 		sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20) + 1;
   1622   1.1    nonaka 	else
   1623   1.1    nonaka 		sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20);
   1624   1.1    nonaka 	DPRINTFN(4, ("PWDB=%d EMA=%d\n", pwdb, sc->avg_pwdb));
   1625   1.1    nonaka }
   1626   1.1    nonaka 
   1627   1.1    nonaka static int8_t
   1628   1.1    nonaka rtwn_get_rssi(struct rtwn_softc *sc, int rate, void *physt)
   1629   1.1    nonaka {
   1630   1.1    nonaka 	static const int8_t cckoff[] = { 16, -12, -26, -46 };
   1631   1.1    nonaka 	struct r92c_rx_phystat *phy;
   1632   1.1    nonaka 	struct r92c_rx_cck *cck;
   1633   1.1    nonaka 	uint8_t rpt;
   1634   1.1    nonaka 	int8_t rssi;
   1635   1.1    nonaka 
   1636   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1637   1.1    nonaka 
   1638   1.1    nonaka 	if (rate <= 3) {
   1639   1.1    nonaka 		cck = (struct r92c_rx_cck *)physt;
   1640   1.1    nonaka 		if (sc->sc_flags & RTWN_FLAG_CCK_HIPWR) {
   1641   1.1    nonaka 			rpt = (cck->agc_rpt >> 5) & 0x3;
   1642   1.1    nonaka 			rssi = (cck->agc_rpt & 0x1f) << 1;
   1643   1.1    nonaka 		} else {
   1644   1.1    nonaka 			rpt = (cck->agc_rpt >> 6) & 0x3;
   1645   1.1    nonaka 			rssi = cck->agc_rpt & 0x3e;
   1646   1.1    nonaka 		}
   1647   1.1    nonaka 		rssi = cckoff[rpt] - rssi;
   1648   1.1    nonaka 	} else {	/* OFDM/HT. */
   1649   1.1    nonaka 		phy = (struct r92c_rx_phystat *)physt;
   1650   1.1    nonaka 		rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110;
   1651   1.1    nonaka 	}
   1652   1.1    nonaka 	return rssi;
   1653   1.1    nonaka }
   1654   1.1    nonaka 
   1655   1.1    nonaka static void
   1656   1.1    nonaka rtwn_rx_frame(struct rtwn_softc *sc, struct r92c_rx_desc *rx_desc,
   1657   1.1    nonaka     struct rtwn_rx_data *rx_data, int desc_idx)
   1658   1.1    nonaka {
   1659   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1660   1.1    nonaka 	struct ifnet *ifp = IC2IFP(ic);
   1661   1.1    nonaka 	struct ieee80211_frame *wh;
   1662   1.1    nonaka 	struct ieee80211_node *ni;
   1663   1.1    nonaka 	struct r92c_rx_phystat *phy = NULL;
   1664   1.1    nonaka 	uint32_t rxdw0, rxdw3;
   1665   1.1    nonaka 	struct mbuf *m, *m1;
   1666   1.1    nonaka 	uint8_t rate;
   1667   1.1    nonaka 	int8_t rssi = 0;
   1668  1.11    nonaka 	int infosz, pktlen, shift, totlen, error, s;
   1669   1.1    nonaka 
   1670   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1671   1.1    nonaka 
   1672   1.1    nonaka 	rxdw0 = le32toh(rx_desc->rxdw0);
   1673   1.1    nonaka 	rxdw3 = le32toh(rx_desc->rxdw3);
   1674   1.1    nonaka 
   1675   1.1    nonaka 	if (__predict_false(rxdw0 & (R92C_RXDW0_CRCERR | R92C_RXDW0_ICVERR))) {
   1676   1.1    nonaka 		/*
   1677   1.1    nonaka 		 * This should not happen since we setup our Rx filter
   1678   1.1    nonaka 		 * to not receive these frames.
   1679   1.1    nonaka 		 */
   1680   1.1    nonaka 		ifp->if_ierrors++;
   1681   1.1    nonaka 		return;
   1682   1.1    nonaka 	}
   1683   1.1    nonaka 
   1684   1.1    nonaka 	pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN);
   1685   1.1    nonaka         /*
   1686   1.1    nonaka 	 * XXX: This will drop most control packets.  Do we really
   1687   1.1    nonaka 	 * want this in IEEE80211_M_MONITOR mode?
   1688   1.1    nonaka 	 */
   1689   1.1    nonaka 	if (__predict_false(pktlen < (int)sizeof(struct ieee80211_frame_ack))) {
   1690   1.1    nonaka 		ic->ic_stats.is_rx_tooshort++;
   1691   1.1    nonaka 		ifp->if_ierrors++;
   1692   1.1    nonaka 		return;
   1693   1.1    nonaka 	}
   1694   1.1    nonaka 	if (__predict_false(pktlen > MCLBYTES)) {
   1695   1.1    nonaka 		ifp->if_ierrors++;
   1696   1.1    nonaka 		return;
   1697   1.1    nonaka 	}
   1698   1.1    nonaka 
   1699   1.1    nonaka 	rate = MS(rxdw3, R92C_RXDW3_RATE);
   1700   1.1    nonaka 	infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8;
   1701   1.1    nonaka 	if (infosz > sizeof(struct r92c_rx_phystat))
   1702   1.1    nonaka 		infosz = sizeof(struct r92c_rx_phystat);
   1703   1.1    nonaka 	shift = MS(rxdw0, R92C_RXDW0_SHIFT);
   1704   1.1    nonaka 	totlen = pktlen + infosz + shift;
   1705   1.1    nonaka 
   1706   1.1    nonaka 	/* Get RSSI from PHY status descriptor if present. */
   1707   1.1    nonaka 	if (infosz != 0 && (rxdw0 & R92C_RXDW0_PHYST)) {
   1708   1.1    nonaka 		phy = mtod(rx_data->m, struct r92c_rx_phystat *);
   1709   1.1    nonaka 		rssi = rtwn_get_rssi(sc, rate, phy);
   1710   1.1    nonaka 		/* Update our average RSSI. */
   1711   1.1    nonaka 		rtwn_update_avgrssi(sc, rate, rssi);
   1712   1.1    nonaka 	}
   1713   1.1    nonaka 
   1714   1.1    nonaka 	DPRINTFN(5, ("Rx frame len=%d rate=%d infosz=%d shift=%d rssi=%d\n",
   1715   1.1    nonaka 	    pktlen, rate, infosz, shift, rssi));
   1716   1.1    nonaka 
   1717   1.1    nonaka 	MGETHDR(m1, M_DONTWAIT, MT_DATA);
   1718   1.1    nonaka 	if (__predict_false(m1 == NULL)) {
   1719   1.1    nonaka 		ic->ic_stats.is_rx_nobuf++;
   1720   1.1    nonaka 		ifp->if_ierrors++;
   1721   1.1    nonaka 		return;
   1722   1.1    nonaka 	}
   1723   1.1    nonaka 	MCLGET(m1, M_DONTWAIT);
   1724   1.1    nonaka 	if (__predict_false(!(m1->m_flags & M_EXT))) {
   1725   1.1    nonaka 		m_freem(m1);
   1726   1.1    nonaka 		ic->ic_stats.is_rx_nobuf++;
   1727   1.1    nonaka 		ifp->if_ierrors++;
   1728   1.1    nonaka 		return;
   1729   1.1    nonaka 	}
   1730   1.1    nonaka 
   1731   1.1    nonaka 	bus_dmamap_sync(sc->sc_dmat, rx_data->map, 0, totlen,
   1732   1.1    nonaka 	    BUS_DMASYNC_POSTREAD);
   1733   1.1    nonaka 
   1734   1.1    nonaka 	bus_dmamap_unload(sc->sc_dmat, rx_data->map);
   1735   1.1    nonaka 	error = bus_dmamap_load(sc->sc_dmat, rx_data->map, mtod(m1, void *),
   1736   1.1    nonaka 	    MCLBYTES, NULL, BUS_DMA_NOWAIT | BUS_DMA_READ);
   1737   1.1    nonaka 	if (error != 0) {
   1738   1.1    nonaka 		m_freem(m1);
   1739   1.1    nonaka 
   1740   1.1    nonaka 		if (bus_dmamap_load_mbuf(sc->sc_dmat, rx_data->map,
   1741   1.1    nonaka 		    rx_data->m, BUS_DMA_NOWAIT))
   1742   1.1    nonaka 			panic("%s: could not load old RX mbuf",
   1743   1.1    nonaka 			    device_xname(sc->sc_dev));
   1744   1.1    nonaka 
   1745   1.1    nonaka 		bus_dmamap_sync(sc->sc_dmat, rx_data->map, 0, MCLBYTES,
   1746   1.1    nonaka 		    BUS_DMASYNC_PREREAD);
   1747   1.1    nonaka 
   1748   1.1    nonaka 		/* Physical address may have changed. */
   1749   1.1    nonaka 		rtwn_setup_rx_desc(sc, rx_desc,
   1750   1.1    nonaka 		    rx_data->map->dm_segs[0].ds_addr, MCLBYTES, desc_idx);
   1751   1.1    nonaka 
   1752   1.1    nonaka 		ifp->if_ierrors++;
   1753   1.1    nonaka 		return;
   1754   1.1    nonaka 	}
   1755   1.1    nonaka 
   1756   1.1    nonaka 	/* Finalize mbuf. */
   1757   1.1    nonaka 	m = rx_data->m;
   1758   1.1    nonaka 	rx_data->m = m1;
   1759   1.1    nonaka 	m->m_pkthdr.len = m->m_len = totlen;
   1760   1.8     ozaki 	m_set_rcvif(m, ifp);
   1761   1.1    nonaka 
   1762   1.1    nonaka 	bus_dmamap_sync(sc->sc_dmat, rx_data->map, 0, MCLBYTES,
   1763   1.1    nonaka 	    BUS_DMASYNC_PREREAD);
   1764   1.1    nonaka 
   1765   1.1    nonaka 	/* Update RX descriptor. */
   1766   1.1    nonaka 	rtwn_setup_rx_desc(sc, rx_desc, rx_data->map->dm_segs[0].ds_addr,
   1767   1.1    nonaka 	    MCLBYTES, desc_idx);
   1768   1.1    nonaka 
   1769   1.1    nonaka 	/* Get ieee80211 frame header. */
   1770   1.1    nonaka 	if (rxdw0 & R92C_RXDW0_PHYST)
   1771   1.1    nonaka 		m_adj(m, infosz + shift);
   1772   1.1    nonaka 	else
   1773   1.1    nonaka 		m_adj(m, shift);
   1774   1.1    nonaka 	wh = mtod(m, struct ieee80211_frame *);
   1775   1.1    nonaka 
   1776  1.11    nonaka 	s = splnet();
   1777  1.11    nonaka 
   1778   1.1    nonaka 	if (__predict_false(sc->sc_drvbpf != NULL)) {
   1779   1.1    nonaka 		struct rtwn_rx_radiotap_header *tap = &sc->sc_rxtap;
   1780   1.1    nonaka 
   1781   1.1    nonaka 		tap->wr_flags = 0;
   1782   1.1    nonaka 		/* Map HW rate index to 802.11 rate. */
   1783   1.1    nonaka 		tap->wr_flags = 2;
   1784   1.1    nonaka 		if (!(rxdw3 & R92C_RXDW3_HT)) {
   1785   1.1    nonaka 			switch (rate) {
   1786   1.1    nonaka 			/* CCK. */
   1787   1.1    nonaka 			case  0: tap->wr_rate =   2; break;
   1788   1.1    nonaka 			case  1: tap->wr_rate =   4; break;
   1789   1.1    nonaka 			case  2: tap->wr_rate =  11; break;
   1790   1.1    nonaka 			case  3: tap->wr_rate =  22; break;
   1791   1.1    nonaka 			/* OFDM. */
   1792   1.1    nonaka 			case  4: tap->wr_rate =  12; break;
   1793   1.1    nonaka 			case  5: tap->wr_rate =  18; break;
   1794   1.1    nonaka 			case  6: tap->wr_rate =  24; break;
   1795   1.1    nonaka 			case  7: tap->wr_rate =  36; break;
   1796   1.1    nonaka 			case  8: tap->wr_rate =  48; break;
   1797   1.1    nonaka 			case  9: tap->wr_rate =  72; break;
   1798   1.1    nonaka 			case 10: tap->wr_rate =  96; break;
   1799   1.1    nonaka 			case 11: tap->wr_rate = 108; break;
   1800   1.1    nonaka 			}
   1801   1.1    nonaka 		} else if (rate >= 12) {	/* MCS0~15. */
   1802   1.1    nonaka 			/* Bit 7 set means HT MCS instead of rate. */
   1803   1.1    nonaka 			tap->wr_rate = 0x80 | (rate - 12);
   1804   1.1    nonaka 		}
   1805   1.1    nonaka 		tap->wr_dbm_antsignal = rssi;
   1806   1.1    nonaka 		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
   1807   1.1    nonaka 		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
   1808   1.1    nonaka 
   1809   1.1    nonaka 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
   1810   1.1    nonaka 	}
   1811   1.1    nonaka 
   1812   1.1    nonaka 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
   1813   1.1    nonaka 
   1814   1.1    nonaka 	/* push the frame up to the 802.11 stack */
   1815   1.1    nonaka 	ieee80211_input(ic, m, ni, rssi, 0);
   1816   1.1    nonaka 
   1817   1.1    nonaka 	/* Node is no longer needed. */
   1818   1.1    nonaka 	ieee80211_free_node(ni);
   1819  1.11    nonaka 
   1820  1.11    nonaka 	splx(s);
   1821   1.1    nonaka }
   1822   1.1    nonaka 
   1823   1.1    nonaka static int
   1824   1.1    nonaka rtwn_tx(struct rtwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
   1825   1.1    nonaka {
   1826   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1827   1.1    nonaka 	struct ieee80211_frame *wh;
   1828   1.1    nonaka 	struct ieee80211_key *k = NULL;
   1829   1.1    nonaka 	struct rtwn_tx_ring *tx_ring;
   1830   1.1    nonaka 	struct rtwn_tx_data *data;
   1831   1.1    nonaka 	struct r92c_tx_desc *txd;
   1832   1.1    nonaka 	uint16_t qos, seq;
   1833   1.1    nonaka 	uint8_t raid, type, tid, qid;
   1834   1.1    nonaka 	int hasqos, error;
   1835   1.1    nonaka 
   1836   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   1837   1.1    nonaka 
   1838   1.1    nonaka 	wh = mtod(m, struct ieee80211_frame *);
   1839   1.1    nonaka 	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
   1840   1.1    nonaka 
   1841   1.1    nonaka 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
   1842   1.1    nonaka 		k = ieee80211_crypto_encap(ic, ni, m);
   1843   1.1    nonaka 		if (k == NULL)
   1844   1.1    nonaka 			return ENOBUFS;
   1845   1.1    nonaka 
   1846   1.1    nonaka 		wh = mtod(m, struct ieee80211_frame *);
   1847   1.1    nonaka 	}
   1848   1.1    nonaka 
   1849   1.1    nonaka 	if ((hasqos = ieee80211_has_qos(wh))) {
   1850   1.1    nonaka 		/* data frames in 11n mode */
   1851   1.1    nonaka 		qos = ieee80211_get_qos(wh);
   1852   1.1    nonaka 		tid = qos & IEEE80211_QOS_TID;
   1853   1.1    nonaka 		qid = TID_TO_WME_AC(tid);
   1854   1.1    nonaka 	} else if (type != IEEE80211_FC0_TYPE_DATA) {
   1855   1.1    nonaka 		/* Use AC_VO for management frames. */
   1856   1.1    nonaka 		tid = 0;	/* compiler happy */
   1857   1.1    nonaka 		qid = RTWN_VO_QUEUE;
   1858   1.1    nonaka 	} else {
   1859   1.1    nonaka 		/* non-qos data frames */
   1860   1.1    nonaka 		tid = R92C_TXDW1_QSEL_BE;
   1861   1.1    nonaka 		qid = RTWN_BE_QUEUE;
   1862   1.1    nonaka 	}
   1863   1.1    nonaka 
   1864   1.1    nonaka 	/* Grab a Tx buffer from the ring. */
   1865   1.1    nonaka 	tx_ring = &sc->tx_ring[qid];
   1866   1.1    nonaka 	data = &tx_ring->tx_data[tx_ring->cur];
   1867   1.1    nonaka 	if (data->m != NULL) {
   1868   1.1    nonaka 		m_freem(m);
   1869   1.1    nonaka 		return ENOBUFS;
   1870   1.1    nonaka 	}
   1871   1.1    nonaka 
   1872   1.1    nonaka 	/* Fill Tx descriptor. */
   1873   1.1    nonaka 	txd = &tx_ring->desc[tx_ring->cur];
   1874   1.1    nonaka 	if (htole32(txd->txdw0) & R92C_RXDW0_OWN) {
   1875   1.1    nonaka 		m_freem(m);
   1876   1.1    nonaka 		return ENOBUFS;
   1877   1.1    nonaka 	}
   1878   1.1    nonaka 
   1879   1.1    nonaka 	txd->txdw0 = htole32(
   1880   1.1    nonaka 	    SM(R92C_TXDW0_PKTLEN, m->m_pkthdr.len) |
   1881   1.1    nonaka 	    SM(R92C_TXDW0_OFFSET, sizeof(*txd)) |
   1882   1.1    nonaka 	    R92C_TXDW0_FSG | R92C_TXDW0_LSG);
   1883   1.1    nonaka 	if (IEEE80211_IS_MULTICAST(wh->i_addr1))
   1884   1.1    nonaka 		txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
   1885   1.1    nonaka 
   1886   1.1    nonaka 	txd->txdw1 = 0;
   1887   1.1    nonaka 	txd->txdw4 = 0;
   1888   1.1    nonaka 	txd->txdw5 = 0;
   1889   1.1    nonaka 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
   1890   1.1    nonaka 	    type == IEEE80211_FC0_TYPE_DATA) {
   1891   1.1    nonaka 		if (ic->ic_curmode == IEEE80211_MODE_11B)
   1892   1.1    nonaka 			raid = R92C_RAID_11B;
   1893   1.1    nonaka 		else
   1894   1.1    nonaka 			raid = R92C_RAID_11BG;
   1895   1.1    nonaka 
   1896   1.1    nonaka 		txd->txdw1 |= htole32(
   1897   1.1    nonaka 		    SM(R92C_TXDW1_MACID, RTWN_MACID_BSS) |
   1898   1.1    nonaka 		    SM(R92C_TXDW1_QSEL, tid) |
   1899   1.1    nonaka 		    SM(R92C_TXDW1_RAID, raid) |
   1900   1.1    nonaka 		    R92C_TXDW1_AGGBK);
   1901   1.1    nonaka 
   1902   1.1    nonaka 		if (ic->ic_flags & IEEE80211_F_USEPROT) {
   1903   1.1    nonaka 			/* for 11g */
   1904   1.1    nonaka 			if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) {
   1905   1.1    nonaka 				txd->txdw4 |= htole32(R92C_TXDW4_CTS2SELF |
   1906   1.1    nonaka 				    R92C_TXDW4_HWRTSEN);
   1907   1.1    nonaka 			} else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS) {
   1908   1.1    nonaka 				txd->txdw4 |= htole32(R92C_TXDW4_RTSEN |
   1909   1.1    nonaka 				    R92C_TXDW4_HWRTSEN);
   1910   1.1    nonaka 			}
   1911   1.1    nonaka 		}
   1912   1.1    nonaka 		/* Send RTS at OFDM24. */
   1913   1.1    nonaka 		txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE, 8));
   1914   1.1    nonaka 		txd->txdw5 |= htole32(SM(R92C_TXDW5_RTSRATE_FBLIMIT, 0xf));
   1915   1.1    nonaka 		/* Send data at OFDM54. */
   1916   1.1    nonaka 		txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, 11));
   1917   1.1    nonaka 		txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE_FBLIMIT, 0x1f));
   1918   1.1    nonaka 	} else if (type == IEEE80211_FC0_TYPE_MGT) {
   1919   1.1    nonaka 		txd->txdw1 |= htole32(
   1920   1.1    nonaka 		    SM(R92C_TXDW1_MACID, RTWN_MACID_BSS) |
   1921   1.1    nonaka 		    SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_MGNT) |
   1922   1.1    nonaka 		    SM(R92C_TXDW1_RAID, R92C_RAID_11B));
   1923   1.1    nonaka 
   1924   1.1    nonaka 		/* Force CCK1. */
   1925   1.1    nonaka 		txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
   1926   1.1    nonaka 		/* Use 1Mbps */
   1927   1.1    nonaka 		txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, 0));
   1928   1.1    nonaka 	} else {
   1929   1.1    nonaka 		txd->txdw1 |= htole32(
   1930   1.1    nonaka 		    SM(R92C_TXDW1_MACID, RTWN_MACID_BC) |
   1931   1.1    nonaka 		    SM(R92C_TXDW1_RAID, R92C_RAID_11B));
   1932   1.1    nonaka 
   1933   1.1    nonaka 		/* Force CCK1. */
   1934   1.1    nonaka 		txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
   1935   1.1    nonaka 		/* Use 1Mbps */
   1936   1.1    nonaka 		txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, 0));
   1937   1.1    nonaka 	}
   1938   1.1    nonaka 
   1939   1.1    nonaka 	/* Set sequence number (already little endian). */
   1940   1.1    nonaka 	seq = LE_READ_2(&wh->i_seq[0]) >> IEEE80211_SEQ_SEQ_SHIFT;
   1941   1.1    nonaka 	txd->txdseq = htole16(seq);
   1942   1.1    nonaka 
   1943   1.1    nonaka 	if (!hasqos) {
   1944   1.1    nonaka 		/* Use HW sequence numbering for non-QoS frames. */
   1945   1.1    nonaka 		txd->txdw4  |= htole32(R92C_TXDW4_HWSEQ);
   1946   1.1    nonaka 		txd->txdseq |= htole16(0x8000);		/* WTF? */
   1947   1.1    nonaka 	} else
   1948   1.1    nonaka 		txd->txdw4 |= htole32(R92C_TXDW4_QOS);
   1949   1.1    nonaka 
   1950   1.1    nonaka 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
   1951   1.1    nonaka 	    BUS_DMA_NOWAIT | BUS_DMA_WRITE);
   1952   1.1    nonaka 	if (error && error != EFBIG) {
   1953   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "can't map mbuf (error %d)\n",
   1954   1.1    nonaka 		    error);
   1955   1.1    nonaka 		m_freem(m);
   1956   1.1    nonaka 		return error;
   1957   1.1    nonaka 	}
   1958   1.1    nonaka 	if (error != 0) {
   1959   1.1    nonaka 		/* Too many DMA segments, linearize mbuf. */
   1960  1.12    nonaka 		struct mbuf *newm = m_defrag(m, M_DONTWAIT);
   1961  1.12    nonaka 		if (newm == NULL) {
   1962   1.1    nonaka 			aprint_error_dev(sc->sc_dev, "can't defrag mbuf\n");
   1963  1.12    nonaka 			m_freem(m);
   1964   1.1    nonaka 			return ENOBUFS;
   1965   1.1    nonaka 		}
   1966  1.12    nonaka 		m = newm;
   1967   1.1    nonaka 
   1968   1.1    nonaka 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
   1969   1.1    nonaka 		    BUS_DMA_NOWAIT | BUS_DMA_WRITE);
   1970   1.1    nonaka 		if (error != 0) {
   1971   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
   1972   1.1    nonaka 			    "can't map mbuf (error %d)\n", error);
   1973   1.1    nonaka 			m_freem(m);
   1974   1.1    nonaka 			return error;
   1975   1.1    nonaka 		}
   1976   1.1    nonaka 	}
   1977   1.1    nonaka 
   1978   1.1    nonaka 	txd->txbufaddr = htole32(data->map->dm_segs[0].ds_addr);
   1979   1.1    nonaka 	txd->txbufsize = htole16(m->m_pkthdr.len);
   1980   1.1    nonaka 	bus_space_barrier(sc->sc_st, sc->sc_sh, 0, sc->sc_mapsize,
   1981   1.1    nonaka 	    BUS_SPACE_BARRIER_WRITE);
   1982   1.1    nonaka 	txd->txdw0 |= htole32(R92C_TXDW0_OWN);
   1983   1.1    nonaka 
   1984   1.1    nonaka 	bus_dmamap_sync(sc->sc_dmat, tx_ring->map, 0,
   1985   1.1    nonaka 	    sizeof(*txd) * RTWN_TX_LIST_COUNT, BUS_DMASYNC_PREWRITE);
   1986   1.1    nonaka 	bus_dmamap_sync(sc->sc_dmat, data->map, 0, m->m_pkthdr.len,
   1987   1.1    nonaka 	    BUS_DMASYNC_PREWRITE);
   1988   1.1    nonaka 
   1989   1.1    nonaka 	data->m = m;
   1990   1.1    nonaka 	data->ni = ni;
   1991   1.1    nonaka 
   1992   1.1    nonaka 	if (__predict_false(sc->sc_drvbpf != NULL)) {
   1993   1.1    nonaka 		struct rtwn_tx_radiotap_header *tap = &sc->sc_txtap;
   1994   1.1    nonaka 
   1995   1.1    nonaka 		tap->wt_flags = 0;
   1996   1.1    nonaka 		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
   1997   1.1    nonaka 		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
   1998   1.1    nonaka 		if (wh->i_fc[1] & IEEE80211_FC1_WEP)
   1999   1.1    nonaka 			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
   2000   1.1    nonaka 
   2001   1.1    nonaka 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m);
   2002   1.1    nonaka 	}
   2003   1.1    nonaka 
   2004   1.1    nonaka 	tx_ring->cur = (tx_ring->cur + 1) % RTWN_TX_LIST_COUNT;
   2005   1.1    nonaka 	tx_ring->queued++;
   2006   1.1    nonaka 
   2007  1.10    nonaka 	if (tx_ring->queued > RTWN_TX_LIST_HIMARK)
   2008   1.1    nonaka 		sc->qfullmsk |= (1 << qid);
   2009   1.1    nonaka 
   2010   1.1    nonaka 	/* Kick TX. */
   2011   1.1    nonaka 	rtwn_write_2(sc, R92C_PCIE_CTRL_REG, (1 << qid));
   2012   1.1    nonaka 
   2013   1.1    nonaka 	return 0;
   2014   1.1    nonaka }
   2015   1.1    nonaka 
   2016   1.1    nonaka static void
   2017   1.1    nonaka rtwn_tx_done(struct rtwn_softc *sc, int qid)
   2018   1.1    nonaka {
   2019   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2020   1.1    nonaka 	struct ifnet *ifp = IC2IFP(ic);
   2021   1.1    nonaka 	struct rtwn_tx_ring *tx_ring = &sc->tx_ring[qid];
   2022   1.1    nonaka 	struct rtwn_tx_data *tx_data;
   2023   1.1    nonaka 	struct r92c_tx_desc *tx_desc;
   2024  1.11    nonaka 	int i, s;
   2025   1.1    nonaka 
   2026   1.1    nonaka 	DPRINTFN(3, ("%s: %s: qid=%d\n", device_xname(sc->sc_dev), __func__,
   2027   1.1    nonaka 	    qid));
   2028   1.1    nonaka 
   2029  1.11    nonaka 	s = splnet();
   2030  1.11    nonaka 
   2031   1.1    nonaka 	bus_dmamap_sync(sc->sc_dmat, tx_ring->map,
   2032   1.1    nonaka 	    0, sizeof(*tx_desc) * RTWN_TX_LIST_COUNT,
   2033   1.1    nonaka 	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   2034   1.1    nonaka 
   2035   1.1    nonaka 	for (i = 0; i < RTWN_TX_LIST_COUNT; i++) {
   2036   1.1    nonaka 		tx_data = &tx_ring->tx_data[i];
   2037   1.1    nonaka 		if (tx_data->m == NULL)
   2038   1.1    nonaka 			continue;
   2039   1.1    nonaka 
   2040   1.1    nonaka 		tx_desc = &tx_ring->desc[i];
   2041   1.1    nonaka 		if (le32toh(tx_desc->txdw0) & R92C_TXDW0_OWN)
   2042   1.1    nonaka 			continue;
   2043   1.1    nonaka 
   2044   1.1    nonaka 		bus_dmamap_unload(sc->sc_dmat, tx_data->map);
   2045   1.1    nonaka 		m_freem(tx_data->m);
   2046   1.1    nonaka 		tx_data->m = NULL;
   2047   1.1    nonaka 		ieee80211_free_node(tx_data->ni);
   2048   1.1    nonaka 		tx_data->ni = NULL;
   2049   1.1    nonaka 
   2050   1.1    nonaka 		ifp->if_opackets++;
   2051   1.1    nonaka 		sc->sc_tx_timer = 0;
   2052   1.1    nonaka 		tx_ring->queued--;
   2053   1.1    nonaka 	}
   2054   1.1    nonaka 
   2055  1.10    nonaka 	if (tx_ring->queued < RTWN_TX_LIST_LOMARK)
   2056   1.1    nonaka 		sc->qfullmsk &= ~(1 << qid);
   2057  1.11    nonaka 
   2058  1.11    nonaka 	splx(s);
   2059   1.1    nonaka }
   2060   1.1    nonaka 
   2061   1.1    nonaka static void
   2062   1.1    nonaka rtwn_start(struct ifnet *ifp)
   2063   1.1    nonaka {
   2064   1.1    nonaka 	struct rtwn_softc *sc = ifp->if_softc;
   2065   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2066   1.1    nonaka 	struct ether_header *eh;
   2067   1.1    nonaka 	struct ieee80211_node *ni;
   2068   1.1    nonaka 	struct mbuf *m;
   2069   1.1    nonaka 
   2070   1.1    nonaka 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
   2071   1.1    nonaka 		return;
   2072   1.1    nonaka 
   2073   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2074   1.1    nonaka 
   2075   1.1    nonaka 	for (;;) {
   2076   1.1    nonaka 		if (sc->qfullmsk != 0) {
   2077   1.1    nonaka 			ifp->if_flags |= IFF_OACTIVE;
   2078   1.1    nonaka 			break;
   2079   1.1    nonaka 		}
   2080   1.1    nonaka 		/* Send pending management frames first. */
   2081   1.1    nonaka 		IF_DEQUEUE(&ic->ic_mgtq, m);
   2082   1.1    nonaka 		if (m != NULL) {
   2083   1.6     ozaki 			ni = M_GETCTX(m, struct ieee80211_node *);
   2084   1.7     ozaki 			M_CLEARCTX(m);
   2085   1.1    nonaka 			goto sendit;
   2086   1.1    nonaka 		}
   2087   1.1    nonaka 		if (ic->ic_state != IEEE80211_S_RUN)
   2088   1.1    nonaka 			break;
   2089   1.1    nonaka 
   2090   1.1    nonaka 		/* Encapsulate and send data frames. */
   2091   1.1    nonaka 		IFQ_DEQUEUE(&ifp->if_snd, m);
   2092   1.1    nonaka 		if (m == NULL)
   2093   1.1    nonaka 			break;
   2094   1.1    nonaka 
   2095   1.1    nonaka 		if (m->m_len < (int)sizeof(*eh) &&
   2096   1.1    nonaka 		    (m = m_pullup(m, sizeof(*eh))) == NULL) {
   2097   1.1    nonaka 			ifp->if_oerrors++;
   2098   1.1    nonaka 			continue;
   2099   1.1    nonaka 		}
   2100   1.1    nonaka 		eh = mtod(m, struct ether_header *);
   2101   1.1    nonaka 		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
   2102   1.1    nonaka 		if (ni == NULL) {
   2103   1.1    nonaka 			m_freem(m);
   2104   1.1    nonaka 			ifp->if_oerrors++;
   2105   1.1    nonaka 			continue;
   2106   1.1    nonaka 		}
   2107   1.1    nonaka 
   2108   1.1    nonaka 		bpf_mtap(ifp, m);
   2109   1.1    nonaka 
   2110   1.1    nonaka 		if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
   2111   1.1    nonaka 			ieee80211_free_node(ni);
   2112   1.1    nonaka 			ifp->if_oerrors++;
   2113   1.1    nonaka 			continue;
   2114   1.1    nonaka 		}
   2115   1.1    nonaka sendit:
   2116   1.1    nonaka 		bpf_mtap3(ic->ic_rawbpf, m);
   2117   1.1    nonaka 
   2118   1.1    nonaka 		if (rtwn_tx(sc, m, ni) != 0) {
   2119   1.1    nonaka 			ieee80211_free_node(ni);
   2120   1.1    nonaka 			ifp->if_oerrors++;
   2121   1.1    nonaka 			continue;
   2122   1.1    nonaka 		}
   2123   1.1    nonaka 
   2124   1.1    nonaka 		sc->sc_tx_timer = 5;
   2125   1.1    nonaka 		ifp->if_timer = 1;
   2126   1.1    nonaka 	}
   2127   1.1    nonaka 
   2128   1.1    nonaka 	DPRINTFN(3, ("%s: %s done\n", device_xname(sc->sc_dev), __func__));
   2129   1.1    nonaka }
   2130   1.1    nonaka 
   2131   1.1    nonaka static void
   2132   1.1    nonaka rtwn_watchdog(struct ifnet *ifp)
   2133   1.1    nonaka {
   2134   1.1    nonaka 	struct rtwn_softc *sc = ifp->if_softc;
   2135   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2136   1.1    nonaka 
   2137   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2138   1.1    nonaka 
   2139   1.1    nonaka 	ifp->if_timer = 0;
   2140   1.1    nonaka 
   2141   1.1    nonaka 	if (sc->sc_tx_timer > 0) {
   2142   1.1    nonaka 		if (--sc->sc_tx_timer == 0) {
   2143   1.1    nonaka 			aprint_error_dev(sc->sc_dev, "device timeout\n");
   2144   1.1    nonaka 			softint_schedule(sc->init_task);
   2145   1.1    nonaka 			ifp->if_oerrors++;
   2146   1.1    nonaka 			return;
   2147   1.1    nonaka 		}
   2148   1.1    nonaka 		ifp->if_timer = 1;
   2149   1.1    nonaka 	}
   2150   1.1    nonaka 	ieee80211_watchdog(ic);
   2151   1.1    nonaka }
   2152   1.1    nonaka 
   2153   1.1    nonaka static int
   2154   1.1    nonaka rtwn_ioctl(struct ifnet *ifp, u_long cmd, void *data)
   2155   1.1    nonaka {
   2156   1.1    nonaka 	struct rtwn_softc *sc = ifp->if_softc;
   2157   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2158   1.1    nonaka 	int s, error = 0;
   2159   1.1    nonaka 
   2160   1.1    nonaka 	DPRINTFN(3, ("%s: %s: cmd=0x%08lx, data=%p\n", device_xname(sc->sc_dev),
   2161   1.1    nonaka 	    __func__, cmd, data));
   2162   1.1    nonaka 
   2163   1.1    nonaka 	s = splnet();
   2164   1.1    nonaka 
   2165   1.1    nonaka 	switch (cmd) {
   2166   1.1    nonaka 	case SIOCSIFFLAGS:
   2167   1.1    nonaka 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
   2168   1.1    nonaka 			break;
   2169   1.1    nonaka 		switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) {
   2170   1.1    nonaka 		case IFF_UP | IFF_RUNNING:
   2171   1.1    nonaka 			break;
   2172   1.1    nonaka 		case IFF_UP:
   2173   1.1    nonaka 			error = rtwn_init(ifp);
   2174   1.1    nonaka 			if (error != 0)
   2175   1.1    nonaka 				ifp->if_flags &= ~IFF_UP;
   2176   1.1    nonaka 			break;
   2177   1.1    nonaka 		case IFF_RUNNING:
   2178   1.1    nonaka 			rtwn_stop(ifp, 1);
   2179   1.1    nonaka 			break;
   2180   1.1    nonaka 		case 0:
   2181   1.1    nonaka 			break;
   2182   1.1    nonaka 		}
   2183   1.1    nonaka 		break;
   2184   1.1    nonaka 
   2185   1.1    nonaka 	case SIOCADDMULTI:
   2186   1.1    nonaka 	case SIOCDELMULTI:
   2187   1.1    nonaka 		if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
   2188   1.1    nonaka 			/* setup multicast filter, etc */
   2189   1.1    nonaka 			error = 0;
   2190   1.1    nonaka 		}
   2191   1.1    nonaka 		break;
   2192   1.1    nonaka 
   2193   1.1    nonaka 	case SIOCS80211CHANNEL:
   2194   1.1    nonaka 		error = ieee80211_ioctl(ic, cmd, data);
   2195   1.1    nonaka 		if (error == ENETRESET &&
   2196   1.1    nonaka 		    ic->ic_opmode == IEEE80211_M_MONITOR) {
   2197   1.1    nonaka 			if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
   2198   1.1    nonaka 			    (IFF_UP | IFF_RUNNING)) {
   2199   1.1    nonaka 				rtwn_set_chan(sc, ic->ic_curchan, NULL);
   2200   1.1    nonaka 			}
   2201   1.1    nonaka 			error = 0;
   2202   1.1    nonaka 		}
   2203   1.1    nonaka 		break;
   2204   1.1    nonaka 
   2205   1.1    nonaka 	default:
   2206   1.1    nonaka 		error = ieee80211_ioctl(ic, cmd, data);
   2207   1.1    nonaka 		break;
   2208   1.1    nonaka 	}
   2209   1.1    nonaka 
   2210   1.1    nonaka 	if (error == ENETRESET) {
   2211   1.1    nonaka 		error = 0;
   2212   1.1    nonaka 		if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
   2213   1.1    nonaka 		    (IFF_UP | IFF_RUNNING)) {
   2214   1.1    nonaka 			rtwn_stop(ifp, 0);
   2215   1.1    nonaka 			error = rtwn_init(ifp);
   2216   1.1    nonaka 		}
   2217   1.1    nonaka 	}
   2218   1.1    nonaka 
   2219   1.1    nonaka 	splx(s);
   2220   1.1    nonaka 
   2221   1.1    nonaka 	DPRINTFN(3, ("%s: %s: error=%d\n", device_xname(sc->sc_dev), __func__,
   2222   1.1    nonaka 	    error));
   2223   1.1    nonaka 
   2224   1.1    nonaka 	return error;
   2225   1.1    nonaka }
   2226   1.1    nonaka 
   2227   1.1    nonaka static int
   2228   1.1    nonaka rtwn_power_on(struct rtwn_softc *sc)
   2229   1.1    nonaka {
   2230   1.1    nonaka 	uint32_t reg;
   2231   1.1    nonaka 	int ntries;
   2232   1.1    nonaka 
   2233   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2234   1.1    nonaka 
   2235   1.1    nonaka 	/* Wait for autoload done bit. */
   2236   1.1    nonaka 	for (ntries = 0; ntries < 1000; ntries++) {
   2237   1.1    nonaka 		if (rtwn_read_1(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_PFM_ALDN)
   2238   1.1    nonaka 			break;
   2239   1.1    nonaka 		DELAY(5);
   2240   1.1    nonaka 	}
   2241   1.1    nonaka 	if (ntries == 1000) {
   2242   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2243   1.1    nonaka 		    "timeout waiting for chip autoload\n");
   2244   1.1    nonaka 		return ETIMEDOUT;
   2245   1.1    nonaka 	}
   2246   1.1    nonaka 
   2247   1.1    nonaka 	/* Unlock ISO/CLK/Power control register. */
   2248   1.1    nonaka 	rtwn_write_1(sc, R92C_RSV_CTRL, 0);
   2249   1.1    nonaka 
   2250   1.1    nonaka 	/* TODO: check if we need this for 8188CE */
   2251   1.1    nonaka 	if (sc->board_type != R92C_BOARD_TYPE_DONGLE) {
   2252   1.1    nonaka 		/* bt coex */
   2253   1.1    nonaka 		reg = rtwn_read_4(sc, R92C_APS_FSMCO);
   2254   1.1    nonaka 		reg |= (R92C_APS_FSMCO_SOP_ABG |
   2255   1.1    nonaka 			R92C_APS_FSMCO_SOP_AMB |
   2256   1.1    nonaka 			R92C_APS_FSMCO_XOP_BTCK);
   2257   1.1    nonaka 		rtwn_write_4(sc, R92C_APS_FSMCO, reg);
   2258   1.1    nonaka 	}
   2259   1.1    nonaka 
   2260   1.1    nonaka 	/* Move SPS into PWM mode. */
   2261   1.1    nonaka 	rtwn_write_1(sc, R92C_SPS0_CTRL, 0x2b);
   2262   1.1    nonaka 	DELAY(100);
   2263   1.1    nonaka 
   2264   1.1    nonaka 	/* Set low byte to 0x0f, leave others unchanged. */
   2265   1.1    nonaka 	rtwn_write_4(sc, R92C_AFE_XTAL_CTRL,
   2266   1.1    nonaka 	    (rtwn_read_4(sc, R92C_AFE_XTAL_CTRL) & 0xffffff00) | 0x0f);
   2267   1.1    nonaka 
   2268   1.1    nonaka 	/* TODO: check if we need this for 8188CE */
   2269   1.1    nonaka 	if (sc->board_type != R92C_BOARD_TYPE_DONGLE) {
   2270   1.1    nonaka 		/* bt coex */
   2271   1.1    nonaka 		reg = rtwn_read_4(sc, R92C_AFE_XTAL_CTRL);
   2272   1.1    nonaka 		reg &= ~0x00024800; /* XXX magic from linux */
   2273   1.1    nonaka 		rtwn_write_4(sc, R92C_AFE_XTAL_CTRL, reg);
   2274   1.1    nonaka 	}
   2275   1.1    nonaka 
   2276   1.1    nonaka 	rtwn_write_2(sc, R92C_SYS_ISO_CTRL,
   2277   1.1    nonaka 	  (rtwn_read_2(sc, R92C_SYS_ISO_CTRL) & 0xff) |
   2278   1.1    nonaka 	  R92C_SYS_ISO_CTRL_PWC_EV12V | R92C_SYS_ISO_CTRL_DIOR);
   2279   1.1    nonaka 	DELAY(200);
   2280   1.1    nonaka 
   2281   1.1    nonaka 	/* TODO: linux does additional btcoex stuff here */
   2282   1.1    nonaka 
   2283   1.1    nonaka 	/* Auto enable WLAN. */
   2284   1.1    nonaka 	rtwn_write_2(sc, R92C_APS_FSMCO,
   2285   1.1    nonaka 	    rtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC);
   2286   1.1    nonaka 	for (ntries = 0; ntries < 1000; ntries++) {
   2287   1.1    nonaka 		if (!(rtwn_read_2(sc, R92C_APS_FSMCO) &
   2288   1.1    nonaka 		    R92C_APS_FSMCO_APFM_ONMAC))
   2289   1.1    nonaka 			break;
   2290   1.1    nonaka 		DELAY(5);
   2291   1.1    nonaka 	}
   2292   1.1    nonaka 	if (ntries == 1000) {
   2293   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2294   1.1    nonaka 		    "timeout waiting for MAC auto ON\n");
   2295   1.1    nonaka 		return ETIMEDOUT;
   2296   1.1    nonaka 	}
   2297   1.1    nonaka 
   2298   1.1    nonaka 	/* Enable radio, GPIO and LED functions. */
   2299   1.1    nonaka 	rtwn_write_2(sc, R92C_APS_FSMCO,
   2300   1.1    nonaka 	    R92C_APS_FSMCO_AFSM_PCIE |
   2301   1.1    nonaka 	    R92C_APS_FSMCO_PDN_EN |
   2302   1.1    nonaka 	    R92C_APS_FSMCO_PFM_ALDN);
   2303   1.1    nonaka 
   2304   1.1    nonaka 	/* Release RF digital isolation. */
   2305   1.1    nonaka 	rtwn_write_2(sc, R92C_SYS_ISO_CTRL,
   2306   1.1    nonaka 	    rtwn_read_2(sc, R92C_SYS_ISO_CTRL) & ~R92C_SYS_ISO_CTRL_DIOR);
   2307   1.1    nonaka 
   2308   1.1    nonaka 	if (sc->chip & RTWN_CHIP_92C)
   2309   1.1    nonaka 		rtwn_write_1(sc, R92C_PCIE_CTRL_REG + 3, 0x77);
   2310   1.1    nonaka 	else
   2311   1.1    nonaka 		rtwn_write_1(sc, R92C_PCIE_CTRL_REG + 3, 0x22);
   2312   1.1    nonaka 
   2313   1.1    nonaka 	rtwn_write_4(sc, R92C_INT_MIG, 0);
   2314   1.1    nonaka 
   2315   1.1    nonaka 	if (sc->board_type != R92C_BOARD_TYPE_DONGLE) {
   2316   1.1    nonaka 		/* bt coex */
   2317   1.1    nonaka 		reg = rtwn_read_4(sc, R92C_AFE_XTAL_CTRL + 2);
   2318   1.1    nonaka 		reg &= 0xfd; /* XXX magic from linux */
   2319   1.1    nonaka 		rtwn_write_4(sc, R92C_AFE_XTAL_CTRL + 2, reg);
   2320   1.1    nonaka 	}
   2321   1.1    nonaka 
   2322   1.1    nonaka 	rtwn_write_1(sc, R92C_GPIO_MUXCFG,
   2323   1.1    nonaka 	    rtwn_read_1(sc, R92C_GPIO_MUXCFG) & ~R92C_GPIO_MUXCFG_RFKILL);
   2324   1.1    nonaka 
   2325   1.1    nonaka 	reg = rtwn_read_1(sc, R92C_GPIO_IO_SEL);
   2326   1.1    nonaka 	if (!(reg & R92C_GPIO_IO_SEL_RFKILL)) {
   2327   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2328   1.1    nonaka 		    "radio is disabled by hardware switch\n");
   2329   1.1    nonaka 		return EPERM;	/* :-) */
   2330   1.1    nonaka 	}
   2331   1.1    nonaka 
   2332   1.1    nonaka 	/* Initialize MAC. */
   2333   1.1    nonaka 	reg = rtwn_read_1(sc, R92C_APSD_CTRL);
   2334   1.1    nonaka 	rtwn_write_1(sc, R92C_APSD_CTRL,
   2335   1.1    nonaka 	    rtwn_read_1(sc, R92C_APSD_CTRL) & ~R92C_APSD_CTRL_OFF);
   2336   1.1    nonaka 	for (ntries = 0; ntries < 200; ntries++) {
   2337   1.1    nonaka 		if (!(rtwn_read_1(sc, R92C_APSD_CTRL) &
   2338   1.1    nonaka 		    R92C_APSD_CTRL_OFF_STATUS))
   2339   1.1    nonaka 			break;
   2340   1.1    nonaka 		DELAY(500);
   2341   1.1    nonaka 	}
   2342   1.1    nonaka 	if (ntries == 200) {
   2343   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2344   1.1    nonaka 		    "timeout waiting for MAC initialization\n");
   2345   1.1    nonaka 		return ETIMEDOUT;
   2346   1.1    nonaka 	}
   2347   1.1    nonaka 
   2348   1.1    nonaka 	/* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */
   2349   1.1    nonaka 	reg = rtwn_read_2(sc, R92C_CR);
   2350   1.1    nonaka 	reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
   2351   1.1    nonaka 	    R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN |
   2352   1.1    nonaka 	    R92C_CR_SCHEDULE_EN | R92C_CR_MACTXEN | R92C_CR_MACRXEN |
   2353   1.1    nonaka 	    R92C_CR_ENSEC;
   2354   1.1    nonaka 	rtwn_write_2(sc, R92C_CR, reg);
   2355   1.1    nonaka 
   2356   1.1    nonaka 	rtwn_write_1(sc, 0xfe10, 0x19);
   2357   1.1    nonaka 
   2358   1.1    nonaka 	return 0;
   2359   1.1    nonaka }
   2360   1.1    nonaka 
   2361   1.1    nonaka static int
   2362   1.1    nonaka rtwn_llt_init(struct rtwn_softc *sc)
   2363   1.1    nonaka {
   2364   1.1    nonaka 	int i, error;
   2365   1.1    nonaka 
   2366   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2367   1.1    nonaka 
   2368   1.1    nonaka 	/* Reserve pages [0; R92C_TX_PAGE_COUNT]. */
   2369   1.1    nonaka 	for (i = 0; i < R92C_TX_PAGE_COUNT; i++) {
   2370   1.1    nonaka 		if ((error = rtwn_llt_write(sc, i, i + 1)) != 0)
   2371   1.1    nonaka 			return error;
   2372   1.1    nonaka 	}
   2373   1.1    nonaka 	/* NB: 0xff indicates end-of-list. */
   2374   1.1    nonaka 	if ((error = rtwn_llt_write(sc, i, 0xff)) != 0)
   2375   1.1    nonaka 		return error;
   2376   1.1    nonaka 	/*
   2377   1.1    nonaka 	 * Use pages [R92C_TX_PAGE_COUNT + 1; R92C_TXPKTBUF_COUNT - 1]
   2378   1.1    nonaka 	 * as ring buffer.
   2379   1.1    nonaka 	 */
   2380   1.1    nonaka 	for (++i; i < R92C_TXPKTBUF_COUNT - 1; i++) {
   2381   1.1    nonaka 		if ((error = rtwn_llt_write(sc, i, i + 1)) != 0)
   2382   1.1    nonaka 			return error;
   2383   1.1    nonaka 	}
   2384   1.1    nonaka 	/* Make the last page point to the beginning of the ring buffer. */
   2385   1.1    nonaka 	error = rtwn_llt_write(sc, i, R92C_TX_PAGE_COUNT + 1);
   2386   1.1    nonaka 	return error;
   2387   1.1    nonaka }
   2388   1.1    nonaka 
   2389   1.1    nonaka static void
   2390   1.1    nonaka rtwn_fw_reset(struct rtwn_softc *sc)
   2391   1.1    nonaka {
   2392   1.1    nonaka 	uint16_t reg;
   2393   1.1    nonaka 	int ntries;
   2394   1.1    nonaka 
   2395   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2396   1.1    nonaka 
   2397   1.1    nonaka 	/* Tell 8051 to reset itself. */
   2398   1.1    nonaka 	rtwn_write_1(sc, R92C_HMETFR + 3, 0x20);
   2399   1.1    nonaka 
   2400   1.1    nonaka 	/* Wait until 8051 resets by itself. */
   2401   1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   2402   1.1    nonaka 		reg = rtwn_read_2(sc, R92C_SYS_FUNC_EN);
   2403   1.1    nonaka 		if (!(reg & R92C_SYS_FUNC_EN_CPUEN))
   2404   1.1    nonaka 			goto sleep;
   2405   1.1    nonaka 		DELAY(50);
   2406   1.1    nonaka 	}
   2407   1.1    nonaka 	/* Force 8051 reset. */
   2408   1.1    nonaka 	rtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN);
   2409   1.1    nonaka sleep:
   2410   1.1    nonaka 	CLR(sc->sc_flags, RTWN_FLAG_FW_LOADED);
   2411   1.1    nonaka #if 0
   2412   1.1    nonaka 	/*
   2413   1.1    nonaka 	 * We must sleep for one second to let the firmware settle.
   2414   1.1    nonaka 	 * Accessing registers too early will hang the whole system.
   2415   1.1    nonaka 	 */
   2416   1.1    nonaka 	tsleep(&reg, 0, "rtwnrst", hz);
   2417   1.1    nonaka #else
   2418   1.1    nonaka 	DELAY(1000 * 1000);
   2419   1.1    nonaka #endif
   2420   1.1    nonaka }
   2421   1.1    nonaka 
   2422   1.1    nonaka static int
   2423   1.1    nonaka rtwn_fw_loadpage(struct rtwn_softc *sc, int page, uint8_t *buf, int len)
   2424   1.1    nonaka {
   2425   1.1    nonaka 	uint32_t reg;
   2426   1.1    nonaka 	int off, mlen, error = 0, i;
   2427   1.1    nonaka 
   2428   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2429   1.1    nonaka 
   2430   1.1    nonaka 	reg = rtwn_read_4(sc, R92C_MCUFWDL);
   2431   1.1    nonaka 	reg = RW(reg, R92C_MCUFWDL_PAGE, page);
   2432   1.1    nonaka 	rtwn_write_4(sc, R92C_MCUFWDL, reg);
   2433   1.1    nonaka 
   2434   1.1    nonaka 	DELAY(5);
   2435   1.1    nonaka 
   2436   1.1    nonaka 	off = R92C_FW_START_ADDR;
   2437   1.1    nonaka 	while (len > 0) {
   2438   1.1    nonaka 		if (len > 196)
   2439   1.1    nonaka 			mlen = 196;
   2440   1.1    nonaka 		else if (len > 4)
   2441   1.1    nonaka 			mlen = 4;
   2442   1.1    nonaka 		else
   2443   1.1    nonaka 			mlen = 1;
   2444   1.1    nonaka 		for (i = 0; i < mlen; i++)
   2445   1.1    nonaka 			rtwn_write_1(sc, off++, buf[i]);
   2446   1.1    nonaka 		buf += mlen;
   2447   1.1    nonaka 		len -= mlen;
   2448   1.1    nonaka 	}
   2449   1.1    nonaka 
   2450   1.1    nonaka 	return error;
   2451   1.1    nonaka }
   2452   1.1    nonaka 
   2453   1.1    nonaka static int
   2454   1.1    nonaka rtwn_load_firmware(struct rtwn_softc *sc)
   2455   1.1    nonaka {
   2456   1.1    nonaka 	firmware_handle_t fwh;
   2457   1.1    nonaka 	const struct r92c_fw_hdr *hdr;
   2458   1.1    nonaka 	const char *name;
   2459   1.1    nonaka 	u_char *fw, *ptr;
   2460   1.1    nonaka 	size_t len;
   2461   1.1    nonaka 	uint32_t reg;
   2462   1.1    nonaka 	int mlen, ntries, page, error;
   2463   1.1    nonaka 
   2464   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2465   1.1    nonaka 
   2466   1.1    nonaka 	/* Read firmware image from the filesystem. */
   2467   1.1    nonaka 	if ((sc->chip & (RTWN_CHIP_UMC_A_CUT | RTWN_CHIP_92C)) ==
   2468   1.1    nonaka 	    RTWN_CHIP_UMC_A_CUT)
   2469   1.1    nonaka 		name = "rtl8192cfwU.bin";
   2470   1.1    nonaka 	else if (sc->chip & RTWN_CHIP_UMC_B_CUT)
   2471   1.1    nonaka 		name = "rtl8192cfwU_B.bin";
   2472   1.1    nonaka 	else
   2473   1.1    nonaka 		name = "rtl8192cfw.bin";
   2474   1.1    nonaka 	DPRINTF(("%s: firmware: %s\n", device_xname(sc->sc_dev), name));
   2475   1.1    nonaka 	if ((error = firmware_open("if_rtwn", name, &fwh)) != 0) {
   2476   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2477   1.1    nonaka 		    "could not read firmware %s (error %d)\n", name, error);
   2478   1.1    nonaka 		return error;
   2479   1.1    nonaka 	}
   2480   1.1    nonaka 	const size_t fwlen = len = firmware_get_size(fwh);
   2481   1.1    nonaka 	fw = firmware_malloc(len);
   2482   1.1    nonaka 	if (fw == NULL) {
   2483   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2484   1.1    nonaka 		    "failed to allocate firmware memory (size=%zu)\n", len);
   2485   1.1    nonaka 		firmware_close(fwh);
   2486   1.1    nonaka 		return ENOMEM;
   2487   1.1    nonaka 	}
   2488   1.1    nonaka 	error = firmware_read(fwh, 0, fw, len);
   2489   1.1    nonaka 	firmware_close(fwh);
   2490   1.1    nonaka 	if (error != 0) {
   2491   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2492   1.1    nonaka 		    "failed to read firmware (error %d)\n", error);
   2493   1.1    nonaka 		firmware_free(fw, fwlen);
   2494   1.1    nonaka 		return error;
   2495   1.1    nonaka 	}
   2496   1.1    nonaka 
   2497   1.1    nonaka 	if (len < sizeof(*hdr)) {
   2498   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "firmware too short\n");
   2499   1.1    nonaka 		error = EINVAL;
   2500   1.1    nonaka 		goto fail;
   2501   1.1    nonaka 	}
   2502   1.1    nonaka 	ptr = fw;
   2503   1.1    nonaka 	hdr = (const struct r92c_fw_hdr *)ptr;
   2504   1.1    nonaka 	/* Check if there is a valid FW header and skip it. */
   2505   1.1    nonaka 	if ((le16toh(hdr->signature) >> 4) == 0x88c ||
   2506   1.1    nonaka 	    (le16toh(hdr->signature) >> 4) == 0x92c) {
   2507   1.1    nonaka 		DPRINTF(("FW V%d.%d %02d-%02d %02d:%02d\n",
   2508   1.1    nonaka 		    le16toh(hdr->version), le16toh(hdr->subversion),
   2509   1.1    nonaka 		    hdr->month, hdr->date, hdr->hour, hdr->minute));
   2510   1.1    nonaka 		ptr += sizeof(*hdr);
   2511   1.1    nonaka 		len -= sizeof(*hdr);
   2512   1.1    nonaka 	}
   2513   1.1    nonaka 
   2514   1.1    nonaka 	if (rtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RAM_DL_SEL)
   2515   1.1    nonaka 		rtwn_fw_reset(sc);
   2516   1.1    nonaka 
   2517   1.1    nonaka 	/* Enable FW download. */
   2518   1.1    nonaka 	rtwn_write_2(sc, R92C_SYS_FUNC_EN,
   2519   1.1    nonaka 	    rtwn_read_2(sc, R92C_SYS_FUNC_EN) |
   2520   1.1    nonaka 	    R92C_SYS_FUNC_EN_CPUEN);
   2521   1.1    nonaka 	rtwn_write_1(sc, R92C_MCUFWDL,
   2522   1.1    nonaka 	    rtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_EN);
   2523   1.1    nonaka 	rtwn_write_1(sc, R92C_MCUFWDL + 2,
   2524   1.1    nonaka 	    rtwn_read_1(sc, R92C_MCUFWDL + 2) & ~0x08);
   2525   1.1    nonaka 
   2526   1.1    nonaka 	/* Reset the FWDL checksum. */
   2527   1.1    nonaka 	rtwn_write_1(sc, R92C_MCUFWDL,
   2528   1.1    nonaka 	    rtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_CHKSUM_RPT);
   2529   1.1    nonaka 
   2530   1.1    nonaka 	/* download firmware */
   2531   1.1    nonaka 	for (page = 0; len > 0; page++) {
   2532   1.1    nonaka 		mlen = MIN(len, R92C_FW_PAGE_SIZE);
   2533   1.1    nonaka 		error = rtwn_fw_loadpage(sc, page, ptr, mlen);
   2534   1.1    nonaka 		if (error != 0) {
   2535   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
   2536   1.1    nonaka 			    "could not load firmware page %d\n", page);
   2537   1.1    nonaka 			goto fail;
   2538   1.1    nonaka 		}
   2539   1.1    nonaka 		ptr += mlen;
   2540   1.1    nonaka 		len -= mlen;
   2541   1.1    nonaka 	}
   2542   1.1    nonaka 
   2543   1.1    nonaka 	/* Disable FW download. */
   2544   1.1    nonaka 	rtwn_write_1(sc, R92C_MCUFWDL,
   2545   1.1    nonaka 	    rtwn_read_1(sc, R92C_MCUFWDL) & ~R92C_MCUFWDL_EN);
   2546   1.1    nonaka 	rtwn_write_1(sc, R92C_MCUFWDL + 1, 0);
   2547   1.1    nonaka 
   2548   1.1    nonaka 	/* Wait for checksum report. */
   2549   1.1    nonaka 	for (ntries = 0; ntries < 1000; ntries++) {
   2550   1.1    nonaka 		if (rtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_CHKSUM_RPT)
   2551   1.1    nonaka 			break;
   2552   1.1    nonaka 		DELAY(5);
   2553   1.1    nonaka 	}
   2554   1.1    nonaka 	if (ntries == 1000) {
   2555   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2556   1.1    nonaka 		    "timeout waiting for checksum report\n");
   2557   1.1    nonaka 		error = ETIMEDOUT;
   2558   1.1    nonaka 		goto fail;
   2559   1.1    nonaka 	}
   2560   1.1    nonaka 
   2561   1.1    nonaka 	reg = rtwn_read_4(sc, R92C_MCUFWDL);
   2562   1.1    nonaka 	reg = (reg & ~R92C_MCUFWDL_WINTINI_RDY) | R92C_MCUFWDL_RDY;
   2563   1.1    nonaka 	rtwn_write_4(sc, R92C_MCUFWDL, reg);
   2564   1.1    nonaka 
   2565   1.1    nonaka 	/* Wait for firmware readiness. */
   2566   1.1    nonaka 	for (ntries = 0; ntries < 1000; ntries++) {
   2567   1.1    nonaka 		if (rtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_WINTINI_RDY)
   2568   1.1    nonaka 			break;
   2569   1.1    nonaka 		DELAY(5);
   2570   1.1    nonaka 	}
   2571   1.1    nonaka 	if (ntries == 1000) {
   2572   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   2573   1.1    nonaka 		    "timeout waiting for firmware readiness\n");
   2574   1.1    nonaka 		error = ETIMEDOUT;
   2575   1.1    nonaka 		goto fail;
   2576   1.1    nonaka 	}
   2577   1.1    nonaka 	SET(sc->sc_flags, RTWN_FLAG_FW_LOADED);
   2578   1.1    nonaka 
   2579   1.1    nonaka  fail:
   2580   1.1    nonaka 	firmware_free(fw, fwlen);
   2581   1.1    nonaka 	return error;
   2582   1.1    nonaka }
   2583   1.1    nonaka 
   2584   1.1    nonaka static int
   2585   1.1    nonaka rtwn_dma_init(struct rtwn_softc *sc)
   2586   1.1    nonaka {
   2587   1.1    nonaka 	uint32_t reg;
   2588   1.1    nonaka 	int error;
   2589   1.1    nonaka 
   2590   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2591   1.1    nonaka 
   2592   1.1    nonaka 	/* Initialize LLT table. */
   2593   1.1    nonaka 	error = rtwn_llt_init(sc);
   2594   1.1    nonaka 	if (error != 0)
   2595   1.1    nonaka 		return error;
   2596   1.1    nonaka 
   2597   1.1    nonaka 	/* Set number of pages for normal priority queue. */
   2598   1.1    nonaka 	rtwn_write_2(sc, R92C_RQPN_NPQ, 0);
   2599   1.1    nonaka 	rtwn_write_4(sc, R92C_RQPN,
   2600   1.1    nonaka 	    /* Set number of pages for public queue. */
   2601   1.1    nonaka 	    SM(R92C_RQPN_PUBQ, R92C_PUBQ_NPAGES) |
   2602   1.1    nonaka 	    /* Set number of pages for high priority queue. */
   2603   1.1    nonaka 	    SM(R92C_RQPN_HPQ, R92C_HPQ_NPAGES) |
   2604   1.1    nonaka 	    /* Set number of pages for low priority queue. */
   2605   1.1    nonaka 	    SM(R92C_RQPN_LPQ, R92C_LPQ_NPAGES) |
   2606   1.1    nonaka 	    /* Load values. */
   2607   1.1    nonaka 	    R92C_RQPN_LD);
   2608   1.1    nonaka 
   2609   1.1    nonaka 	rtwn_write_1(sc, R92C_TXPKTBUF_BCNQ_BDNY, R92C_TX_PAGE_BOUNDARY);
   2610   1.1    nonaka 	rtwn_write_1(sc, R92C_TXPKTBUF_MGQ_BDNY, R92C_TX_PAGE_BOUNDARY);
   2611   1.1    nonaka 	rtwn_write_1(sc, R92C_TXPKTBUF_WMAC_LBK_BF_HD, R92C_TX_PAGE_BOUNDARY);
   2612   1.1    nonaka 	rtwn_write_1(sc, R92C_TRXFF_BNDY, R92C_TX_PAGE_BOUNDARY);
   2613   1.1    nonaka 	rtwn_write_1(sc, R92C_TDECTRL + 1, R92C_TX_PAGE_BOUNDARY);
   2614   1.1    nonaka 
   2615   1.1    nonaka 	reg = rtwn_read_2(sc, R92C_TRXDMA_CTRL);
   2616   1.1    nonaka 	reg &= ~R92C_TRXDMA_CTRL_QMAP_M;
   2617   1.1    nonaka 	reg |= 0xF771;
   2618   1.1    nonaka 	rtwn_write_2(sc, R92C_TRXDMA_CTRL, reg);
   2619   1.1    nonaka 
   2620   1.1    nonaka 	rtwn_write_4(sc, R92C_TCR, R92C_TCR_CFENDFORM | (1 << 12) | (1 << 13));
   2621   1.1    nonaka 
   2622   1.1    nonaka 	/* Configure Tx DMA. */
   2623   1.1    nonaka 	rtwn_write_4(sc, R92C_BKQ_DESA,
   2624   1.1    nonaka 		sc->tx_ring[RTWN_BK_QUEUE].map->dm_segs[0].ds_addr);
   2625   1.1    nonaka 	rtwn_write_4(sc, R92C_BEQ_DESA,
   2626   1.1    nonaka 		sc->tx_ring[RTWN_BE_QUEUE].map->dm_segs[0].ds_addr);
   2627   1.1    nonaka 	rtwn_write_4(sc, R92C_VIQ_DESA,
   2628   1.1    nonaka 		sc->tx_ring[RTWN_VI_QUEUE].map->dm_segs[0].ds_addr);
   2629   1.1    nonaka 	rtwn_write_4(sc, R92C_VOQ_DESA,
   2630   1.1    nonaka 		sc->tx_ring[RTWN_VO_QUEUE].map->dm_segs[0].ds_addr);
   2631   1.1    nonaka 	rtwn_write_4(sc, R92C_BCNQ_DESA,
   2632   1.1    nonaka 		sc->tx_ring[RTWN_BEACON_QUEUE].map->dm_segs[0].ds_addr);
   2633   1.1    nonaka 	rtwn_write_4(sc, R92C_MGQ_DESA,
   2634   1.1    nonaka 		sc->tx_ring[RTWN_MGNT_QUEUE].map->dm_segs[0].ds_addr);
   2635   1.1    nonaka 	rtwn_write_4(sc, R92C_HQ_DESA,
   2636   1.1    nonaka 		sc->tx_ring[RTWN_HIGH_QUEUE].map->dm_segs[0].ds_addr);
   2637   1.1    nonaka 
   2638   1.1    nonaka 	/* Configure Rx DMA. */
   2639   1.1    nonaka 	rtwn_write_4(sc, R92C_RX_DESA, sc->rx_ring.map->dm_segs[0].ds_addr);
   2640   1.1    nonaka 
   2641   1.1    nonaka 	/* Set Tx/Rx transfer page boundary. */
   2642   1.1    nonaka 	rtwn_write_2(sc, R92C_TRXFF_BNDY + 2, 0x27ff);
   2643   1.1    nonaka 
   2644   1.1    nonaka 	/* Set Tx/Rx transfer page size. */
   2645   1.1    nonaka 	rtwn_write_1(sc, R92C_PBP,
   2646   1.1    nonaka 	    SM(R92C_PBP_PSRX, R92C_PBP_128) |
   2647   1.1    nonaka 	    SM(R92C_PBP_PSTX, R92C_PBP_128));
   2648   1.1    nonaka 	return 0;
   2649   1.1    nonaka }
   2650   1.1    nonaka 
   2651   1.1    nonaka static void
   2652   1.1    nonaka rtwn_mac_init(struct rtwn_softc *sc)
   2653   1.1    nonaka {
   2654   1.1    nonaka 	int i;
   2655   1.1    nonaka 
   2656   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2657   1.1    nonaka 
   2658   1.1    nonaka 	/* Write MAC initialization values. */
   2659   1.1    nonaka 	for (i = 0; i < __arraycount(rtl8192ce_mac); i++)
   2660   1.1    nonaka 		rtwn_write_1(sc, rtl8192ce_mac[i].reg, rtl8192ce_mac[i].val);
   2661   1.1    nonaka }
   2662   1.1    nonaka 
   2663   1.1    nonaka static void
   2664   1.1    nonaka rtwn_bb_init(struct rtwn_softc *sc)
   2665   1.1    nonaka {
   2666   1.1    nonaka 	const struct rtwn_bb_prog *prog;
   2667   1.1    nonaka 	uint32_t reg;
   2668   1.1    nonaka 	int i;
   2669   1.1    nonaka 
   2670   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2671   1.1    nonaka 
   2672   1.1    nonaka 	/* Enable BB and RF. */
   2673   1.1    nonaka 	rtwn_write_2(sc, R92C_SYS_FUNC_EN,
   2674   1.1    nonaka 	    rtwn_read_2(sc, R92C_SYS_FUNC_EN) |
   2675   1.1    nonaka 	    R92C_SYS_FUNC_EN_BBRSTB | R92C_SYS_FUNC_EN_BB_GLB_RST |
   2676   1.1    nonaka 	    R92C_SYS_FUNC_EN_DIO_RF);
   2677   1.1    nonaka 
   2678   1.1    nonaka 	rtwn_write_2(sc, R92C_AFE_PLL_CTRL, 0xdb83);
   2679   1.1    nonaka 
   2680   1.1    nonaka 	rtwn_write_1(sc, R92C_RF_CTRL,
   2681   1.1    nonaka 	    R92C_RF_CTRL_EN | R92C_RF_CTRL_RSTB | R92C_RF_CTRL_SDMRSTB);
   2682   1.1    nonaka 
   2683   1.1    nonaka 	rtwn_write_1(sc, R92C_SYS_FUNC_EN,
   2684   1.1    nonaka 	    R92C_SYS_FUNC_EN_DIO_PCIE | R92C_SYS_FUNC_EN_PCIEA |
   2685   1.1    nonaka 	    R92C_SYS_FUNC_EN_PPLL | R92C_SYS_FUNC_EN_BB_GLB_RST |
   2686   1.1    nonaka 	    R92C_SYS_FUNC_EN_BBRSTB);
   2687   1.1    nonaka 
   2688   1.1    nonaka 	rtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 1, 0x80);
   2689   1.1    nonaka 
   2690   1.1    nonaka 	rtwn_write_4(sc, R92C_LEDCFG0,
   2691   1.1    nonaka 	    rtwn_read_4(sc, R92C_LEDCFG0) | 0x00800000);
   2692   1.1    nonaka 
   2693   1.1    nonaka 	/* Select BB programming. */
   2694   1.1    nonaka 	prog = (sc->chip & RTWN_CHIP_92C) ?
   2695   1.1    nonaka 	    &rtl8192ce_bb_prog_2t : &rtl8192ce_bb_prog_1t;
   2696   1.1    nonaka 
   2697   1.1    nonaka 	/* Write BB initialization values. */
   2698   1.1    nonaka 	for (i = 0; i < prog->count; i++) {
   2699   1.1    nonaka 		rtwn_bb_write(sc, prog->regs[i], prog->vals[i]);
   2700   1.1    nonaka 		DELAY(1);
   2701   1.1    nonaka 	}
   2702   1.1    nonaka 
   2703   1.1    nonaka 	if (sc->chip & RTWN_CHIP_92C_1T2R) {
   2704   1.1    nonaka 		/* 8192C 1T only configuration. */
   2705   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_FPGA0_TXINFO);
   2706   1.1    nonaka 		reg = (reg & ~0x00000003) | 0x2;
   2707   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_TXINFO, reg);
   2708   1.1    nonaka 
   2709   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_FPGA1_TXINFO);
   2710   1.1    nonaka 		reg = (reg & ~0x00300033) | 0x00200022;
   2711   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA1_TXINFO, reg);
   2712   1.1    nonaka 
   2713   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_CCK0_AFESETTING);
   2714   1.1    nonaka 		reg = (reg & ~0xff000000) | 0x45 << 24;
   2715   1.1    nonaka 		rtwn_bb_write(sc, R92C_CCK0_AFESETTING, reg);
   2716   1.1    nonaka 
   2717   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_OFDM0_TRXPATHENA);
   2718   1.1    nonaka 		reg = (reg & ~0x000000ff) | 0x23;
   2719   1.1    nonaka 		rtwn_bb_write(sc, R92C_OFDM0_TRXPATHENA, reg);
   2720   1.1    nonaka 
   2721   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_OFDM0_AGCPARAM1);
   2722   1.1    nonaka 		reg = (reg & ~0x00000030) | 1 << 4;
   2723   1.1    nonaka 		rtwn_bb_write(sc, R92C_OFDM0_AGCPARAM1, reg);
   2724   1.1    nonaka 
   2725   1.1    nonaka 		reg = rtwn_bb_read(sc, 0xe74);
   2726   1.1    nonaka 		reg = (reg & ~0x0c000000) | 2 << 26;
   2727   1.1    nonaka 		rtwn_bb_write(sc, 0xe74, reg);
   2728   1.1    nonaka 		reg = rtwn_bb_read(sc, 0xe78);
   2729   1.1    nonaka 		reg = (reg & ~0x0c000000) | 2 << 26;
   2730   1.1    nonaka 		rtwn_bb_write(sc, 0xe78, reg);
   2731   1.1    nonaka 		reg = rtwn_bb_read(sc, 0xe7c);
   2732   1.1    nonaka 		reg = (reg & ~0x0c000000) | 2 << 26;
   2733   1.1    nonaka 		rtwn_bb_write(sc, 0xe7c, reg);
   2734   1.1    nonaka 		reg = rtwn_bb_read(sc, 0xe80);
   2735   1.1    nonaka 		reg = (reg & ~0x0c000000) | 2 << 26;
   2736   1.1    nonaka 		rtwn_bb_write(sc, 0xe80, reg);
   2737   1.1    nonaka 		reg = rtwn_bb_read(sc, 0xe88);
   2738   1.1    nonaka 		reg = (reg & ~0x0c000000) | 2 << 26;
   2739   1.1    nonaka 		rtwn_bb_write(sc, 0xe88, reg);
   2740   1.1    nonaka 	}
   2741   1.1    nonaka 
   2742   1.1    nonaka 	/* Write AGC values. */
   2743   1.1    nonaka 	for (i = 0; i < prog->agccount; i++) {
   2744   1.1    nonaka 		rtwn_bb_write(sc, R92C_OFDM0_AGCRSSITABLE,
   2745   1.1    nonaka 		    prog->agcvals[i]);
   2746   1.1    nonaka 		DELAY(1);
   2747   1.1    nonaka 	}
   2748   1.1    nonaka 
   2749   1.1    nonaka 	if (rtwn_bb_read(sc, R92C_HSSI_PARAM2(0)) &
   2750   1.1    nonaka 	    R92C_HSSI_PARAM2_CCK_HIPWR)
   2751   1.1    nonaka 		sc->sc_flags |= RTWN_FLAG_CCK_HIPWR;
   2752   1.1    nonaka }
   2753   1.1    nonaka 
   2754   1.1    nonaka static void
   2755   1.1    nonaka rtwn_rf_init(struct rtwn_softc *sc)
   2756   1.1    nonaka {
   2757   1.1    nonaka 	const struct rtwn_rf_prog *prog;
   2758   1.1    nonaka 	uint32_t reg, type;
   2759   1.1    nonaka 	int i, j, idx, off;
   2760   1.1    nonaka 
   2761   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2762   1.1    nonaka 
   2763   1.1    nonaka 	/* Select RF programming based on board type. */
   2764   1.1    nonaka 	if (!(sc->chip & RTWN_CHIP_92C)) {
   2765   1.1    nonaka 		if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
   2766   1.1    nonaka 			prog = rtl8188ce_rf_prog;
   2767   1.1    nonaka 		else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
   2768   1.1    nonaka 			prog = rtl8188ru_rf_prog;
   2769   1.1    nonaka 		else
   2770   1.1    nonaka 			prog = rtl8188cu_rf_prog;
   2771   1.1    nonaka 	} else
   2772   1.1    nonaka 		prog = rtl8192ce_rf_prog;
   2773   1.1    nonaka 
   2774   1.1    nonaka 	for (i = 0; i < sc->nrxchains; i++) {
   2775   1.1    nonaka 		/* Save RF_ENV control type. */
   2776   1.1    nonaka 		idx = i / 2;
   2777   1.1    nonaka 		off = (i % 2) * 16;
   2778   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx));
   2779   1.1    nonaka 		type = (reg >> off) & 0x10;
   2780   1.1    nonaka 
   2781   1.1    nonaka 		/* Set RF_ENV enable. */
   2782   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i));
   2783   1.1    nonaka 		reg |= 0x100000;
   2784   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg);
   2785   1.1    nonaka 		DELAY(1);
   2786   1.1    nonaka 		/* Set RF_ENV output high. */
   2787   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i));
   2788   1.1    nonaka 		reg |= 0x10;
   2789   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg);
   2790   1.1    nonaka 		DELAY(1);
   2791   1.1    nonaka 		/* Set address and data lengths of RF registers. */
   2792   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_HSSI_PARAM2(i));
   2793   1.1    nonaka 		reg &= ~R92C_HSSI_PARAM2_ADDR_LENGTH;
   2794   1.1    nonaka 		rtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg);
   2795   1.1    nonaka 		DELAY(1);
   2796   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_HSSI_PARAM2(i));
   2797   1.1    nonaka 		reg &= ~R92C_HSSI_PARAM2_DATA_LENGTH;
   2798   1.1    nonaka 		rtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg);
   2799   1.1    nonaka 		DELAY(1);
   2800   1.1    nonaka 
   2801   1.1    nonaka 		/* Write RF initialization values for this chain. */
   2802   1.1    nonaka 		for (j = 0; j < prog[i].count; j++) {
   2803   1.1    nonaka 			if (prog[i].regs[j] >= 0xf9 &&
   2804   1.1    nonaka 			    prog[i].regs[j] <= 0xfe) {
   2805   1.1    nonaka 				/*
   2806   1.1    nonaka 				 * These are fake RF registers offsets that
   2807   1.1    nonaka 				 * indicate a delay is required.
   2808   1.1    nonaka 				 */
   2809   1.1    nonaka 				DELAY(50);
   2810   1.1    nonaka 				continue;
   2811   1.1    nonaka 			}
   2812   1.1    nonaka 			rtwn_rf_write(sc, i, prog[i].regs[j],
   2813   1.1    nonaka 			    prog[i].vals[j]);
   2814   1.1    nonaka 			DELAY(1);
   2815   1.1    nonaka 		}
   2816   1.1    nonaka 
   2817   1.1    nonaka 		/* Restore RF_ENV control type. */
   2818   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx));
   2819   1.1    nonaka 		reg &= ~(0x10 << off) | (type << off);
   2820   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_RFIFACESW(idx), reg);
   2821   1.1    nonaka 
   2822   1.1    nonaka 		/* Cache RF register CHNLBW. */
   2823   1.1    nonaka 		sc->rf_chnlbw[i] = rtwn_rf_read(sc, i, R92C_RF_CHNLBW);
   2824   1.1    nonaka 	}
   2825   1.1    nonaka 
   2826   1.1    nonaka 	if ((sc->chip & (RTWN_CHIP_UMC_A_CUT | RTWN_CHIP_92C)) ==
   2827   1.1    nonaka 	    RTWN_CHIP_UMC_A_CUT) {
   2828   1.1    nonaka 		rtwn_rf_write(sc, 0, R92C_RF_RX_G1, 0x30255);
   2829   1.1    nonaka 		rtwn_rf_write(sc, 0, R92C_RF_RX_G2, 0x50a00);
   2830   1.1    nonaka 	}
   2831   1.1    nonaka }
   2832   1.1    nonaka 
   2833   1.1    nonaka static void
   2834   1.1    nonaka rtwn_cam_init(struct rtwn_softc *sc)
   2835   1.1    nonaka {
   2836   1.1    nonaka 
   2837   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2838   1.1    nonaka 
   2839   1.1    nonaka 	/* Invalidate all CAM entries. */
   2840   1.1    nonaka 	rtwn_write_4(sc, R92C_CAMCMD, R92C_CAMCMD_POLLING | R92C_CAMCMD_CLR);
   2841   1.1    nonaka }
   2842   1.1    nonaka 
   2843   1.1    nonaka static void
   2844   1.1    nonaka rtwn_pa_bias_init(struct rtwn_softc *sc)
   2845   1.1    nonaka {
   2846   1.1    nonaka 	uint8_t reg;
   2847   1.1    nonaka 	int i;
   2848   1.1    nonaka 
   2849   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2850   1.1    nonaka 
   2851   1.1    nonaka 	for (i = 0; i < sc->nrxchains; i++) {
   2852   1.1    nonaka 		if (sc->pa_setting & (1 << i))
   2853   1.1    nonaka 			continue;
   2854   1.1    nonaka 		rtwn_rf_write(sc, i, R92C_RF_IPA, 0x0f406);
   2855   1.1    nonaka 		rtwn_rf_write(sc, i, R92C_RF_IPA, 0x4f406);
   2856   1.1    nonaka 		rtwn_rf_write(sc, i, R92C_RF_IPA, 0x8f406);
   2857   1.1    nonaka 		rtwn_rf_write(sc, i, R92C_RF_IPA, 0xcf406);
   2858   1.1    nonaka 	}
   2859   1.1    nonaka 	if (!(sc->pa_setting & 0x10)) {
   2860   1.1    nonaka 		reg = rtwn_read_1(sc, 0x16);
   2861   1.1    nonaka 		reg = (reg & ~0xf0) | 0x90;
   2862   1.1    nonaka 		rtwn_write_1(sc, 0x16, reg);
   2863   1.1    nonaka 	}
   2864   1.1    nonaka }
   2865   1.1    nonaka 
   2866   1.1    nonaka static void
   2867   1.1    nonaka rtwn_rxfilter_init(struct rtwn_softc *sc)
   2868   1.1    nonaka {
   2869   1.1    nonaka 
   2870   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2871   1.1    nonaka 
   2872   1.1    nonaka 	/* Initialize Rx filter. */
   2873   1.1    nonaka 	/* TODO: use better filter for monitor mode. */
   2874   1.1    nonaka 	rtwn_write_4(sc, R92C_RCR,
   2875   1.1    nonaka 	    R92C_RCR_AAP | R92C_RCR_APM | R92C_RCR_AM | R92C_RCR_AB |
   2876   1.1    nonaka 	    R92C_RCR_APP_ICV | R92C_RCR_AMF | R92C_RCR_HTC_LOC_CTRL |
   2877   1.1    nonaka 	    R92C_RCR_APP_MIC | R92C_RCR_APP_PHYSTS);
   2878   1.1    nonaka 	/* Accept all multicast frames. */
   2879   1.1    nonaka 	rtwn_write_4(sc, R92C_MAR + 0, 0xffffffff);
   2880   1.1    nonaka 	rtwn_write_4(sc, R92C_MAR + 4, 0xffffffff);
   2881   1.1    nonaka 	/* Accept all management frames. */
   2882   1.1    nonaka 	rtwn_write_2(sc, R92C_RXFLTMAP0, 0xffff);
   2883   1.1    nonaka 	/* Reject all control frames. */
   2884   1.1    nonaka 	rtwn_write_2(sc, R92C_RXFLTMAP1, 0x0000);
   2885   1.1    nonaka 	/* Accept all data frames. */
   2886   1.1    nonaka 	rtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
   2887   1.1    nonaka }
   2888   1.1    nonaka 
   2889   1.1    nonaka static void
   2890   1.1    nonaka rtwn_edca_init(struct rtwn_softc *sc)
   2891   1.1    nonaka {
   2892   1.1    nonaka 
   2893   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2894   1.1    nonaka 
   2895   1.1    nonaka 	/* set spec SIFS (used in NAV) */
   2896   1.1    nonaka 	rtwn_write_2(sc, R92C_SPEC_SIFS, 0x1010);
   2897   1.1    nonaka 	rtwn_write_2(sc, R92C_MAC_SPEC_SIFS, 0x1010);
   2898   1.1    nonaka 
   2899   1.1    nonaka 	/* set SIFS CCK/OFDM */
   2900   1.1    nonaka 	rtwn_write_2(sc, R92C_SIFS_CCK, 0x1010);
   2901   1.1    nonaka 	rtwn_write_2(sc, R92C_SIFS_OFDM, 0x0e0e);
   2902   1.1    nonaka 
   2903   1.1    nonaka 	/* TXOP */
   2904   1.1    nonaka 	rtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x005ea42b);
   2905   1.1    nonaka 	rtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a44f);
   2906   1.1    nonaka 	rtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005e4322);
   2907   1.1    nonaka 	rtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002f3222);
   2908   1.1    nonaka }
   2909   1.1    nonaka 
   2910   1.1    nonaka static void
   2911   1.1    nonaka rtwn_write_txpower(struct rtwn_softc *sc, int chain,
   2912   1.1    nonaka     uint16_t power[RTWN_RIDX_COUNT])
   2913   1.1    nonaka {
   2914   1.1    nonaka 	uint32_t reg;
   2915   1.1    nonaka 
   2916   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2917   1.1    nonaka 
   2918   1.1    nonaka 	/* Write per-CCK rate Tx power. */
   2919   1.1    nonaka 	if (chain == 0) {
   2920   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_TXAGC_A_CCK1_MCS32);
   2921   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_A_CCK1,  power[0]);
   2922   1.1    nonaka 		rtwn_bb_write(sc, R92C_TXAGC_A_CCK1_MCS32, reg);
   2923   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11);
   2924   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_A_CCK2,  power[1]);
   2925   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_A_CCK55, power[2]);
   2926   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_A_CCK11, power[3]);
   2927   1.1    nonaka 		rtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg);
   2928   1.1    nonaka 	} else {
   2929   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_TXAGC_B_CCK1_55_MCS32);
   2930   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_B_CCK1,  power[0]);
   2931   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_B_CCK2,  power[1]);
   2932   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_B_CCK55, power[2]);
   2933   1.1    nonaka 		rtwn_bb_write(sc, R92C_TXAGC_B_CCK1_55_MCS32, reg);
   2934   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11);
   2935   1.1    nonaka 		reg = RW(reg, R92C_TXAGC_B_CCK11, power[3]);
   2936   1.1    nonaka 		rtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg);
   2937   1.1    nonaka 	}
   2938   1.1    nonaka 	/* Write per-OFDM rate Tx power. */
   2939   1.1    nonaka 	rtwn_bb_write(sc, R92C_TXAGC_RATE18_06(chain),
   2940   1.1    nonaka 	    SM(R92C_TXAGC_RATE06, power[ 4]) |
   2941   1.1    nonaka 	    SM(R92C_TXAGC_RATE09, power[ 5]) |
   2942   1.1    nonaka 	    SM(R92C_TXAGC_RATE12, power[ 6]) |
   2943   1.1    nonaka 	    SM(R92C_TXAGC_RATE18, power[ 7]));
   2944   1.1    nonaka 	rtwn_bb_write(sc, R92C_TXAGC_RATE54_24(chain),
   2945   1.1    nonaka 	    SM(R92C_TXAGC_RATE24, power[ 8]) |
   2946   1.1    nonaka 	    SM(R92C_TXAGC_RATE36, power[ 9]) |
   2947   1.1    nonaka 	    SM(R92C_TXAGC_RATE48, power[10]) |
   2948   1.1    nonaka 	    SM(R92C_TXAGC_RATE54, power[11]));
   2949   1.1    nonaka 	/* Write per-MCS Tx power. */
   2950   1.1    nonaka 	rtwn_bb_write(sc, R92C_TXAGC_MCS03_MCS00(chain),
   2951   1.1    nonaka 	    SM(R92C_TXAGC_MCS00,  power[12]) |
   2952   1.1    nonaka 	    SM(R92C_TXAGC_MCS01,  power[13]) |
   2953   1.1    nonaka 	    SM(R92C_TXAGC_MCS02,  power[14]) |
   2954   1.1    nonaka 	    SM(R92C_TXAGC_MCS03,  power[15]));
   2955   1.1    nonaka 	rtwn_bb_write(sc, R92C_TXAGC_MCS07_MCS04(chain),
   2956   1.1    nonaka 	    SM(R92C_TXAGC_MCS04,  power[16]) |
   2957   1.1    nonaka 	    SM(R92C_TXAGC_MCS05,  power[17]) |
   2958   1.1    nonaka 	    SM(R92C_TXAGC_MCS06,  power[18]) |
   2959   1.1    nonaka 	    SM(R92C_TXAGC_MCS07,  power[19]));
   2960   1.1    nonaka 	rtwn_bb_write(sc, R92C_TXAGC_MCS11_MCS08(chain),
   2961   1.1    nonaka 	    SM(R92C_TXAGC_MCS08,  power[20]) |
   2962   1.1    nonaka 	    SM(R92C_TXAGC_MCS09,  power[21]) |
   2963   1.1    nonaka 	    SM(R92C_TXAGC_MCS10,  power[22]) |
   2964   1.1    nonaka 	    SM(R92C_TXAGC_MCS11,  power[23]));
   2965   1.1    nonaka 	rtwn_bb_write(sc, R92C_TXAGC_MCS15_MCS12(chain),
   2966   1.1    nonaka 	    SM(R92C_TXAGC_MCS12,  power[24]) |
   2967   1.1    nonaka 	    SM(R92C_TXAGC_MCS13,  power[25]) |
   2968   1.1    nonaka 	    SM(R92C_TXAGC_MCS14,  power[26]) |
   2969   1.1    nonaka 	    SM(R92C_TXAGC_MCS15,  power[27]));
   2970   1.1    nonaka }
   2971   1.1    nonaka 
   2972   1.1    nonaka static void
   2973   1.1    nonaka rtwn_get_txpower(struct rtwn_softc *sc, int chain,
   2974   1.1    nonaka     struct ieee80211_channel *c, struct ieee80211_channel *extc,
   2975   1.1    nonaka     uint16_t power[RTWN_RIDX_COUNT])
   2976   1.1    nonaka {
   2977   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2978   1.1    nonaka 	struct r92c_rom *rom = &sc->rom;
   2979   1.3  riastrad 	uint16_t cckpow, ofdmpow, htpow, diff, maxpwr;
   2980   1.1    nonaka 	const struct rtwn_txpwr *base;
   2981   1.1    nonaka 	int ridx, chan, group;
   2982   1.1    nonaka 
   2983   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   2984   1.1    nonaka 
   2985   1.1    nonaka 	/* Determine channel group. */
   2986   1.1    nonaka 	chan = ieee80211_chan2ieee(ic, c);	/* XXX center freq! */
   2987   1.1    nonaka 	if (chan <= 3)
   2988   1.1    nonaka 		group = 0;
   2989   1.1    nonaka 	else if (chan <= 9)
   2990   1.1    nonaka 		group = 1;
   2991   1.1    nonaka 	else
   2992   1.1    nonaka 		group = 2;
   2993   1.1    nonaka 
   2994   1.1    nonaka 	/* Get original Tx power based on board type and RF chain. */
   2995   1.1    nonaka 	if (!(sc->chip & RTWN_CHIP_92C)) {
   2996   1.1    nonaka 		if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
   2997   1.1    nonaka 			base = &rtl8188ru_txagc[chain];
   2998   1.1    nonaka 		else
   2999   1.1    nonaka 			base = &rtl8192cu_txagc[chain];
   3000   1.1    nonaka 	} else
   3001   1.1    nonaka 		base = &rtl8192cu_txagc[chain];
   3002   1.1    nonaka 
   3003   1.1    nonaka 	memset(power, 0, RTWN_RIDX_COUNT * sizeof(power[0]));
   3004   1.1    nonaka 	if (sc->regulatory == 0) {
   3005   1.1    nonaka 		for (ridx = 0; ridx <= 3; ridx++)
   3006   1.1    nonaka 			power[ridx] = base->pwr[0][ridx];
   3007   1.1    nonaka 	}
   3008   1.1    nonaka 	for (ridx = 4; ridx < RTWN_RIDX_COUNT; ridx++) {
   3009   1.1    nonaka 		if (sc->regulatory == 3) {
   3010   1.1    nonaka 			power[ridx] = base->pwr[0][ridx];
   3011   1.1    nonaka 			/* Apply vendor limits. */
   3012   1.1    nonaka 			if (extc != NULL)
   3013   1.3  riastrad 				maxpwr = rom->ht40_max_pwr[group];
   3014   1.1    nonaka 			else
   3015   1.3  riastrad 				maxpwr = rom->ht20_max_pwr[group];
   3016   1.4  riastrad 			maxpwr = (maxpwr >> (chain * 4)) & 0xf;
   3017   1.3  riastrad 			if (power[ridx] > maxpwr)
   3018   1.3  riastrad 				power[ridx] = maxpwr;
   3019   1.1    nonaka 		} else if (sc->regulatory == 1) {
   3020   1.1    nonaka 			if (extc == NULL)
   3021   1.1    nonaka 				power[ridx] = base->pwr[group][ridx];
   3022   1.1    nonaka 		} else if (sc->regulatory != 2)
   3023   1.1    nonaka 			power[ridx] = base->pwr[0][ridx];
   3024   1.1    nonaka 	}
   3025   1.1    nonaka 
   3026   1.1    nonaka 	/* Compute per-CCK rate Tx power. */
   3027   1.1    nonaka 	cckpow = rom->cck_tx_pwr[chain][group];
   3028   1.1    nonaka 	for (ridx = 0; ridx <= 3; ridx++) {
   3029   1.1    nonaka 		power[ridx] += cckpow;
   3030   1.1    nonaka 		if (power[ridx] > R92C_MAX_TX_PWR)
   3031   1.1    nonaka 			power[ridx] = R92C_MAX_TX_PWR;
   3032   1.1    nonaka 	}
   3033   1.1    nonaka 
   3034   1.1    nonaka 	htpow = rom->ht40_1s_tx_pwr[chain][group];
   3035   1.1    nonaka 	if (sc->ntxchains > 1) {
   3036   1.1    nonaka 		/* Apply reduction for 2 spatial streams. */
   3037   1.1    nonaka 		diff = rom->ht40_2s_tx_pwr_diff[group];
   3038   1.1    nonaka 		diff = (diff >> (chain * 4)) & 0xf;
   3039   1.1    nonaka 		htpow = (htpow > diff) ? htpow - diff : 0;
   3040   1.1    nonaka 	}
   3041   1.1    nonaka 
   3042   1.1    nonaka 	/* Compute per-OFDM rate Tx power. */
   3043   1.1    nonaka 	diff = rom->ofdm_tx_pwr_diff[group];
   3044   1.1    nonaka 	diff = (diff >> (chain * 4)) & 0xf;
   3045   1.1    nonaka 	ofdmpow = htpow + diff;	/* HT->OFDM correction. */
   3046   1.1    nonaka 	for (ridx = 4; ridx <= 11; ridx++) {
   3047   1.1    nonaka 		power[ridx] += ofdmpow;
   3048   1.1    nonaka 		if (power[ridx] > R92C_MAX_TX_PWR)
   3049   1.1    nonaka 			power[ridx] = R92C_MAX_TX_PWR;
   3050   1.1    nonaka 	}
   3051   1.1    nonaka 
   3052   1.1    nonaka 	/* Compute per-MCS Tx power. */
   3053   1.1    nonaka 	if (extc == NULL) {
   3054   1.1    nonaka 		diff = rom->ht20_tx_pwr_diff[group];
   3055   1.1    nonaka 		diff = (diff >> (chain * 4)) & 0xf;
   3056   1.1    nonaka 		htpow += diff;	/* HT40->HT20 correction. */
   3057   1.1    nonaka 	}
   3058   1.1    nonaka 	for (ridx = 12; ridx <= 27; ridx++) {
   3059   1.1    nonaka 		power[ridx] += htpow;
   3060   1.1    nonaka 		if (power[ridx] > R92C_MAX_TX_PWR)
   3061   1.1    nonaka 			power[ridx] = R92C_MAX_TX_PWR;
   3062   1.1    nonaka 	}
   3063   1.1    nonaka #ifdef RTWN_DEBUG
   3064   1.1    nonaka 	if (rtwn_debug >= 4) {
   3065   1.1    nonaka 		/* Dump per-rate Tx power values. */
   3066   1.1    nonaka 		printf("Tx power for chain %d:\n", chain);
   3067   1.1    nonaka 		for (ridx = 0; ridx < RTWN_RIDX_COUNT; ridx++)
   3068   1.1    nonaka 			printf("Rate %d = %u\n", ridx, power[ridx]);
   3069   1.1    nonaka 	}
   3070   1.1    nonaka #endif
   3071   1.1    nonaka }
   3072   1.1    nonaka 
   3073   1.1    nonaka static void
   3074   1.1    nonaka rtwn_set_txpower(struct rtwn_softc *sc, struct ieee80211_channel *c,
   3075   1.1    nonaka     struct ieee80211_channel *extc)
   3076   1.1    nonaka {
   3077   1.1    nonaka 	uint16_t power[RTWN_RIDX_COUNT];
   3078   1.1    nonaka 	int i;
   3079   1.1    nonaka 
   3080   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3081   1.1    nonaka 
   3082   1.1    nonaka 	for (i = 0; i < sc->ntxchains; i++) {
   3083   1.1    nonaka 		/* Compute per-rate Tx power values. */
   3084   1.1    nonaka 		rtwn_get_txpower(sc, i, c, extc, power);
   3085   1.1    nonaka 		/* Write per-rate Tx power values to hardware. */
   3086   1.1    nonaka 		rtwn_write_txpower(sc, i, power);
   3087   1.1    nonaka 	}
   3088   1.1    nonaka }
   3089   1.1    nonaka 
   3090   1.1    nonaka static void
   3091   1.1    nonaka rtwn_set_chan(struct rtwn_softc *sc, struct ieee80211_channel *c,
   3092   1.1    nonaka     struct ieee80211_channel *extc)
   3093   1.1    nonaka {
   3094   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3095   1.1    nonaka 	u_int chan;
   3096   1.1    nonaka 	int i;
   3097   1.1    nonaka 
   3098   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3099   1.1    nonaka 
   3100   1.1    nonaka 	chan = ieee80211_chan2ieee(ic, c);	/* XXX center freq! */
   3101   1.1    nonaka 
   3102   1.1    nonaka 	/* Set Tx power for this new channel. */
   3103   1.1    nonaka 	rtwn_set_txpower(sc, c, extc);
   3104   1.1    nonaka 
   3105   1.1    nonaka 	for (i = 0; i < sc->nrxchains; i++) {
   3106   1.1    nonaka 		rtwn_rf_write(sc, i, R92C_RF_CHNLBW,
   3107   1.1    nonaka 		    RW(sc->rf_chnlbw[i], R92C_RF_CHNLBW_CHNL, chan));
   3108   1.1    nonaka 	}
   3109   1.1    nonaka #ifndef IEEE80211_NO_HT
   3110   1.1    nonaka 	if (extc != NULL) {
   3111   1.1    nonaka 		uint32_t reg;
   3112   1.1    nonaka 
   3113   1.1    nonaka 		/* Is secondary channel below or above primary? */
   3114   1.1    nonaka 		int prichlo = c->ic_freq < extc->ic_freq;
   3115   1.1    nonaka 
   3116   1.1    nonaka 		rtwn_write_1(sc, R92C_BWOPMODE,
   3117   1.1    nonaka 		    rtwn_read_1(sc, R92C_BWOPMODE) & ~R92C_BWOPMODE_20MHZ);
   3118   1.1    nonaka 
   3119   1.1    nonaka 		reg = rtwn_read_1(sc, R92C_RRSR + 2);
   3120   1.1    nonaka 		reg = (reg & ~0x6f) | (prichlo ? 1 : 2) << 5;
   3121   1.1    nonaka 		rtwn_write_1(sc, R92C_RRSR + 2, reg);
   3122   1.1    nonaka 
   3123   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_RFMOD,
   3124   1.1    nonaka 		    rtwn_bb_read(sc, R92C_FPGA0_RFMOD) | R92C_RFMOD_40MHZ);
   3125   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA1_RFMOD,
   3126   1.1    nonaka 		    rtwn_bb_read(sc, R92C_FPGA1_RFMOD) | R92C_RFMOD_40MHZ);
   3127   1.1    nonaka 
   3128   1.1    nonaka 		/* Set CCK side band. */
   3129   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_CCK0_SYSTEM);
   3130   1.1    nonaka 		reg = (reg & ~0x00000010) | (prichlo ? 0 : 1) << 4;
   3131   1.1    nonaka 		rtwn_bb_write(sc, R92C_CCK0_SYSTEM, reg);
   3132   1.1    nonaka 
   3133   1.1    nonaka 		reg = rtwn_bb_read(sc, R92C_OFDM1_LSTF);
   3134   1.1    nonaka 		reg = (reg & ~0x00000c00) | (prichlo ? 1 : 2) << 10;
   3135   1.1    nonaka 		rtwn_bb_write(sc, R92C_OFDM1_LSTF, reg);
   3136   1.1    nonaka 
   3137   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2,
   3138   1.1    nonaka 		    rtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) &
   3139   1.1    nonaka 		    ~R92C_FPGA0_ANAPARAM2_CBW20);
   3140   1.1    nonaka 
   3141   1.1    nonaka 		reg = rtwn_bb_read(sc, 0x818);
   3142   1.1    nonaka 		reg = (reg & ~0x0c000000) | (prichlo ? 2 : 1) << 26;
   3143   1.1    nonaka 		rtwn_bb_write(sc, 0x818, reg);
   3144   1.1    nonaka 
   3145   1.1    nonaka 		/* Select 40MHz bandwidth. */
   3146   1.1    nonaka 		rtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
   3147   1.1    nonaka 		    (sc->rf_chnlbw[0] & ~0xfff) | chan);
   3148   1.1    nonaka 	} else
   3149   1.1    nonaka #endif
   3150   1.1    nonaka 	{
   3151   1.1    nonaka 		rtwn_write_1(sc, R92C_BWOPMODE,
   3152   1.1    nonaka 		    rtwn_read_1(sc, R92C_BWOPMODE) | R92C_BWOPMODE_20MHZ);
   3153   1.1    nonaka 
   3154   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_RFMOD,
   3155   1.1    nonaka 		    rtwn_bb_read(sc, R92C_FPGA0_RFMOD) & ~R92C_RFMOD_40MHZ);
   3156   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA1_RFMOD,
   3157   1.1    nonaka 		    rtwn_bb_read(sc, R92C_FPGA1_RFMOD) & ~R92C_RFMOD_40MHZ);
   3158   1.1    nonaka 
   3159   1.1    nonaka 		rtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2,
   3160   1.1    nonaka 		    rtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) |
   3161   1.1    nonaka 		    R92C_FPGA0_ANAPARAM2_CBW20);
   3162   1.1    nonaka 
   3163   1.1    nonaka 		/* Select 20MHz bandwidth. */
   3164   1.1    nonaka 		rtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
   3165   1.1    nonaka 		    (sc->rf_chnlbw[0] & ~0xfff) | R92C_RF_CHNLBW_BW20 | chan);
   3166   1.1    nonaka 	}
   3167   1.1    nonaka }
   3168   1.1    nonaka 
   3169   1.1    nonaka static void
   3170   1.1    nonaka rtwn_iq_calib(struct rtwn_softc *sc)
   3171   1.1    nonaka {
   3172   1.1    nonaka 
   3173   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3174   1.1    nonaka 
   3175   1.1    nonaka 	/* XXX */
   3176   1.1    nonaka }
   3177   1.1    nonaka 
   3178   1.1    nonaka static void
   3179   1.1    nonaka rtwn_lc_calib(struct rtwn_softc *sc)
   3180   1.1    nonaka {
   3181   1.1    nonaka 	uint32_t rf_ac[2];
   3182   1.1    nonaka 	uint8_t txmode;
   3183   1.1    nonaka 	int i;
   3184   1.1    nonaka 
   3185   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3186   1.1    nonaka 
   3187   1.1    nonaka 	txmode = rtwn_read_1(sc, R92C_OFDM1_LSTF + 3);
   3188   1.1    nonaka 	if ((txmode & 0x70) != 0) {
   3189   1.1    nonaka 		/* Disable all continuous Tx. */
   3190   1.1    nonaka 		rtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode & ~0x70);
   3191   1.1    nonaka 
   3192   1.1    nonaka 		/* Set RF mode to standby mode. */
   3193   1.1    nonaka 		for (i = 0; i < sc->nrxchains; i++) {
   3194   1.1    nonaka 			rf_ac[i] = rtwn_rf_read(sc, i, R92C_RF_AC);
   3195   1.1    nonaka 			rtwn_rf_write(sc, i, R92C_RF_AC,
   3196   1.1    nonaka 			    RW(rf_ac[i], R92C_RF_AC_MODE,
   3197   1.1    nonaka 				R92C_RF_AC_MODE_STANDBY));
   3198   1.1    nonaka 		}
   3199   1.1    nonaka 	} else {
   3200   1.1    nonaka 		/* Block all Tx queues. */
   3201   1.1    nonaka 		rtwn_write_1(sc, R92C_TXPAUSE, 0xff);
   3202   1.1    nonaka 	}
   3203   1.1    nonaka 	/* Start calibration. */
   3204   1.1    nonaka 	rtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
   3205   1.1    nonaka 	    rtwn_rf_read(sc, 0, R92C_RF_CHNLBW) | R92C_RF_CHNLBW_LCSTART);
   3206   1.1    nonaka 
   3207   1.1    nonaka 	/* Give calibration the time to complete. */
   3208   1.1    nonaka 	DELAY(100);
   3209   1.1    nonaka 
   3210   1.1    nonaka 	/* Restore configuration. */
   3211   1.1    nonaka 	if ((txmode & 0x70) != 0) {
   3212   1.1    nonaka 		/* Restore Tx mode. */
   3213   1.1    nonaka 		rtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode);
   3214   1.1    nonaka 		/* Restore RF mode. */
   3215   1.1    nonaka 		for (i = 0; i < sc->nrxchains; i++)
   3216   1.1    nonaka 			rtwn_rf_write(sc, i, R92C_RF_AC, rf_ac[i]);
   3217   1.1    nonaka 	} else {
   3218   1.1    nonaka 		/* Unblock all Tx queues. */
   3219   1.1    nonaka 		rtwn_write_1(sc, R92C_TXPAUSE, 0x00);
   3220   1.1    nonaka 	}
   3221   1.1    nonaka }
   3222   1.1    nonaka 
   3223   1.1    nonaka static void
   3224   1.1    nonaka rtwn_temp_calib(struct rtwn_softc *sc)
   3225   1.1    nonaka {
   3226   1.1    nonaka 	int temp;
   3227   1.1    nonaka 
   3228   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3229   1.1    nonaka 
   3230   1.1    nonaka 	if (sc->thcal_state == 0) {
   3231   1.1    nonaka 		/* Start measuring temperature. */
   3232   1.1    nonaka 		rtwn_rf_write(sc, 0, R92C_RF_T_METER, 0x60);
   3233   1.1    nonaka 		sc->thcal_state = 1;
   3234   1.1    nonaka 		return;
   3235   1.1    nonaka 	}
   3236   1.1    nonaka 	sc->thcal_state = 0;
   3237   1.1    nonaka 
   3238   1.1    nonaka 	/* Read measured temperature. */
   3239   1.1    nonaka 	temp = rtwn_rf_read(sc, 0, R92C_RF_T_METER) & 0x1f;
   3240   1.1    nonaka 	if (temp == 0)	/* Read failed, skip. */
   3241   1.1    nonaka 		return;
   3242   1.1    nonaka 	DPRINTFN(2, ("temperature=%d\n", temp));
   3243   1.1    nonaka 
   3244   1.1    nonaka 	/*
   3245   1.1    nonaka 	 * Redo IQ and LC calibration if temperature changed significantly
   3246   1.1    nonaka 	 * since last calibration.
   3247   1.1    nonaka 	 */
   3248   1.1    nonaka 	if (sc->thcal_lctemp == 0) {
   3249   1.1    nonaka 		/* First calibration is performed in rtwn_init(). */
   3250   1.1    nonaka 		sc->thcal_lctemp = temp;
   3251   1.1    nonaka 	} else if (abs(temp - sc->thcal_lctemp) > 1) {
   3252   1.1    nonaka 		DPRINTF(("IQ/LC calib triggered by temp: %d -> %d\n",
   3253   1.1    nonaka  		    sc->thcal_lctemp, temp));
   3254   1.1    nonaka 		rtwn_iq_calib(sc);
   3255   1.1    nonaka 		rtwn_lc_calib(sc);
   3256   1.1    nonaka 		/* Record temperature of last calibration. */
   3257   1.1    nonaka 		sc->thcal_lctemp = temp;
   3258   1.1    nonaka 	}
   3259   1.1    nonaka }
   3260   1.1    nonaka 
   3261   1.1    nonaka static int
   3262   1.1    nonaka rtwn_init(struct ifnet *ifp)
   3263   1.1    nonaka {
   3264   1.1    nonaka 	struct rtwn_softc *sc = ifp->if_softc;
   3265   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3266   1.1    nonaka 	uint32_t reg;
   3267   1.1    nonaka 	int i, error;
   3268   1.1    nonaka 
   3269   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3270   1.1    nonaka 
   3271   1.1    nonaka 	/* Init firmware commands ring. */
   3272   1.1    nonaka 	sc->fwcur = 0;
   3273   1.1    nonaka 
   3274   1.1    nonaka 	/* Power on adapter. */
   3275   1.1    nonaka 	error = rtwn_power_on(sc);
   3276   1.1    nonaka 	if (error != 0) {
   3277   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not power on adapter\n");
   3278   1.1    nonaka 		goto fail;
   3279   1.1    nonaka 	}
   3280   1.1    nonaka 
   3281   1.1    nonaka 	/* Initialize DMA. */
   3282   1.1    nonaka 	error = rtwn_dma_init(sc);
   3283   1.1    nonaka 	if (error != 0) {
   3284   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not initialize DMA\n");
   3285   1.1    nonaka 		goto fail;
   3286   1.1    nonaka 	}
   3287   1.1    nonaka 
   3288   1.1    nonaka 	/* Set info size in Rx descriptors (in 64-bit words). */
   3289   1.1    nonaka 	rtwn_write_1(sc, R92C_RX_DRVINFO_SZ, 4);
   3290   1.1    nonaka 
   3291   1.1    nonaka 	/* Disable interrupts. */
   3292   1.1    nonaka 	rtwn_write_4(sc, R92C_HISR, 0xffffffff);
   3293   1.1    nonaka 	rtwn_write_4(sc, R92C_HIMR, 0x00000000);
   3294   1.1    nonaka 
   3295   1.1    nonaka 	/* Set MAC address. */
   3296   1.1    nonaka 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
   3297   1.1    nonaka 	for (i = 0; i < IEEE80211_ADDR_LEN; i++)
   3298   1.1    nonaka 		rtwn_write_1(sc, R92C_MACID + i, ic->ic_myaddr[i]);
   3299   1.1    nonaka 
   3300   1.1    nonaka 	/* Set initial network type. */
   3301   1.1    nonaka 	rtwn_set_nettype0_msr(sc, rtwn_get_nettype(sc));
   3302   1.1    nonaka 
   3303   1.1    nonaka 	rtwn_rxfilter_init(sc);
   3304   1.1    nonaka 
   3305   1.1    nonaka 	reg = rtwn_read_4(sc, R92C_RRSR);
   3306   1.1    nonaka 	reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_ALL);
   3307   1.1    nonaka 	rtwn_write_4(sc, R92C_RRSR, reg);
   3308   1.1    nonaka 
   3309   1.1    nonaka 	/* Set short/long retry limits. */
   3310   1.1    nonaka 	rtwn_write_2(sc, R92C_RL,
   3311   1.1    nonaka 	    SM(R92C_RL_SRL, 0x07) | SM(R92C_RL_LRL, 0x07));
   3312   1.1    nonaka 
   3313   1.1    nonaka 	/* Initialize EDCA parameters. */
   3314   1.1    nonaka 	rtwn_edca_init(sc);
   3315   1.1    nonaka 
   3316   1.1    nonaka 	/* Set data and response automatic rate fallback retry counts. */
   3317   1.1    nonaka 	rtwn_write_4(sc, R92C_DARFRC + 0, 0x01000000);
   3318   1.1    nonaka 	rtwn_write_4(sc, R92C_DARFRC + 4, 0x07060504);
   3319   1.1    nonaka 	rtwn_write_4(sc, R92C_RARFRC + 0, 0x01000000);
   3320   1.1    nonaka 	rtwn_write_4(sc, R92C_RARFRC + 4, 0x07060504);
   3321   1.1    nonaka 
   3322   1.1    nonaka 	rtwn_write_2(sc, R92C_FWHW_TXQ_CTRL, 0x1f80);
   3323   1.1    nonaka 
   3324   1.1    nonaka 	/* Set ACK timeout. */
   3325   1.1    nonaka 	rtwn_write_1(sc, R92C_ACKTO, 0x40);
   3326   1.1    nonaka 
   3327   1.1    nonaka 	/* Initialize beacon parameters. */
   3328   1.1    nonaka 	rtwn_write_2(sc, R92C_TBTT_PROHIBIT, 0x6404);
   3329   1.1    nonaka 	rtwn_write_1(sc, R92C_DRVERLYINT, 0x05);
   3330   1.1    nonaka 	rtwn_write_1(sc, R92C_BCNDMATIM, 0x02);
   3331   1.1    nonaka 	rtwn_write_2(sc, R92C_BCNTCFG, 0x660f);
   3332   1.1    nonaka 
   3333   1.1    nonaka 	/* Setup AMPDU aggregation. */
   3334   1.1    nonaka 	rtwn_write_4(sc, R92C_AGGLEN_LMT, 0x99997631);	/* MCS7~0 */
   3335   1.1    nonaka 	rtwn_write_1(sc, R92C_AGGR_BREAK_TIME, 0x16);
   3336   1.1    nonaka 
   3337   1.1    nonaka 	rtwn_write_1(sc, R92C_BCN_MAX_ERR, 0xff);
   3338   1.1    nonaka 	rtwn_write_1(sc, R92C_BCN_CTRL, R92C_BCN_CTRL_DIS_TSF_UDT0);
   3339   1.1    nonaka 
   3340   1.1    nonaka 	rtwn_write_4(sc, R92C_PIFS, 0x1c);
   3341   1.1    nonaka 	rtwn_write_4(sc, R92C_MCUTST_1, 0x0);
   3342   1.1    nonaka 
   3343   1.1    nonaka 	/* Load 8051 microcode. */
   3344   1.1    nonaka 	error = rtwn_load_firmware(sc);
   3345   1.1    nonaka 	if (error != 0)
   3346   1.1    nonaka 		goto fail;
   3347   1.1    nonaka 
   3348   1.1    nonaka 	/* Initialize MAC/BB/RF blocks. */
   3349   1.1    nonaka 	rtwn_mac_init(sc);
   3350   1.1    nonaka 	rtwn_bb_init(sc);
   3351   1.1    nonaka 	rtwn_rf_init(sc);
   3352   1.1    nonaka 
   3353   1.1    nonaka 	/* Turn CCK and OFDM blocks on. */
   3354   1.1    nonaka 	reg = rtwn_bb_read(sc, R92C_FPGA0_RFMOD);
   3355   1.1    nonaka 	reg |= R92C_RFMOD_CCK_EN;
   3356   1.1    nonaka 	rtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg);
   3357   1.1    nonaka 	reg = rtwn_bb_read(sc, R92C_FPGA0_RFMOD);
   3358   1.1    nonaka 	reg |= R92C_RFMOD_OFDM_EN;
   3359   1.1    nonaka 	rtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg);
   3360   1.1    nonaka 
   3361   1.1    nonaka 	/* Clear per-station keys table. */
   3362   1.1    nonaka 	rtwn_cam_init(sc);
   3363   1.1    nonaka 
   3364   1.1    nonaka 	/* Enable hardware sequence numbering. */
   3365   1.1    nonaka 	rtwn_write_1(sc, R92C_HWSEQ_CTRL, 0xff);
   3366   1.1    nonaka 
   3367   1.1    nonaka 	/* Perform LO and IQ calibrations. */
   3368   1.1    nonaka 	rtwn_iq_calib(sc);
   3369   1.1    nonaka 	/* Perform LC calibration. */
   3370   1.1    nonaka 	rtwn_lc_calib(sc);
   3371   1.1    nonaka 
   3372   1.1    nonaka 	rtwn_pa_bias_init(sc);
   3373   1.1    nonaka 
   3374   1.1    nonaka 	/* Initialize GPIO setting. */
   3375   1.1    nonaka 	rtwn_write_1(sc, R92C_GPIO_MUXCFG,
   3376   1.1    nonaka 	    rtwn_read_1(sc, R92C_GPIO_MUXCFG) & ~R92C_GPIO_MUXCFG_ENBT);
   3377   1.1    nonaka 
   3378   1.1    nonaka 	/* Fix for lower temperature. */
   3379   1.1    nonaka 	rtwn_write_1(sc, 0x15, 0xe9);
   3380   1.1    nonaka 
   3381   1.1    nonaka 	/* Set default channel. */
   3382   1.1    nonaka 	rtwn_set_chan(sc, ic->ic_curchan, NULL);
   3383   1.1    nonaka 
   3384   1.1    nonaka 	/* Clear pending interrupts. */
   3385   1.1    nonaka 	rtwn_write_4(sc, R92C_HISR, 0xffffffff);
   3386   1.1    nonaka 
   3387   1.1    nonaka 	/* Enable interrupts. */
   3388   1.1    nonaka 	rtwn_write_4(sc, R92C_HIMR, RTWN_INT_ENABLE);
   3389   1.1    nonaka 
   3390   1.1    nonaka 	/* We're ready to go. */
   3391   1.1    nonaka 	ifp->if_flags &= ~IFF_OACTIVE;
   3392   1.1    nonaka 	ifp->if_flags |= IFF_RUNNING;
   3393   1.1    nonaka 
   3394   1.1    nonaka 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
   3395   1.1    nonaka 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
   3396   1.1    nonaka 	else
   3397   1.1    nonaka 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
   3398   1.1    nonaka 
   3399   1.1    nonaka 	return 0;
   3400   1.1    nonaka 
   3401   1.1    nonaka  fail:
   3402   1.1    nonaka 	rtwn_stop(ifp, 1);
   3403   1.1    nonaka 	return error;
   3404   1.1    nonaka }
   3405   1.1    nonaka 
   3406   1.1    nonaka static void
   3407   1.1    nonaka rtwn_init_task(void *arg)
   3408   1.1    nonaka {
   3409   1.1    nonaka 	struct rtwn_softc *sc = arg;
   3410   1.1    nonaka 	struct ifnet *ifp = GET_IFP(sc);
   3411   1.1    nonaka 	int s;
   3412   1.1    nonaka 
   3413   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3414   1.1    nonaka 
   3415   1.1    nonaka 	s = splnet();
   3416   1.1    nonaka 
   3417   1.1    nonaka 	rtwn_stop(ifp, 0);
   3418   1.1    nonaka 
   3419   1.1    nonaka 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == IFF_UP)
   3420   1.1    nonaka 		rtwn_init(ifp);
   3421   1.1    nonaka 
   3422   1.1    nonaka 	splx(s);
   3423   1.1    nonaka }
   3424   1.1    nonaka 
   3425   1.1    nonaka static void
   3426   1.1    nonaka rtwn_stop(struct ifnet *ifp, int disable)
   3427   1.1    nonaka {
   3428   1.1    nonaka 	struct rtwn_softc *sc = ifp->if_softc;
   3429   1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3430   1.1    nonaka 	uint16_t reg;
   3431   1.1    nonaka 	int s, i;
   3432   1.1    nonaka 
   3433   1.1    nonaka 	DPRINTFN(3, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
   3434   1.1    nonaka 
   3435   1.1    nonaka 	sc->sc_tx_timer = 0;
   3436   1.1    nonaka 	ifp->if_timer = 0;
   3437   1.1    nonaka 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   3438   1.1    nonaka 
   3439   1.1    nonaka 	callout_stop(&sc->scan_to);
   3440   1.1    nonaka 	callout_stop(&sc->calib_to);
   3441   1.1    nonaka 
   3442   1.1    nonaka 	s = splnet();
   3443   1.1    nonaka 
   3444   1.1    nonaka 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
   3445   1.1    nonaka 
   3446   1.1    nonaka 	/* Disable interrupts. */
   3447   1.1    nonaka 	rtwn_write_4(sc, R92C_HIMR, 0x00000000);
   3448   1.1    nonaka 
   3449   1.1    nonaka 	/* Pause MAC TX queue */
   3450   1.1    nonaka 	rtwn_write_1(sc, R92C_TXPAUSE, 0xff);
   3451   1.1    nonaka 
   3452   1.1    nonaka 	rtwn_write_1(sc, R92C_RF_CTRL, 0x00);
   3453   1.1    nonaka 
   3454   1.1    nonaka 	/* Reset BB state machine */
   3455   1.1    nonaka 	reg = rtwn_read_1(sc, R92C_SYS_FUNC_EN);
   3456   1.1    nonaka 	reg |= R92C_SYS_FUNC_EN_BB_GLB_RST;
   3457   1.1    nonaka 	rtwn_write_1(sc, R92C_SYS_FUNC_EN, reg);
   3458   1.1    nonaka 	reg &= ~R92C_SYS_FUNC_EN_BB_GLB_RST;
   3459   1.1    nonaka 	rtwn_write_1(sc, R92C_SYS_FUNC_EN, reg);
   3460   1.1    nonaka 
   3461   1.1    nonaka 	reg = rtwn_read_2(sc, R92C_CR);
   3462   1.1    nonaka 	reg &= ~(R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
   3463   1.1    nonaka 	    R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN |
   3464   1.1    nonaka 	    R92C_CR_SCHEDULE_EN | R92C_CR_MACTXEN | R92C_CR_MACRXEN |
   3465   1.1    nonaka 	    R92C_CR_ENSEC);
   3466   1.1    nonaka 	rtwn_write_2(sc, R92C_CR, reg);
   3467   1.1    nonaka 
   3468   1.1    nonaka 	if (rtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RAM_DL_SEL)
   3469   1.1    nonaka 		rtwn_fw_reset(sc);
   3470   1.1    nonaka 
   3471   1.1    nonaka 	/* Reset MAC and Enable 8051 */
   3472   1.1    nonaka 	rtwn_write_1(sc, R92C_SYS_FUNC_EN + 1, 0x54);
   3473   1.1    nonaka 
   3474   1.1    nonaka 	/* TODO: linux does additional btcoex stuff here */
   3475   1.1    nonaka 
   3476   1.1    nonaka 	/* Disable AFE PLL */
   3477   1.1    nonaka 	rtwn_write_2(sc, R92C_AFE_PLL_CTRL, 0x80); /* linux magic number */
   3478   1.1    nonaka 	/* Enter PFM mode */
   3479   1.1    nonaka 	rtwn_write_1(sc, R92C_SPS0_CTRL, 0x23); /* ditto */
   3480   1.1    nonaka 	/* Gated AFE DIG_CLOCK */
   3481   1.1    nonaka 	rtwn_write_1(sc, R92C_AFE_XTAL_CTRL, 0x0e); /* different with btcoex */
   3482   1.1    nonaka 	rtwn_write_1(sc, R92C_RSV_CTRL, 0x0e);
   3483   1.1    nonaka 	rtwn_write_1(sc, R92C_APS_FSMCO, R92C_APS_FSMCO_PDN_EN);
   3484   1.1    nonaka 
   3485   1.1    nonaka 	for (i = 0; i < RTWN_NTXQUEUES; i++)
   3486   1.1    nonaka 		rtwn_reset_tx_list(sc, i);
   3487   1.1    nonaka 	rtwn_reset_rx_list(sc);
   3488   1.1    nonaka 
   3489   1.1    nonaka 	splx(s);
   3490   1.1    nonaka }
   3491   1.1    nonaka 
   3492   1.1    nonaka static int
   3493   1.1    nonaka rtwn_intr(void *xsc)
   3494   1.1    nonaka {
   3495   1.1    nonaka 	struct rtwn_softc *sc = xsc;
   3496   1.1    nonaka 	uint32_t status;
   3497   1.1    nonaka 
   3498   1.1    nonaka 	if (!ISSET(sc->sc_flags, RTWN_FLAG_FW_LOADED))
   3499   1.1    nonaka 		return 0;
   3500   1.1    nonaka 
   3501   1.1    nonaka 	status = rtwn_read_4(sc, R92C_HISR);
   3502   1.1    nonaka 	if (status == 0 || status == 0xffffffff)
   3503   1.1    nonaka 		return 0;
   3504   1.1    nonaka 
   3505   1.1    nonaka 	/* Disable interrupts. */
   3506   1.1    nonaka 	rtwn_write_4(sc, R92C_HIMR, 0x00000000);
   3507   1.1    nonaka 
   3508  1.11    nonaka 	softint_schedule(sc->sc_soft_ih);
   3509  1.11    nonaka 	return 1;
   3510  1.11    nonaka }
   3511  1.11    nonaka 
   3512  1.11    nonaka static void
   3513  1.11    nonaka rtwn_softintr(void *xsc)
   3514  1.11    nonaka {
   3515  1.11    nonaka 	struct rtwn_softc *sc = xsc;
   3516  1.11    nonaka 	uint32_t status;
   3517  1.11    nonaka 	int i, s;
   3518  1.11    nonaka 
   3519  1.11    nonaka 	if (!ISSET(sc->sc_flags, RTWN_FLAG_FW_LOADED))
   3520  1.11    nonaka 		return;
   3521  1.11    nonaka 
   3522  1.11    nonaka 	status = rtwn_read_4(sc, R92C_HISR);
   3523  1.11    nonaka 	if (status == 0 || status == 0xffffffff)
   3524  1.11    nonaka 		goto out;
   3525  1.11    nonaka 
   3526   1.1    nonaka 	/* Ack interrupts. */
   3527   1.1    nonaka 	rtwn_write_4(sc, R92C_HISR, status);
   3528   1.1    nonaka 
   3529   1.1    nonaka 	/* Vendor driver treats RX errors like ROK... */
   3530   1.1    nonaka 	if (status & RTWN_INT_ENABLE_RX) {
   3531   1.1    nonaka 		for (i = 0; i < RTWN_RX_LIST_COUNT; i++) {
   3532   1.1    nonaka 			struct r92c_rx_desc *rx_desc = &sc->rx_ring.desc[i];
   3533   1.1    nonaka 			struct rtwn_rx_data *rx_data = &sc->rx_ring.rx_data[i];
   3534   1.1    nonaka 
   3535   1.1    nonaka 			if (le32toh(rx_desc->rxdw0) & R92C_RXDW0_OWN)
   3536   1.1    nonaka 				continue;
   3537   1.1    nonaka 
   3538   1.1    nonaka 			rtwn_rx_frame(sc, rx_desc, rx_data, i);
   3539   1.1    nonaka 		}
   3540   1.1    nonaka 	}
   3541   1.1    nonaka 
   3542   1.1    nonaka 	if (status & R92C_IMR_BDOK)
   3543   1.1    nonaka 		rtwn_tx_done(sc, RTWN_BEACON_QUEUE);
   3544   1.1    nonaka 	if (status & R92C_IMR_HIGHDOK)
   3545   1.1    nonaka 		rtwn_tx_done(sc, RTWN_HIGH_QUEUE);
   3546   1.1    nonaka 	if (status & R92C_IMR_MGNTDOK)
   3547   1.1    nonaka 		rtwn_tx_done(sc, RTWN_MGNT_QUEUE);
   3548   1.1    nonaka 	if (status & R92C_IMR_BKDOK)
   3549   1.1    nonaka 		rtwn_tx_done(sc, RTWN_BK_QUEUE);
   3550   1.1    nonaka 	if (status & R92C_IMR_BEDOK)
   3551   1.1    nonaka 		rtwn_tx_done(sc, RTWN_BE_QUEUE);
   3552   1.1    nonaka 	if (status & R92C_IMR_VIDOK)
   3553   1.1    nonaka 		rtwn_tx_done(sc, RTWN_VI_QUEUE);
   3554   1.1    nonaka 	if (status & R92C_IMR_VODOK)
   3555   1.1    nonaka 		rtwn_tx_done(sc, RTWN_VO_QUEUE);
   3556   1.1    nonaka 	if ((status & RTWN_INT_ENABLE_TX) && sc->qfullmsk == 0) {
   3557   1.1    nonaka 		struct ifnet *ifp = GET_IFP(sc);
   3558  1.11    nonaka 		s = splnet();
   3559   1.1    nonaka 		ifp->if_flags &= ~IFF_OACTIVE;
   3560  1.11    nonaka 		rtwn_start(ifp);
   3561  1.11    nonaka 		splx(s);
   3562   1.1    nonaka 	}
   3563   1.1    nonaka 
   3564  1.11    nonaka  out:
   3565   1.1    nonaka 	/* Enable interrupts. */
   3566   1.1    nonaka 	rtwn_write_4(sc, R92C_HIMR, RTWN_INT_ENABLE);
   3567   1.1    nonaka }
   3568