[haiku-commits] haiku: hrev52113 - in src/add-ons/kernel/drivers/network/wlan: ralinkwifi/dev/ral marvell88w8363/dev/mwl marvell88w8335/dev/malo

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 17 Jul 2018 20:55:05 -0400 (EDT)

hrev52113 adds 3 changesets to branch 'master'
old head: 7edcb06f629466ff0e4585f23e417705ff005e74
new head: f329739cdc520e8487b07473b0d8e3fae04a3eb0
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=f329739cdc52+%5E7edcb06f6294

----------------------------------------------------------------------------

28ca18780111: ralinkwifi: Sync with FreeBSD 11.1.
  
  Untested, but the changes are mostly adapations to the new KPIs.

5f64721b3036: marvell88w8335: Sync with FreeBSD 11.1.
  
  Untested, but the changes are mostly adaptations to the new KPIs.

f329739cdc52: marvell88w8363: Sync with FreeBSD 11.1.
  
  Untested, but the changes are mostly adapations to the new KPIs.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

29 files changed, 1744 insertions(+), 1838 deletions(-)
src/add-ons/kernel/drivers/network/wlan/Jamfile  |   8 +-
.../drivers/network/wlan/marvell88w8335/Jamfile  |  14 +-
.../wlan/marvell88w8335/dev/malo/if_malo.c       | 537 +++++-------
.../wlan/marvell88w8335/dev/malo/if_malo.h       |  12 +-
.../wlan/marvell88w8335/dev/malo/if_malo_pci.c   |  16 +-
.../wlan/marvell88w8335/dev/malo/if_malohal.c    |  23 +-
.../wlan/marvell88w8335/dev/malo/if_malohal.h    |   2 +-
.../wlan/marvell88w8335/dev/malo/if_maloioctl.h  |   2 +-
.../drivers/network/wlan/marvell88w8363/Jamfile  |  18 +-
.../network/wlan/marvell88w8363/dev/mwl/if_mwl.c | 853 +++++++------------
.../wlan/marvell88w8363/dev/mwl/if_mwl_pci.c     |  10 +-
.../wlan/marvell88w8363/dev/mwl/if_mwlioctl.h    |   2 +-
.../wlan/marvell88w8363/dev/mwl/if_mwlvar.h      |  19 +-
.../wlan/marvell88w8363/dev/mwl/mwldiag.h        |   2 +-
.../network/wlan/marvell88w8363/dev/mwl/mwlhal.c |  45 +-
.../network/wlan/marvell88w8363/dev/mwl/mwlhal.h |   6 +-
.../network/wlan/marvell88w8363/dev/mwl/mwlreg.h |   2 +-
.../drivers/network/wlan/ralinkwifi/Jamfile      |  14 +-
.../network/wlan/ralinkwifi/dev/ral/if_ral_pci.c |   6 +-
.../network/wlan/ralinkwifi/dev/ral/rt2560.c     | 428 ++++------
.../network/wlan/ralinkwifi/dev/ral/rt2560reg.h  |   4 +-
.../network/wlan/ralinkwifi/dev/ral/rt2560var.h  |  16 +-
.../network/wlan/ralinkwifi/dev/ral/rt2661.c     | 402 ++++-----
.../network/wlan/ralinkwifi/dev/ral/rt2661reg.h  |   4 +-
.../network/wlan/ralinkwifi/dev/ral/rt2661var.h  |  15 +-
.../network/wlan/ralinkwifi/dev/ral/rt2860.c     | 809 +++++++++++-------
.../network/wlan/ralinkwifi/dev/ral/rt2860reg.h  | 281 ++++--
.../network/wlan/ralinkwifi/dev/ral/rt2860var.h  |  17 +-
.../drivers/network/wlan/ralinkwifi/glue.c       |  15 +-

############################################################################

Commit:      28ca18780111bd42b373a8b7a016b0b64fa13087
URL:         https://git.haiku-os.org/haiku/commit/?id=28ca18780111
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Tue Jul 17 23:46:44 2018 UTC

ralinkwifi: Sync with FreeBSD 11.1.

Untested, but the changes are mostly adapations to the new KPIs.

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/drivers/network/wlan/Jamfile 
b/src/add-ons/kernel/drivers/network/wlan/Jamfile
index 0a1233a7b4..30ca1a8f08 100644
--- a/src/add-ons/kernel/drivers/network/wlan/Jamfile
+++ b/src/add-ons/kernel/drivers/network/wlan/Jamfile
@@ -6,7 +6,6 @@ SubInclude HAIKU_TOP src add-ons kernel drivers network wlan 
marvell88w8335 ;
 # FreeBSD 9.3 drivers
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan broadcom43xx ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan marvell88w8363 ;
-SubInclude HAIKU_TOP src add-ons kernel drivers network wlan ralinkwifi ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan wavelanwifi ;
 
 # FreeBSD 11.1 drivers
@@ -15,6 +14,7 @@ SubInclude HAIKU_TOP src add-ons kernel drivers network wlan 
atheroswifi ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi2100 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi3945 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi4965 ;
+SubInclude HAIKU_TOP src add-ons kernel drivers network wlan ralinkwifi ;
 
 # FreeBSD 11.2 drivers
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan idualwifi7260 ;
diff --git a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile
index ccdfb5b976..7211af2995 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile
@@ -1,14 +1,14 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network wlan ralinkwifi ;
 
-UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ]
+UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_network compat ]
        : true ;
-UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_wlan ] : true ;
+UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_wlan ] : true ;
 UsePrivateHeaders net system ;
 UsePrivateKernelHeaders ;
 
-SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] 
-       -Wno-format 
-       -Wno-unused 
+SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ]
+       -Wno-format
+       -Wno-unused
        -Wno-uninitialized ;
 
 UseHeaders [ FDirName $(SUBDIR) ] : true ;
@@ -22,8 +22,8 @@ KernelAddon ralinkwifi :
        rt2860.c
        glue.c
        :
-       libfreebsd_wlan.a
-       libfreebsd_network.a
+       libfreebsd11_wlan.a
+       libfreebsd11_network.a
        ;
 
 HAIKU_WIFI_FIRMWARE_PACKAGES on ralinkwifi = RT61_Firmware_V1.2
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/if_ral_pci.c 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/if_ral_pci.c
index d3a269210a..4b2dd35191 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/if_ral_pci.c
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/if_ral_pci.c
@@ -16,7 +16,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: releng/11.1/sys/dev/ral/if_ral_pci.c 287197 2015-08-27 
08:56:39Z glebius $");
 
 /*
  * PCI/Cardbus front-end for the Ralink RT2560/RT2561/RT2561S/RT2661 driver.
@@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
+#include <sys/mbuf.h>
 #include <sys/module.h>
 #include <sys/mutex.h>
 #include <sys/rman.h>
@@ -93,7 +94,10 @@ static const struct ral_pci_ident ral_pci_ids[] = {
        { 0x1814, 0x3562, "Ralink Technology RT3562" },
        { 0x1814, 0x3592, "Ralink Technology RT3592" },
        { 0x1814, 0x3593, "Ralink Technology RT3593" },
+       { 0x1814, 0x5360, "Ralink Technology RT5390" },
+       { 0x1814, 0x5362, "Ralink Technology RT5392" },
        { 0x1814, 0x5390, "Ralink Technology RT5390" },
+       { 0x1814, 0x5392, "Ralink Technology RT5392" },
        { 0x1814, 0x539a, "Ralink Technology RT5390" },
        { 0x1814, 0x539f, "Ralink Technology RT5390" },
        { 0x1a3b, 0x1059, "AWT RT2890" },
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560.c 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560.c
index 0c3a00361f..bf512b347a 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560.c
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560.c
@@ -1,4 +1,4 @@
-/*     $FreeBSD$       */
+/*     $FreeBSD: releng/11.1/sys/dev/ral/rt2560.c 300752 2016-05-26 16:05:19Z 
avos $   */
 
 /*-
  * Copyright (c) 2005, 2006
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: releng/11.1/sys/dev/ral/rt2560.c 300752 2016-05-26 
16:05:19Z avos $");
 
 /*-
  * Ralink Technology RT2560 chipset driver
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 
 #include <net/bpf.h>
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 #include <net/if_dl.h>
@@ -116,6 +117,8 @@ static void         rt2560_beacon_expire(struct 
rt2560_softc *);
 static void            rt2560_wakeup_expire(struct rt2560_softc *);
 static void            rt2560_scan_start(struct ieee80211com *);
 static void            rt2560_scan_end(struct ieee80211com *);
+static void            rt2560_getradiocaps(struct ieee80211com *, int, int *,
+                           struct ieee80211_channel[]);
 static void            rt2560_set_channel(struct ieee80211com *);
 static void            rt2560_setup_tx_desc(struct rt2560_softc *,
                            struct rt2560_tx_desc *, uint32_t, int, int, int,
@@ -126,10 +129,10 @@ static int                rt2560_tx_mgt(struct 
rt2560_softc *, struct mbuf *,
                            struct ieee80211_node *);
 static int             rt2560_tx_data(struct rt2560_softc *, struct mbuf *,
                            struct ieee80211_node *);
-static void            rt2560_start_locked(struct ifnet *);
-static void            rt2560_start(struct ifnet *);
+static int             rt2560_transmit(struct ieee80211com *, struct mbuf *);
+static void            rt2560_start(struct rt2560_softc *);
 static void            rt2560_watchdog(void *);
-static int             rt2560_ioctl(struct ifnet *, u_long, caddr_t);
+static void            rt2560_parent(struct ieee80211com *);
 static void            rt2560_bbp_write(struct rt2560_softc *, uint8_t,
                            uint8_t);
 static uint8_t         rt2560_bbp_read(struct rt2560_softc *, uint8_t);
@@ -143,14 +146,15 @@ static void               rt2560_disable_rf_tune(struct 
rt2560_softc *);
 static void            rt2560_enable_tsf_sync(struct rt2560_softc *);
 static void            rt2560_enable_tsf(struct rt2560_softc *);
 static void            rt2560_update_plcp(struct rt2560_softc *);
-static void            rt2560_update_slot(struct ifnet *);
+static void            rt2560_update_slot(struct ieee80211com *);
 static void            rt2560_set_basicrates(struct rt2560_softc *,
                            const struct ieee80211_rateset *);
 static void            rt2560_update_led(struct rt2560_softc *, int, int);
 static void            rt2560_set_bssid(struct rt2560_softc *, const uint8_t 
*);
-static void            rt2560_set_macaddr(struct rt2560_softc *, uint8_t *);
+static void            rt2560_set_macaddr(struct rt2560_softc *,
+                           const uint8_t *);
 static void            rt2560_get_macaddr(struct rt2560_softc *, uint8_t *);
-static void            rt2560_update_promisc(struct ifnet *);
+static void            rt2560_update_promisc(struct ieee80211com *);
 static const char      *rt2560_get_rf(int);
 static void            rt2560_read_config(struct rt2560_softc *);
 static int             rt2560_bbp_init(struct rt2560_softc *);
@@ -185,6 +189,14 @@ static const uint32_t rt2560_rf2525e_r2[]   = 
RT2560_RF2525E_R2;
 static const uint32_t rt2560_rf2526_r2[]    = RT2560_RF2526_R2;
 static const uint32_t rt2560_rf2526_hi_r2[] = RT2560_RF2526_HI_R2;
 
+static const uint8_t rt2560_chan_2ghz[] =
+       { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
+
+static const uint8_t rt2560_chan_5ghz[] =
+       { 36, 40, 44, 48, 52, 56, 60, 64,
+         100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
+         149, 153, 157, 161 };
+
 static const struct {
        uint8_t         chan;
        uint32_t        r1, r2, r4;
@@ -196,11 +208,8 @@ int
 rt2560_attach(device_t dev, int id)
 {
        struct rt2560_softc *sc = device_get_softc(dev);
-       struct ieee80211com *ic;
-       struct ifnet *ifp;
+       struct ieee80211com *ic = &sc->sc_ic;
        int error;
-       uint8_t bands;
-       uint8_t macaddr[IEEE80211_ADDR_LEN];
 
        sc->sc_dev = dev;
 
@@ -208,6 +217,7 @@ rt2560_attach(device_t dev, int id)
            MTX_DEF | MTX_RECURSE);
 
        callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0);
+       mbufq_init(&sc->sc_snd, ifqmaxlen);
 
        /* retrieve RT2560 rev. no */
        sc->asic_rev = RAL_READ(sc, RT2560_CSR0);
@@ -251,27 +261,11 @@ rt2560_attach(device_t dev, int id)
                goto fail5;
        }
 
