summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2016-04-27 19:49:26 +0000
committerchristos <christos@NetBSD.org>2016-04-27 19:49:26 +0000
commit43f9f5efdc77bff16ce28429e9214b1dc67fccda (patch)
treeee11144a288ba2155647a37fe76ab7e7bbcee366 /sys/dev
parent4396a54a1292d819aff9b8e7113d368f29f5393c (diff)
Make RT 2860 for the if_ral_pci.c driver compile.
This work was done by Jeff Rizzo
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/rt2860.c1014
-rw-r--r--sys/dev/ic/rt2860reg.h1
-rw-r--r--sys/dev/ic/rt2860var.h22
3 files changed, 553 insertions, 484 deletions
diff --git a/sys/dev/ic/rt2860.c b/sys/dev/ic/rt2860.c
index 3b2f16ae39a..b1bfac2f875 100644
--- a/sys/dev/ic/rt2860.c
+++ b/sys/dev/ic/rt2860.c
@@ -1,3 +1,4 @@
+/* $NetBSD: rt2860.c,v 1.2 2016/04/27 19:49:26 christos Exp $ */
/* $OpenBSD: rt2860.c,v 1.90 2016/04/13 10:49:26 mpi Exp $ */
/*-
@@ -21,43 +22,46 @@
* http://www.ralinktech.com/
*/
-#include "bpfilter.h"
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.2 2016/04/27 19:49:26 christos Exp $");
#include <sys/param.h>
#include <sys/sockio.h>
+#include <sys/sysctl.h>
#include <sys/mbuf.h>
#include <sys/kernel.h>
#include <sys/socket.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/queue.h>
-#include <sys/timeout.h>
+#include <sys/callout.h>
+#include <sys/module.h>
#include <sys/conf.h>
#include <sys/device.h>
#include <sys/endian.h>
+#include <sys/cprng.h>
-#include <machine/bus.h>
-#include <machine/intr.h>
+#include <sys/bus.h>
+#include <sys/intr.h>
-#if NBPFILTER > 0
#include <net/bpf.h>
-#endif
#include <net/if.h>
#include <net/if_dl.h>
+#include <net/if_ether.h>
#include <net/if_media.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_amrr.h>
#include <net80211/ieee80211_radiotap.h>
+#include <dev/firmload.h>
+
#include <dev/ic/rt2860var.h>
#include <dev/ic/rt2860reg.h>
#include <dev/pci/pcidevs.h>
+#define RAL_DEBUG
#ifdef RAL_DEBUG
#define DPRINTF(x) do { if (rt2860_debug > 0) printf x; } while (0)
#define DPRINTFN(n, x) do { if (rt2860_debug >= (n)) printf x; } while (0)
@@ -67,94 +71,94 @@ int rt2860_debug = 0;
#define DPRINTFN(n, x)
#endif
-void rt2860_attachhook(struct device *);
-int rt2860_alloc_tx_ring(struct rt2860_softc *,
+static void rt2860_attachhook(struct device *);
+static int rt2860_alloc_tx_ring(struct rt2860_softc *,
struct rt2860_tx_ring *);
-void rt2860_reset_tx_ring(struct rt2860_softc *,
+static void rt2860_reset_tx_ring(struct rt2860_softc *,
struct rt2860_tx_ring *);
-void rt2860_free_tx_ring(struct rt2860_softc *,
+static void rt2860_free_tx_ring(struct rt2860_softc *,
struct rt2860_tx_ring *);
-int rt2860_alloc_tx_pool(struct rt2860_softc *);
-void rt2860_free_tx_pool(struct rt2860_softc *);
-int rt2860_alloc_rx_ring(struct rt2860_softc *,
+static int rt2860_alloc_tx_pool(struct rt2860_softc *);
+static void rt2860_free_tx_pool(struct rt2860_softc *);
+static int rt2860_alloc_rx_ring(struct rt2860_softc *,
struct rt2860_rx_ring *);
-void rt2860_reset_rx_ring(struct rt2860_softc *,
+static void rt2860_reset_rx_ring(struct rt2860_softc *,
struct rt2860_rx_ring *);
-void rt2860_free_rx_ring(struct rt2860_softc *,
+static void rt2860_free_rx_ring(struct rt2860_softc *,
struct rt2860_rx_ring *);
-struct ieee80211_node *rt2860_node_alloc(struct ieee80211com *);
-int rt2860_media_change(struct ifnet *);
-void rt2860_iter_func(void *, struct ieee80211_node *);
-void rt2860_updatestats(struct rt2860_softc *);
-void rt2860_newassoc(struct ieee80211com *, struct ieee80211_node *,
+static struct ieee80211_node *rt2860_node_alloc(struct ieee80211_node_table *);
+static int rt2860_media_change(struct ifnet *);
+static void rt2860_iter_func(void *, struct ieee80211_node *);
+static void rt2860_updatestats(struct rt2860_softc *);
+static void rt2860_newassoc(struct ieee80211_node *,
int);
-void rt2860_node_leave(struct ieee80211com *,
- struct ieee80211_node *);
-int rt2860_ampdu_rx_start(struct ieee80211com *,
+#ifdef notyet
+static int rt2860_ampdu_rx_start(struct ieee80211com *,
struct ieee80211_node *, uint8_t);
-void rt2860_ampdu_rx_stop(struct ieee80211com *,
+static void rt2860_ampdu_rx_stop(struct ieee80211com *,
struct ieee80211_node *, uint8_t);
-int rt2860_newstate(struct ieee80211com *, enum ieee80211_state,
+#endif
+static int rt2860_newstate(struct ieee80211com *, enum ieee80211_state,
int);
-uint16_t rt3090_efuse_read_2(struct rt2860_softc *, uint16_t);
-uint16_t rt2860_eeprom_read_2(struct rt2860_softc *, uint16_t);
-void rt2860_intr_coherent(struct rt2860_softc *);
-void rt2860_drain_stats_fifo(struct rt2860_softc *);
-void rt2860_tx_intr(struct rt2860_softc *, int);
-void rt2860_rx_intr(struct rt2860_softc *);
-void rt2860_tbtt_intr(struct rt2860_softc *);
-void rt2860_gp_intr(struct rt2860_softc *);
-int rt2860_tx(struct rt2860_softc *, struct mbuf *,
+static uint16_t rt3090_efuse_read_2(struct rt2860_softc *, uint16_t);
+static uint16_t rt2860_eeprom_read_2(struct rt2860_softc *, uint16_t);
+static void rt2860_intr_coherent(struct rt2860_softc *);
+static void rt2860_drain_stats_fifo(struct rt2860_softc *);
+static void rt2860_tx_intr(struct rt2860_softc *, int);
+static void rt2860_rx_intr(struct rt2860_softc *);
+static void rt2860_tbtt_intr(struct rt2860_softc *);
+static void rt2860_gp_intr(struct rt2860_softc *);
+static int rt2860_tx(struct rt2860_softc *, struct mbuf *,
struct ieee80211_node *);
-void rt2860_start(struct ifnet *);
-void rt2860_watchdog(struct ifnet *);
-int rt2860_ioctl(struct ifnet *, u_long, caddr_t);
-void rt2860_mcu_bbp_write(struct rt2860_softc *, uint8_t, uint8_t);
-uint8_t rt2860_mcu_bbp_read(struct rt2860_softc *, uint8_t);
-void rt2860_rf_write(struct rt2860_softc *, uint8_t, uint32_t);
-uint8_t rt3090_rf_read(struct rt2860_softc *, uint8_t);
-void rt3090_rf_write(struct rt2860_softc *, uint8_t, uint8_t);
-int rt2860_mcu_cmd(struct rt2860_softc *, uint8_t, uint16_t, int);
-void rt2860_enable_mrr(struct rt2860_softc *);
-void rt2860_set_txpreamble(struct rt2860_softc *);
-void rt2860_set_basicrates(struct rt2860_softc *);
-void rt2860_select_chan_group(struct rt2860_softc *, int);
-void rt2860_set_chan(struct rt2860_softc *, u_int);
-void rt3090_set_chan(struct rt2860_softc *, u_int);
-int rt3090_rf_init(struct rt2860_softc *);
-void rt3090_rf_wakeup(struct rt2860_softc *);
-int rt3090_filter_calib(struct rt2860_softc *, uint8_t, uint8_t,
+static void rt2860_start(struct ifnet *);
+static void rt2860_watchdog(struct ifnet *);
+static int rt2860_ioctl(struct ifnet *, u_long, void *);
+static void rt2860_mcu_bbp_write(struct rt2860_softc *, uint8_t, uint8_t);
+static uint8_t rt2860_mcu_bbp_read(struct rt2860_softc *, uint8_t);
+static void rt2860_rf_write(struct rt2860_softc *, uint8_t, uint32_t);
+static uint8_t rt3090_rf_read(struct rt2860_softc *, uint8_t);
+static void rt3090_rf_write(struct rt2860_softc *, uint8_t, uint8_t);
+static int rt2860_mcu_cmd(struct rt2860_softc *, uint8_t, uint16_t, int);
+static void rt2860_enable_mrr(struct rt2860_softc *);
+static void rt2860_set_txpreamble(struct rt2860_softc *);
+static void rt2860_set_basicrates(struct rt2860_softc *);
+static void rt2860_select_chan_group(struct rt2860_softc *, int);
+static void rt2860_set_chan(struct rt2860_softc *, u_int);
+static void rt3090_set_chan(struct rt2860_softc *, u_int);
+static int rt3090_rf_init(struct rt2860_softc *);
+static void rt3090_rf_wakeup(struct rt2860_softc *);
+static int rt3090_filter_calib(struct rt2860_softc *, uint8_t, uint8_t,
uint8_t *);
-void rt3090_rf_setup(struct rt2860_softc *);
-void rt2860_set_leds(struct rt2860_softc *, uint16_t);
-void rt2860_set_gp_timer(struct rt2860_softc *, int);
-void rt2860_set_bssid(struct rt2860_softc *, const uint8_t *);
-void rt2860_set_macaddr(struct rt2860_softc *, const uint8_t *);
-void rt2860_updateslot(struct ieee80211com *);
-void rt2860_updateprot(struct ieee80211com *);
-void rt2860_updateedca(struct ieee80211com *);
-int rt2860_set_key(struct ieee80211com *, struct ieee80211_node *,
- struct ieee80211_key *);
-void rt2860_delete_key(struct ieee80211com *,
- struct ieee80211_node *, struct ieee80211_key *);
-#if NBPFILTER > 0
-int8_t rt2860_rssi2dbm(struct rt2860_softc *, uint8_t, uint8_t);
+static void rt3090_rf_setup(struct rt2860_softc *);
+static void rt2860_set_leds(struct rt2860_softc *, uint16_t);
+static void rt2860_set_gp_timer(struct rt2860_softc *, int);
+static void rt2860_set_bssid(struct rt2860_softc *, const uint8_t *);
+static void rt2860_set_macaddr(struct rt2860_softc *, const uint8_t *);
+static void rt2860_updateslot(struct ifnet *);
+static void rt2860_updateprot(struct ieee80211com *);
+static int rt2860_updateedca(struct ieee80211com *);
+static int rt2860_set_key(struct ieee80211com *,
+ const struct ieee80211_key *, const uint8_t *);
+static int rt2860_delete_key(struct ieee80211com *,
+ const struct ieee80211_key *);
+static int8_t rt2860_rssi2dbm(struct rt2860_softc *, uint8_t, uint8_t);
+static const char * rt2860_get_rf(uint8_t);
+static int rt2860_read_eeprom(struct rt2860_softc *);
+static int rt2860_bbp_init(struct rt2860_softc *);
+static int rt2860_txrx_enable(struct rt2860_softc *);
+static int rt2860_init(struct ifnet *);
+static void rt2860_stop(struct ifnet *, int);
+static int rt2860_load_microcode(struct rt2860_softc *);
+#if 0
+static void rt2860_calib(struct rt2860_softc *);
#endif
-const char * rt2860_get_rf(uint8_t);
-int rt2860_read_eeprom(struct rt2860_softc *);
-int rt2860_bbp_init(struct rt2860_softc *);
-int rt2860_txrx_enable(struct rt2860_softc *);
-int rt2860_init(struct ifnet *);
-void rt2860_stop(struct ifnet *, int);
-int rt2860_load_microcode(struct rt2860_softc *);
-void rt2860_calib(struct rt2860_softc *);
-void rt3090_set_rx_antenna(struct rt2860_softc *, int);
-void rt2860_switch_chan(struct rt2860_softc *,
+static void rt3090_set_rx_antenna(struct rt2860_softc *, int);
+static void rt2860_switch_chan(struct rt2860_softc *,
struct ieee80211_channel *);
#ifndef IEEE80211_STA_ONLY
-int rt2860_setup_beacon(struct rt2860_softc *);
+static int rt2860_setup_beacon(struct rt2860_softc *);
#endif
-void rt2860_enable_tsf_sync(struct rt2860_softc *);
+static void rt2860_enable_tsf_sync(struct rt2860_softc *);
static const struct {
uint32_t reg;
@@ -200,19 +204,21 @@ rt2860_attach(void *xsc, int id)
int qid, ntries, error;
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
sc->amrr.amrr_min_success_threshold = 1;
sc->amrr.amrr_max_success_threshold = 15;
/* wait for NIC to initialize */
for (ntries = 0; ntries < 100; ntries++) {
+ aprint_normal_dev(sc->sc_dev, "reading ASIC\n");
tmp = RAL_READ(sc, RT2860_ASIC_VER_ID);
if (tmp != 0 && tmp != 0xffffffff)
break;
DELAY(10);
}
if (ntries == 100) {
- printf("%s: timeout waiting for NIC to initialize\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "timeout waiting for NIC to initialize\n");
return ETIMEDOUT;
}
sc->mac_ver = tmp >> 16;
@@ -224,39 +230,39 @@ rt2860_attach(void *xsc, int id)
id == PCI_PRODUCT_AWT_RT2890))
sc->sc_flags |= RT2860_ADVANCED_PS;
+ aprint_normal_dev(sc->sc_dev, "reading eeprom\n");
/* retrieve RF rev. no and various other things from EEPROM */
rt2860_read_eeprom(sc);
- printf(", address %s\n", ether_sprintf(ic->ic_myaddr));
- printf("%s: MAC/BBP RT%X (rev 0x%04X), RF %s (MIMO %dT%dR)\n",
- sc->sc_dev.dv_xname, sc->mac_ver, sc->mac_rev,
- rt2860_get_rf(sc->rf_rev), sc->ntxchains, sc->nrxchains);
+ aprint_normal_dev(sc->sc_dev, "802.11 address %s\n",
+ ether_sprintf(ic->ic_myaddr));
+ aprint_normal_dev(sc->sc_dev, "MAC/BBP RT%X (rev 0x%04X), RF %s (MIMO %dT%dR)\n",
+ sc->mac_ver, sc->mac_rev, rt2860_get_rf(sc->rf_rev),
+ sc->ntxchains, sc->nrxchains);
/*
* Allocate Tx (4 EDCAs + HCCA + Mgt) and Rx rings.
*/
for (qid = 0; qid < 6; qid++) {
if ((error = rt2860_alloc_tx_ring(sc, &sc->txq[qid])) != 0) {
- printf("%s: could not allocate Tx ring %d\n",
- sc->sc_dev.dv_xname, qid);
+ aprint_error_dev(sc->sc_dev,
+ "could not allocate Tx ring %d\n", qid);
goto fail1;
}
}
if ((error = rt2860_alloc_rx_ring(sc, &sc->rxq)) != 0) {
- printf("%s: could not allocate Rx ring\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not allocate Rx ring\n");
goto fail1;
}
if ((error = rt2860_alloc_tx_pool(sc)) != 0) {
- printf("%s: could not allocate Tx pool\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not allocate Tx pool\n");
goto fail2;
}
/* mgmt ring is broken on RT2860C, use EDCA AC VO ring instead */
sc->mgtqid = (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) ?
- EDCA_AC_VO : 5;
+ WME_AC_VO : 5;
config_mountroot(xsc, rt2860_attachhook);
@@ -268,21 +274,46 @@ fail1: while (--qid >= 0)
return error;
}
-void
+static int
+firmware_load(const char *dname, const char *iname, uint8_t **ucodep,
+ size_t *sizep)
+{
+ firmware_handle_t fh;
+ int error;
+
+ aprint_normal("in %s\n", __func__);
+ if ((error = firmware_open(dname, iname, &fh)) != 0)
+ return (error);
+ *sizep = firmware_get_size(fh);
+ if ((*ucodep = firmware_malloc(*sizep)) == NULL) {
+ firmware_close(fh);
+ return (ENOMEM);
+ }
+ if ((error = firmware_read(fh, 0, *ucodep, *sizep)) != 0)
+ firmware_free(*ucodep, *sizep);
+ firmware_close(fh);
+
+ return (error);
+}
+
+static void
rt2860_attachhook(struct device *self)
{
struct rt2860_softc *sc = (struct rt2860_softc *)self;
struct ieee80211com *ic = &sc->sc_ic;
- struct ifnet *ifp = &ic->ic_if;
+ struct ifnet *ifp = &sc->sc_if;
int i, error;
- error = loadfirmware("ral-rt2860", &sc->ucode, &sc->ucsize);
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
+ error = firmware_load("ral", "ral-rt2860", &sc->ucode, &sc->ucsize);
if (error != 0) {
- printf("%s: error %d, could not read firmware file %s\n",
- sc->sc_dev.dv_xname, error, "ral-rt2860");
+ aprint_error_dev(sc->sc_dev,
+ "error %d, could not read firmware file %s\n",
+ error, "ral-rt2860");
return;
}
+ ic->ic_ifp = ifp;
ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
ic->ic_state = IEEE80211_S_INIT;
@@ -293,12 +324,14 @@ rt2860_attachhook(struct device *self)
#ifndef IEEE80211_STA_ONLY
IEEE80211_C_IBSS | /* IBSS mode supported */
IEEE80211_C_HOSTAP | /* HostAP mode supported */
+#ifdef IEEE80211_C_APPMGT
IEEE80211_C_APPMGT | /* HostAP power management */
#endif
+#endif
IEEE80211_C_SHPREAMBLE | /* short preamble supported */
IEEE80211_C_SHSLOT | /* short slot time supported */
IEEE80211_C_WEP | /* s/w WEP */
- IEEE80211_C_RSN; /* WPA/RSN */
+ IEEE80211_C_WPA; /* WPA/RSN */
if (sc->rf_rev == RT2860_RF_2750 || sc->rf_rev == RT2860_RF_2850) {
/* set supported .11a rates */
@@ -306,7 +339,7 @@ rt2860_attachhook(struct device *self)
ieee80211_std_rateset_11a;
/* set supported .11a channels */
- for (i = 14; i < nitems(rt2860_rf2850); i++) {
+ for (i = 14; i < (int)__arraycount(rt2860_rf2850); i++) {
uint8_t chan = rt2860_rf2850[i].chan;
ic->ic_channels[chan].ic_freq =
ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ);
@@ -332,32 +365,31 @@ rt2860_attachhook(struct device *self)
ifp->if_softc = sc;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_init = rt2860_init;
ifp->if_ioctl = rt2860_ioctl;
ifp->if_start = rt2860_start;
ifp->if_watchdog = rt2860_watchdog;
- memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
+ memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
if_attach(ifp);
- ieee80211_ifattach(ifp);
+ ieee80211_ifattach(ic);
ic->ic_node_alloc = rt2860_node_alloc;
ic->ic_newassoc = rt2860_newassoc;
-#ifndef IEEE80211_STA_ONLY
- ic->ic_node_leave = rt2860_node_leave;
-#endif
+#ifdef notyet
ic->ic_ampdu_rx_start = rt2860_ampdu_rx_start;
ic->ic_ampdu_rx_stop = rt2860_ampdu_rx_stop;
+#endif
ic->ic_updateslot = rt2860_updateslot;
- ic->ic_updateedca = rt2860_updateedca;
- ic->ic_set_key = rt2860_set_key;
- ic->ic_delete_key = rt2860_delete_key;
+ ic->ic_wme.wme_update = rt2860_updateedca;
+ ic->ic_crypto.cs_key_set = rt2860_set_key;
+ ic->ic_crypto.cs_key_delete = rt2860_delete_key;
/* override state transition machine */
sc->sc_newstate = ic->ic_newstate;
ic->ic_newstate = rt2860_newstate;
- ieee80211_media_init(ifp, rt2860_media_change, ieee80211_media_status);
+ ieee80211_media_init(ic, rt2860_media_change, ieee80211_media_status);
-#if NBPFILTER > 0
- bpfattach(&sc->sc_drvbpf, ifp, DLT_IEEE802_11_RADIO,
- sizeof (struct ieee80211_frame) + 64);
+ bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
+ sizeof (struct ieee80211_frame) + 64, &sc->sc_drvbpf);
sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
@@ -366,17 +398,17 @@ rt2860_attachhook(struct device *self)
sc->sc_txtap_len = sizeof sc->sc_txtapu;
sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
sc->sc_txtap.wt_ihdr.it_present = htole32(RT2860_TX_RADIOTAP_PRESENT);
-#endif
}
int
rt2860_detach(void *xsc)
{
struct rt2860_softc *sc = xsc;
- struct ifnet *ifp = &sc->sc_ic.ic_if;
+ struct ifnet *ifp = &sc->sc_if;
int qid;
- ieee80211_ifdetach(ifp); /* free all nodes */
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
+ ieee80211_ifdetach(&sc->sc_ic); /* free all nodes */
if_detach(ifp);
for (qid = 0; qid < 6; qid++)
@@ -385,7 +417,7 @@ rt2860_detach(void *xsc)
rt2860_free_tx_pool(sc);
if (sc->ucode != NULL)
- free(sc->ucode, M_DEVBUF, sc->ucsize);
+ free(sc->ucode, M_DEVBUF);
return 0;
}
@@ -394,8 +426,9 @@ void
rt2860_suspend(void *xsc)
{
struct rt2860_softc *sc = xsc;
- struct ifnet *ifp = &sc->sc_ic.ic_if;
+ struct ifnet *ifp = &sc->sc_if;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (ifp->if_flags & IFF_RUNNING)
rt2860_stop(ifp, 1);
}
@@ -404,46 +437,48 @@ void
rt2860_wakeup(void *xsc)
{
struct rt2860_softc *sc = xsc;
- struct ifnet *ifp = &sc->sc_ic.ic_if;
+ struct ifnet *ifp = &sc->sc_if;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (ifp->if_flags & IFF_UP)
rt2860_init(ifp);
}
-int
+static int
rt2860_alloc_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring)
{
int nsegs, size, error;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
size = RT2860_TX_RING_COUNT * sizeof (struct rt2860_txd);
error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
BUS_DMA_NOWAIT, &ring->map);
if (error != 0) {
- printf("%s: could not create DMA map\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not create DMA map\n");
goto fail;
}
/* Tx rings must be 4-DWORD aligned */
error = bus_dmamem_alloc(sc->sc_dmat, size, 16, 0, &ring->seg, 1,
- &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
+ &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not allocate DMA memory\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not allocate DMA memory\n");
goto fail;
}
error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs, size,
- (caddr_t *)&ring->txd, BUS_DMA_NOWAIT);
+ (void **)&ring->txd, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: can't map DMA memory\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "can't map DMA memory\n");
goto fail;
}
error = bus_dmamap_load(sc->sc_dmat, ring->map, ring->txd, size, NULL,
BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not load DMA map\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not load DMA map\n");
goto fail;
}
@@ -457,12 +492,13 @@ fail: rt2860_free_tx_ring(sc, ring);
return error;
}
-void
+static void
rt2860_reset_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring)
{
struct rt2860_tx_data *data;
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (i = 0; i < RT2860_TX_RING_COUNT; i++) {
if ((data = ring->data[i]) == NULL)
continue; /* nothing mapped in this slot */
@@ -482,17 +518,18 @@ rt2860_reset_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring)
ring->cur = ring->next = 0;
}
-void
+static void
rt2860_free_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring)
{
struct rt2860_tx_data *data;
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (ring->txd != NULL) {
bus_dmamap_sync(sc->sc_dmat, ring->map, 0,
ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, ring->map);
- bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->txd,
+ bus_dmamem_unmap(sc->sc_dmat, (void *)ring->txd,
RT2860_TX_RING_COUNT * sizeof (struct rt2860_txd));
bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
}
@@ -515,13 +552,14 @@ rt2860_free_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring)
/*
* Allocate a pool of TX Wireless Information blocks.
*/
-int
+static int
rt2860_alloc_tx_pool(struct rt2860_softc *sc)
{
- caddr_t vaddr;
+ char *vaddr;
bus_addr_t paddr;
int i, nsegs, size, error;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
size = RT2860_TX_POOL_COUNT * RT2860_TXWI_DMASZ;
/* init data_pool early in case of failure.. */
@@ -530,29 +568,29 @@ rt2860_alloc_tx_pool(struct rt2860_softc *sc)
error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
BUS_DMA_NOWAIT, &sc->txwi_map);
if (error != 0) {
- printf("%s: could not create DMA map\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not create DMA map\n");
goto fail;
}
error = bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0,
- &sc->txwi_seg, 1, &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
+ &sc->txwi_seg, 1, &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not allocate DMA memory\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not allocate DMA memory\n");
goto fail;
}
error = bus_dmamem_map(sc->sc_dmat, &sc->txwi_seg, nsegs, size,
&sc->txwi_vaddr, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: can't map DMA memory\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "can't map DMA memory\n");
goto fail;
}
error = bus_dmamap_load(sc->sc_dmat, sc->txwi_map, sc->txwi_vaddr,
size, NULL, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not load DMA map\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not load DMA map\n");
goto fail;
}
@@ -568,8 +606,8 @@ rt2860_alloc_tx_pool(struct rt2860_softc *sc)
RT2860_MAX_SCATTER, MCLBYTES, 0, BUS_DMA_NOWAIT,
&data->map); /* <0> */
if (error != 0) {
- printf("%s: could not create DMA map\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not create DMA map\n");
goto fail;
}
data->txwi = (struct rt2860_txwi *)vaddr;
@@ -586,9 +624,10 @@ fail: rt2860_free_tx_pool(sc);
return error;
}
-void
+static void
rt2860_free_tx_pool(struct rt2860_softc *sc)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (sc->txwi_vaddr != NULL) {
bus_dmamap_sync(sc->sc_dmat, sc->txwi_map, 0,
sc->txwi_map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
@@ -608,40 +647,41 @@ rt2860_free_tx_pool(struct rt2860_softc *sc)
}
}
-int
+static int
rt2860_alloc_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring)
{
int i, nsegs, size, error;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
size = RT2860_RX_RING_COUNT * sizeof (struct rt2860_rxd);
error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
BUS_DMA_NOWAIT, &ring->map);
if (error != 0) {
- printf("%s: could not create DMA map\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not create DMA map\n");
goto fail;
}
/* Rx ring must be 4-DWORD aligned */
error = bus_dmamem_alloc(sc->sc_dmat, size, 16, 0, &ring->seg, 1,
- &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
+ &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not allocate DMA memory\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not allocate DMA memory\n");
goto fail;
}
error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs, size,
- (caddr_t *)&ring->rxd, BUS_DMA_NOWAIT);
+ (void **)&ring->rxd, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: can't map DMA memory\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "can't map DMA memory\n");
goto fail;
}
error = bus_dmamap_load(sc->sc_dmat, ring->map, ring->rxd, size, NULL,
BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not load DMA map\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not load DMA map\n");
goto fail;
}
@@ -654,25 +694,33 @@ rt2860_alloc_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring)
error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
0, BUS_DMA_NOWAIT, &data->map);
if (error != 0) {
- printf("%s: could not create DMA map\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not create DMA map\n");
goto fail;
}
- data->m = MCLGETI(NULL, M_DONTWAIT, NULL, MCLBYTES);
+ MGET(data->m, M_DONTWAIT, MT_DATA);
if (data->m == NULL) {
- printf("%s: could not allocate Rx mbuf\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not allocate Rx mbuf\n");
error = ENOBUFS;
goto fail;
}
+ MCLGET(data->m, M_DONTWAIT);
+ if ((data->m->m_flags & M_EXT) == 0) {
+ aprint_error_dev(sc->sc_dev,
+ "could not allocate Rx mbuf cluster\n");
+ error = ENOBUFS;
+ goto fail;
+ }
+
error = bus_dmamap_load(sc->sc_dmat, data->map,
mtod(data->m, void *), MCLBYTES, NULL,
BUS_DMA_READ | BUS_DMA_NOWAIT);
if (error != 0) {
- printf("%s: could not load DMA map\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not load DMA map\n");
goto fail;
}
@@ -688,11 +736,12 @@ fail: rt2860_free_rx_ring(sc, ring);
return error;
}
-void
+static void
rt2860_reset_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring)
{
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (i = 0; i < RT2860_RX_RING_COUNT; i++)
ring->rxd[i].sdl0 &= ~htole16(RT2860_RX_DDONE);
@@ -702,16 +751,17 @@ rt2860_reset_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring)
ring->cur = 0;
}
-void
+static void
rt2860_free_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring)
{
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (ring->rxd != NULL) {
bus_dmamap_sync(sc->sc_dmat, ring->map, 0,
ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, ring->map);
- bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->rxd,
+ bus_dmamem_unmap(sc->sc_dmat, (void *)ring->rxd,
RT2860_RX_RING_COUNT * sizeof (struct rt2860_rxd));
bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
}
@@ -732,14 +782,16 @@ rt2860_free_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring)
}
}
-struct ieee80211_node *
-rt2860_node_alloc(struct ieee80211com *ic)
+static struct ieee80211_node *
+rt2860_node_alloc(struct ieee80211_node_table *nt)
{
- return malloc(sizeof (struct rt2860_node), M_DEVBUF,
- M_NOWAIT | M_ZERO);
+ aprint_normal("in %s\n", __func__);
+ struct rt2860_node *rn =
+ malloc(sizeof (struct rt2860_node), M_DEVBUF, M_NOWAIT | M_ZERO);
+ return (rn) ? &rn->ni : NULL;
}
-int
+static int
rt2860_media_change(struct ifnet *ifp)
{
struct rt2860_softc *sc = ifp->if_softc;
@@ -747,6 +799,7 @@ rt2860_media_change(struct ifnet *ifp)
uint8_t rate, ridx;
int error;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
error = ieee80211_media_change(ifp);
if (error != ENETRESET)
return error;
@@ -768,20 +821,22 @@ rt2860_media_change(struct ifnet *ifp)
return 0;
}
-void
+static void
rt2860_iter_func(void *arg, struct ieee80211_node *ni)
{
struct rt2860_softc *sc = arg;
uint8_t wcid = ((struct rt2860_node *)ni)->wcid;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
ieee80211_amrr_choose(&sc->amrr, ni, &sc->amn[wcid]);
}
-void
+static void
rt2860_updatestats(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
#ifndef IEEE80211_STA_ONLY
/*
* In IBSS or HostAP modes (when the hardware sends beacons), the
@@ -807,19 +862,20 @@ rt2860_updatestats(struct rt2860_softc *sc)
rt2860_iter_func(sc, ic->ic_bss);
#ifndef IEEE80211_STA_ONLY
else
- ieee80211_iterate_nodes(ic, rt2860_iter_func, sc);
+ ieee80211_iterate_nodes(&ic->ic_sta, rt2860_iter_func, sc);
#endif
}
-void
-rt2860_newassoc(struct ieee80211com *ic, struct ieee80211_node *ni, int isnew)
+static void
+rt2860_newassoc(struct ieee80211_node *ni, int isnew)
{
- struct rt2860_softc *sc = ic->ic_softc;
+ struct rt2860_softc *sc = ni->ni_ic->ic_ifp->if_softc;
struct rt2860_node *rn = (void *)ni;
struct ieee80211_rateset *rs = &ni->ni_rates;
uint8_t rate, wcid = 0;
int ridx, i, j;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (isnew && ni->ni_associd != 0) {
/* only interested in true associations */
wcid = rn->wcid = IEEE80211_AID(ni->ni_associd);
@@ -860,22 +916,12 @@ rt2860_newassoc(struct ieee80211com *ic, struct ieee80211_node *ni, int isnew)
}
}
-#ifndef IEEE80211_STA_ONLY
-void
-rt2860_node_leave(struct ieee80211com *ic, struct ieee80211_node *ni)
-{
- struct rt2860_softc *sc = ic->ic_softc;
- uint8_t wcid = ((struct rt2860_node *)ni)->wcid;
-
- /* clear Rx WCID search table entry */
- RAL_SET_REGION_4(sc, RT2860_WCID_ENTRY(wcid), 0, 2);
-}
-#endif
-
-int
+#ifdef notyet
+static int
rt2860_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni,
uint8_t tid)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
struct rt2860_softc *sc = ic->ic_softc;
uint8_t wcid = ((struct rt2860_node *)ni)->wcid;
uint32_t tmp;
@@ -887,10 +933,11 @@ rt2860_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni,
return 0;
}
-void
+static void
rt2860_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni,
uint8_t tid)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
struct rt2860_softc *sc = ic->ic_softc;
uint8_t wcid = ((struct rt2860_node *)ni)->wcid;
uint32_t tmp;
@@ -900,14 +947,16 @@ rt2860_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni,
tmp &= ~((1 << tid) << 16);
RAL_WRITE(sc, RT2860_WCID_ENTRY(wcid) + 4, tmp);
}
+#endif
-int
+static int
rt2860_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
{
- struct rt2860_softc *sc = ic->ic_if.if_softc;
+ struct rt2860_softc *sc = ic->ic_ifp->if_softc;
enum ieee80211_state ostate;
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
ostate = ic->ic_state;
if (ostate == IEEE80211_S_RUN) {
@@ -944,7 +993,7 @@ rt2860_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
rt2860_switch_chan(sc, ic->ic_bss->ni_chan);
if (ic->ic_opmode != IEEE80211_M_MONITOR) {
- rt2860_updateslot(ic);
+ rt2860_updateslot(ic->ic_ifp);
rt2860_enable_mrr(sc);
rt2860_set_txpreamble(sc);
rt2860_set_basicrates(sc);
@@ -959,7 +1008,7 @@ rt2860_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
if (ic->ic_opmode == IEEE80211_M_STA) {
/* fake a join to init the tx rate */
- rt2860_newassoc(ic, ic->ic_bss, 1);
+ rt2860_newassoc(ic->ic_bss, 1);
}
if (ic->ic_opmode != IEEE80211_M_MONITOR) {
@@ -978,7 +1027,7 @@ rt2860_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
}
/* Read 16-bit from eFUSE ROM (>=RT3071 only.) */
-uint16_t
+static uint16_t
rt3090_efuse_read_2(struct rt2860_softc *sc, uint16_t addr)
{
uint32_t tmp;
@@ -1020,13 +1069,14 @@ rt3090_efuse_read_2(struct rt2860_softc *sc, uint16_t addr)
* Read 16 bits at address 'addr' from the serial EEPROM (either 93C46,
* 93C66 or 93C86).
*/
-uint16_t
+static uint16_t
rt2860_eeprom_read_2(struct rt2860_softc *sc, uint16_t addr)
{
uint32_t tmp;
uint16_t val;
int n;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* clock C once before the first command */
RT2860_EEPROM_CTL(sc, 0);
@@ -1077,15 +1127,17 @@ rt2860_eeprom_read_2(struct rt2860_softc *sc, uint16_t addr)
static __inline uint16_t
rt2860_srom_read(struct rt2860_softc *sc, uint8_t addr)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* either eFUSE ROM or EEPROM */
return sc->sc_srom_read(sc, addr);
}
-void
+static void
rt2860_intr_coherent(struct rt2860_softc *sc)
{
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* DMA finds data coherent event when checking the DDONE bit */
DPRINTF(("Tx/Rx Coherent interrupt\n"));
@@ -1098,14 +1150,15 @@ rt2860_intr_coherent(struct rt2860_softc *sc)
(void)rt2860_txrx_enable(sc);
}
-void
+static void
rt2860_drain_stats_fifo(struct rt2860_softc *sc)
{
- struct ifnet *ifp = &sc->sc_ic.ic_if;
+ struct ifnet *ifp = &sc->sc_if;
struct ieee80211_amrr_node *amn;
uint32_t stat;
uint8_t wcid, mcs, pid;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* drain Tx status FIFO (maxsize = 16) */
while ((stat = RAL_READ(sc, RT2860_TX_STAT_FIFO)) & RT2860_TXQ_VLD) {
DPRINTFN(4, ("tx stat 0x%08x\n", stat));
@@ -1137,14 +1190,14 @@ rt2860_drain_stats_fifo(struct rt2860_softc *sc)
}
}
-void
+static void
rt2860_tx_intr(struct rt2860_softc *sc, int qid)
{
- struct ieee80211com *ic = &sc->sc_ic;
- struct ifnet *ifp = &ic->ic_if;
+ struct ifnet *ifp = &sc->sc_if;
struct rt2860_tx_ring *ring = &sc->txq[qid];
uint32_t hw;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
rt2860_drain_stats_fifo(sc);
hw = RAL_READ(sc, RT2860_TX_DTX_IDX(qid));
@@ -1157,7 +1210,7 @@ rt2860_tx_intr(struct rt2860_softc *sc, int qid)
bus_dmamap_unload(sc->sc_dmat, data->map);
m_freem(data->m);
data->m= NULL;
- ieee80211_release_node(ic, data->ni);
+ ieee80211_free_node(data->ni);
data->ni = NULL;
SLIST_INSERT_HEAD(&sc->data_pool, data, next);
@@ -1170,9 +1223,8 @@ rt2860_tx_intr(struct rt2860_softc *sc, int qid)
}
sc->sc_tx_timer = 0;
- if (ring->queued <= RT2860_TX_RING_ONEMORE)
+ if (ring->queued < RT2860_TX_RING_ONEMORE)
sc->qfullmsk &= ~(1 << qid);
- ifq_clr_oactive(&ifp->if_snd);
rt2860_start(ifp);
}
@@ -1184,6 +1236,7 @@ rt2860_maxrssi_chain(struct rt2860_softc *sc, const struct rt2860_rxwi *rxwi)
{
uint8_t rxchain = 0;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (sc->nrxchains > 1) {
if (rxwi->rssi[1] > rxwi->rssi[rxchain])
rxchain = 1;
@@ -1194,24 +1247,21 @@ rt2860_maxrssi_chain(struct rt2860_softc *sc, const struct rt2860_rxwi *rxwi)
return rxchain;
}
-void
+static void
rt2860_rx_intr(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
- struct ifnet *ifp = &ic->ic_if;
+ struct ifnet *ifp = &sc->sc_if;
struct ieee80211_frame *wh;
- struct ieee80211_rxinfo rxi;
struct ieee80211_node *ni;
struct mbuf *m, *m1;
uint32_t hw;
uint8_t ant, rssi;
int error;
-#if NBPFILTER > 0
struct rt2860_rx_radiotap_header *tap;
- struct mbuf mb;
uint16_t phy;
-#endif
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
hw = RAL_READ(sc, RT2860_FS_DRX_IDX) & 0xfff;
while (sc->rxq.cur != hw) {
struct rt2860_rx_data *data = &sc->rxq.data[sc->rxq.cur];
@@ -1233,16 +1283,14 @@ rt2860_rx_intr(struct rt2860_softc *sc)
goto skip;
}
- if (__predict_false(rxd->flags & htole32(RT2860_RX_MICERR))) {
- /* report MIC failures to net80211 for TKIP */
- ic->ic_stats.is_rx_locmicfail++;
- ieee80211_michael_mic_failure(ic, 0/* XXX */);
+ MGET(m1, M_DONTWAIT, MT_DATA);
+ if (__predict_false(m1 == NULL)) {
ifp->if_ierrors++;
goto skip;
}
-
- m1 = MCLGETI(NULL, M_DONTWAIT, NULL, MCLBYTES);
- if (__predict_false(m1 == NULL)) {
+ MCLGET(m1, M_DONTWAIT);
+ if (__predict_false((m1->m_flags & M_EXT) == 0)) {
+ m_freem(m1);
ifp->if_ierrors++;
goto skip;
}
@@ -1263,7 +1311,7 @@ rt2860_rx_intr(struct rt2860_softc *sc)
BUS_DMA_READ | BUS_DMA_NOWAIT);
if (__predict_false(error != 0)) {
panic("%s: could not load old rx mbuf",
- sc->sc_dev.dv_xname);
+ device_xname(sc->sc_dev));
}
/* physical address may have changed */
rxd->sdp0 = htole32(data->map->dm_segs[0].ds_addr);
@@ -1282,41 +1330,45 @@ rt2860_rx_intr(struct rt2860_softc *sc)
rxwi = mtod(m, struct rt2860_rxwi *);
/* finalize mbuf */
- m->m_data = (caddr_t)(rxwi + 1);
- m->m_pkthdr.len = m->m_len = letoh16(rxwi->len) & 0xfff;
+ m->m_data = (void *)(rxwi + 1);
+ m->m_pkthdr.len = m->m_len = le16toh(rxwi->len) & 0xfff;
wh = mtod(m, struct ieee80211_frame *);
- rxi.rxi_flags = 0;
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
/* frame is decrypted by hardware */
wh->i_fc[1] &= ~IEEE80211_FC1_PROTECTED;
- rxi.rxi_flags |= IEEE80211_RXI_HWDEC;
}
/* HW may insert 2 padding bytes after 802.11 header */
if (rxd->flags & htole32(RT2860_RX_L2PAD)) {
- u_int hdrlen = ieee80211_get_hdrlen(wh);
- memmove((caddr_t)wh + 2, wh, hdrlen);
+ u_int hdrlen = ieee80211_hdrspace(ic, wh);
+ memmove(wh + 2, wh, hdrlen);
m->m_data += 2;
wh = mtod(m, struct ieee80211_frame *);
}
+ if (__predict_false(rxd->flags & htole32(RT2860_RX_MICERR))) {
+ /* report MIC failures to net80211 for TKIP */
+ ieee80211_notify_michael_failure(ic, wh, 0/* XXX */);
+ ifp->if_ierrors++;
+ goto skip;
+ }
+
ant = rt2860_maxrssi_chain(sc, rxwi);
rssi = rxwi->rssi[ant];
-#if NBPFILTER > 0
if (__predict_true(sc->sc_drvbpf == NULL))
goto skipbpf;
tap = &sc->sc_rxtap;
tap->wr_flags = 0;
- tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
- tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
+ tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
+ tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
tap->wr_antsignal = rssi;
tap->wr_antenna = ant;
tap->wr_dbm_antsignal = rt2860_rssi2dbm(sc, rssi, ant);
tap->wr_rate = 2; /* in case it can't be found below */
- phy = letoh16(rxwi->phy);
+ phy = le16toh(rxwi->phy);
switch (phy & RT2860_PHY_MODE) {
case RT2860_PHY_CCK:
switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
@@ -1341,25 +1393,17 @@ rt2860_rx_intr(struct rt2860_softc *sc)
}
break;
}
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_rxtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
skipbpf:
-#endif
/* grab a reference to the source node */
- ni = ieee80211_find_rxnode(ic, wh);
+ ni = ieee80211_find_rxnode(ic,
+ (struct ieee80211_frame_min *)wh);
/* send the frame to the 802.11 layer */
- rxi.rxi_rssi = rssi;
- rxi.rxi_tstamp = 0; /* unused */
- ieee80211_input(ifp, m, ni, &rxi);
+ ieee80211_input(ic, m, ni, rssi, 0);
/* node is no longer needed */
- ieee80211_release_node(ic, ni);
+ ieee80211_free_node(ni);
skip: rxd->sdl0 &= ~htole16(RT2860_RX_DDONE);
@@ -1375,11 +1419,12 @@ skip: rxd->sdl0 &= ~htole16(RT2860_RX_DDONE);
(sc->rxq.cur - 1) % RT2860_RX_RING_COUNT);
}
-void
+static void
rt2860_tbtt_intr(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
#ifndef IEEE80211_STA_ONLY
if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
/* one less beacon until next DTIM */
@@ -1391,9 +1436,11 @@ rt2860_tbtt_intr(struct rt2860_softc *sc)
/* update dynamic parts of beacon */
rt2860_setup_beacon(sc);
+#if 0
/* flush buffered multicast frames */
if (ic->ic_dtim_count == 0)
ieee80211_notify_dtim(ic);
+#endif
}
#endif
/* check if protection mode has changed */
@@ -1403,15 +1450,16 @@ rt2860_tbtt_intr(struct rt2860_softc *sc)
}
}
-void
+static void
rt2860_gp_intr(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
DPRINTFN(2, ("GP timeout state=%d\n", ic->ic_state));
if (ic->ic_state == IEEE80211_S_SCAN)
- ieee80211_next_scan(&ic->ic_if);
+ ieee80211_next_scan(ic);
else if (ic->ic_state == IEEE80211_S_RUN)
rt2860_updatestats(sc);
}
@@ -1462,7 +1510,7 @@ rt2860_intr(void *arg)
rt2860_tbtt_intr(sc);
if (r & RT2860_MAC_INT_3) /* Auto wakeup */
- /* TBD wakeup */;
+ /* TBD wakeup */{};
if (r & RT2860_MAC_INT_4) /* GP timer */
rt2860_gp_intr(sc);
@@ -1470,7 +1518,7 @@ rt2860_intr(void *arg)
return 1;
}
-int
+static int
rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
{
struct ieee80211com *ic = &sc->sc_ic;
@@ -1486,22 +1534,23 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
uint8_t type, qsel, mcs, pid, tid, qid;
int nsegs, hasqos, ridx, ctl_ridx;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* the data pool contains at least one element, pick the first */
data = SLIST_FIRST(&sc->data_pool);
wh = mtod(m, struct ieee80211_frame *);
- hdrlen = ieee80211_get_hdrlen(wh);
+ hdrlen = ieee80211_hdrspace(ic, wh);
type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
if ((hasqos = ieee80211_has_qos(wh))) {
qos = ieee80211_get_qos(wh);
tid = qos & IEEE80211_QOS_TID;
- qid = ieee80211_up_to_ac(ic, tid);
+ qid = TID_TO_WME_AC(tid);
} else {
qos = 0;
tid = 0;
qid = (type == IEEE80211_FC0_TYPE_MGT) ?
- sc->mgtqid : EDCA_AC_BE;
+ sc->mgtqid : WME_AC_BE;
}
ring = &sc->txq[qid];
@@ -1558,8 +1607,8 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
txwi->txop = RT2860_TX_TXOP_BACKOFF;
if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
- (!hasqos || (qos & IEEE80211_QOS_ACK_POLICY_MASK) !=
- IEEE80211_QOS_ACK_POLICY_NOACK)) {
+ (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
+ IEEE80211_QOS_ACKPOLICY_NOACK)) {
txwi->xflags |= RT2860_TX_ACK;
if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
@@ -1577,10 +1626,8 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
txwi->flags |= RT2860_TX_TS;
#endif
-#if NBPFILTER > 0
if (__predict_false(sc->sc_drvbpf != NULL)) {
struct rt2860_tx_radiotap_header *tap = &sc->sc_txtap;
- struct mbuf mb;
tap->wt_flags = 0;
tap->wt_rate = rt2860_rates[ridx].rate;
@@ -1590,22 +1637,14 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
if (mcs & RT2860_PHY_SHPRE)
tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_txtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
+ bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m);
}
-#endif
/* copy and trim 802.11 header */
memcpy(txwi + 1, wh, hdrlen);
m_adj(m, hdrlen);
KASSERT (ring->queued <= RT2860_TX_RING_ONEMORE); /* <1> */
-
if (bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m, BUS_DMA_NOWAIT)) {
if (m_defrag(m, M_DONTWAIT))
return (ENOBUFS);
@@ -1626,7 +1665,7 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
* TX_RING_MAX
*/
- qsel = (qid < EDCA_NUM_AC) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_MGMT;
+ qsel = (qid < WME_NUM_AC) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_MGMT;
/* first segment is TXWI + 802.11 header */
txd = &ring->txd[ring->cur];
@@ -1664,7 +1703,7 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
ring->data[ring->cur] = data;
bus_dmamap_sync(sc->sc_dmat, sc->txwi_map,
- (caddr_t)txwi - sc->txwi_vaddr, RT2860_TXWI_DMASZ,
+ (uintptr_t)txwi - (uintptr_t)sc->txwi_vaddr, RT2860_TXWI_DMASZ,
BUS_DMASYNC_PREWRITE);
bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
BUS_DMASYNC_PREWRITE);
@@ -1685,56 +1724,65 @@ rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
return 0;
}
-void
+static void
rt2860_start(struct ifnet *ifp)
{
struct rt2860_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
+ struct ether_header *eh;
struct ieee80211_node *ni;
struct mbuf *m;
- if (!(ifp->if_flags & IFF_RUNNING) || ifq_is_oactive(&ifp->if_snd))
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
+ if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
return;
for (;;) {
if (SLIST_EMPTY(&sc->data_pool) || sc->qfullmsk != 0) {
- ifq_set_oactive(&ifp->if_snd);
+ ifp->if_flags |= IFF_OACTIVE;
break;
}
/* send pending management frames first */
- m = mq_dequeue(&ic->ic_mgtq);
+ IF_DEQUEUE(&ic->ic_mgtq, m);
if (m != NULL) {
- ni = m->m_pkthdr.ph_cookie;
+ ni = (void *)m->m_pkthdr.rcvif;
+ m->m_pkthdr.rcvif = NULL;
goto sendit;
}
if (ic->ic_state != IEEE80211_S_RUN)
break;
- /* send buffered frames for power-save mode */
- m = mq_dequeue(&ic->ic_pwrsaveq);
- if (m != NULL) {
- ni = m->m_pkthdr.ph_cookie;
- goto sendit;
- }
-
/* encapsulate and send data frames */
IFQ_DEQUEUE(&ifp->if_snd, m);
if (m == NULL)
break;
-#if NBPFILTER > 0
- if (ifp->if_bpf != NULL)
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
-#endif
- if ((m = ieee80211_encap(ifp, m, &ni)) == NULL)
+ if (m->m_len < (int)sizeof(*eh) &&
+ (m = m_pullup(m, sizeof(*eh))) == NULL) {
+ ifp->if_oerrors++;
continue;
+ }
+
+ eh = mtod(m, struct ether_header *);
+ ni = ieee80211_find_txnode(ic, eh->ether_dhost);
+ if (ni == NULL) {
+ m_freem(m);
+ ifp->if_oerrors++;
+ continue;
+ }
+
+ bpf_mtap(ifp, m);
+
+ if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
+ ieee80211_free_node(ni);
+ ifp->if_oerrors++;
+ continue;
+ }
sendit:
-#if NBPFILTER > 0
- if (ic->ic_rawbpf != NULL)
- bpf_mtap(ic->ic_rawbpf, m, BPF_DIRECTION_OUT);
-#endif
+ bpf_mtap3(ic->ic_rawbpf, m);
+
if (rt2860_tx(sc, m, ni) != 0) {
m_freem(m);
- ieee80211_release_node(ic, ni);
+ ieee80211_free_node(ni);
ifp->if_oerrors++;
continue;
}
@@ -1744,16 +1792,18 @@ sendit:
}
}
-void
+static void
rt2860_watchdog(struct ifnet *ifp)
{
struct rt2860_softc *sc = ifp->if_softc;
+ struct ieee80211com *ic = &sc->sc_ic;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
ifp->if_timer = 0;
if (sc->sc_tx_timer > 0) {
if (--sc->sc_tx_timer == 0) {
- printf("%s: device timeout\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "device timeout\n");
rt2860_stop(ifp, 0);
rt2860_init(ifp);
ifp->if_oerrors++;
@@ -1762,62 +1812,47 @@ rt2860_watchdog(struct ifnet *ifp)
ifp->if_timer = 1;
}
- ieee80211_watchdog(ifp);
+ ieee80211_watchdog(ic);
}
-int
-rt2860_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+static int
+rt2860_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct rt2860_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
- struct ifreq *ifr;
int s, error = 0;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
- ifp->if_flags |= IFF_UP;
- /* FALLTHROUGH */
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (!(ifp->if_flags & IFF_RUNNING))
- rt2860_init(ifp);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- rt2860_stop(ifp, 1);
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_UP|IFF_RUNNING:
+ break;
+ case IFF_UP:
+ rt2860_init(ifp);
+ break;
+ case IFF_RUNNING:
+ rt2860_stop(ifp, 1);
+ break;
+ case 0:
+ break;
}
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
- ifr = (struct ifreq *)data;
- error = (cmd == SIOCADDMULTI) ?
- ether_addmulti(ifr, &ic->ic_ac) :
- ether_delmulti(ifr, &ic->ic_ac);
-
- if (error == ENETRESET)
- error = 0;
- break;
-
- case SIOCS80211CHANNEL:
- /*
- * This allows for fast channel switching in monitor mode
- * (used by kismet). In IBSS mode, we must explicitly reset
- * the interface to generate a new beacon frame.
- */
- error = ieee80211_ioctl(ifp, cmd, data);
- if (error == ENETRESET &&
- ic->ic_opmode == IEEE80211_M_MONITOR) {
- if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
- (IFF_UP | IFF_RUNNING))
- rt2860_switch_chan(sc, ic->ic_ibss_chan);
+ if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
+ /* setup multicast filter, etc */
error = 0;
}
break;
default:
- error = ieee80211_ioctl(ifp, cmd, data);
+ error = ieee80211_ioctl(ic, cmd, data);
}
if (error == ENETRESET) {
@@ -1839,19 +1874,20 @@ rt2860_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
* We access the BBP through the 8051 microcontroller unit which means that
* the microcode must be loaded first.
*/
-void
+static void
rt2860_mcu_bbp_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val)
{
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (ntries = 0; ntries < 100; ntries++) {
if (!(RAL_READ(sc, RT2860_H2M_BBPAGENT) & RT2860_BBP_CSR_KICK))
break;
DELAY(1);
}
if (ntries == 100) {
- printf("%s: could not write to BBP through MCU\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not write to BBP through MCU\n");
return;
}
@@ -1863,20 +1899,21 @@ rt2860_mcu_bbp_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val)
DELAY(1000);
}
-uint8_t
+static uint8_t
rt2860_mcu_bbp_read(struct rt2860_softc *sc, uint8_t reg)
{
uint32_t val;
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (ntries = 0; ntries < 100; ntries++) {
if (!(RAL_READ(sc, RT2860_H2M_BBPAGENT) & RT2860_BBP_CSR_KICK))
break;
DELAY(1);
}
if (ntries == 100) {
- printf("%s: could not read from BBP through MCU\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not read from BBP through MCU\n");
return 0;
}
@@ -1893,8 +1930,7 @@ rt2860_mcu_bbp_read(struct rt2860_softc *sc, uint8_t reg)
return val & 0xff;
DELAY(1);
}
- printf("%s: could not read from BBP through MCU\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not read from BBP through MCU\n");
return 0;
}
@@ -1902,19 +1938,20 @@ rt2860_mcu_bbp_read(struct rt2860_softc *sc, uint8_t reg)
/*
* Write to one of the 4 programmable 24-bit RF registers.
*/
-void
+static void
rt2860_rf_write(struct rt2860_softc *sc, uint8_t reg, uint32_t val)
{
uint32_t tmp;
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (ntries = 0; ntries < 100; ntries++) {
if (!(RAL_READ(sc, RT2860_RF_CSR_CFG0) & RT2860_RF_REG_CTRL))
break;
DELAY(1);
}
if (ntries == 100) {
- printf("%s: could not write to RF\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not write to RF\n");
return;
}
@@ -1924,20 +1961,20 @@ rt2860_rf_write(struct rt2860_softc *sc, uint8_t reg, uint32_t val)
RAL_WRITE(sc, RT2860_RF_CSR_CFG0, tmp);
}
-uint8_t
+static uint8_t
rt3090_rf_read(struct rt2860_softc *sc, uint8_t reg)
{
uint32_t tmp;
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (ntries = 0; ntries < 100; ntries++) {
if (!(RAL_READ(sc, RT3070_RF_CSR_CFG) & RT3070_RF_KICK))
break;
DELAY(1);
}
if (ntries == 100) {
- printf("%s: could not read RF register\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not read RF register\n");
return 0xff;
}
tmp = RT3070_RF_KICK | reg << 8;
@@ -1950,14 +1987,13 @@ rt3090_rf_read(struct rt2860_softc *sc, uint8_t reg)
DELAY(1);
}
if (ntries == 100) {
- printf("%s: could not read RF register\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not read RF register\n");
return 0xff;
}
return tmp & 0xff;
}
-void
+static void
rt3090_rf_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val)
{
uint32_t tmp;
@@ -1969,7 +2005,7 @@ rt3090_rf_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val)
DELAY(10);
}
if (ntries == 10) {
- printf("%s: could not write to RF\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "could not write to RF\n");
return;
}
@@ -1980,13 +2016,14 @@ rt3090_rf_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val)
/*
* Send a command to the 8051 microcontroller unit.
*/
-int
+static int
rt2860_mcu_cmd(struct rt2860_softc *sc, uint8_t cmd, uint16_t arg, int wait)
{
int slot, ntries;
uint32_t tmp;
uint8_t cid;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
for (ntries = 0; ntries < 100; ntries++) {
if (!(RAL_READ(sc, RT2860_H2M_MAILBOX) & RT2860_H2M_BUSY))
break;
@@ -2030,9 +2067,10 @@ rt2860_mcu_cmd(struct rt2860_softc *sc, uint8_t cmd, uint16_t arg, int wait)
return (tmp == 1) ? 0 : EIO;
}
-void
+static void
rt2860_enable_mrr(struct rt2860_softc *sc)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
#define CCK(mcs) (mcs)
#define OFDM(mcs) (1 << 3 | (mcs))
RAL_WRITE(sc, RT2860_LG_FBK_CFG0,
@@ -2054,11 +2092,12 @@ rt2860_enable_mrr(struct rt2860_softc *sc)
#undef CCK
}
-void
+static void
rt2860_set_txpreamble(struct rt2860_softc *sc)
{
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
tmp = RAL_READ(sc, RT2860_AUTO_RSP_CFG);
tmp &= ~RT2860_CCK_SHORT_EN;
if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
@@ -2066,11 +2105,12 @@ rt2860_set_txpreamble(struct rt2860_softc *sc)
RAL_WRITE(sc, RT2860_AUTO_RSP_CFG, tmp);
}
-void
+static void
rt2860_set_basicrates(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* set basic rates mask */
if (ic->ic_curmode == IEEE80211_MODE_11B)
RAL_WRITE(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
@@ -2080,12 +2120,13 @@ rt2860_set_basicrates(struct rt2860_softc *sc)
RAL_WRITE(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
}
-void
+static void
rt2860_select_chan_group(struct rt2860_softc *sc, int group)
{
uint32_t tmp;
uint8_t agc;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
rt2860_mcu_bbp_write(sc, 62, 0x37 - sc->lna[group]);
rt2860_mcu_bbp_write(sc, 63, 0x37 - sc->lna[group]);
rt2860_mcu_bbp_write(sc, 64, 0x37 - sc->lna[group]);
@@ -2174,7 +2215,7 @@ rt2860_select_chan_group(struct rt2860_softc *sc, int group)
DELAY(1000);
}
-void
+static void
rt2860_set_chan(struct rt2860_softc *sc, u_int chan)
{
const struct rfprog *rfprog = rt2860_rf2850;
@@ -2182,6 +2223,7 @@ rt2860_set_chan(struct rt2860_softc *sc, u_int chan)
int8_t txpow1, txpow2;
u_int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* find the settings for this channel (we know it exists) */
for (i = 0; rfprog[i].chan != chan; i++);
@@ -2229,13 +2271,14 @@ rt2860_set_chan(struct rt2860_softc *sc, u_int chan)
rt2860_rf_write(sc, RT2860_RF4, r4);
}
-void
+static void
rt3090_set_chan(struct rt2860_softc *sc, u_int chan)
{
int8_t txpow1, txpow2;
uint8_t rf;
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
KASSERT(chan >= 1 && chan <= 14); /* RT3090 is 2GHz only */
/* find the settings for this channel (we know it exists) */
@@ -2293,13 +2336,14 @@ rt3090_set_chan(struct rt2860_softc *sc, u_int chan)
rt3090_rf_write(sc, 7, rf | RT3070_TUNE);
}
-int
+static int
rt3090_rf_init(struct rt2860_softc *sc)
{
uint32_t tmp;
uint8_t rf, bbp;
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
rf = rt3090_rf_read(sc, 30);
/* toggle RF R30 bit 7 */
rt3090_rf_write(sc, 30, rf | 0x80);
@@ -2320,12 +2364,12 @@ rt3090_rf_init(struct rt2860_softc *sc)
/* initialize RF registers to default value */
if (sc->mac_ver == 0x3572) {
- for (i = 0; i < nitems(rt3572_def_rf); i++) {
+ for (i = 0; i < (int)__arraycount(rt3572_def_rf); i++) {
rt3090_rf_write(sc, rt3572_def_rf[i].reg,
rt3572_def_rf[i].val);
}
} else {
- for (i = 0; i < nitems(rt3090_def_rf); i++) {
+ for (i = 0; i < (int)__arraycount(rt3090_def_rf); i++) {
rt3090_rf_write(sc, rt3090_def_rf[i].reg,
rt3090_def_rf[i].val);
}
@@ -2408,12 +2452,13 @@ rt3090_rf_init(struct rt2860_softc *sc)
return 0;
}
-void
+static void
rt3090_rf_wakeup(struct rt2860_softc *sc)
{
uint32_t tmp;
uint8_t rf;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (sc->mac_ver == 0x3593) {
/* enable VCO */
rf = rt3090_rf_read(sc, 1);
@@ -2474,7 +2519,7 @@ rt3090_rf_wakeup(struct rt2860_softc *sc)
}
}
-int
+static int
rt3090_filter_calib(struct rt2860_softc *sc, uint8_t init, uint8_t target,
uint8_t *val)
{
@@ -2482,6 +2527,7 @@ rt3090_filter_calib(struct rt2860_softc *sc, uint8_t init, uint8_t target,
uint8_t bbp55_pb, bbp55_sb, delta;
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* program filter */
rf24 = rt3090_rf_read(sc, 24);
rf24 = (rf24 & 0xc0) | init; /* initial filter value */
@@ -2539,12 +2585,13 @@ rt3090_filter_calib(struct rt2860_softc *sc, uint8_t init, uint8_t target,
return 0;
}
-void
+static void
rt3090_rf_setup(struct rt2860_softc *sc)
{
uint8_t bbp;
int i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (sc->mac_rev >= 0x0211) {
/* enable DC filter */
rt2860_mcu_bbp_write(sc, 103, 0xc0);
@@ -2569,9 +2616,10 @@ rt3090_rf_setup(struct rt2860_softc *sc)
}
}
-void
+static void
rt2860_set_leds(struct rt2860_softc *sc, uint16_t which)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
rt2860_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
which | (sc->leds & 0x7f), 0);
}
@@ -2580,11 +2628,12 @@ rt2860_set_leds(struct rt2860_softc *sc, uint16_t which)
* Hardware has a general-purpose programmable timer interrupt that can
* periodically raise MAC_INT_4.
*/
-void
+static void
rt2860_set_gp_timer(struct rt2860_softc *sc, int ms)
{
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* disable GP timer before reprogramming it */
tmp = RAL_READ(sc, RT2860_INT_TIMER_EN);
RAL_WRITE(sc, RT2860_INT_TIMER_EN, tmp & ~RT2860_GP_TIMER_EN);
@@ -2602,42 +2651,47 @@ rt2860_set_gp_timer(struct rt2860_softc *sc, int ms)
RAL_WRITE(sc, RT2860_INT_TIMER_EN, tmp | RT2860_GP_TIMER_EN);
}
-void
+static void
rt2860_set_bssid(struct rt2860_softc *sc, const uint8_t *bssid)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
RAL_WRITE(sc, RT2860_MAC_BSSID_DW0,
bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
RAL_WRITE(sc, RT2860_MAC_BSSID_DW1,
bssid[4] | bssid[5] << 8);
}
-void
+static void
rt2860_set_macaddr(struct rt2860_softc *sc, const uint8_t *addr)
{
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
RAL_WRITE(sc, RT2860_MAC_ADDR_DW0,
addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
RAL_WRITE(sc, RT2860_MAC_ADDR_DW1,
addr[4] | addr[5] << 8 | 0xff << 16);
}
-void
-rt2860_updateslot(struct ieee80211com *ic)
+static void
+rt2860_updateslot(struct ifnet *ifp)
{
- struct rt2860_softc *sc = ic->ic_softc;
+ struct rt2860_softc *sc = ifp->if_softc;
+ struct ieee80211com *ic = &sc->sc_ic;
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
tmp = RAL_READ(sc, RT2860_BKOFF_SLOT_CFG);
tmp &= ~0xff;
tmp |= (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
RAL_WRITE(sc, RT2860_BKOFF_SLOT_CFG, tmp);
}
-void
+static void
rt2860_updateprot(struct ieee80211com *ic)
{
- struct rt2860_softc *sc = ic->ic_softc;
+ struct rt2860_softc *sc = ic->ic_ifp->if_softc;
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
/* setup protection frame rate (MCS code) */
tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
@@ -2656,138 +2710,138 @@ rt2860_updateprot(struct ieee80211com *ic)
RAL_WRITE(sc, RT2860_OFDM_PROT_CFG, tmp);
}
-void
+static int
rt2860_updateedca(struct ieee80211com *ic)
{
- struct rt2860_softc *sc = ic->ic_softc;
+ struct rt2860_softc *sc = ic->ic_ifp->if_softc;
int aci;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* update MAC TX configuration registers */
- for (aci = 0; aci < EDCA_NUM_AC; aci++) {
+ for (aci = 0; aci < WME_NUM_AC; aci++) {
RAL_WRITE(sc, RT2860_EDCA_AC_CFG(aci),
- ic->ic_edca_ac[aci].ac_ecwmax << 16 |
- ic->ic_edca_ac[aci].ac_ecwmin << 12 |
- ic->ic_edca_ac[aci].ac_aifsn << 8 |
- ic->ic_edca_ac[aci].ac_txoplimit);
+ ic->ic_wme.wme_params[aci].wmep_logcwmax << 16 |
+ ic->ic_wme.wme_params[aci].wmep_logcwmin << 12 |
+ ic->ic_wme.wme_params[aci].wmep_aifsn << 8 |
+ ic->ic_wme.wme_params[aci].wmep_txopLimit);
}
/* update SCH/DMA registers too */
RAL_WRITE(sc, RT2860_WMM_AIFSN_CFG,
- ic->ic_edca_ac[EDCA_AC_VO].ac_aifsn << 12 |
- ic->ic_edca_ac[EDCA_AC_VI].ac_aifsn << 8 |
- ic->ic_edca_ac[EDCA_AC_BK].ac_aifsn << 4 |
- ic->ic_edca_ac[EDCA_AC_BE].ac_aifsn);
+ ic->ic_wme.wme_params[WME_AC_VO].wmep_aifsn << 12 |
+ ic->ic_wme.wme_params[WME_AC_VI].wmep_aifsn << 8 |
+ ic->ic_wme.wme_params[WME_AC_BK].wmep_aifsn << 4 |
+ ic->ic_wme.wme_params[WME_AC_BE].wmep_aifsn);
RAL_WRITE(sc, RT2860_WMM_CWMIN_CFG,
- ic->ic_edca_ac[EDCA_AC_VO].ac_ecwmin << 12 |
- ic->ic_edca_ac[EDCA_AC_VI].ac_ecwmin << 8 |
- ic->ic_edca_ac[EDCA_AC_BK].ac_ecwmin << 4 |
- ic->ic_edca_ac[EDCA_AC_BE].ac_ecwmin);
+ ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmin << 12 |
+ ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmin << 8 |
+ ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmin << 4 |
+ ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmin);
RAL_WRITE(sc, RT2860_WMM_CWMAX_CFG,
- ic->ic_edca_ac[EDCA_AC_VO].ac_ecwmax << 12 |
- ic->ic_edca_ac[EDCA_AC_VI].ac_ecwmax << 8 |
- ic->ic_edca_ac[EDCA_AC_BK].ac_ecwmax << 4 |
- ic->ic_edca_ac[EDCA_AC_BE].ac_ecwmax);
+ ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmax << 12 |
+ ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmax << 8 |
+ ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmax << 4 |
+ ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmax);
RAL_WRITE(sc, RT2860_WMM_TXOP0_CFG,
- ic->ic_edca_ac[EDCA_AC_BK].ac_txoplimit << 16 |
- ic->ic_edca_ac[EDCA_AC_BE].ac_txoplimit);
+ ic->ic_wme.wme_params[WME_AC_BK].wmep_txopLimit << 16 |
+ ic->ic_wme.wme_params[WME_AC_BE].wmep_txopLimit);
RAL_WRITE(sc, RT2860_WMM_TXOP1_CFG,
- ic->ic_edca_ac[EDCA_AC_VO].ac_txoplimit << 16 |
- ic->ic_edca_ac[EDCA_AC_VI].ac_txoplimit);
+ ic->ic_wme.wme_params[WME_AC_VO].wmep_txopLimit << 16 |
+ ic->ic_wme.wme_params[WME_AC_VI].wmep_txopLimit);
+ return 0;
}
-int
-rt2860_set_key(struct ieee80211com *ic, struct ieee80211_node *ni,
- struct ieee80211_key *k)
+static int
+rt2860_set_key(struct ieee80211com *ic, const struct ieee80211_key *ck,
+ const uint8_t *mac)
{
- struct rt2860_softc *sc = ic->ic_softc;
+ struct rt2860_softc *sc = ic->ic_ifp->if_softc;
+ struct ieee80211_node *ni = ic->ic_bss;
bus_size_t base;
uint32_t attr;
uint8_t mode, wcid, iv[8];
+ struct ieee80211_key *k = __UNCONST(ck); /* XXX */
- /* defer setting of WEP keys until interface is brought up */
- if ((ic->ic_if.if_flags & (IFF_UP | IFF_RUNNING)) !=
- (IFF_UP | IFF_RUNNING))
- return 0;
-
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* map net80211 cipher to RT2860 security mode */
- switch (k->k_cipher) {
- case IEEE80211_CIPHER_WEP40:
- mode = RT2860_MODE_WEP40;
- break;
- case IEEE80211_CIPHER_WEP104:
- mode = RT2860_MODE_WEP104;
+ switch (k->wk_cipher->ic_cipher) {
+ case IEEE80211_CIPHER_WEP:
+ k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
+ if (k->wk_keylen == 5)
+ mode = RT2860_MODE_WEP40;
+ else
+ mode = RT2860_MODE_WEP104;
break;
case IEEE80211_CIPHER_TKIP:
mode = RT2860_MODE_TKIP;
break;
- case IEEE80211_CIPHER_CCMP:
+ case IEEE80211_CIPHER_AES_CCM:
mode = RT2860_MODE_AES_CCMP;
break;
default:
return EINVAL;
}
- if (k->k_flags & IEEE80211_KEY_GROUP) {
+ if (k->wk_flags & IEEE80211_KEY_GROUP) {
wcid = 0; /* NB: update WCID0 for group keys */
- base = RT2860_SKEY(0, k->k_id);
+ base = RT2860_SKEY(0, k->wk_keyix);
} else {
wcid = ((struct rt2860_node *)ni)->wcid;
base = RT2860_PKEY(wcid);
}
- if (k->k_cipher == IEEE80211_CIPHER_TKIP) {
- RAL_WRITE_REGION_1(sc, base, k->k_key, 16);
+ if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
+ RAL_WRITE_REGION_1(sc, base, k->wk_key, 16);
#ifndef IEEE80211_STA_ONLY
if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
- RAL_WRITE_REGION_1(sc, base + 16, &k->k_key[16], 8);
- RAL_WRITE_REGION_1(sc, base + 24, &k->k_key[24], 8);
+ RAL_WRITE_REGION_1(sc, base + 16, &k->wk_key[16], 8);
+ RAL_WRITE_REGION_1(sc, base + 24, &k->wk_key[24], 8);
} else
#endif
{
- RAL_WRITE_REGION_1(sc, base + 16, &k->k_key[24], 8);
- RAL_WRITE_REGION_1(sc, base + 24, &k->k_key[16], 8);
+ RAL_WRITE_REGION_1(sc, base + 16, &k->wk_key[24], 8);
+ RAL_WRITE_REGION_1(sc, base + 24, &k->wk_key[16], 8);
}
} else
- RAL_WRITE_REGION_1(sc, base, k->k_key, k->k_len);
+ RAL_WRITE_REGION_1(sc, base, k->wk_key, k->wk_keylen);
- if (!(k->k_flags & IEEE80211_KEY_GROUP) ||
- (k->k_flags & IEEE80211_KEY_TX)) {
+ if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
+ (k->wk_flags & IEEE80211_KEY_XMIT)) {
/* set initial packet number in IV+EIV */
- if (k->k_cipher == IEEE80211_CIPHER_WEP40 ||
- k->k_cipher == IEEE80211_CIPHER_WEP104) {
- uint32_t val = arc4random();
+ if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) {
+ uint32_t val = cprng_fast32();
/* skip weak IVs from Fluhrer/Mantin/Shamir */
if (val >= 0x03ff00 && (val & 0xf8ff00) == 0x00ff00)
val += 0x000100;
iv[0] = val;
iv[1] = val >> 8;
iv[2] = val >> 16;
- iv[3] = k->k_id << 6;
+ iv[3] = k->wk_keyix << 6;
iv[4] = iv[5] = iv[6] = iv[7] = 0;
} else {
- if (k->k_cipher == IEEE80211_CIPHER_TKIP) {
- iv[0] = k->k_tsc >> 8;
+ if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
+ iv[0] = k->wk_keytsc >> 8;
iv[1] = (iv[0] | 0x20) & 0x7f;
- iv[2] = k->k_tsc;
+ iv[2] = k->wk_keytsc;
} else /* CCMP */ {
- iv[0] = k->k_tsc;
- iv[1] = k->k_tsc >> 8;
+ iv[0] = k->wk_keytsc;
+ iv[1] = k->wk_keytsc >> 8;
iv[2] = 0;
}
- iv[3] = k->k_id << 6 | IEEE80211_WEP_EXTIV;
- iv[4] = k->k_tsc >> 16;
- iv[5] = k->k_tsc >> 24;
- iv[6] = k->k_tsc >> 32;
- iv[7] = k->k_tsc >> 40;
+ iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
+ iv[4] = k->wk_keytsc >> 16;
+ iv[5] = k->wk_keytsc >> 24;
+ iv[6] = k->wk_keytsc >> 32;
+ iv[7] = k->wk_keytsc >> 40;
}
RAL_WRITE_REGION_1(sc, RT2860_IVEIV(wcid), iv, 8);
}
- if (k->k_flags & IEEE80211_KEY_GROUP) {
+ if (k->wk_flags & IEEE80211_KEY_GROUP) {
/* install group key */
attr = RAL_READ(sc, RT2860_SKEY_MODE_0_7);
- attr &= ~(0xf << (k->k_id * 4));
- attr |= mode << (k->k_id * 4);
+ attr &= ~(0xf << (k->wk_keyix * 4));
+ attr |= mode << (k->wk_keyix * 4);
RAL_WRITE(sc, RT2860_SKEY_MODE_0_7, attr);
} else {
/* install pairwise key */
@@ -2795,21 +2849,22 @@ rt2860_set_key(struct ieee80211com *ic, struct ieee80211_node *ni,
attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
RAL_WRITE(sc, RT2860_WCID_ATTR(wcid), attr);
}
- return 0;
+ return 1;
}
-void
-rt2860_delete_key(struct ieee80211com *ic, struct ieee80211_node *ni,
- struct ieee80211_key *k)
+static int
+rt2860_delete_key(struct ieee80211com *ic, const struct ieee80211_key *k)
{
- struct rt2860_softc *sc = ic->ic_softc;
+ struct rt2860_softc *sc = ic->ic_ifp->if_softc;
+ struct ieee80211_node *ni = ic->ic_bss;
uint32_t attr;
uint8_t wcid;
- if (k->k_flags & IEEE80211_KEY_GROUP) {
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
+ if (k->wk_flags & IEEE80211_KEY_GROUP) {
/* remove group key */
attr = RAL_READ(sc, RT2860_SKEY_MODE_0_7);
- attr &= ~(0xf << (k->k_id * 4));
+ attr &= ~(0xf << (k->wk_keyix * 4));
RAL_WRITE(sc, RT2860_SKEY_MODE_0_7, attr);
} else {
@@ -2819,16 +2874,17 @@ rt2860_delete_key(struct ieee80211com *ic, struct ieee80211_node *ni,
attr &= ~0xf;
RAL_WRITE(sc, RT2860_WCID_ATTR(wcid), attr);
}
+ return 1;
}
-#if NBPFILTER > 0
-int8_t
+static int8_t
rt2860_rssi2dbm(struct rt2860_softc *sc, uint8_t rssi, uint8_t rxchain)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211_channel *c = ic->ic_ibss_chan;
int delta;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (IEEE80211_IS_CHAN_5GHZ(c)) {
u_int chan = ieee80211_chan2ieee(ic, c);
delta = sc->rssi_5ghz[rxchain];
@@ -2845,7 +2901,6 @@ rt2860_rssi2dbm(struct rt2860_softc *sc, uint8_t rssi, uint8_t rxchain)
return -12 - delta - rssi;
}
-#endif
/*
* Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
@@ -2856,6 +2911,7 @@ b4inc(uint32_t b32, int8_t delta)
{
int8_t i, b4;
+ aprint_normal("in %s\n", __func__);
for (i = 0; i < 8; i++) {
b4 = b32 & 0xf;
b4 += delta;
@@ -2868,9 +2924,10 @@ b4inc(uint32_t b32, int8_t delta)
return b32;
}
-const char *
+static const char *
rt2860_get_rf(uint8_t rev)
{
+ aprint_normal("in %s\n", __func__);
switch (rev) {
case RT2860_RF_2820: return "RT2820";
case RT2860_RF_2850: return "RT2850";
@@ -2887,7 +2944,7 @@ rt2860_get_rf(uint8_t rev)
}
}
-int
+static int
rt2860_read_eeprom(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
@@ -2896,6 +2953,7 @@ rt2860_read_eeprom(struct rt2860_softc *sc)
uint16_t val;
int ridx, ant, i;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* check whether the ROM is eFUSE ROM or EEPROM */
sc->sc_srom_read = rt2860_eeprom_read_2;
if (sc->mac_ver >= 0x3071) {
@@ -3201,11 +3259,12 @@ rt2860_read_eeprom(struct rt2860_softc *sc)
return 0;
}
-int
+static int
rt2860_bbp_init(struct rt2860_softc *sc)
{
int i, ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* wait for BBP to wake up */
for (ntries = 0; ntries < 20; ntries++) {
uint8_t bbp0 = rt2860_mcu_bbp_read(sc, 0);
@@ -3213,13 +3272,13 @@ rt2860_bbp_init(struct rt2860_softc *sc)
break;
}
if (ntries == 20) {
- printf("%s: timeout waiting for BBP to wake up\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "timeout waiting for BBP to wake up\n");
return ETIMEDOUT;
}
/* initialize BBP registers to default values */
- for (i = 0; i < nitems(rt2860_def_bbp); i++) {
+ for (i = 0; i < (int)__arraycount(rt2860_def_bbp); i++) {
rt2860_mcu_bbp_write(sc, rt2860_def_bbp[i].reg,
rt2860_def_bbp[i].val);
}
@@ -3240,12 +3299,13 @@ rt2860_bbp_init(struct rt2860_softc *sc)
return 0;
}
-int
+static int
rt2860_txrx_enable(struct rt2860_softc *sc)
{
uint32_t tmp;
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* enable Tx/Rx DMA engine */
RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
RAL_BARRIER_READ_WRITE(sc);
@@ -3256,8 +3316,8 @@ rt2860_txrx_enable(struct rt2860_softc *sc)
DELAY(1000);
}
if (ntries == 200) {
- printf("%s: timeout waiting for DMA engine\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "timeout waiting for DMA engine\n");
return ETIMEDOUT;
}
@@ -3285,7 +3345,7 @@ rt2860_txrx_enable(struct rt2860_softc *sc)
return 0;
}
-int
+static int
rt2860_init(struct ifnet *ifp)
{
struct rt2860_softc *sc = ifp->if_softc;
@@ -3294,11 +3354,12 @@ rt2860_init(struct ifnet *ifp)
uint8_t bbp1, bbp3;
int i, qid, ridx, ntries, error;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* for CardBus, power on the socket */
if (!(sc->sc_flags & RT2860_ENABLED)) {
if (sc->sc_enable != NULL && (*sc->sc_enable)(sc) != 0) {
- printf("%s: could not enable device\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not enable device\n");
return EIO;
}
sc->sc_flags |= RT2860_ENABLED;
@@ -3307,8 +3368,8 @@ rt2860_init(struct ifnet *ifp)
if (sc->rfswitch) {
/* hardware has a radio switch on GPIO pin 2 */
if (!(RAL_READ(sc, RT2860_GPIO_CTRL) & (1 << 2))) {
- printf("%s: radio is disabled by hardware switch\n",
- sc->sc_dev.dv_xname);
+ aprint_normal_dev(sc->sc_dev,
+ "radio is disabled by hardware switch\n");
#ifdef notyet
rt2860_stop(ifp, 1);
return EPERM;
@@ -3328,13 +3389,13 @@ rt2860_init(struct ifnet *ifp)
RAL_WRITE(sc, RT2860_SYS_CTRL, 0xe00);
if ((error = rt2860_load_microcode(sc)) != 0) {
- printf("%s: could not load 8051 microcode\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "could not load 8051 microcode\n");
rt2860_stop(ifp, 1);
return error;
}
- IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl));
+ IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
rt2860_set_macaddr(sc, ic->ic_myaddr);
/* init Tx power for all Tx rates (from EEPROM) */
@@ -3351,8 +3412,8 @@ rt2860_init(struct ifnet *ifp)
DELAY(1000);
}
if (ntries == 100) {
- printf("%s: timeout waiting for DMA engine\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "timeout waiting for DMA engine\n");
rt2860_stop(ifp, 1);
return ETIMEDOUT;
}
@@ -3373,7 +3434,7 @@ rt2860_init(struct ifnet *ifp)
RAL_BARRIER_WRITE(sc);
RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, 0);
- for (i = 0; i < nitems(rt2860_def_mac); i++)
+ for (i = 0; i < (int)__arraycount(rt2860_def_mac); i++)
RAL_WRITE(sc, rt2860_def_mac[i].reg, rt2860_def_mac[i].val);
if (sc->mac_ver >= 0x3071) {
/* set delay of PA_PE assertion to 1us (unit of 0.25us) */
@@ -3397,7 +3458,7 @@ rt2860_init(struct ifnet *ifp)
DELAY(1000);
}
if (ntries == 100) {
- printf("%s: timeout waiting for MAC\n", sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev, "timeout waiting for MAC\n");
rt2860_stop(ifp, 1);
return ETIMEDOUT;
}
@@ -3450,8 +3511,8 @@ rt2860_init(struct ifnet *ifp)
DELAY(1000);
}
if (ntries == 100) {
- printf("%s: timeout waiting for DMA engine\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "timeout waiting for DMA engine\n");
rt2860_stop(ifp, 1);
return ETIMEDOUT;
}
@@ -3545,13 +3606,7 @@ rt2860_init(struct ifnet *ifp)
rt2860_mcu_cmd(sc, RT2860_MCU_CMD_PSLEVEL, sc->pslevel, 0);
ifp->if_flags |= IFF_RUNNING;
- ifq_clr_oactive(&ifp->if_snd);
-
- if (ic->ic_flags & IEEE80211_F_WEPON) {
- /* install WEP keys */
- for (i = 0; i < IEEE80211_WEP_NKID; i++)
- (void)rt2860_set_key(ic, NULL, &ic->ic_nw_keys[i]);
- }
+ ifp->if_flags &= ~IFF_OACTIVE;
if (ic->ic_opmode != IEEE80211_M_MONITOR)
ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
@@ -3561,7 +3616,7 @@ rt2860_init(struct ifnet *ifp)
return 0;
}
-void
+static void
rt2860_stop(struct ifnet *ifp, int disable)
{
struct rt2860_softc *sc = ifp->if_softc;
@@ -3569,13 +3624,14 @@ rt2860_stop(struct ifnet *ifp, int disable)
uint32_t tmp;
int qid;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (ifp->if_flags & IFF_RUNNING)
rt2860_set_leds(sc, 0); /* turn all LEDs off */
sc->sc_tx_timer = 0;
ifp->if_timer = 0;
ifp->if_flags &= ~IFF_RUNNING;
- ifq_clr_oactive(&ifp->if_snd);
+ ifp->if_flags &= ~IFF_OACTIVE;
ieee80211_new_state(ic, IEEE80211_S_INIT, -1); /* free all nodes */
@@ -3610,11 +3666,12 @@ rt2860_stop(struct ifnet *ifp, int disable)
}
}
-int
+static int
rt2860_load_microcode(struct rt2860_softc *sc)
{
int ntries;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* set "host program ram write selection" bit */
RAL_WRITE(sc, RT2860_SYS_CTRL, RT2860_HST_PM_SEL);
/* write microcode image */
@@ -3635,18 +3692,19 @@ rt2860_load_microcode(struct rt2860_softc *sc)
DELAY(1000);
}
if (ntries == 1000) {
- printf("%s: timeout waiting for MCU to initialize\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(sc->sc_dev,
+ "timeout waiting for MCU to initialize\n");
return ETIMEDOUT;
}
return 0;
}
+#if 0
/*
* This function is called periodically to adjust Tx power based on
* temperature variation.
*/
-void
+static void
rt2860_calib(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
@@ -3654,6 +3712,7 @@ rt2860_calib(struct rt2860_softc *sc)
uint8_t step, bbp49;
int8_t ridx, d;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
/* read current temperature */
bbp49 = rt2860_mcu_bbp_read(sc, 49);
@@ -3687,12 +3746,14 @@ rt2860_calib(struct rt2860_softc *sc)
b4inc(sc->txpow20mhz[ridx], d));
}
}
+#endif /* 0 */
-void
+static void
rt3090_set_rx_antenna(struct rt2860_softc *sc, int aux)
{
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
if (aux) {
tmp = RAL_READ(sc, RT2860_PCI_EECTRL);
RAL_WRITE(sc, RT2860_PCI_EECTRL, tmp & ~RT2860_C);
@@ -3706,12 +3767,13 @@ rt3090_set_rx_antenna(struct rt2860_softc *sc, int aux)
}
}
-void
+static void
rt2860_switch_chan(struct rt2860_softc *sc, struct ieee80211_channel *c)
{
struct ieee80211com *ic = &sc->sc_ic;
u_int chan, group;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
chan = ieee80211_chan2ieee(ic, c);
if (chan == 0 || chan == IEEE80211_CHAN_ANY)
return;
@@ -3738,7 +3800,7 @@ rt2860_switch_chan(struct rt2860_softc *sc, struct ieee80211_channel *c)
}
#ifndef IEEE80211_STA_ONLY
-int
+static int
rt2860_setup_beacon(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
@@ -3746,7 +3808,8 @@ rt2860_setup_beacon(struct rt2860_softc *sc)
struct mbuf *m;
int ridx;
- if ((m = ieee80211_beacon_alloc(ic, ic->ic_bss)) == NULL)
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
+ if ((m = ieee80211_beacon_alloc(ic, ic->ic_bss, &sc->sc_bo)) == NULL)
return ENOBUFS;
memset(&txwi, 0, sizeof txwi);
@@ -3773,12 +3836,13 @@ rt2860_setup_beacon(struct rt2860_softc *sc)
}
#endif
-void
+static void
rt2860_enable_tsf_sync(struct rt2860_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
uint32_t tmp;
+ aprint_normal_dev(sc->sc_dev, "in %s\n", __func__);
tmp = RAL_READ(sc, RT2860_BCN_TIME_CFG);
tmp &= ~0x1fffff;
diff --git a/sys/dev/ic/rt2860reg.h b/sys/dev/ic/rt2860reg.h
index 2cc9ec38f45..700a793dea5 100644
--- a/sys/dev/ic/rt2860reg.h
+++ b/sys/dev/ic/rt2860reg.h
@@ -1,3 +1,4 @@
+/* $NetBSD: rt2860reg.h,v 1.3 2016/04/27 19:49:26 christos Exp $ */
/* $OpenBSD: rt2860reg.h,v 1.32 2014/05/24 10:10:17 stsp Exp $ */
/*-
diff --git a/sys/dev/ic/rt2860var.h b/sys/dev/ic/rt2860var.h
index 613588cbe0a..9f690769d6f 100644
--- a/sys/dev/ic/rt2860var.h
+++ b/sys/dev/ic/rt2860var.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rt2860var.h,v 1.1 2016/04/26 21:17:20 christos Exp $ */
+/* $NetBSD: rt2860var.h,v 1.2 2016/04/27 19:49:26 christos Exp $ */
/* $OpenBSD: rt2860var.h,v 1.23 2016/03/21 21:16:30 stsp Exp $ */
/*-
@@ -31,6 +31,8 @@
#define RT2860_WCID_MAX 254
#define RT2860_AID2WCID(aid) ((aid) & 0xff)
+#define IEEE80211_NO_HT
+
struct rt2860_rx_radiotap_header {
struct ieee80211_radiotap_header wr_ihdr;
uint8_t wr_flags;
@@ -62,8 +64,7 @@ struct rt2860_tx_radiotap_header {
#define RT2860_TX_RADIOTAP_PRESENT \
(1 << IEEE80211_RADIOTAP_FLAGS | \
1 << IEEE80211_RADIOTAP_RATE | \
- 1 << IEEE80211_RADIOTAP_CHANNEL | \
- 1 << IEEE80211_RADIOTAP_HWQUEUE)
+ 1 << IEEE80211_RADIOTAP_CHANNEL)
struct rt2860_tx_data {
struct rt2860_txwi *txwi;
@@ -107,12 +108,11 @@ struct rt2860_node {
};
struct rt2860_softc {
- struct device sc_dev;
+ device_t sc_dev;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
- struct ieee80211_amrr amrr;
int (*sc_enable)(struct rt2860_softc *);
void (*sc_disable)(struct rt2860_softc *);
@@ -121,6 +121,9 @@ struct rt2860_softc {
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
+ struct ethercom sc_ec;
+#define sc_if sc_ec.ec_if
+
uint16_t (*sc_srom_read)(struct rt2860_softc *,
uint16_t);
@@ -129,6 +132,8 @@ struct rt2860_softc {
#define RT2860_ADVANCED_PS (1 << 1)
#define RT2860_PCIE (1 << 2)
+ struct ieee80211_amrr amrr;
+
uint32_t sc_ic_flags;
int fixed_ridx;
@@ -142,9 +147,10 @@ struct rt2860_softc {
struct rt2860_tx_data data[RT2860_TX_POOL_COUNT];
bus_dmamap_t txwi_map;
bus_dma_segment_t txwi_seg;
- caddr_t txwi_vaddr;
+ void *txwi_vaddr;
int sc_tx_timer;
+ struct ieee80211_beacon_offsets sc_bo;
int mgtqid;
uint8_t qfullmsk;
@@ -186,8 +192,7 @@ struct rt2860_softc {
struct ieee80211_amrr_node amn[RT2860_WCID_MAX + 1];
-#if NBPFILTER > 0
- caddr_t sc_drvbpf;
+ struct bpf_if *sc_drvbpf;
union {
struct rt2860_rx_radiotap_header th;
uint8_t pad[64];
@@ -201,7 +206,6 @@ struct rt2860_softc {
} sc_txtapu;
#define sc_txtap sc_txtapu.th
int sc_txtap_len;
-#endif
};
int rt2860_attach(void *, int);