-       ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
-       if (ifp == NULL) {
-               device_printf(sc->sc_dev, "can not if_alloc()\n");
-               goto fail6;
-       }
-       ic = ifp->if_l2com;
-
        /* retrieve MAC address */
-       rt2560_get_macaddr(sc, macaddr);
-
-       ifp->if_softc = sc;
-       if_initname(ifp, device_get_name(dev), device_get_unit(dev));
-       ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
-       ifp->if_init = rt2560_init;
-       ifp->if_ioctl = rt2560_ioctl;
-       ifp->if_start = rt2560_start;
-       IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
-       ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
-       IFQ_SET_READY(&ifp->if_snd);
-
-       ic->ic_ifp = ifp;
+       rt2560_get_macaddr(sc, ic->ic_macaddr);
+
+       ic->ic_softc = sc;
+       ic->ic_name = device_get_nameunit(dev);
        ic->ic_opmode = IEEE80211_M_STA;
        ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
 
@@ -293,23 +287,22 @@ rt2560_attach(device_t dev, int id)
 #endif
                ;
 
-       bands = 0;
-       setbit(&bands, IEEE80211_MODE_11B);
-       setbit(&bands, IEEE80211_MODE_11G);
-       if (sc->rf_rev == RT2560_RF_5222)
-               setbit(&bands, IEEE80211_MODE_11A);
-       ieee80211_init_channels(ic, NULL, &bands);
+       rt2560_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
+           ic->ic_channels);
 
-       ieee80211_ifattach(ic, macaddr);
+       ieee80211_ifattach(ic);
        ic->ic_raw_xmit = rt2560_raw_xmit;
        ic->ic_updateslot = rt2560_update_slot;
        ic->ic_update_promisc = rt2560_update_promisc;
        ic->ic_scan_start = rt2560_scan_start;
        ic->ic_scan_end = rt2560_scan_end;
+       ic->ic_getradiocaps = rt2560_getradiocaps;
        ic->ic_set_channel = rt2560_set_channel;
 
        ic->ic_vap_create = rt2560_vap_create;
        ic->ic_vap_delete = rt2560_vap_delete;
+       ic->ic_parent = rt2560_parent;
+       ic->ic_transmit = rt2560_transmit;
 
        ieee80211_radiotap_attach(ic,
            &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
@@ -338,7 +331,6 @@ rt2560_attach(device_t dev, int id)
 
        return 0;
 
-fail6: rt2560_free_rx_ring(sc, &sc->rxq);
 fail5: rt2560_free_tx_ring(sc, &sc->bcnq);
 fail4: rt2560_free_tx_ring(sc, &sc->prioq);
 fail3: rt2560_free_tx_ring(sc, &sc->atimq);
@@ -352,12 +344,12 @@ int
 rt2560_detach(void *xsc)
 {
        struct rt2560_softc *sc = xsc;
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
-       
+       struct ieee80211com *ic = &sc->sc_ic;
+
        rt2560_stop(sc);
 
        ieee80211_ifdetach(ic);
+       mbufq_drain(&sc->sc_snd);
 
        rt2560_free_tx_ring(sc, &sc->txq);
        rt2560_free_tx_ring(sc, &sc->atimq);
@@ -365,8 +357,6 @@ rt2560_detach(void *xsc)
        rt2560_free_tx_ring(sc, &sc->bcnq);
        rt2560_free_rx_ring(sc, &sc->rxq);
 
-       if_free(ifp);
-
        mtx_destroy(&sc->sc_mtx);
 
        return 0;
@@ -378,7 +368,7 @@ rt2560_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
     const uint8_t bssid[IEEE80211_ADDR_LEN],
     const uint8_t mac[IEEE80211_ADDR_LEN])
 {
-       struct ifnet *ifp = ic->ic_ifp;
+       struct rt2560_softc *sc = ic->ic_softc;
        struct rt2560_vap *rvp;
        struct ieee80211vap *vap;
 
@@ -391,7 +381,7 @@ rt2560_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
        case IEEE80211_M_MBSS:
                /* XXXRP: TBD */
                if (!TAILQ_EMPTY(&ic->ic_vaps)) {
-                       if_printf(ifp, "only 1 vap supported\n");
+                       device_printf(sc->sc_dev, "only 1 vap supported\n");
                        return NULL;
                }
                if (opmode == IEEE80211_M_STA)
@@ -400,7 +390,8 @@ rt2560_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
        case IEEE80211_M_WDS:
                if (TAILQ_EMPTY(&ic->ic_vaps) ||
                    ic->ic_opmode != IEEE80211_M_HOSTAP) {
-                       if_printf(ifp, "wds only supported in ap mode\n");
+                       device_printf(sc->sc_dev,
+                           "wds only supported in ap mode\n");
                        return NULL;
                }
                /*
@@ -411,15 +402,12 @@ rt2560_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
                flags &= ~IEEE80211_CLONE_BSSID;
                break;
        default:
-               if_printf(ifp, "unknown opmode %d\n", opmode);
+               device_printf(sc->sc_dev, "unknown opmode %d\n", opmode);
                return NULL;
        }
-       rvp = (struct rt2560_vap *) malloc(sizeof(struct rt2560_vap),
-           M_80211_VAP, M_NOWAIT | M_ZERO);
-       if (rvp == NULL)
-               return NULL;
+       rvp = malloc(sizeof(struct rt2560_vap), M_80211_VAP, M_WAITOK | M_ZERO);
        vap = &rvp->ral_vap;
-       ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
+       ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid);
 
        /* override state transition machine */
        rvp->ral_newstate = vap->iv_newstate;
@@ -428,7 +416,8 @@ rt2560_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
 
        ieee80211_ratectl_init(vap);
        /* complete setup */
-       ieee80211_vap_attach(vap, ieee80211_media_change, 
ieee80211_media_status);
+       ieee80211_vap_attach(vap, ieee80211_media_change,
+           ieee80211_media_status, mac);
        if (TAILQ_FIRST(&ic->ic_vaps) == vap)
                ic->ic_opmode = opmode;
        return vap;
@@ -448,9 +437,8 @@ void
 rt2560_resume(void *xsc)
 {
        struct rt2560_softc *sc = xsc;
-       struct ifnet *ifp = sc->sc_ifp;
 
-       if (ifp->if_flags & IFF_UP)
+       if (sc->sc_ic.ic_nrunning > 0)
                rt2560_init(sc);
 }
 
@@ -476,7 +464,7 @@ rt2560_alloc_tx_ring(struct rt2560_softc *sc, struct 
rt2560_tx_ring *ring,
        ring->cur = ring->next = 0;
        ring->cur_encrypt = ring->next_encrypt = 0;
 
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
            count * RT2560_TX_DESC_SIZE, 1, count * RT2560_TX_DESC_SIZE,
            0, NULL, NULL, &ring->desc_dmat);
@@ -508,7 +496,7 @@ rt2560_alloc_tx_ring(struct rt2560_softc *sc, struct 
rt2560_tx_ring *ring,
                goto fail;
        }
 
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
            MCLBYTES, RT2560_MAX_SCATTER, MCLBYTES, 0, NULL, NULL,
            &ring->data_dmat);
@@ -620,7 +608,7 @@ rt2560_alloc_rx_ring(struct rt2560_softc *sc, struct 
rt2560_rx_ring *ring,
        ring->cur = ring->next = 0;
        ring->cur_decrypt = 0;
 
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
            count * RT2560_RX_DESC_SIZE, 1, count * RT2560_RX_DESC_SIZE,
            0, NULL, NULL, &ring->desc_dmat);
@@ -655,7 +643,7 @@ rt2560_alloc_rx_ring(struct rt2560_softc *sc, struct 
rt2560_rx_ring *ring,
        /*
         * Pre-allocate Rx buffers and populate Rx ring.
         */
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
            1, MCLBYTES, 0, NULL, NULL, &ring->data_dmat);
        if (error != 0) {
@@ -760,8 +748,7 @@ static int
 rt2560_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
 {
        struct rt2560_vap *rvp = RT2560_VAP(vap);
-       struct ifnet *ifp = vap->iv_ic->ic_ifp;
-       struct rt2560_softc *sc = ifp->if_softc;
+       struct rt2560_softc *sc = vap->iv_ic->ic_softc;
        int error;
 
        if (nstate == IEEE80211_S_INIT && vap->iv_state == IEEE80211_S_RUN) {
@@ -787,9 +774,10 @@ rt2560_newstate(struct ieee80211vap *vap, enum 
ieee80211_state nstate, int arg)
                if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
                    vap->iv_opmode == IEEE80211_M_IBSS ||
                    vap->iv_opmode == IEEE80211_M_MBSS) {
-                       m = ieee80211_beacon_alloc(ni, &rvp->ral_bo);
+                       m = ieee80211_beacon_alloc(ni);
                        if (m == NULL) {
-                               if_printf(ifp, "could not allocate beacon\n");
+                               device_printf(sc->sc_dev,
+                                   "could not allocate beacon\n");
                                return ENOBUFS;
                        }
                        ieee80211_ref_node(ni);
@@ -798,7 +786,7 @@ rt2560_newstate(struct ieee80211vap *vap, enum 
ieee80211_state nstate, int arg)
                                return error;
                }
 
-               /* turn assocation led on */
+               /* turn association led on */
                rt2560_update_led(sc, 1, 0);
 
                if (vap->iv_opmode != IEEE80211_M_MONITOR)
@@ -923,14 +911,13 @@ rt2560_encryption_intr(struct rt2560_softc *sc)
 static void
 rt2560_tx_intr(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
        struct rt2560_tx_desc *desc;
        struct rt2560_tx_data *data;
        struct mbuf *m;
-       uint32_t flags;
-       int retrycnt;
        struct ieee80211vap *vap;
        struct ieee80211_node *ni;
+       uint32_t flags;
+       int retrycnt, status;
 
        bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
            BUS_DMASYNC_POSTREAD);
@@ -958,7 +945,7 @@ rt2560_tx_intr(struct rt2560_softc *sc)
                                ieee80211_ratectl_tx_complete(vap, ni,
                                    IEEE80211_RATECTL_TX_SUCCESS,
                                    &retrycnt, NULL);
-                       ifp->if_opackets++;
+                       status = 0;
                        break;
 
                case RT2560_TX_SUCCESS_RETRY:
@@ -970,7 +957,7 @@ rt2560_tx_intr(struct rt2560_softc *sc)
                                ieee80211_ratectl_tx_complete(vap, ni,
                                    IEEE80211_RATECTL_TX_SUCCESS,
                                    &retrycnt, NULL);
-                       ifp->if_opackets++;
+                       status = 0;
                        break;
 
                case RT2560_TX_FAIL_RETRY:
@@ -982,7 +969,7 @@ rt2560_tx_intr(struct rt2560_softc *sc)
                                ieee80211_ratectl_tx_complete(vap, ni,
                                    IEEE80211_RATECTL_TX_FAILURE,
                                    &retrycnt, NULL);
-                       ifp->if_oerrors++;
+                       status = 1;
                        break;
 
                case RT2560_TX_FAIL_INVALID:
@@ -990,16 +977,16 @@ rt2560_tx_intr(struct rt2560_softc *sc)
                default:
                        device_printf(sc->sc_dev, "sending data frame failed "
                            "0x%08x\n", flags);
-                       ifp->if_oerrors++;
+                       status = 1;
                }
 
                bus_dmamap_sync(sc->txq.data_dmat, data->map,
                    BUS_DMASYNC_POSTWRITE);
                bus_dmamap_unload(sc->txq.data_dmat, data->map);
-               m_freem(m);
-               data->m = NULL;
-               ieee80211_free_node(data->ni);
+
+               ieee80211_tx_complete(ni, m, status);
                data->ni = NULL;
+               data->m = NULL;
 
                /* descriptor is no longer valid */
                desc->flags &= ~htole32(RT2560_TX_VALID);
@@ -1016,19 +1003,13 @@ rt2560_tx_intr(struct rt2560_softc *sc)
        if (sc->prioq.queued == 0 && sc->txq.queued == 0)
                sc->sc_tx_timer = 0;
 
-       if (sc->txq.queued < RT2560_TX_RING_COUNT - 1) {
-               sc->sc_flags &= ~RT2560_F_DATA_OACTIVE;
-               if ((sc->sc_flags &
-                    (RT2560_F_DATA_OACTIVE | RT2560_F_PRIO_OACTIVE)) == 0)
-                       ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-               rt2560_start_locked(ifp);
-       }
+       if (sc->txq.queued < RT2560_TX_RING_COUNT - 1)
+               rt2560_start(sc);
 }
 
 static void
 rt2560_prio_intr(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
        struct rt2560_tx_desc *desc;
        struct rt2560_tx_data *data;
        struct ieee80211_node *ni;
@@ -1100,13 +1081,8 @@ rt2560_prio_intr(struct rt2560_softc *sc)
        if (sc->prioq.queued == 0 && sc->txq.queued == 0)
                sc->sc_tx_timer = 0;
 
-       if (sc->prioq.queued < RT2560_PRIO_RING_COUNT) {
-               sc->sc_flags &= ~RT2560_F_PRIO_OACTIVE;
-               if ((sc->sc_flags &
-                    (RT2560_F_DATA_OACTIVE | RT2560_F_PRIO_OACTIVE)) == 0)
-                       ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-               rt2560_start_locked(ifp);
-       }
+       if (sc->prioq.queued < RT2560_PRIO_RING_COUNT)
+               rt2560_start(sc);
 }
 
 /*
@@ -1116,8 +1092,7 @@ rt2560_prio_intr(struct rt2560_softc *sc)
 static void
 rt2560_decryption_intr(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        struct rt2560_rx_desc *desc;
        struct rt2560_rx_data *data;
        bus_addr_t physaddr;
@@ -1127,7 +1102,7 @@ rt2560_decryption_intr(struct rt2560_softc *sc)
        int hw, error;
        int8_t rssi, nf;
 
-       /* retrieve last decriptor index processed by cipher engine */
+       /* retrieve last descriptor index processed by cipher engine */
        hw = RAL_READ(sc, RT2560_SECCSR0) - sc->rxq.physaddr;
        hw /= RT2560_RX_DESC_SIZE;
 
@@ -1143,13 +1118,13 @@ rt2560_decryption_intr(struct rt2560_softc *sc)
                        break;
 
                if (data->drop) {
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
                if ((le32toh(desc->flags) & RT2560_RX_CIPHER_MASK) != 0 &&
                    (le32toh(desc->flags) & RT2560_RX_ICV_ERROR)) {
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
@@ -1162,7 +1137,7 @@ rt2560_decryption_intr(struct rt2560_softc *sc)
                 */
                mnew = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
                if (mnew == NULL) {
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
@@ -1185,7 +1160,7 @@ rt2560_decryption_intr(struct rt2560_softc *sc)
                                panic("%s: could not load old rx mbuf",
                                    device_get_name(sc->sc_dev));
                        }
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
@@ -1198,7 +1173,6 @@ rt2560_decryption_intr(struct rt2560_softc *sc)
                desc->physaddr = htole32(physaddr);
 
                /* finalize mbuf */
-               m->m_pkthdr.rcvif = ifp;
                m->m_pkthdr.len = m->m_len =
                    (le32toh(desc->flags) >> 16) & 0xfff;
 
@@ -1305,8 +1279,7 @@ rt2560_rx_intr(struct rt2560_softc *sc)
 static void
 rt2560_beacon_update(struct ieee80211vap *vap, int item)
 {
-       struct rt2560_vap *rvp = RT2560_VAP(vap);
-       struct ieee80211_beacon_offsets *bo = &rvp->ral_bo;
+       struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off;
 
        setbit(bo->bo_flags, item);
 }
@@ -1318,16 +1291,13 @@ rt2560_beacon_update(struct ieee80211vap *vap, int item)
 static void
 rt2560_beacon_expire(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
-       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
-       struct rt2560_vap *rvp = RT2560_VAP(vap);
+       struct ieee80211com *ic = &sc->sc_ic;
        struct rt2560_tx_data *data;
 
        if (ic->ic_opmode != IEEE80211_M_IBSS &&
            ic->ic_opmode != IEEE80211_M_HOSTAP &&
            ic->ic_opmode != IEEE80211_M_MBSS)
-               return; 
+               return;
 
        data = &sc->bcnq.data[sc->bcnq.next];
        /*
@@ -1340,7 +1310,7 @@ rt2560_beacon_expire(struct rt2560_softc *sc)
        bus_dmamap_unload(sc->bcnq.data_dmat, data->map);
 
        /* XXX 1 =>'s mcast frames which means all PS sta's will wakeup! */
-       ieee80211_beacon_update(data->ni, &rvp->ral_bo, data->m, 1);
+       ieee80211_beacon_update(data->ni, data->m, 1);
 
        rt2560_tx_bcn(sc, data->m, data->ni);
 
@@ -1360,7 +1330,6 @@ void
 rt2560_intr(void *arg)
 {
        struct rt2560_softc *sc = arg;
-       struct ifnet *ifp = sc->sc_ifp;
        uint32_t r;
 
        RAL_LOCK(sc);
@@ -1370,7 +1339,7 @@ rt2560_intr(void *arg)
        RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
 
        /* don't re-enable interrupts if we're shutting down */
-       if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+       if (!(sc->sc_flags & RT2560_F_RUNNING)) {
                RAL_UNLOCK(sc);
                return;
        }
@@ -1439,8 +1408,7 @@ static void
 rt2560_setup_tx_desc(struct rt2560_softc *sc, struct rt2560_tx_desc *desc,
     uint32_t flags, int len, int rate, int encrypt, bus_addr_t physaddr)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint16_t plcp_length;
        int remainder;
 
@@ -1465,7 +1433,7 @@ rt2560_setup_tx_desc(struct rt2560_softc *sc, struct 
rt2560_tx_desc *desc,
                desc->plcp_length_hi = plcp_length >> 6;
                desc->plcp_length_lo = plcp_length & 0x3f;
        } else {
-               plcp_length = (16 * len + rate - 1) / rate;
+               plcp_length = howmany(16 * len, rate);
                if (rate == 22) {
                        remainder = (16 * len) % 22;
                        if (remainder != 0 && remainder < 7)
@@ -1559,7 +1527,7 @@ rt2560_tx_mgt(struct rt2560_softc *sc, struct mbuf *m0,
 
        wh = mtod(m0, struct ieee80211_frame *);
 
-       if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
+       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
                k = ieee80211_crypto_encap(ni, m0);
                if (k == NULL) {
                        m_freem(m0);
@@ -1805,7 +1773,7 @@ rt2560_tx_data(struct rt2560_softc *sc, struct mbuf *m0,
                rate = ni->ni_txrate;
        }
 
-       if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
+       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
                k = ieee80211_crypto_encap(ni, m0);
                if (k == NULL) {
                        m_freem(m0);
@@ -1915,55 +1883,57 @@ rt2560_tx_data(struct rt2560_softc *sc, struct mbuf *m0,
        return 0;
 }
 
+static int
+rt2560_transmit(struct ieee80211com *ic, struct mbuf *m)
+{
+       struct rt2560_softc *sc = ic->ic_softc;
+       int error;
+
+       RAL_LOCK(sc);
+       if ((sc->sc_flags & RT2560_F_RUNNING) == 0) {
+               RAL_UNLOCK(sc);
+               return (ENXIO);
+       }
+       error = mbufq_enqueue(&sc->sc_snd, m);
+       if (error) {
+               RAL_UNLOCK(sc);
+               return (error);
+       }
+       rt2560_start(sc);
+       RAL_UNLOCK(sc);
+
+       return (0);
+}
+
 static void
-rt2560_start_locked(struct ifnet *ifp)
+rt2560_start(struct rt2560_softc *sc)
 {
-       struct rt2560_softc *sc = ifp->if_softc;
-       struct mbuf *m;
        struct ieee80211_node *ni;
+       struct mbuf *m;
 
        RAL_LOCK_ASSERT(sc);
 
-       for (;;) {
-               IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
-               if (m == NULL)
-                       break;
-               if (sc->txq.queued >= RT2560_TX_RING_COUNT - 1) {
-                       IFQ_DRV_PREPEND(&ifp->if_snd, m);
-                       ifp->if_drv_flags |= IFF_DRV_OACTIVE;
-                       sc->sc_flags |= RT2560_F_DATA_OACTIVE;
-                       break;
-               }
+       while (sc->txq.queued < RT2560_TX_RING_COUNT - 1 &&
+           (m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
                ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
                if (rt2560_tx_data(sc, m, ni) != 0) {
+                       if_inc_counter(ni->ni_vap->iv_ifp,
+                           IFCOUNTER_OERRORS, 1);
                        ieee80211_free_node(ni);
-                       ifp->if_oerrors++;
                        break;
                }
-
                sc->sc_tx_timer = 5;
        }
 }
 
-static void
-rt2560_start(struct ifnet *ifp)
-{
-       struct rt2560_softc *sc = ifp->if_softc;
-
-       RAL_LOCK(sc);
-       rt2560_start_locked(ifp);
-       RAL_UNLOCK(sc);
-}
-
 static void
 rt2560_watchdog(void *arg)
 {
        struct rt2560_softc *sc = arg;
-       struct ifnet *ifp = sc->sc_ifp;
 
        RAL_LOCK_ASSERT(sc);
 
-       KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, ("not running"));
+       KASSERT(sc->sc_flags & RT2560_F_RUNNING, ("not running"));
 
        if (sc->sc_invalid)             /* card ejected */
                return;
@@ -1972,51 +1942,33 @@ rt2560_watchdog(void *arg)
        rt2560_tx_intr(sc);
 
        if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) {
-               if_printf(ifp, "device timeout\n");
+               device_printf(sc->sc_dev, "device timeout\n");
                rt2560_init_locked(sc);
-               ifp->if_oerrors++;
+               counter_u64_add(sc->sc_ic.ic_oerrors, 1);
                /* NB: callout is reset in rt2560_init() */
                return;
        }
        callout_reset(&sc->watchdog_ch, hz, rt2560_watchdog, sc);
 }
 
-static int
-rt2560_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+static void
+rt2560_parent(struct ieee80211com *ic)
 {
-       struct rt2560_softc *sc = ifp->if_softc;
-       struct ieee80211com *ic = ifp->if_l2com;
-       struct ifreq *ifr = (struct ifreq *) data;
-       int error = 0, startall = 0;
+       struct rt2560_softc *sc = ic->ic_softc;
+       int startall = 0;
 
-       switch (cmd) {
-       case SIOCSIFFLAGS:
-               RAL_LOCK(sc);
-               if (ifp->if_flags & IFF_UP) {
-                       if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-                               rt2560_init_locked(sc);
-                               startall = 1;
-                       } else
-                               rt2560_update_promisc(ifp);
-               } else {
-                       if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-                               rt2560_stop_locked(sc);
-               }
-               RAL_UNLOCK(sc);
-               if (startall)
-                       ieee80211_start_all(ic);
-               break;
-       case SIOCGIFMEDIA:
-               error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
-               break;
-       case SIOCGIFADDR:
-               error = ether_ioctl(ifp, cmd, data);
-               break;
-       default:
-               error = EINVAL;
-               break;
-       }
-       return error;
+       RAL_LOCK(sc);
+       if (ic->ic_nrunning > 0) {
+               if ((sc->sc_flags & RT2560_F_RUNNING) == 0) {
+                       rt2560_init_locked(sc);
+                       startall = 1;
+               } else
+                       rt2560_update_promisc(ic);
+       } else if (sc->sc_flags & RT2560_F_RUNNING)
+               rt2560_stop_locked(sc);
+       RAL_UNLOCK(sc);
+       if (startall)
+               ieee80211_start_all(ic);
 }
 
 static void
@@ -2100,8 +2052,7 @@ rt2560_rf_write(struct rt2560_softc *sc, uint8_t reg, 
uint32_t val)
 static void
 rt2560_set_chan(struct rt2560_softc *sc, struct ieee80211_channel *c)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint8_t power, tmp;
        u_int i, chan;
 
@@ -2177,7 +2128,7 @@ rt2560_set_chan(struct rt2560_softc *sc, struct 
ieee80211_channel *c)
                rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x00040);
                rt2560_rf_write(sc, RAL_RF4, rt2560_rf5222[i].r4);
                break;
-       default: 
+       default:
                printf("unknown ral rev=%d\n", sc->rf_rev);
        }
 
@@ -2197,11 +2148,30 @@ rt2560_set_chan(struct rt2560_softc *sc, struct 
ieee80211_channel *c)
        }
 }
 
+static void
+rt2560_getradiocaps(struct ieee80211com *ic,
+    int maxchans, int *nchans, struct ieee80211_channel chans[])
+{
+       struct rt2560_softc *sc = ic->ic_softc;
+       uint8_t bands[IEEE80211_MODE_BYTES];
+
+       memset(bands, 0, sizeof(bands));
+       setbit(bands, IEEE80211_MODE_11B);
+       setbit(bands, IEEE80211_MODE_11G);
+       ieee80211_add_channel_list_2ghz(chans, maxchans, nchans,
+           rt2560_chan_2ghz, nitems(rt2560_chan_2ghz), bands, 0);
+
+       if (sc->rf_rev == RT2560_RF_5222) {
+               setbit(bands, IEEE80211_MODE_11A);
+               ieee80211_add_channel_list_5ghz(chans, maxchans, nchans,
+                   rt2560_chan_5ghz, nitems(rt2560_chan_5ghz), bands, 0);
+       }
+}
+
 static void
 rt2560_set_channel(struct ieee80211com *ic)
 {
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2560_softc *sc = ifp->if_softc;
+       struct rt2560_softc *sc = ic->ic_softc;
 
        RAL_LOCK(sc);
        rt2560_set_chan(sc, ic->ic_curchan);
@@ -2237,8 +2207,7 @@ rt2560_disable_rf_tune(struct rt2560_softc *sc)
 static void
 rt2560_enable_tsf_sync(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
        uint16_t logcwmin, preload;
        uint32_t tmp;
@@ -2279,8 +2248,7 @@ rt2560_enable_tsf(struct rt2560_softc *sc)
 static void
 rt2560_update_plcp(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
 
        /* no short preamble for 1Mbps */
        RAL_WRITE(sc, RT2560_PLCP1MCSR, 0x00700400);
@@ -2306,16 +2274,15 @@ rt2560_update_plcp(struct rt2560_softc *sc)
  * IEEE Std 802.11-1999 pp. 85 to know how these values are computed.
  */
 static void
-rt2560_update_slot(struct ifnet *ifp)
+rt2560_update_slot(struct ieee80211com *ic)
 {
-       struct rt2560_softc *sc = ifp->if_softc;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct rt2560_softc *sc = ic->ic_softc;
        uint8_t slottime;
        uint16_t tx_sifs, tx_pifs, tx_difs, eifs;
        uint32_t tmp;
 
 #ifndef FORCE_SLOTTIME
-       slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
+       slottime = IEEE80211_GET_SLOTTIME(ic);
 #else
        /*
         * Setting slot time according to "short slot time" capability
@@ -2333,13 +2300,13 @@ rt2560_update_slot(struct ifnet *ifp)
         * (-1Mb~-2Mb lower) and the _whole_ BSS would stop using short
         * slot time.
         */
-       slottime = 20;
+       slottime = IEEE80211_DUR_SLOT;
 #endif
 
        /* update the MAC slot boundaries */
        tx_sifs = RAL_SIFS - RT2560_TXRX_TURNAROUND;
        tx_pifs = tx_sifs + slottime;
-       tx_difs = tx_sifs + 2 * slottime;
+       tx_difs = IEEE80211_DUR_DIFS(tx_sifs, slottime);
        eifs = (ic->ic_curmode == IEEE80211_MODE_11B) ? 364 : 60;
 
        tmp = RAL_READ(sc, RT2560_CSR11);
@@ -2359,9 +2326,7 @@ static void
 rt2560_set_basicrates(struct rt2560_softc *sc,
     const struct ieee80211_rateset *rs)
 {
-#define RV(r)  ((r) & IEEE80211_RATE_VAL)
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint32_t mask = 0;
        uint8_t rate;
        int i;
@@ -2372,13 +2337,13 @@ rt2560_set_basicrates(struct rt2560_softc *sc,
                if (!(rate & IEEE80211_RATE_BASIC))
                        continue;
 
-               mask |= 1 << ic->ic_rt->rateCodeToIndex[RV(rate)];
+               mask |= 1 << ieee80211_legacy_rate_lookup(ic->ic_rt,
+                   IEEE80211_RV(rate));
        }
 
        RAL_WRITE(sc, RT2560_ARSP_PLCP_1, mask);
 
        DPRINTF(sc, "Setting basic rate mask to 0x%x\n", mask);
-#undef RV
 }
 
 static void
@@ -2406,7 +2371,7 @@ rt2560_set_bssid(struct rt2560_softc *sc, const uint8_t 
*bssid)
 }
 
 static void
-rt2560_set_macaddr(struct rt2560_softc *sc, uint8_t *addr)
+rt2560_set_macaddr(struct rt2560_softc *sc, const uint8_t *addr)
 {
        uint32_t tmp;
 
@@ -2436,21 +2401,21 @@ rt2560_get_macaddr(struct rt2560_softc *sc, uint8_t 
*addr)
 }
 
 static void
-rt2560_update_promisc(struct ifnet *ifp)
+rt2560_update_promisc(struct ieee80211com *ic)
 {
-       struct rt2560_softc *sc = ifp->if_softc;
+       struct rt2560_softc *sc = ic->ic_softc;
        uint32_t tmp;
 
        tmp = RAL_READ(sc, RT2560_RXCSR0);
 
        tmp &= ~RT2560_DROP_NOT_TO_ME;
-       if (!(ifp->if_flags & IFF_PROMISC))
+       if (ic->ic_promisc == 0)
                tmp |= RT2560_DROP_NOT_TO_ME;
 
        RAL_WRITE(sc, RT2560_RXCSR0, tmp);
 
-       DPRINTF(sc, "%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ?
-           "entering" : "leaving");
+       DPRINTF(sc, "%s promiscuous mode\n",
+           (ic->ic_promisc > 0) ?  "entering" : "leaving");
 }
 
 static const char *
@@ -2516,19 +2481,17 @@ rt2560_read_config(struct rt2560_softc *sc)
 static void
 rt2560_scan_start(struct ieee80211com *ic)
 {
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2560_softc *sc = ifp->if_softc;
+       struct rt2560_softc *sc = ic->ic_softc;
 
        /* abort TSF synchronization */
        RAL_WRITE(sc, RT2560_CSR14, 0);
-       rt2560_set_bssid(sc, ifp->if_broadcastaddr);
+       rt2560_set_bssid(sc, ieee80211broadcastaddr);
 }
 
 static void
 rt2560_scan_end(struct ieee80211com *ic)
 {
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2560_softc *sc = ifp->if_softc;
+       struct rt2560_softc *sc = ic->ic_softc;
        struct ieee80211vap *vap = ic->ic_scan->ss_vap;
 
        rt2560_enable_tsf_sync(sc);
@@ -2539,7 +2502,6 @@ rt2560_scan_end(struct ieee80211com *ic)
 static int
 rt2560_bbp_init(struct rt2560_softc *sc)
 {
-#define N(a)   (sizeof (a) / sizeof ((a)[0]))
        int i, ntries;
 
        /* wait for BBP to be ready */
@@ -2554,7 +2516,7 @@ rt2560_bbp_init(struct rt2560_softc *sc)
        }
 
        /* initialize BBP registers to default values */
-       for (i = 0; i < N(rt2560_def_bbp); i++) {
+       for (i = 0; i < nitems(rt2560_def_bbp); i++) {
                rt2560_bbp_write(sc, rt2560_def_bbp[i].reg,
                    rt2560_def_bbp[i].val);
        }
@@ -2568,7 +2530,6 @@ rt2560_bbp_init(struct rt2560_softc *sc)
        rt2560_bbp_write(sc, 17, 0x48); /* XXX restore bbp17 */
 
        return 0;
-#undef N
 }
 
 static void
@@ -2621,9 +2582,8 @@ rt2560_set_rxantenna(struct rt2560_softc *sc, int antenna)
 static void
 rt2560_init_locked(struct rt2560_softc *sc)
 {
-#define N(a)   (sizeof (a) / sizeof ((a)[0]))
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
+       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
        uint32_t tmp;
        int i;
 
@@ -2651,15 +2611,15 @@ rt2560_init_locked(struct rt2560_softc *sc)
        RAL_WRITE(sc, RT2560_RXCSR2, sc->rxq.physaddr);
 
        /* initialize MAC registers to default values */
-       for (i = 0; i < N(rt2560_def_mac); i++)
+       for (i = 0; i < nitems(rt2560_def_mac); i++)
                RAL_WRITE(sc, rt2560_def_mac[i].reg, rt2560_def_mac[i].val);
 
-       rt2560_set_macaddr(sc, IF_LLADDR(ifp));
+       rt2560_set_macaddr(sc, vap ? vap->iv_myaddr : ic->ic_macaddr);
 
        /* set basic rate set (will be updated later) */
        RAL_WRITE(sc, RT2560_ARSP_PLCP_1, 0x153);
 
-       rt2560_update_slot(ifp);
+       rt2560_update_slot(ic);
        rt2560_update_plcp(sc);
        rt2560_update_led(sc, 0, 0);
 
@@ -2684,7 +2644,7 @@ rt2560_init_locked(struct rt2560_softc *sc)
                if (ic->ic_opmode != IEEE80211_M_HOSTAP &&
                    ic->ic_opmode != IEEE80211_M_MBSS)
                        tmp |= RT2560_DROP_TODS;
-               if (!(ifp->if_flags & IFF_PROMISC))
+               if (ic->ic_promisc == 0)
                        tmp |= RT2560_DROP_NOT_TO_ME;
        }
        RAL_WRITE(sc, RT2560_RXCSR0, tmp);
@@ -2699,32 +2659,28 @@ rt2560_init_locked(struct rt2560_softc *sc)
        /* enable interrupts */
        RAL_WRITE(sc, RT2560_CSR8, RT2560_INTR_MASK);
 
-       ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-       ifp->if_drv_flags |= IFF_DRV_RUNNING;
+       sc->sc_flags |= RT2560_F_RUNNING;
 
        callout_reset(&sc->watchdog_ch, hz, rt2560_watchdog, sc);
-#undef N
 }
 
 static void
 rt2560_init(void *priv)
 {
        struct rt2560_softc *sc = priv;
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
 
        RAL_LOCK(sc);
        rt2560_init_locked(sc);
        RAL_UNLOCK(sc);
 
-       if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+       if (sc->sc_flags & RT2560_F_RUNNING)
                ieee80211_start_all(ic);                /* start all vap's */
 }
 
 static void
 rt2560_stop_locked(struct rt2560_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
        volatile int *flags = &sc->sc_flags;
 
        RAL_LOCK_ASSERT(sc);
@@ -2735,12 +2691,12 @@ rt2560_stop_locked(struct rt2560_softc *sc)
        callout_stop(&sc->watchdog_ch);
        sc->sc_tx_timer = 0;
 
-       if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-               ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+       if (sc->sc_flags & RT2560_F_RUNNING) {
+               sc->sc_flags &= ~RT2560_F_RUNNING;
 
                /* abort Tx */
                RAL_WRITE(sc, RT2560_TXCSR0, RT2560_ABORT_TX);
-               
+
                /* disable Rx */
                RAL_WRITE(sc, RT2560_RXCSR0, RT2560_DISABLE_RX);
 
@@ -2750,7 +2706,7 @@ rt2560_stop_locked(struct rt2560_softc *sc)
 
                /* disable interrupts */
                RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
-               
+
                /* reset Tx and Rx rings */
                rt2560_reset_tx_ring(sc, &sc->txq);
                rt2560_reset_tx_ring(sc, &sc->atimq);
@@ -2758,7 +2714,6 @@ rt2560_stop_locked(struct rt2560_softc *sc)
                rt2560_reset_tx_ring(sc, &sc->bcnq);
                rt2560_reset_rx_ring(sc, &sc->rxq);
        }
-       sc->sc_flags &= ~(RT2560_F_PRIO_OACTIVE | RT2560_F_DATA_OACTIVE);
 }
 
 void
@@ -2776,29 +2731,22 @@ rt2560_raw_xmit(struct ieee80211_node *ni, struct mbuf 
*m,
        const struct ieee80211_bpf_params *params)
 {
        struct ieee80211com *ic = ni->ni_ic;
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2560_softc *sc = ifp->if_softc;
+       struct rt2560_softc *sc = ic->ic_softc;
 
        RAL_LOCK(sc);
 
        /* prevent management frames from being sent if we're not ready */
-       if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+       if (!(sc->sc_flags & RT2560_F_RUNNING)) {
                RAL_UNLOCK(sc);
                m_freem(m);
-               ieee80211_free_node(ni);
                return ENETDOWN;
        }
        if (sc->prioq.queued >= RT2560_PRIO_RING_COUNT) {
-               ifp->if_drv_flags |= IFF_DRV_OACTIVE;
-               sc->sc_flags |= RT2560_F_PRIO_OACTIVE;
                RAL_UNLOCK(sc);
                m_freem(m);
-               ieee80211_free_node(ni);
                return ENOBUFS;         /* XXX */
        }
 
-       ifp->if_opackets++;
-
        if (params == NULL) {
                /*
                 * Legacy path; interpret frame contents to decide
@@ -2820,8 +2768,6 @@ rt2560_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
 
        return 0;
 bad:
-       ifp->if_oerrors++;
-       ieee80211_free_node(ni);
        RAL_UNLOCK(sc);
        return EIO;             /* XXX */
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560reg.h 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560reg.h
index 8e501b4c22..ae46b5f912 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560reg.h
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560reg.h
@@ -1,4 +1,4 @@
-/*     $FreeBSD$       */
+/*     $FreeBSD: releng/11.1/sys/dev/ral/rt2560reg.h 258780 2013-11-30 
22:17:27Z eadler $      */
 
 /*-
  * Copyright (c) 2005, 2006
@@ -268,7 +268,7 @@ struct rt2560_rx_desc {
 #define RT2560_BBP_BUSY                (1 << 15)
 #define RT2560_BBP_WRITE       (1 << 16)
 #define RT2560_RF_20BIT                (20 << 24)
-#define RT2560_RF_BUSY         (1 << 31)
+#define RT2560_RF_BUSY         (1U << 31)
 
 #define RT2560_RF_2522 0x00
 #define RT2560_RF_2523 0x01
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560var.h 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560var.h
index b6a8d68e92..364a85655d 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560var.h
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560var.h
@@ -1,4 +1,4 @@
-/*     $FreeBSD$       */
+/*     $FreeBSD: releng/11.1/sys/dev/ral/rt2560var.h 289168 2015-10-12 
05:21:51Z adrian $      */
 
 /*-
  * Copyright (c) 2005, 2006
@@ -97,7 +97,6 @@ struct rt2560_rx_ring {
 
 struct rt2560_vap {
        struct ieee80211vap     ral_vap;
-       struct ieee80211_beacon_offsets ral_bo;
 
        int                     (*ral_newstate)(struct ieee80211vap *,
                                    enum ieee80211_state, int);
@@ -105,13 +104,13 @@ struct rt2560_vap {
 #define        RT2560_VAP(vap)         ((struct rt2560_vap *)(vap))
 
 struct rt2560_softc {
-       struct ifnet            *sc_ifp;
+       struct ieee80211com     sc_ic;
+       struct mtx              sc_mtx;
+       struct mbufq            sc_snd;
        device_t                sc_dev;
        bus_space_tag_t         sc_st;
        bus_space_handle_t      sc_sh;
 
-       struct mtx              sc_mtx;
-
        struct callout          watchdog_ch;
 
        int                     sc_tx_timer;
@@ -147,13 +146,10 @@ struct rt2560_softc {
        int                     nb_ant;
 
        struct rt2560_rx_radiotap_header sc_rxtap;
-       int                     sc_rxtap_len;
-
        struct rt2560_tx_radiotap_header sc_txtap;
-       int                     sc_txtap_len;
+
 #define RT2560_F_INPUT_RUNNING 0x1
-#define RT2560_F_PRIO_OACTIVE  0x2
-#define RT2560_F_DATA_OACTIVE  0x4
+#define RT2560_F_RUNNING       0x2
        int                     sc_flags;
 };
 
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661.c 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661.c
index 5210969dbe..65356530ab 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661.c
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661.c
@@ -1,4 +1,4 @@
-/*     $FreeBSD$       */
+/*     $FreeBSD: releng/11.1/sys/dev/ral/rt2661.c 314222 2017-02-24 21:19:40Z 
avos $   */
 
 /*-
  * Copyright (c) 2006
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: releng/11.1/sys/dev/ral/rt2661.c 314222 2017-02-24 
21:19:40Z avos $");
 
 /*-
  * Ralink Technology RT2561, RT2561S and RT2661 chipset driver
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 
 #include <net/bpf.h>
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 #include <net/if_dl.h>
@@ -112,6 +113,8 @@ static void         rt2661_mcu_wakeup(struct rt2661_softc 
*);
 static void            rt2661_mcu_cmd_intr(struct rt2661_softc *);
 static void            rt2661_scan_start(struct ieee80211com *);
 static void            rt2661_scan_end(struct ieee80211com *);
+static void            rt2661_getradiocaps(struct ieee80211com *, int, int *,
+                           struct ieee80211_channel[]);
 static void            rt2661_set_channel(struct ieee80211com *);
 static void            rt2661_setup_tx_desc(struct rt2661_softc *,
                            struct rt2661_tx_desc *, uint32_t, uint16_t, int,
@@ -120,12 +123,12 @@ static int                rt2661_tx_data(struct 
rt2661_softc *, struct mbuf *,
                            struct ieee80211_node *, int);
 static int             rt2661_tx_mgt(struct rt2661_softc *, struct mbuf *,
                            struct ieee80211_node *);
-static void            rt2661_start_locked(struct ifnet *);
-static void            rt2661_start(struct ifnet *);
+static int             rt2661_transmit(struct ieee80211com *, struct mbuf *);
+static void            rt2661_start(struct rt2661_softc *);
 static int             rt2661_raw_xmit(struct ieee80211_node *, struct mbuf *,
                            const struct ieee80211_bpf_params *);
 static void            rt2661_watchdog(void *);
-static int             rt2661_ioctl(struct ifnet *, u_long, caddr_t);
+static void            rt2661_parent(struct ieee80211com *);
 static void            rt2661_bbp_write(struct rt2661_softc *, uint8_t,
                            uint8_t);
 static uint8_t         rt2661_bbp_read(struct rt2661_softc *, uint8_t);
@@ -146,9 +149,9 @@ static void         rt2661_set_bssid(struct rt2661_softc *,
                            const uint8_t *);
 static void            rt2661_set_macaddr(struct rt2661_softc *,
                           const uint8_t *);
-static void            rt2661_update_promisc(struct ifnet *);
+static void            rt2661_update_promisc(struct ieee80211com *);
 static int             rt2661_wme_update(struct ieee80211com *) __unused;
-static void            rt2661_update_slot(struct ifnet *);
+static void            rt2661_update_slot(struct ieee80211com *);
 static const char      *rt2661_get_rf(int);
 static void            rt2661_read_eeprom(struct rt2661_softc *,
                            uint8_t macaddr[IEEE80211_ADDR_LEN]);
@@ -192,31 +195,29 @@ static const struct rfprog {
        RT2661_RF5225_2
 };
 
+static const uint8_t rt2661_chan_2ghz[] =
+       { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
+static const uint8_t rt2661_chan_5ghz[] =
+       { 36, 40, 44, 48, 52, 56, 60, 64,
+         100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
+         149, 153, 157, 161, 165 };
+
 int
 rt2661_attach(device_t dev, int id)
 {
        struct rt2661_softc *sc = device_get_softc(dev);
-       struct ieee80211com *ic;
-       struct ifnet *ifp;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint32_t val;
        int error, ac, ntries;
-       uint8_t bands;
-       uint8_t macaddr[IEEE80211_ADDR_LEN];
 
        sc->sc_id = id;
        sc->sc_dev = dev;
 
-       ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
-       if (ifp == NULL) {
-               device_printf(sc->sc_dev, "can not if_alloc()\n");
-               return ENOMEM;
-       }
-       ic = ifp->if_l2com;
-
        mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
            MTX_DEF | MTX_RECURSE);
 
        callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0);
+       mbufq_init(&sc->sc_snd, ifqmaxlen);
 
        /* wait for NIC to initialize */
        for (ntries = 0; ntries < 1000; ntries++) {
@@ -232,7 +233,7 @@ rt2661_attach(device_t dev, int id)
        }
 
        /* retrieve RF rev. no and various other things from EEPROM */
-       rt2661_read_eeprom(sc, macaddr);
+       rt2661_read_eeprom(sc, ic->ic_macaddr);
 
        device_printf(dev, "MAC/BBP RT%X, RF %s\n", val,
            rt2661_get_rf(sc->rf_rev));
@@ -262,17 +263,8 @@ rt2661_attach(device_t dev, int id)
                goto fail3;
        }
 
-       ifp->if_softc = sc;
-       if_initname(ifp, device_get_name(dev), device_get_unit(dev));
-       ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
-       ifp->if_init = rt2661_init;
-       ifp->if_ioctl = rt2661_ioctl;
-       ifp->if_start = rt2661_start;
-       IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
-       ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
-       IFQ_SET_READY(&ifp->if_snd);
-
-       ic->ic_ifp = ifp;
+       ic->ic_softc = sc;
+       ic->ic_name = device_get_nameunit(dev);
        ic->ic_opmode = IEEE80211_M_STA;
        ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
 
@@ -295,24 +287,22 @@ rt2661_attach(device_t dev, int id)
 #endif
                ;
 
-       bands = 0;
-       setbit(&bands, IEEE80211_MODE_11B);
-       setbit(&bands, IEEE80211_MODE_11G);
-       if (sc->rf_rev == RT2661_RF_5225 || sc->rf_rev == RT2661_RF_5325) 
-               setbit(&bands, IEEE80211_MODE_11A);
-       ieee80211_init_channels(ic, NULL, &bands);
+       rt2661_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
+           ic->ic_channels);
 
-       ieee80211_ifattach(ic, macaddr);
+       ieee80211_ifattach(ic);
 #if 0
        ic->ic_wme.wme_update = rt2661_wme_update;
 #endif
        ic->ic_scan_start = rt2661_scan_start;
        ic->ic_scan_end = rt2661_scan_end;
+       ic->ic_getradiocaps = rt2661_getradiocaps;
        ic->ic_set_channel = rt2661_set_channel;
        ic->ic_updateslot = rt2661_update_slot;
        ic->ic_update_promisc = rt2661_update_promisc;
        ic->ic_raw_xmit = rt2661_raw_xmit;
-
+       ic->ic_transmit = rt2661_transmit;
+       ic->ic_parent = rt2661_parent;
        ic->ic_vap_create = rt2661_vap_create;
        ic->ic_vap_delete = rt2661_vap_delete;
 
@@ -336,7 +326,6 @@ fail3:      rt2661_free_tx_ring(sc, &sc->mgtq);
 fail2: while (--ac >= 0)
                rt2661_free_tx_ring(sc, &sc->txq[ac]);
 fail1: mtx_destroy(&sc->sc_mtx);
-       if_free(ifp);
        return error;
 }
 
@@ -344,14 +333,14 @@ int
 rt2661_detach(void *xsc)
 {
        struct rt2661_softc *sc = xsc;
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
-       
+       struct ieee80211com *ic = &sc->sc_ic;
+
        RAL_LOCK(sc);
        rt2661_stop_locked(sc);
        RAL_UNLOCK(sc);
 
        ieee80211_ifdetach(ic);
+       mbufq_drain(&sc->sc_snd);
 
        rt2661_free_tx_ring(sc, &sc->txq[0]);
        rt2661_free_tx_ring(sc, &sc->txq[1]);
@@ -360,8 +349,6 @@ rt2661_detach(void *xsc)
        rt2661_free_tx_ring(sc, &sc->mgtq);
        rt2661_free_rx_ring(sc, &sc->rxq);
 
-       if_free(ifp);
-
        mtx_destroy(&sc->sc_mtx);
 
        return 0;
@@ -373,7 +360,7 @@ rt2661_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
     const uint8_t bssid[IEEE80211_ADDR_LEN],
     const uint8_t mac[IEEE80211_ADDR_LEN])
 {
-       struct ifnet *ifp = ic->ic_ifp;
+       struct rt2661_softc *sc = ic->ic_softc;
        struct rt2661_vap *rvp;
        struct ieee80211vap *vap;
 
@@ -386,7 +373,7 @@ rt2661_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
        case IEEE80211_M_MBSS:
                /* XXXRP: TBD */
                if (!TAILQ_EMPTY(&ic->ic_vaps)) {
-                       if_printf(ifp, "only 1 vap supported\n");
+                       device_printf(sc->sc_dev, "only 1 vap supported\n");
                        return NULL;
                }
                if (opmode == IEEE80211_M_STA)
@@ -395,7 +382,8 @@ rt2661_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
        case IEEE80211_M_WDS:
                if (TAILQ_EMPTY(&ic->ic_vaps) ||
                    ic->ic_opmode != IEEE80211_M_HOSTAP) {
-                       if_printf(ifp, "wds only supported in ap mode\n");
+                       device_printf(sc->sc_dev,
+                           "wds only supported in ap mode\n");
                        return NULL;
                }
                /*
@@ -406,15 +394,12 @@ rt2661_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
                flags &= ~IEEE80211_CLONE_BSSID;
                break;
        default:
-               if_printf(ifp, "unknown opmode %d\n", opmode);
+               device_printf(sc->sc_dev, "unknown opmode %d\n", opmode);
                return NULL;
        }
-       rvp = (struct rt2661_vap *) malloc(sizeof(struct rt2661_vap),
-           M_80211_VAP, M_NOWAIT | M_ZERO);
-       if (rvp == NULL)
-               return NULL;
+       rvp = malloc(sizeof(struct rt2661_vap), M_80211_VAP, M_WAITOK | M_ZERO);
        vap = &rvp->ral_vap;
-       ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
+       ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid);
 
        /* override state transition machine */
        rvp->ral_newstate = vap->iv_newstate;
@@ -425,7 +410,8 @@ rt2661_vap_create(struct ieee80211com *ic, const char 
name[IFNAMSIZ], int unit,
 
        ieee80211_ratectl_init(vap);
        /* complete setup */
-       ieee80211_vap_attach(vap, ieee80211_media_change, 
ieee80211_media_status);
+       ieee80211_vap_attach(vap, ieee80211_media_change,
+           ieee80211_media_status, mac);
        if (TAILQ_FIRST(&ic->ic_vaps) == vap)
                ic->ic_opmode = opmode;
        return vap;
@@ -461,9 +447,8 @@ void
 rt2661_resume(void *xsc)
 {
        struct rt2661_softc *sc = xsc;
-       struct ifnet *ifp = sc->sc_ifp;
 
-       if (ifp->if_flags & IFF_UP)
+       if (sc->sc_ic.ic_nrunning > 0)
                rt2661_init(sc);
 }
 
@@ -488,7 +473,7 @@ rt2661_alloc_tx_ring(struct rt2661_softc *sc, struct 
rt2661_tx_ring *ring,
        ring->queued = 0;
        ring->cur = ring->next = ring->stat = 0;
 
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
            count * RT2661_TX_DESC_SIZE, 1, count * RT2661_TX_DESC_SIZE,
            0, NULL, NULL, &ring->desc_dmat);
@@ -520,7 +505,7 @@ rt2661_alloc_tx_ring(struct rt2661_softc *sc, struct 
rt2661_tx_ring *ring,
                goto fail;
        }
 
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
            RT2661_MAX_SCATTER, MCLBYTES, 0, NULL, NULL, &ring->data_dmat);
        if (error != 0) {
@@ -629,7 +614,7 @@ rt2661_alloc_rx_ring(struct rt2661_softc *sc, struct 
rt2661_rx_ring *ring,
        ring->count = count;
        ring->cur = ring->next = 0;
 
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
            count * RT2661_RX_DESC_SIZE, 1, count * RT2661_RX_DESC_SIZE,
            0, NULL, NULL, &ring->desc_dmat);
@@ -664,7 +649,7 @@ rt2661_alloc_rx_ring(struct rt2661_softc *sc, struct 
rt2661_rx_ring *ring,
        /*
         * Pre-allocate Rx buffers and populate Rx ring.
         */
-       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 
+       error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
            BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
            1, MCLBYTES, 0, NULL, NULL, &ring->data_dmat);
        if (error != 0) {
@@ -767,7 +752,7 @@ rt2661_newstate(struct ieee80211vap *vap, enum 
ieee80211_state nstate, int arg)
 {
        struct rt2661_vap *rvp = RT2661_VAP(vap);
        struct ieee80211com *ic = vap->iv_ic;
-       struct rt2661_softc *sc = ic->ic_ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
        int error;
 
        if (nstate == IEEE80211_S_INIT && vap->iv_state == IEEE80211_S_RUN) {
@@ -866,11 +851,10 @@ rt2661_eeprom_read(struct rt2661_softc *sc, uint8_t addr)
 static void
 rt2661_tx_intr(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
        struct rt2661_tx_ring *txq;
        struct rt2661_tx_data *data;
        uint32_t val;
-       int qid, retrycnt;
+       int error, qid, retrycnt;
        struct ieee80211vap *vap;
 
        for (;;) {
@@ -908,7 +892,7 @@ rt2661_tx_intr(struct rt2661_softc *sc)
                                ieee80211_ratectl_tx_complete(vap, ni,
                                    IEEE80211_RATECTL_TX_SUCCESS,
                                    &retrycnt, NULL);
-                       ifp->if_opackets++;
+                       error = 0;
                        break;
 
                case RT2661_TX_RETRY_FAIL:
@@ -920,14 +904,14 @@ rt2661_tx_intr(struct rt2661_softc *sc)
                                ieee80211_ratectl_tx_complete(vap, ni,
                                    IEEE80211_RATECTL_TX_FAILURE,
                                    &retrycnt, NULL);
-                       ifp->if_oerrors++;
+                       error = 1;
                        break;
 
                default:
                        /* other failure */
                        device_printf(sc->sc_dev,
                            "sending data frame failed 0x%08x\n", val);
-                       ifp->if_oerrors++;
+                       error = 1;
                }
 
                DPRINTFN(sc, 15, "tx done q=%d idx=%u\n", qid, txq->stat);
@@ -936,17 +920,12 @@ rt2661_tx_intr(struct rt2661_softc *sc)
                if (++txq->stat >= txq->count)  /* faster than % count */
                        txq->stat = 0;
 
-               if (m->m_flags & M_TXCB)
-                       ieee80211_process_callback(ni, m,
-                               RT2661_TX_RESULT(val) != RT2661_TX_SUCCESS);
-               m_freem(m);
-               ieee80211_free_node(ni);
+               ieee80211_tx_complete(ni, m, error);
        }
 
        sc->sc_tx_timer = 0;
-       ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
-       rt2661_start_locked(ifp);
+       rt2661_start(sc);
 }
 
 static void
@@ -984,8 +963,7 @@ rt2661_tx_dma_intr(struct rt2661_softc *sc, struct 
rt2661_tx_ring *txq)
 static void
 rt2661_rx_intr(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        struct rt2661_rx_desc *desc;
        struct rt2661_rx_data *data;
        bus_addr_t physaddr;
@@ -1014,12 +992,12 @@ rt2661_rx_intr(struct rt2661_softc *sc)
                         */
                        DPRINTFN(sc, 5, "PHY or CRC error flags 0x%08x\n",
                            le32toh(desc->flags));
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
                if ((le32toh(desc->flags) & RT2661_RX_CIPHER_MASK) != 0) {
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
@@ -1032,7 +1010,7 @@ rt2661_rx_intr(struct rt2661_softc *sc)
                 */
                mnew = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
                if (mnew == NULL) {
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
@@ -1055,7 +1033,7 @@ rt2661_rx_intr(struct rt2661_softc *sc)
                                panic("%s: could not load old rx mbuf",
                                    device_get_name(sc->sc_dev));
                        }
-                       ifp->if_ierrors++;
+                       counter_u64_add(ic->ic_ierrors, 1);
                        goto skip;
                }
 
@@ -1068,7 +1046,6 @@ rt2661_rx_intr(struct rt2661_softc *sc)
                desc->physaddr = htole32(physaddr);
 
                /* finalize mbuf */
-               m->m_pkthdr.rcvif = ifp;
                m->m_pkthdr.len = m->m_len =
                    (le32toh(desc->flags) >> 16) & 0xfff;
 
@@ -1153,7 +1130,6 @@ void
 rt2661_intr(void *arg)
 {
        struct rt2661_softc *sc = arg;
-       struct ifnet *ifp = sc->sc_ifp;
        uint32_t r1, r2;
 
        RAL_LOCK(sc);
@@ -1164,7 +1140,7 @@ rt2661_intr(void *arg)
        RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
 
        /* don't re-enable interrupts if we're shutting down */
-       if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+       if (!(sc->sc_flags & RAL_RUNNING)) {
                RAL_UNLOCK(sc);
                return;
        }
@@ -1241,8 +1217,7 @@ rt2661_setup_tx_desc(struct rt2661_softc *sc, struct 
rt2661_tx_desc *desc,
     uint32_t flags, uint16_t xflags, int len, int rate,
     const bus_dma_segment_t *segs, int nsegs, int ac)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint16_t plcp_length;
        int i, remainder;
 
@@ -1278,7 +1253,7 @@ rt2661_setup_tx_desc(struct rt2661_softc *sc, struct 
rt2661_tx_desc *desc,
                desc->plcp_length_hi = plcp_length >> 6;
                desc->plcp_length_lo = plcp_length & 0x3f;
        } else {
-               plcp_length = (16 * len + rate - 1) / rate;
+               plcp_length = howmany(16 * len, rate);
                if (rate == 22) {
                        remainder = (16 * len) % 22;
                        if (remainder != 0 && remainder < 7)
@@ -1320,7 +1295,7 @@ rt2661_tx_mgt(struct rt2661_softc *sc, struct mbuf *m0,
 
        wh = mtod(m0, struct ieee80211_frame *);
 
-       if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
+       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
                k = ieee80211_crypto_encap(ni, m0);
                if (k == NULL) {
                        m_freem(m0);
@@ -1460,8 +1435,7 @@ rt2661_tx_data(struct rt2661_softc *sc, struct mbuf *m0,
     struct ieee80211_node *ni, int ac)
 {
        struct ieee80211vap *vap = ni->ni_vap;
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        struct rt2661_tx_ring *txq = &sc->txq[ac];
        struct rt2661_tx_desc *desc;
        struct rt2661_tx_data *data;
@@ -1495,7 +1469,7 @@ rt2661_tx_data(struct rt2661_softc *sc, struct mbuf *m0,
                noack = cap->cap_wmeParams[ac].wmep_noackPolicy;
        }
 
-       if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
+       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
                k = ieee80211_crypto_encap(ni, m0);
                if (k == NULL) {
                        m_freem(m0);
@@ -1603,10 +1577,31 @@ rt2661_tx_data(struct rt2661_softc *sc, struct mbuf *m0,
        return 0;
 }
 
+static int
+rt2661_transmit(struct ieee80211com *ic, struct mbuf *m)
+{
+       struct rt2661_softc *sc = ic->ic_softc;
+       int error;
+
+       RAL_LOCK(sc);
+       if ((sc->sc_flags & RAL_RUNNING) == 0) {
+               RAL_UNLOCK(sc);
+               return (ENXIO);
+       }
+       error = mbufq_enqueue(&sc->sc_snd, m);
+       if (error) {
+               RAL_UNLOCK(sc);
+               return (error);
+       }
+       rt2661_start(sc);
+       RAL_UNLOCK(sc);
+
+       return (0);
+}
+
 static void
-rt2661_start_locked(struct ifnet *ifp)
+rt2661_start(struct rt2661_softc *sc)
 {
-       struct rt2661_softc *sc = ifp->if_softc;
        struct mbuf *m;
        struct ieee80211_node *ni;
        int ac;
@@ -1614,69 +1609,48 @@ rt2661_start_locked(struct ifnet *ifp)
        RAL_LOCK_ASSERT(sc);
 
        /* prevent management frames from being sent if we're not ready */
-       if (!(ifp->if_drv_flags & IFF_DRV_RUNNING) || sc->sc_invalid)
+       if (!(sc->sc_flags & RAL_RUNNING) || sc->sc_invalid)
                return;
 
-       for (;;) {
-               IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
-               if (m == NULL)
-                       break;
-
+       while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
                ac = M_WME_GETAC(m);
                if (sc->txq[ac].queued >= RT2661_TX_RING_COUNT - 1) {
                        /* there is no place left in this ring */
-                       IFQ_DRV_PREPEND(&ifp->if_snd, m);
-                       ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+                       mbufq_prepend(&sc->sc_snd, m);
                        break;
                }
                ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
                if (rt2661_tx_data(sc, m, ni, ac) != 0) {
+                       if_inc_counter(ni->ni_vap->iv_ifp,
+                           IFCOUNTER_OERRORS, 1);
                        ieee80211_free_node(ni);
-                       ifp->if_oerrors++;
                        break;
                }
-
                sc->sc_tx_timer = 5;
        }
 }
 
-static void
-rt2661_start(struct ifnet *ifp)
-{
-       struct rt2661_softc *sc = ifp->if_softc;
-
-       RAL_LOCK(sc);
-       rt2661_start_locked(ifp);
-       RAL_UNLOCK(sc);
-}
-
 static int
 rt2661_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
        const struct ieee80211_bpf_params *params)
 {
        struct ieee80211com *ic = ni->ni_ic;
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2661_softc *sc = ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
 
        RAL_LOCK(sc);
 
        /* prevent management frames from being sent if we're not ready */
-       if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+       if (!(sc->sc_flags & RAL_RUNNING)) {
                RAL_UNLOCK(sc);
                m_freem(m);
-               ieee80211_free_node(ni);
                return ENETDOWN;
        }
        if (sc->mgtq.queued >= RT2661_MGT_RING_COUNT) {
-               ifp->if_drv_flags |= IFF_DRV_OACTIVE;
                RAL_UNLOCK(sc);
                m_freem(m);
-               ieee80211_free_node(ni);
                return ENOBUFS;         /* XXX */
        }
 
-       ifp->if_opackets++;
-
        /*
         * Legacy path; interpret frame contents to decide
         * precisely how to send the frame.
@@ -1690,8 +1664,6 @@ rt2661_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
 
        return 0;
 bad:
-       ifp->if_oerrors++;
-       ieee80211_free_node(ni);
        RAL_UNLOCK(sc);
        return EIO;             /* XXX */
 }
@@ -1700,61 +1672,42 @@ static void
 rt2661_watchdog(void *arg)
 {
        struct rt2661_softc *sc = (struct rt2661_softc *)arg;
-       struct ifnet *ifp = sc->sc_ifp;
 
        RAL_LOCK_ASSERT(sc);
 
-       KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, ("not running"));
+       KASSERT(sc->sc_flags & RAL_RUNNING, ("not running"));
 
        if (sc->sc_invalid)             /* card ejected */
                return;
 
        if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) {
-               if_printf(ifp, "device timeout\n");
+               device_printf(sc->sc_dev, "device timeout\n");
                rt2661_init_locked(sc);
-               ifp->if_oerrors++;
+               counter_u64_add(sc->sc_ic.ic_oerrors, 1);
                /* NB: callout is reset in rt2661_init() */
                return;
        }
        callout_reset(&sc->watchdog_ch, hz, rt2661_watchdog, sc);
 }
 
-static int
-rt2661_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+static void
+rt2661_parent(struct ieee80211com *ic)
 {
-       struct rt2661_softc *sc = ifp->if_softc;
-       struct ieee80211com *ic = ifp->if_l2com;
-       struct ifreq *ifr = (struct ifreq *) data;
-       int error = 0, startall = 0;
+       struct rt2661_softc *sc = ic->ic_softc;
+       int startall = 0;
 
-       switch (cmd) {
-       case SIOCSIFFLAGS:
-               RAL_LOCK(sc);
-               if (ifp->if_flags & IFF_UP) {
-                       if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-                               rt2661_init_locked(sc);
-                               startall = 1;
-                       } else
-                               rt2661_update_promisc(ifp);
-               } else {
-                       if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-                               rt2661_stop_locked(sc);
-               }
-               RAL_UNLOCK(sc);
-               if (startall)
-                       ieee80211_start_all(ic);
-               break;
-       case SIOCGIFMEDIA:
-               error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
-               break;
-       case SIOCGIFADDR:
-               error = ether_ioctl(ifp, cmd, data);
-               break;
-       default:
-               error = EINVAL;
-               break;
-       }
-       return error;
+       RAL_LOCK(sc);
+       if (ic->ic_nrunning > 0) {
+               if ((sc->sc_flags & RAL_RUNNING) == 0) {
+                       rt2661_init_locked(sc);
+                       startall = 1;
+               } else
+                       rt2661_update_promisc(ic);
+       } else if (sc->sc_flags & RAL_RUNNING)
+               rt2661_stop_locked(sc);
+       RAL_UNLOCK(sc);
+       if (startall)
+               ieee80211_start_all(ic);
 }
 
 static void
@@ -1878,8 +1831,7 @@ rt2661_select_antenna(struct rt2661_softc *sc)
 static void
 rt2661_enable_mrr(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint32_t tmp;
 
        tmp = RAL_READ(sc, RT2661_TXRX_CSR4);
@@ -1895,8 +1847,7 @@ rt2661_enable_mrr(struct rt2661_softc *sc)
 static void
 rt2661_set_txpreamble(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint32_t tmp;
 
        tmp = RAL_READ(sc, RT2661_TXRX_CSR4);
@@ -1912,9 +1863,7 @@ static void
 rt2661_set_basicrates(struct rt2661_softc *sc,
     const struct ieee80211_rateset *rs)
 {
-#define RV(r)  ((r) & IEEE80211_RATE_VAL)
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        uint32_t mask = 0;
        uint8_t rate;
        int i;
@@ -1925,13 +1874,13 @@ rt2661_set_basicrates(struct rt2661_softc *sc,
                if (!(rate & IEEE80211_RATE_BASIC))
                        continue;
 
-               mask |= 1 << ic->ic_rt->rateCodeToIndex[RV(rate)];
+               mask |= 1 << ieee80211_legacy_rate_lookup(ic->ic_rt,
+                   IEEE80211_RV(rate));
        }
 
        RAL_WRITE(sc, RT2661_TXRX_CSR5, mask);
 
        DPRINTF(sc, "Setting basic rate mask to 0x%x\n", mask);
-#undef RV
 }
 
 /*
@@ -1983,8 +1932,7 @@ rt2661_select_band(struct rt2661_softc *sc, struct 
ieee80211_channel *c)
 static void
 rt2661_set_chan(struct rt2661_softc *sc, struct ieee80211_channel *c)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        const struct rfprog *rfprog;
        uint8_t bbp3, bbp94 = RT2661_BBPR94_DEFAULT;
        int8_t power;
@@ -2079,21 +2027,21 @@ rt2661_set_macaddr(struct rt2661_softc *sc, const 
uint8_t *addr)
 }
 
 static void
-rt2661_update_promisc(struct ifnet *ifp)
+rt2661_update_promisc(struct ieee80211com *ic)
 {
-       struct rt2661_softc *sc = ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
        uint32_t tmp;
 
        tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
 
        tmp &= ~RT2661_DROP_NOT_TO_ME;
-       if (!(ifp->if_flags & IFF_PROMISC))
+       if (ic->ic_promisc == 0)
                tmp |= RT2661_DROP_NOT_TO_ME;
 
        RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
 
-       DPRINTF(sc, "%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ?
-           "entering" : "leaving");
+       DPRINTF(sc, "%s promiscuous mode\n",
+           (ic->ic_promisc > 0) ?  "entering" : "leaving");
 }
 
 /*
@@ -2102,7 +2050,7 @@ rt2661_update_promisc(struct ifnet *ifp)
 static int
 rt2661_wme_update(struct ieee80211com *ic)
 {
-       struct rt2661_softc *sc = ic->ic_ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
        const struct wmeParams *wmep;
 
        wmep = ic->ic_wme.wme_chanParams.cap_wmeParams;
@@ -2143,14 +2091,13 @@ rt2661_wme_update(struct ieee80211com *ic)
 }
 
 static void
-rt2661_update_slot(struct ifnet *ifp)
+rt2661_update_slot(struct ieee80211com *ic)
 {
-       struct rt2661_softc *sc = ifp->if_softc;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct rt2661_softc *sc = ic->ic_softc;
        uint8_t slottime;
        uint32_t tmp;
 
-       slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
+       slottime = IEEE80211_GET_SLOTTIME(ic);
 
        tmp = RAL_READ(sc, RT2661_MAC_CSR9);
        tmp = (tmp & ~0xff) | slottime;
@@ -2264,7 +2211,6 @@ rt2661_read_eeprom(struct rt2661_softc *sc, uint8_t 
macaddr[IEEE80211_ADDR_LEN])
 static int
 rt2661_bbp_init(struct rt2661_softc *sc)
 {
-#define N(a)   (sizeof (a) / sizeof ((a)[0]))
        int i, ntries;
        uint8_t val;
 
@@ -2281,7 +2227,7 @@ rt2661_bbp_init(struct rt2661_softc *sc)
        }
 
        /* initialize BBP registers to default values */
-       for (i = 0; i < N(rt2661_def_bbp); i++) {
+       for (i = 0; i < nitems(rt2661_def_bbp); i++) {
                rt2661_bbp_write(sc, rt2661_def_bbp[i].reg,
                    rt2661_def_bbp[i].val);
        }
@@ -2294,15 +2240,13 @@ rt2661_bbp_init(struct rt2661_softc *sc)
        }
 
        return 0;
-#undef N
 }
 
 static void
 rt2661_init_locked(struct rt2661_softc *sc)
 {
-#define N(a)   (sizeof (a) / sizeof ((a)[0]))
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
+       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
        uint32_t tmp, sta[3];
        int i, error, ntries;
 
@@ -2311,7 +2255,7 @@ rt2661_init_locked(struct rt2661_softc *sc)
        if ((sc->sc_flags & RAL_FW_LOADED) == 0) {
                error = rt2661_load_microcode(sc);
                if (error != 0) {
-                       if_printf(ifp,
+                       device_printf(sc->sc_dev,
                            "%s: could not load 8051 microcode, error %d\n",
                            __func__, error);
                        return;
@@ -2361,10 +2305,10 @@ rt2661_init_locked(struct rt2661_softc *sc)
        RAL_WRITE(sc, RT2661_RX_CNTL_CSR, 2);
 
        /* initialize MAC registers to default values */
-       for (i = 0; i < N(rt2661_def_mac); i++)
+       for (i = 0; i < nitems(rt2661_def_mac); i++)
                RAL_WRITE(sc, rt2661_def_mac[i].reg, rt2661_def_mac[i].val);
 
-       rt2661_set_macaddr(sc, IF_LLADDR(ifp));
+       rt2661_set_macaddr(sc, vap ? vap->iv_myaddr : ic->ic_macaddr);
 
        /* set host ready */
        RAL_WRITE(sc, RT2661_MAC_CSR1, 3);
@@ -2403,14 +2347,14 @@ rt2661_init_locked(struct rt2661_softc *sc)
                if (ic->ic_opmode != IEEE80211_M_HOSTAP &&
                    ic->ic_opmode != IEEE80211_M_MBSS)
                        tmp |= RT2661_DROP_TODS;
-               if (!(ifp->if_flags & IFF_PROMISC))
+               if (ic->ic_promisc == 0)
                        tmp |= RT2661_DROP_NOT_TO_ME;
        }
 
        RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
 
        /* clear STA registers */
-       RAL_READ_REGION_4(sc, RT2661_STA_CSR0, sta, N(sta));
+       RAL_READ_REGION_4(sc, RT2661_STA_CSR0, sta, nitems(sta));
 
        /* initialize ASIC */
        RAL_WRITE(sc, RT2661_MAC_CSR1, 4);
@@ -2425,34 +2369,30 @@ rt2661_init_locked(struct rt2661_softc *sc)
        /* kick Rx */
        RAL_WRITE(sc, RT2661_RX_CNTL_CSR, 1);
 
-       ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-       ifp->if_drv_flags |= IFF_DRV_RUNNING;
+       sc->sc_flags |= RAL_RUNNING;
 
        callout_reset(&sc->watchdog_ch, hz, rt2661_watchdog, sc);
-#undef N
 }
 
 static void
 rt2661_init(void *priv)
 {
        struct rt2661_softc *sc = priv;
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
 
        RAL_LOCK(sc);
        rt2661_init_locked(sc);
        RAL_UNLOCK(sc);
 
-       if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+       if (sc->sc_flags & RAL_RUNNING)
                ieee80211_start_all(ic);                /* start all vap's */
 }
 
 void
 rt2661_stop_locked(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       uint32_t tmp;
        volatile int *flags = &sc->sc_flags;
+       uint32_t tmp;
 
        while (*flags & RAL_INPUT_RUNNING)
                msleep(sc, &sc->sc_mtx, 0, "ralrunning", hz/10);
@@ -2460,28 +2400,28 @@ rt2661_stop_locked(struct rt2661_softc *sc)
        callout_stop(&sc->watchdog_ch);
        sc->sc_tx_timer = 0;
 
-       if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-               ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+       if (sc->sc_flags & RAL_RUNNING) {
+               sc->sc_flags &= ~RAL_RUNNING;
 
                /* abort Tx (for all 5 Tx rings) */
                RAL_WRITE(sc, RT2661_TX_CNTL_CSR, 0x1f << 16);
-               
+
                /* disable Rx (value remains after reset!) */
                tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
                RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp | RT2661_DISABLE_RX);
-               
+
                /* reset ASIC */
                RAL_WRITE(sc, RT2661_MAC_CSR1, 3);
                RAL_WRITE(sc, RT2661_MAC_CSR1, 0);
-               
+
                /* disable interrupts */
                RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffffff);
                RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
-               
+
                /* clear any pending interrupt */
                RAL_WRITE(sc, RT2661_INT_SOURCE_CSR, 0xffffffff);
                RAL_WRITE(sc, RT2661_MCU_INT_SOURCE_CSR, 0xffffffff);
-               
+
                /* reset Tx and Rx rings */
                rt2661_reset_tx_ring(sc, &sc->txq[0]);
                rt2661_reset_tx_ring(sc, &sc->txq[1]);
@@ -2505,7 +2445,6 @@ rt2661_stop(void *priv)
 static int
 rt2661_load_microcode(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
        const struct firmware *fp;
        const char *imagename;
        int ntries, error;
@@ -2517,7 +2456,7 @@ rt2661_load_microcode(struct rt2661_softc *sc)
        case 0x0302: imagename = "rt2561fw"; break;
        case 0x0401: imagename = "rt2661fw"; break;
        default:
-               if_printf(ifp, "%s: unexpected pci device id 0x%x, "
+               device_printf(sc->sc_dev, "%s: unexpected pci device id 0x%x, "
                    "don't know how to retrieve firmware\n",
                    __func__, sc->sc_id);
                return EINVAL;
@@ -2526,7 +2465,8 @@ rt2661_load_microcode(struct rt2661_softc *sc)
        fp = firmware_get(imagename);
        RAL_LOCK(sc);
        if (fp == NULL) {
-               if_printf(ifp, "%s: unable to retrieve firmware image %s\n",
+               device_printf(sc->sc_dev,
+                   "%s: unable to retrieve firmware image %s\n",
                    __func__, imagename);
                return EINVAL;
        }
@@ -2557,8 +2497,8 @@ rt2661_load_microcode(struct rt2661_softc *sc)
                DELAY(100);
        }
        if (ntries == 500) {
-               if_printf(ifp, "%s: timeout waiting for MCU to initialize\n",
-                   __func__);
+               device_printf(sc->sc_dev,
+                   "%s: timeout waiting for MCU to initialize\n", __func__);
                error = EIO;
        } else
                error = 0;
@@ -2690,13 +2630,11 @@ static int
 rt2661_prepare_beacon(struct rt2661_softc *sc, struct ieee80211vap *vap)
 {
        struct ieee80211com *ic = vap->iv_ic;
-       struct ieee80211_beacon_offsets bo;
        struct rt2661_tx_desc desc;
        struct mbuf *m0;
        int rate;
 
-       m0 = ieee80211_beacon_alloc(vap->iv_bss, &bo);
-       if (m0 == NULL) {
+       if ((m0 = ieee80211_beacon_alloc(vap->iv_bss))== NULL) {
                device_printf(sc->sc_dev, "could not allocate beacon frame\n");
                return ENOBUFS;
        }
@@ -2726,8 +2664,7 @@ rt2661_prepare_beacon(struct rt2661_softc *sc, struct 
ieee80211vap *vap)
 static void
 rt2661_enable_tsf_sync(struct rt2661_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
-       struct ieee80211com *ic = ifp->if_l2com;
+       struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
        uint32_t tmp;
 
@@ -2756,7 +2693,7 @@ rt2661_enable_tsf_sync(struct rt2661_softc *sc)
 static void
 rt2661_enable_tsf(struct rt2661_softc *sc)
 {
-       RAL_WRITE(sc, RT2661_TXRX_CSR9, 
+       RAL_WRITE(sc, RT2661_TXRX_CSR9,
              (RAL_READ(sc, RT2661_TXRX_CSR9) & 0xff000000)
            | RT2661_TSF_TICKING | RT2661_TSF_MODE(2));
 }
@@ -2811,21 +2748,19 @@ rt2661_get_rssi(struct rt2661_softc *sc, uint8_t raw)
 static void
 rt2661_scan_start(struct ieee80211com *ic)
 {
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2661_softc *sc = ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
        uint32_t tmp;
 
        /* abort TSF synchronization */
        tmp = RAL_READ(sc, RT2661_TXRX_CSR9);
        RAL_WRITE(sc, RT2661_TXRX_CSR9, tmp & ~0xffffff);
-       rt2661_set_bssid(sc, ifp->if_broadcastaddr);
+       rt2661_set_bssid(sc, ieee80211broadcastaddr);
 }
 
 static void
 rt2661_scan_end(struct ieee80211com *ic)
 {
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2661_softc *sc = ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
        struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
 
        rt2661_enable_tsf_sync(sc);
@@ -2833,11 +2768,30 @@ rt2661_scan_end(struct ieee80211com *ic)
        rt2661_set_bssid(sc, vap->iv_bss->ni_bssid);
 }
 
+static void
+rt2661_getradiocaps(struct ieee80211com *ic,
+    int maxchans, int *nchans, struct ieee80211_channel chans[])
+{
+       struct rt2661_softc *sc = ic->ic_softc;
+       uint8_t bands[IEEE80211_MODE_BYTES];
+
+       memset(bands, 0, sizeof(bands));
+       setbit(bands, IEEE80211_MODE_11B);
+       setbit(bands, IEEE80211_MODE_11G);
+       ieee80211_add_channel_list_2ghz(chans, maxchans, nchans,
+           rt2661_chan_2ghz, nitems(rt2661_chan_2ghz), bands, 0);
+
+       if (sc->rf_rev == RT2661_RF_5225 || sc->rf_rev == RT2661_RF_5325) {
+               setbit(bands, IEEE80211_MODE_11A);
+               ieee80211_add_channel_list_5ghz(chans, maxchans, nchans,
+                   rt2661_chan_5ghz, nitems(rt2661_chan_5ghz), bands, 0);
+       }
+}
+
 static void
 rt2661_set_channel(struct ieee80211com *ic)
 {
-       struct ifnet *ifp = ic->ic_ifp;
-       struct rt2661_softc *sc = ifp->if_softc;
+       struct rt2661_softc *sc = ic->ic_softc;
 
        RAL_LOCK(sc);
        rt2661_set_chan(sc, ic->ic_curchan);
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661reg.h 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661reg.h
index b4325b053d..417365d408 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661reg.h
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661reg.h
@@ -1,4 +1,4 @@
-/*     $FreeBSD$       */
+/*     $FreeBSD: releng/11.1/sys/dev/ral/rt2661reg.h 258780 2013-11-30 
22:17:27Z eadler $      */
 
 /*-
  * Copyright (c) 2006
@@ -182,7 +182,7 @@
 
 /* possible flags for register PHY_CSR4 */
 #define RT2661_RF_21BIT        (21 << 24)
-#define RT2661_RF_BUSY (1 << 31)
+#define RT2661_RF_BUSY (1U << 31)
 
 /* possible values for register STA_CSR4 */
 #define RT2661_TX_STAT_VALID   (1 << 0)
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661var.h 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661var.h
index 9927d138fa..975add1254 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661var.h
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661var.h
@@ -1,4 +1,4 @@
-/*     $FreeBSD$       */
+/*     $FreeBSD: releng/11.1/sys/dev/ral/rt2661var.h 300657 2016-05-25 
06:29:23Z sgalabov $    */
 
 /*-
  * Copyright (c) 2005
@@ -26,7 +26,7 @@ struct rt2661_rx_radiotap_header {
        uint16_t        wr_chan_flags;
        int8_t          wr_antsignal;
        int8_t          wr_antnoise;
-} __packed;
+} __packed __aligned(8);
 
 #define RT2661_RX_RADIOTAP_PRESENT                                     \
        ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
@@ -42,7 +42,7 @@ struct rt2661_tx_radiotap_header {
        uint8_t         wt_rate;
        uint16_t        wt_chan_freq;
        uint16_t        wt_chan_flags;
-} __packed;
+} __packed __aligned(8);
 
 #define RT2661_TX_RADIOTAP_PRESENT                                     \
        ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
@@ -97,13 +97,13 @@ struct rt2661_vap {
 #define        RT2661_VAP(vap)         ((struct rt2661_vap *)(vap))
 
 struct rt2661_softc {
-       struct ifnet                    *sc_ifp;
+       struct ieee80211com             sc_ic;
+       struct mtx                      sc_mtx;
+       struct mbufq                    sc_snd;
        device_t                        sc_dev;
        bus_space_tag_t                 sc_st;
        bus_space_handle_t              sc_sh;
 
-       struct mtx                      sc_mtx;
-
        struct callout                  watchdog_ch;
 
        int                             sc_tx_timer;
@@ -117,6 +117,7 @@ struct rt2661_softc {
        int                             sc_flags;
 #define        RAL_FW_LOADED           0x1
 #define        RAL_INPUT_RUNNING       0x2
+#define        RAL_RUNNING             0x4
        int                             sc_id;
        struct ieee80211_channel        *sc_curchan;
 
@@ -156,9 +157,7 @@ struct rt2661_softc {
        int                             dwelltime;
 
        struct rt2661_rx_radiotap_header sc_rxtap;
-       int                             sc_rxtap_len;
        struct rt2661_tx_radiotap_header sc_txtap;
-       int                             sc_txtap_len;
 };
 
 int    rt2661_attach(device_t, int);
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2860.c 
b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2860.c
index 138fbc0ba1..c5f161e3c1 100644
--- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2860.c
+++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2860.c
@@ -18,10 +18,10 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: releng/11.1/sys/dev/ral/rt2860.c 306851 2016-10-08 
16:39:21Z avos $");
 
 /*-
- * Ralink Technology RT2860/RT3090/RT3390/RT3562 chipset driver
+ * Ralink Technology RT2860/RT3090/RT3390/RT3562/RT5390/RT5392 chipset driver
  * http://www.ralinktech.com/
  */
 
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 
 #include <net/bpf.h>
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 #include <net/if_dl.h>
@@ -121,10 +122,10 @@ static int        rt2860_raw_xmit(struct ieee80211_node 
*, struct mbuf *,
 static int     rt2860_tx_raw(struct rt2860_softc *, struct mbuf *,
                    struct ieee80211_node *,
                    const struct ieee80211_bpf_params *params);
-static void    rt2860_start(struct ifnet *);
-static void    rt2860_start_locked(struct ifnet *);
+static int     rt2860_transmit(struct ieee80211com *, struct mbuf *);
+static void    rt2860_start(struct rt2860_softc *);
 static void    rt2860_watchdog(void *);
-static int     rt2860_ioctl(struct ifnet *, u_long, caddr_t);
+static void    rt2860_parent(struct ieee80211com *);
 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);
@@ -137,12 +138,17 @@ static void       rt2860_set_basicrates(struct 
rt2860_softc *,
                    const struct ieee80211_rateset *);
 static void    rt2860_scan_start(struct ieee80211com *);
 static void    rt2860_scan_end(struct ieee80211com *);
+static void    rt2860_getradiocaps(struct ieee80211com *, int, int *,
+                   struct ieee80211_channel[]);
 static void    rt2860_set_channel(struct ieee80211com *);
 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 void    rt5390_set_chan(struct rt2860_softc *, u_int);
 static int     rt3090_rf_init(struct rt2860_softc *);
+static void    rt5390_rf_init(struct rt2860_softc *);
 static void    rt3090_rf_wakeup(struct rt2860_softc *);
+static void    rt5390_rf_wakeup(struct rt2860_softc *);
 static int     rt3090_filter_calib(struct rt2860_softc *, uint8_t, uint8_t,
                    uint8_t *);
 static void    rt3090_rf_setup(struct rt2860_softc *);
@@ -150,9 +156,9 @@ 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_update_promisc(struct ifnet *);
-static void    rt2860_updateslot(struct ifnet *);
-static void    rt2860_updateprot(struct ifnet *);
+static void    rt2860_update_promisc(struct ieee80211com *);
+static void    rt2860_updateslot(struct ieee80211com *);
+static void    rt2860_updateprot(struct rt2860_softc *);

[ *** diff truncated: 2119 lines dropped *** ]


############################################################################

Commit:      5f64721b3036873c3a008b359c0f4e806d8901a6
URL:         https://git.haiku-os.org/haiku/commit/?id=5f64721b3036
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Tue Jul 17 23:53:33 2018 UTC

marvell88w8335: Sync with FreeBSD 11.1.

Untested, but the changes are mostly adaptations to the new KPIs.

----------------------------------------------------------------------------

############################################################################

Revision:    hrev52113
Commit:      f329739cdc520e8487b07473b0d8e3fae04a3eb0
URL:         https://git.haiku-os.org/haiku/commit/?id=f329739cdc52
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Wed Jul 18 00:05:35 2018 UTC

marvell88w8363: Sync with FreeBSD 11.1.

Untested, but the changes are mostly adapations to the new KPIs.

----------------------------------------------------------------------------


Other related posts:

  • » [haiku-commits] haiku: hrev52113 - in src/add-ons/kernel/drivers/network/wlan: ralinkwifi/dev/ral marvell88w8363/dev/mwl marvell88w8335/dev/malo - waddlesplash