[haiku-commits] Change in haiku[master]: idualwifi7260: Port changes from newer FreeBSD.

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 17 May 2020 23:34:21 +0000

From waddlesplash <waddlesplash@xxxxxxxxx>:

waddlesplash has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/2733 ;)


Change subject: idualwifi7260: Port changes from newer FreeBSD.
......................................................................

idualwifi7260: Port changes from newer FreeBSD.

This adds support for the 9xxx series of devices.
---
A data/system/data/firmware/idualwifi7260/iwm-9000-ucode-34.tgz
A data/system/data/firmware/idualwifi7260/iwm-9260-ucode-34.tgz
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/Jamfile
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_7000.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_8000.c
A src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9000.c
A src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9260.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_config.h

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_constants.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_debug.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.h

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.c

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.h

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.c

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.h

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.c

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.h

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.c

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.h

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.c

src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.c
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmreg.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmvar.h
M src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c
42 files changed, 1,856 insertions(+), 964 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/33/2733/1

diff --git a/data/system/data/firmware/idualwifi7260/iwm-9000-ucode-34.tgz 
b/data/system/data/firmware/idualwifi7260/iwm-9000-ucode-34.tgz
new file mode 100644
index 0000000..37e22bc
--- /dev/null
+++ b/data/system/data/firmware/idualwifi7260/iwm-9000-ucode-34.tgz
Binary files differ
diff --git a/data/system/data/firmware/idualwifi7260/iwm-9260-ucode-34.tgz 
b/data/system/data/firmware/idualwifi7260/iwm-9260-ucode-34.tgz
new file mode 100644
index 0000000..4b79b59
--- /dev/null
+++ b/data/system/data/firmware/idualwifi7260/iwm-9260-ucode-34.tgz
Binary files differ
diff --git a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/Jamfile 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/Jamfile
index 37e35f0..7a83cab 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/Jamfile
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/Jamfile
@@ -18,6 +18,8 @@
 KernelAddon idualwifi7260 :
     if_iwm_7000.c
        if_iwm_8000.c
+       if_iwm_9000.c
+       if_iwm_9260.c
        if_iwm_binding.c
        if_iwm_fw.c
        if_iwm_led.c
@@ -42,9 +44,11 @@
 HAIKU_WIFI_FIRMWARE_PACKAGES on idualwifi7260 =
        iwm-3160-ucode-17 iwm-3168-ucode-22
        iwm-7260-ucode-17 iwm-7265-ucode-17 iwm-7265D-ucode-22
-       iwm-8000C-ucode-22 iwm-8265-ucode-22 ;
+       iwm-8000C-ucode-22 iwm-8265-ucode-22
+       iwm-9000-ucode-34 iwm-9260-ucode-34 ;
 HAIKU_WIFI_FIRMWARE_ARCHIVES on idualwifi7260 =
        iwm-3160-ucode-17.tgz iwm-3168-ucode-22.tgz
        iwm-7260-ucode-17.tgz iwm-7265-ucode-17.tgz iwm-7265D-ucode-22.tgz
-       iwm-8000C-ucode-22.tgz iwm-8265-ucode-22.tgz ;
+       iwm-8000C-ucode-22.tgz iwm-8265-ucode-22.tgz
+       iwm-9000-ucode-34.tgz iwm-9260-ucode-34.tgz ;
 HAIKU_WIFI_FIRMWARE_DO_EXTRACT on idualwifi7260 = true ;
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm.c
index e39e772..9b82621 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm.c
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm.c 339038 2018-10-01 
10:44:33Z bz $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -231,10 +231,10 @@
        uint8_t *data;
 };

-#define IWM_MVM_UCODE_ALIVE_TIMEOUT    (5*hz)
-#define IWM_MVM_UCODE_CALIB_TIMEOUT    (10*hz)
+#define IWM_UCODE_ALIVE_TIMEOUT        hz
+#define IWM_UCODE_CALIB_TIMEOUT        (2*hz)

-struct iwm_mvm_alive_data {
+struct iwm_alive_data {
        int valid;
        uint32_t scd_base_addr;
 };
@@ -263,7 +263,7 @@
 static void    iwm_ict_reset(struct iwm_softc *);
 static int     iwm_allow_mcast(struct ieee80211vap *, struct iwm_softc *);
 static void    iwm_stop_device(struct iwm_softc *);
-static void    iwm_mvm_nic_config(struct iwm_softc *);
+static void    iwm_nic_config(struct iwm_softc *);
 static int     iwm_nic_rx_init(struct iwm_softc *);
 static int     iwm_nic_tx_init(struct iwm_softc *);
 static int     iwm_nic_init(struct iwm_softc *);
@@ -317,25 +317,23 @@
 static int     iwm_start_fw(struct iwm_softc *, const struct iwm_fw_img *);
 static int     iwm_send_tx_ant_cfg(struct iwm_softc *, uint8_t);
 static int     iwm_send_phy_cfg_cmd(struct iwm_softc *);
-static int     iwm_mvm_load_ucode_wait_alive(struct iwm_softc *,
+static int     iwm_load_ucode_wait_alive(struct iwm_softc *,
                                               enum iwm_ucode_type);
-static int     iwm_run_init_mvm_ucode(struct iwm_softc *, int);
-static int     iwm_mvm_config_ltr(struct iwm_softc *sc);
+static int     iwm_run_init_ucode(struct iwm_softc *, int);
+static int     iwm_config_ltr(struct iwm_softc *sc);
 static int     iwm_rx_addbuf(struct iwm_softc *, int, int);
-static int     iwm_mvm_get_signal_strength(struct iwm_softc *,
-                                           struct iwm_rx_phy_info *);
-static void    iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *,
+static void    iwm_rx_rx_phy_cmd(struct iwm_softc *,
                                       struct iwm_rx_packet *);
 static int     iwm_get_noise(struct iwm_softc *,
-                   const struct iwm_mvm_statistics_rx_non_phy *);
-static void    iwm_mvm_handle_rx_statistics(struct iwm_softc *,
+                   const struct iwm_statistics_rx_non_phy *);
+static void    iwm_handle_rx_statistics(struct iwm_softc *,
                    struct iwm_rx_packet *);
-static boolean_t iwm_mvm_rx_rx_mpdu(struct iwm_softc *, struct mbuf *,
-                                   uint32_t, boolean_t);
-static int     iwm_mvm_rx_tx_cmd_single(struct iwm_softc *,
+static bool    iwm_rx_mpdu(struct iwm_softc *, struct mbuf *,
+                   uint32_t, bool);
+static int     iwm_rx_tx_cmd_single(struct iwm_softc *,
                                          struct iwm_rx_packet *,
                                         struct iwm_node *);
-static void    iwm_mvm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *);
+static void    iwm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *);
 static void    iwm_cmd_done(struct iwm_softc *, struct iwm_rx_packet *);
 #if 0
 static void    iwm_update_sched(struct iwm_softc *, int, int, uint8_t,
@@ -348,7 +346,7 @@
                        struct ieee80211_node *, int);
 static int     iwm_raw_xmit(struct ieee80211_node *, struct mbuf *,
                             const struct ieee80211_bpf_params *);
-static int     iwm_mvm_update_quotas(struct iwm_softc *, struct iwm_vap *);
+static int     iwm_update_quotas(struct iwm_softc *, struct iwm_vap *);
 static int     iwm_auth(struct ieee80211vap *, struct iwm_softc *);
 static struct ieee80211_node *
                iwm_node_alloc(struct ieee80211vap *,
@@ -360,10 +358,10 @@
 static int     iwm_newstate(struct ieee80211vap *, enum ieee80211_state, int);
 static void    iwm_endscan_cb(void *, int);
 static int     iwm_send_bt_init_conf(struct iwm_softc *);
-static boolean_t iwm_mvm_is_lar_supported(struct iwm_softc *);
-static boolean_t iwm_mvm_is_wifi_mcc_supported(struct iwm_softc *);
+static boolean_t iwm_is_lar_supported(struct iwm_softc *);
+static boolean_t iwm_is_wifi_mcc_supported(struct iwm_softc *);
 static int     iwm_send_update_mcc_cmd(struct iwm_softc *, const char *);
-static void    iwm_mvm_tt_tx_backoff(struct iwm_softc *, uint32_t);
+static void    iwm_tt_tx_backoff(struct iwm_softc *, uint32_t);
 static int     iwm_init_hw(struct iwm_softc *);
 static void    iwm_init(struct iwm_softc *);
 static void    iwm_start(struct iwm_softc *);
@@ -793,7 +791,7 @@
                        break;
                }

-               case 48: /* undocumented TLV */
+               case IWM_UCODE_TLV_CMD_VERSIONS:
                case IWM_UCODE_TLV_SDIO_ADMA_ADDR:
                case IWM_UCODE_TLV_FW_GSCAN_CAPA:
                        /* ignore, not used by current driver */
@@ -853,7 +851,7 @@
                                goto parse_out;
                        }
                        snprintf(sc->sc_fwver, sizeof(sc->sc_fwver),
-                           "%d.%d.%d",
+                           "%u.%u.%u",
                            le32toh(((const uint32_t *)tlv_data)[0]),
                            le32toh(((const uint32_t *)tlv_data)[1]),
                            le32toh(((const uint32_t *)tlv_data)[2]));
@@ -929,19 +927,28 @@
 iwm_alloc_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
 {
        bus_size_t size;
-       int i, error;
+       size_t descsz;
+       int count, i, error;

        ring->cur = 0;
+       if (sc->cfg->mqrx_supported) {
+               count = IWM_RX_MQ_RING_COUNT;
+               descsz = sizeof(uint64_t);
+       } else {
+               count = IWM_RX_LEGACY_RING_COUNT;
+               descsz = sizeof(uint32_t);
+       }

        /* Allocate RX descriptors (256-byte aligned). */
-       size = IWM_RX_RING_COUNT * sizeof(uint32_t);
-       error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
+       size = count * descsz;
+       error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->free_desc_dma, size,
+           256);
        if (error != 0) {
                device_printf(sc->sc_dev,
                    "could not allocate RX ring DMA memory\n");
                goto fail;
        }
-       ring->desc = ring->desc_dma.vaddr;
+       ring->desc = ring->free_desc_dma.vaddr;

        /* Allocate RX status area (16-byte aligned). */
        error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->stat_dma,
@@ -953,6 +960,17 @@
        }
        ring->stat = ring->stat_dma.vaddr;

+       if (sc->cfg->mqrx_supported) {
+               size = count * sizeof(uint32_t);
+               error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->used_desc_dma,
+                   size, 256);
+               if (error != 0) {
+                       device_printf(sc->sc_dev,
+                           "could not allocate RX ring DMA memory\n");
+                       goto fail;
+               }
+       }
+
         /* Create RX buffer DMA tag. */
         error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
             BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
@@ -972,10 +990,11 @@
                    __func__, error);
                goto fail;
        }
+
        /*
         * Allocate and map RX buffers.
         */
-       for (i = 0; i < IWM_RX_RING_COUNT; i++) {
+       for (i = 0; i < count; i++) {
                struct iwm_rx_data *data = &ring->data[i];
                error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
                if (error != 0) {
@@ -1013,12 +1032,16 @@
 static void
 iwm_free_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
 {
-       int i;
+       int count, i;

-       iwm_dma_contig_free(&ring->desc_dma);
+       iwm_dma_contig_free(&ring->free_desc_dma);
        iwm_dma_contig_free(&ring->stat_dma);
+       iwm_dma_contig_free(&ring->used_desc_dma);

-       for (i = 0; i < IWM_RX_RING_COUNT; i++) {
+       count = sc->cfg->mqrx_supported ? IWM_RX_MQ_RING_COUNT :
+           IWM_RX_LEGACY_RING_COUNT;
+
+       for (i = 0; i < count; i++) {
                struct iwm_rx_data *data = &ring->data[i];

                if (data->m != NULL) {
@@ -1070,7 +1093,7 @@
         * We only use rings 0 through 9 (4 EDCA + cmd) so there is no need
         * to allocate commands space for other rings.
         */
-       if (qid > IWM_MVM_CMD_QUEUE)
+       if (qid > IWM_CMD_QUEUE)
                return 0;

        size = IWM_TX_RING_COUNT * sizeof(struct iwm_device_cmd);
@@ -1083,7 +1106,7 @@
        ring->cmd = ring->cmd_dma.vaddr;

        /* FW commands may require more mapped space than packets. */
-       if (qid == IWM_MVM_CMD_QUEUE) {
+       if (qid == IWM_CMD_QUEUE) {
                maxsize = IWM_RBUF_SIZE;
                nsegments = 1;
        } else {
@@ -1140,15 +1163,14 @@
                }
        }
        /* Clear TX descriptors. */
-       if (ring->desc)
-               memset(ring->desc, 0, ring->desc_dma.size);
+       memset(ring->desc, 0, ring->desc_dma.size);
        bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
            BUS_DMASYNC_PREWRITE);
        sc->qfullmsk &= ~(1 << ring->qid);
        ring->queued = 0;
        ring->cur = 0;

-       if (ring->qid == IWM_MVM_CMD_QUEUE && sc->cmd_hold_nic_awake)
+       if (ring->qid == IWM_CMD_QUEUE && sc->cmd_hold_nic_awake)
                iwm_pcie_clear_cmd_in_flight(sc);
 }

@@ -1316,12 +1338,14 @@
        /* Stop the device, and put it in low power state */
        iwm_apm_stop(sc);

-       /* Upon stop, the APM issues an interrupt if HW RF kill is set.
-        * Clean again the interrupt here
+       /* stop and reset the on-board processor */
+       IWM_SETBITS(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET);
+       DELAY(5000);
+
+       /*
+        * Upon stop, the APM issues an interrupt if HW RF kill is set.
         */
        iwm_disable_interrupts(sc);
-       /* stop and reset the on-board processor */
-       IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET);

        /*
         * Even if we stop the HW, we still want the RF kill
@@ -1329,15 +1353,17 @@
         */
        iwm_enable_rfkill_int(sc);
        iwm_check_rfkill(sc);
+
+       iwm_prepare_card_hw(sc);
 }

 /* iwlwifi: mvm/ops.c */
 static void
-iwm_mvm_nic_config(struct iwm_softc *sc)
+iwm_nic_config(struct iwm_softc *sc)
 {
        uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
        uint32_t reg_val = 0;
-       uint32_t phy_config = iwm_mvm_get_phy_config(sc);
+       uint32_t phy_config = iwm_get_phy_config(sc);

        radio_cfg_type = (phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
            IWM_FW_PHY_CFG_RADIO_TYPE_POS;
@@ -1357,7 +1383,15 @@
        reg_val |= radio_cfg_step << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_STEP;
        reg_val |= radio_cfg_dash << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;

-       IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG, reg_val);
+       IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG,
+           IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_DASH |
+           IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_STEP |
+           IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_STEP |
+           IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_DASH |
+           IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_TYPE |
+           IWM_CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
+           IWM_CSR_HW_IF_CONFIG_REG_BIT_MAC_SI |
+           reg_val);

        IWM_DPRINTF(sc, IWM_DEBUG_RESET,
            "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
@@ -1376,12 +1410,61 @@
 }

 static int
-iwm_nic_rx_init(struct iwm_softc *sc)
+iwm_nic_rx_mq_init(struct iwm_softc *sc)
 {
-       /*
-        * Initialize RX ring.  This is from the iwn driver.
-        */
-       memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat));
+       int enabled;
+
+       if (!iwm_nic_lock(sc))
+               return EBUSY;
+
+       /* Stop RX DMA. */
+       iwm_write_prph(sc, IWM_RFH_RXF_DMA_CFG, 0);
+       /* Disable RX used and free queue operation. */
+       iwm_write_prph(sc, IWM_RFH_RXF_RXQ_ACTIVE, 0);
+
+       iwm_write_prph64(sc, IWM_RFH_Q0_FRBDCB_BA_LSB,
+           sc->rxq.free_desc_dma.paddr);
+       iwm_write_prph64(sc, IWM_RFH_Q0_URBDCB_BA_LSB,
+           sc->rxq.used_desc_dma.paddr);
+       iwm_write_prph64(sc, IWM_RFH_Q0_URBD_STTS_WPTR_LSB,
+           sc->rxq.stat_dma.paddr);
+       iwm_write_prph(sc, IWM_RFH_Q0_FRBDCB_WIDX, 0);
+       iwm_write_prph(sc, IWM_RFH_Q0_FRBDCB_RIDX, 0);
+       iwm_write_prph(sc, IWM_RFH_Q0_URBDCB_WIDX, 0);
+
+       /* We configure only queue 0 for now. */
+       enabled = ((1 << 0) << 16) | (1 << 0);
+
+       /* Enable RX DMA, 4KB buffer size. */
+       iwm_write_prph(sc, IWM_RFH_RXF_DMA_CFG,
+           IWM_RFH_DMA_EN_ENABLE_VAL |
+           IWM_RFH_RXF_DMA_RB_SIZE_4K |
+           IWM_RFH_RXF_DMA_MIN_RB_4_8 |
+           IWM_RFH_RXF_DMA_DROP_TOO_LARGE_MASK |
+           IWM_RFH_RXF_DMA_RBDCB_SIZE_512);
+
+       /* Enable RX DMA snooping. */
+       iwm_write_prph(sc, IWM_RFH_GEN_CFG,
+           IWM_RFH_GEN_CFG_RFH_DMA_SNOOP |
+           IWM_RFH_GEN_CFG_SERVICE_DMA_SNOOP |
+           (sc->cfg->integrated ? IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_64 :
+           IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_128));
+
+       /* Enable the configured queue(s). */
+       iwm_write_prph(sc, IWM_RFH_RXF_RXQ_ACTIVE, enabled);
+
+       iwm_nic_unlock(sc);
+
+       IWM_WRITE_1(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_TIMEOUT_DEF);
+
+       IWM_WRITE(sc, IWM_RFH_Q0_FRBDCB_WIDX_TRG, 8);
+
+       return (0);
+}
+
+static int
+iwm_nic_rx_legacy_init(struct iwm_softc *sc)
+{

        /* Stop Rx DMA */
        iwm_pcie_rx_stop(sc);
@@ -1397,7 +1480,8 @@

        /* Set physical address of RX ring (256-byte aligned). */
        IWM_WRITE(sc,
-           IWM_FH_RSCSR_CHNL0_RBDCB_BASE_REG, sc->rxq.desc_dma.paddr >> 8);
+           IWM_FH_RSCSR_CHNL0_RBDCB_BASE_REG,
+           sc->rxq.free_desc_dma.paddr >> 8);

        /* Set physical address of RX status (16-byte aligned). */
        IWM_WRITE(sc,
@@ -1430,20 +1514,23 @@
        if (sc->cfg->host_interrupt_operation_mode)
                IWM_SETBITS(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_OPER_MODE);

-       /*
-        * Thus sayeth el jefe (iwlwifi) via a comment:
-        *
-        * This value should initially be 0 (before preparing any
-        * RBs), should be 8 after preparing the first 8 RBs (for example)
-        */
-       IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, 8);
-
        iwm_nic_unlock(sc);

+       IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, 8);
+
        return 0;
 }

 static int
+iwm_nic_rx_init(struct iwm_softc *sc)
+{
+       if (sc->cfg->mqrx_supported)
+               return iwm_nic_rx_mq_init(sc);
+       else
+               return iwm_nic_rx_legacy_init(sc);
+}
+
+static int
 iwm_nic_tx_init(struct iwm_softc *sc)
 {
        int qid;
@@ -1471,7 +1558,9 @@
                    (unsigned long) (txq->desc_dma.paddr >> 8));
        }

-       iwm_write_prph(sc, IWM_SCD_GP_CTRL, IWM_SCD_GP_CTRL_AUTO_ACTIVE_MODE);
+       iwm_set_bits_prph(sc, IWM_SCD_GP_CTRL,
+           IWM_SCD_GP_CTRL_AUTO_ACTIVE_MODE |
+           IWM_SCD_GP_CTRL_ENABLE_31_QUEUES);

        iwm_nic_unlock(sc);

@@ -1487,7 +1576,7 @@
        if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000)
                iwm_set_pwr(sc);

-       iwm_mvm_nic_config(sc);
+       iwm_nic_config(sc);

        if ((error = iwm_nic_rx_init(sc)) != 0)
                return error;
@@ -1508,25 +1597,31 @@
 int
 iwm_enable_txq(struct iwm_softc *sc, int sta_id, int qid, int fifo)
 {
+       int qmsk;
+
+       qmsk = 1 << qid;
+
        if (!iwm_nic_lock(sc)) {
-               device_printf(sc->sc_dev,
-                   "%s: cannot enable txq %d\n",
-                   __func__,
-                   qid);
+               device_printf(sc->sc_dev, "%s: cannot enable txq %d\n",
+                   __func__, qid);
                return EBUSY;
        }

        IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, qid << 8 | 0);

-       if (qid == IWM_MVM_CMD_QUEUE) {
-               /* unactivate before configuration */
+       if (qid == IWM_CMD_QUEUE) {
+               /* Disable the scheduler. */
+               iwm_write_prph(sc, IWM_SCD_EN_CTRL, 0);
+
+               /* Stop the TX queue prior to configuration. */
                iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
-                   (0 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE)
-                   | (1 << IWM_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN));
+                   (0 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE) |
+                   (1 << IWM_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN));

                iwm_nic_unlock(sc);

-               iwm_clear_bits_prph(sc, IWM_SCD_AGGR_SEL, (1 << qid));
+               /* Disable aggregations for this queue. */
+               iwm_clear_bits_prph(sc, IWM_SCD_AGGR_SEL, qmsk);

                if (!iwm_nic_lock(sc)) {
                        device_printf(sc->sc_dev,
@@ -1536,7 +1631,8 @@
                iwm_write_prph(sc, IWM_SCD_QUEUE_RDPTR(qid), 0);
                iwm_nic_unlock(sc);

-               iwm_write_mem32(sc, sc->scd_base_addr + 
IWM_SCD_CONTEXT_QUEUE_OFFSET(qid), 0);
+               iwm_write_mem32(sc,
+                   sc->scd_base_addr + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid), 0);
                /* Set scheduler window size and frame limit. */
                iwm_write_mem32(sc,
                    sc->scd_base_addr + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid) +
@@ -1556,6 +1652,9 @@
                    (fifo << IWM_SCD_QUEUE_STTS_REG_POS_TXF) |
                    (1 << IWM_SCD_QUEUE_STTS_REG_POS_WSL) |
                    IWM_SCD_QUEUE_STTS_REG_MSK);
+
+               /* Enable the scheduler for this queue. */
+               iwm_write_prph(sc, IWM_SCD_EN_CTRL, qmsk);
        } else {
                struct iwm_scd_txq_cfg_cmd cmd;
                int error;
@@ -1570,7 +1669,7 @@
                cmd.aggregate = 0;
                cmd.window = IWM_FRAME_LIMIT;

-               error = iwm_mvm_send_cmd_pdu(sc, IWM_SCD_QUEUE_CFG, 
IWM_CMD_SYNC,
+               error = iwm_send_cmd_pdu(sc, IWM_SCD_QUEUE_CFG, IWM_CMD_SYNC,
                    sizeof(cmd), &cmd);
                if (error) {
                        device_printf(sc->sc_dev,
@@ -1582,9 +1681,6 @@
                        return EBUSY;
        }

-       iwm_write_prph(sc, IWM_SCD_EN_CTRL,
-           iwm_read_prph(sc, IWM_SCD_EN_CTRL) | qid);
-
        iwm_nic_unlock(sc);

        IWM_DPRINTF(sc, IWM_DEBUG_XMIT, "%s: enabled txq %d FIFO %d\n",
@@ -1636,7 +1732,7 @@
        iwm_nic_unlock(sc);

        /* enable command channel */
-       error = iwm_enable_txq(sc, 0 /* unused */, IWM_MVM_CMD_QUEUE, 7);
+       error = iwm_enable_txq(sc, 0 /* unused */, IWM_CMD_QUEUE, 7);
        if (error)
                return error;

@@ -1658,7 +1754,7 @@
        iwm_nic_unlock(sc);

        /* Enable L1-Active */
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) {
                iwm_clear_bits_prph(sc, IWM_APMG_PCIDEV_STT_REG,
                    IWM_APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
        }
@@ -2076,7 +2172,7 @@
 iwm_get_sku(const struct iwm_softc *sc, const uint16_t *nvm_sw,
            const uint16_t *phy_sku)
 {
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000)
                return le16_to_cpup(nvm_sw + IWM_SKU);

        return le32_to_cpup((const uint32_t *)(phy_sku + IWM_SKU_8000));
@@ -2085,7 +2181,7 @@
 static int
 iwm_get_nvm_version(const struct iwm_softc *sc, const uint16_t *nvm_sw)
 {
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000)
                return le16_to_cpup(nvm_sw + IWM_NVM_VERSION);
        else
                return le32_to_cpup((const uint32_t *)(nvm_sw +
@@ -2096,7 +2192,7 @@
 iwm_get_radio_cfg(const struct iwm_softc *sc, const uint16_t *nvm_sw,
                  const uint16_t *phy_sku)
 {
-        if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
+        if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000)
                 return le16_to_cpup(nvm_sw + IWM_RADIO_CFG);

         return le32_to_cpup((const uint32_t *)(phy_sku + IWM_RADIO_CFG_8000));
@@ -2107,7 +2203,7 @@
 {
        int n_hw_addr;

-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000)
                return le16_to_cpup(nvm_sw + IWM_N_HW_ADDRS);

        n_hw_addr = le32_to_cpup((const uint32_t *)(nvm_sw + 
IWM_N_HW_ADDRS_8000));
@@ -2119,7 +2215,7 @@
 iwm_set_radio_cfg(const struct iwm_softc *sc, struct iwm_nvm_data *data,
                  uint32_t radio_cfg)
 {
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) {
                data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK(radio_cfg);
                data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK(radio_cfg);
                data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK(radio_cfg);
@@ -2145,7 +2241,7 @@
                iwm_set_hw_address_from_csr(sc, data);
         } else
 #endif
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) {
                const uint8_t *hw_addr = (const uint8_t *)(nvm_hw + 
IWM_HW_ADDR);

                /* The byte order is little endian 16 bit, meaning 214365 */
@@ -2177,7 +2273,7 @@
        uint32_t sku, radio_cfg;
        uint16_t lar_config;
 
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) {
                data = malloc(sizeof(*data) +
                    IWM_NUM_CHANNELS * sizeof(uint16_t),
                    M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -2201,7 +2297,8 @@

        data->n_hw_addrs = iwm_get_n_hw_addrs(sc, nvm_sw);

-       if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) {
+               /* TODO: use IWL_NVM_EXT */
                uint16_t lar_offset = data->nvm_version < 0xE39 ?
                                       IWM_NVM_LAR_OFFSET_8000_OLD :
                                       IWM_NVM_LAR_OFFSET_8000;
@@ -2218,7 +2315,8 @@
        }

        if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) {
-               memcpy(data->nvm_ch_flags, &nvm_sw[IWM_NVM_CHANNELS],
+               memcpy(data->nvm_ch_flags, sc->cfg->nvm_type == IWM_NVM_SDP ?
+                   &regulatory[0] : &nvm_sw[IWM_NVM_CHANNELS],
                    IWM_NUM_CHANNELS * sizeof(uint16_t));
        } else {
                memcpy(data->nvm_ch_flags, &regulatory[IWM_NVM_CHANNELS_8000],
@@ -2248,7 +2346,7 @@
                            "Can't parse empty OTP/NVM sections\n");
                        return NULL;
                }
-       } else if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
+       } else if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) {
                /* SW and REGULATORY sections are mandatory */
                if (!sections[IWM_NVM_SECTION_TYPE_SW].data ||
                    !sections[IWM_NVM_SECTION_TYPE_REGULATORY].data) {
@@ -2278,8 +2376,9 @@
        sw = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_SW].data;
        calib = (const uint16_t *)
            sections[IWM_NVM_SECTION_TYPE_CALIBRATION].data;
-       regulatory = (const uint16_t *)
-           sections[IWM_NVM_SECTION_TYPE_REGULATORY].data;
+       regulatory = sc->cfg->nvm_type == IWM_NVM_SDP ?
+           (const uint16_t 
*)sections[IWM_NVM_SECTION_TYPE_REGULATORY_SDP].data :
+           (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_REGULATORY].data;
        mac_override = (const uint16_t *)
            sections[IWM_NVM_SECTION_TYPE_MAC_OVERRIDE].data;
        phy_sku = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_PHY_SKU].data;
@@ -2677,7 +2776,7 @@
        IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);

        /* Load the given image to the HW */
-       if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000)
+       if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000)
                ret = iwm_pcie_load_given_ucode_8000(sc, fw);
        else
                ret = iwm_pcie_load_given_ucode(sc, fw);
@@ -2695,7 +2794,7 @@
                .valid = htole32(valid_tx_ant),
        };

-       return iwm_mvm_send_cmd_pdu(sc, IWM_TX_ANT_CONFIGURATION_CMD,
+       return iwm_send_cmd_pdu(sc, IWM_TX_ANT_CONFIGURATION_CMD,
            IWM_CMD_SYNC, sizeof(tx_ant_cmd), &tx_ant_cmd);
 }

@@ -2707,7 +2806,7 @@
        enum iwm_ucode_type ucode_type = sc->cur_ucode;

        /* Set parameters */
-       phy_cfg_cmd.phy_cfg = htole32(iwm_mvm_get_phy_config(sc));
+       phy_cfg_cmd.phy_cfg = htole32(iwm_get_phy_config(sc));
        phy_cfg_cmd.calib_control.event_trigger =
            sc->sc_default_calib[ucode_type].event_trigger;
        phy_cfg_cmd.calib_control.flow_trigger =
@@ -2715,16 +2814,16 @@

        IWM_DPRINTF(sc, IWM_DEBUG_CMD | IWM_DEBUG_RESET,
            "Sending Phy CFG command: 0x%x\n", phy_cfg_cmd.phy_cfg);
-       return iwm_mvm_send_cmd_pdu(sc, IWM_PHY_CONFIGURATION_CMD, IWM_CMD_SYNC,
+       return iwm_send_cmd_pdu(sc, IWM_PHY_CONFIGURATION_CMD, IWM_CMD_SYNC,
            sizeof(phy_cfg_cmd), &phy_cfg_cmd);
 }

 static int
 iwm_alive_fn(struct iwm_softc *sc, struct iwm_rx_packet *pkt, void *data)
 {
-       struct iwm_mvm_alive_data *alive_data = data;
-       struct iwm_mvm_alive_resp_v3 *palive3;
-       struct iwm_mvm_alive_resp *palive;
+       struct iwm_alive_data *alive_data = data;
+       struct iwm_alive_resp_v3 *palive3;
+       struct iwm_alive_resp *palive;
        struct iwm_umac_alive *umac;
        struct iwm_lmac_alive *lmac1;
        struct iwm_lmac_alive *lmac2 = NULL;
@@ -2792,15 +2891,15 @@
 }

 static int
-iwm_mvm_load_ucode_wait_alive(struct iwm_softc *sc,
+iwm_load_ucode_wait_alive(struct iwm_softc *sc,
        enum iwm_ucode_type ucode_type)
 {
        struct iwm_notification_wait alive_wait;
-       struct iwm_mvm_alive_data alive_data;
+       struct iwm_alive_data alive_data;
        const struct iwm_fw_img *fw;
        enum iwm_ucode_type old_type = sc->cur_ucode;
        int error;
-       static const uint16_t alive_cmd[] = { IWM_MVM_ALIVE };
+       static const uint16_t alive_cmd[] = { IWM_ALIVE };

        fw = &sc->sc_fw.img[ucode_type];
        sc->cur_ucode = ucode_type;
@@ -2825,10 +2924,10 @@
         */
        IWM_UNLOCK(sc);
        error = iwm_wait_notification(sc->sc_notif_wait, &alive_wait,
-                                     IWM_MVM_UCODE_ALIVE_TIMEOUT);
+                                     IWM_UCODE_ALIVE_TIMEOUT);
        IWM_LOCK(sc);
        if (error) {
-               if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
+               if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) {
                        uint32_t a = 0x5a5a5a5a, b = 0x5a5a5a5a;
                        if (iwm_nic_lock(sc)) {
                                a = iwm_read_prph(sc, IWM_SB_CPU_1_STATUS);
@@ -2888,7 +2987,7 @@
  * follows iwlwifi/fw.c
  */
 static int
-iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justnvm)
+iwm_run_init_ucode(struct iwm_softc *sc, int justnvm)
 {
        struct iwm_notification_wait calib_wait;
        static const uint16_t init_complete[] = {
@@ -2912,13 +3011,22 @@
                                   sc->sc_phy_db);

        /* Will also start the device */
-       ret = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_INIT);
+       ret = iwm_load_ucode_wait_alive(sc, IWM_UCODE_INIT);
        if (ret) {
                device_printf(sc->sc_dev, "Failed to start INIT ucode: %d\n",
                    ret);
                goto error;
        }

+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) {
+               ret = iwm_send_bt_init_conf(sc);
+               if (ret) {
+                       device_printf(sc->sc_dev,
+                           "failed to send bt coex configuration: %d\n", ret);
+                       goto error;
+               }
+       }
+
        if (justnvm) {
                /* Read nvm */
                ret = iwm_nvm_init(sc);
@@ -2930,15 +3038,8 @@
                goto error;
        }

-       ret = iwm_send_bt_init_conf(sc);
-       if (ret) {
-               device_printf(sc->sc_dev,
-                   "failed to send bt coex configuration: %d\n", ret);
-               goto error;
-       }
-
        /* Send TX valid antennas before triggering calibrations */
-       ret = iwm_send_tx_ant_cfg(sc, iwm_mvm_get_valid_tx_ant(sc));
+       ret = iwm_send_tx_ant_cfg(sc, iwm_get_valid_tx_ant(sc));
        if (ret) {
                device_printf(sc->sc_dev,
                    "failed to send antennas before calibration: %d\n", ret);
@@ -2963,7 +3064,7 @@
         */
        IWM_UNLOCK(sc);
        ret = iwm_wait_notification(sc->sc_notif_wait, &calib_wait,
-           IWM_MVM_UCODE_CALIB_TIMEOUT);
+           IWM_UCODE_CALIB_TIMEOUT);
        IWM_LOCK(sc);


@@ -2976,7 +3077,7 @@
 }

 static int
-iwm_mvm_config_ltr(struct iwm_softc *sc)
+iwm_config_ltr(struct iwm_softc *sc)
 {
        struct iwm_ltr_config_cmd cmd = {
                .flags = htole32(IWM_LTR_CFG_FLAG_FEATURE_ENABLE),
@@ -2985,7 +3086,7 @@
        if (!sc->sc_ltr_enabled)
                return 0;

-       return iwm_mvm_send_cmd_pdu(sc, IWM_LTR_CONFIG, 0, sizeof(cmd), &cmd);
+       return iwm_send_cmd_pdu(sc, IWM_LTR_CONFIG, 0, sizeof(cmd), &cmd);
 }

 /*
@@ -3030,48 +3131,18 @@

        /* Update RX descriptor. */
        KASSERT((seg.ds_addr & 255) == 0, ("seg.ds_addr not aligned"));
-       ring->desc[idx] = htole32(seg.ds_addr >> 8);
-       bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
+       if (sc->cfg->mqrx_supported)
+               ((uint64_t *)ring->desc)[idx] = htole64(seg.ds_addr);
+       else
+               ((uint32_t *)ring->desc)[idx] = htole32(seg.ds_addr >> 8);
+       bus_dmamap_sync(ring->free_desc_dma.tag, ring->free_desc_dma.map,
            BUS_DMASYNC_PREWRITE);

        return 0;
 }

-/* iwlwifi: mvm/rx.c */
-/*
- * iwm_mvm_get_signal_strength - use new rx PHY INFO API
- * values are reported by the fw as positive values - need to negate
- * to obtain their dBM.  Account for missing antennas by replacing 0
- * values by -256dBm: practically 0 power and a non-feasible 8 bit value.
- */
-static int
-iwm_mvm_get_signal_strength(struct iwm_softc *sc, struct iwm_rx_phy_info 
*phy_info)
-{
-       int energy_a, energy_b, energy_c, max_energy;
-       uint32_t val;
-
-       val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_ENERGY_ANT_ABC_IDX]);
-       energy_a = (val & IWM_RX_INFO_ENERGY_ANT_A_MSK) >>
-           IWM_RX_INFO_ENERGY_ANT_A_POS;
-       energy_a = energy_a ? -energy_a : -256;
-       energy_b = (val & IWM_RX_INFO_ENERGY_ANT_B_MSK) >>
-           IWM_RX_INFO_ENERGY_ANT_B_POS;
-       energy_b = energy_b ? -energy_b : -256;
-       energy_c = (val & IWM_RX_INFO_ENERGY_ANT_C_MSK) >>
-           IWM_RX_INFO_ENERGY_ANT_C_POS;
-       energy_c = energy_c ? -energy_c : -256;
-       max_energy = MAX(energy_a, energy_b);
-       max_energy = MAX(max_energy, energy_c);
-
-       IWM_DPRINTF(sc, IWM_DEBUG_RECV,
-           "energy In A %d B %d C %d , and max %d\n",
-           energy_a, energy_b, energy_c, max_energy);
-
-       return max_energy;
-}
-
 static void
-iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
+iwm_rx_rx_phy_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
 {
        struct iwm_rx_phy_info *phy_info = (void *)pkt->data;

@@ -3085,7 +3156,7 @@
  */
 static int
 iwm_get_noise(struct iwm_softc *sc,
-    const struct iwm_mvm_statistics_rx_non_phy *stats)
+    const struct iwm_statistics_rx_non_phy *stats)
 {
        int i, total, nbant, noise;

@@ -3115,7 +3186,7 @@
 }

 static void
-iwm_mvm_handle_rx_statistics(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
+iwm_handle_rx_statistics(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
 {
        struct iwm_notif_statistics_v10 *stats = (void *)&pkt->data;

@@ -3123,19 +3194,65 @@
        sc->sc_noise = iwm_get_noise(sc, &stats->rx.general);
 }

+/* iwlwifi: mvm/rx.c */
 /*
- * iwm_mvm_rx_rx_mpdu - IWM_REPLY_RX_MPDU_CMD handler
+ * iwm_get_signal_strength - use new rx PHY INFO API
+ * values are reported by the fw as positive values - need to negate
+ * to obtain their dBM.  Account for missing antennas by replacing 0
+ * values by -256dBm: practically 0 power and a non-feasible 8 bit value.
+ */
+static int
+iwm_rx_get_signal_strength(struct iwm_softc *sc,
+    struct iwm_rx_phy_info *phy_info)
+{
+       int energy_a, energy_b, energy_c, max_energy;
+       uint32_t val;
+
+       val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_ENERGY_ANT_ABC_IDX]);
+       energy_a = (val & IWM_RX_INFO_ENERGY_ANT_A_MSK) >>
+           IWM_RX_INFO_ENERGY_ANT_A_POS;
+       energy_a = energy_a ? -energy_a : -256;
+       energy_b = (val & IWM_RX_INFO_ENERGY_ANT_B_MSK) >>
+           IWM_RX_INFO_ENERGY_ANT_B_POS;
+       energy_b = energy_b ? -energy_b : -256;
+       energy_c = (val & IWM_RX_INFO_ENERGY_ANT_C_MSK) >>
+           IWM_RX_INFO_ENERGY_ANT_C_POS;
+       energy_c = energy_c ? -energy_c : -256;
+       max_energy = MAX(energy_a, energy_b);
+       max_energy = MAX(max_energy, energy_c);
+
+       IWM_DPRINTF(sc, IWM_DEBUG_RECV,
+           "energy In A %d B %d C %d , and max %d\n",
+           energy_a, energy_b, energy_c, max_energy);
+
+       return max_energy;
+}
+
+static int
+iwm_rxmq_get_signal_strength(struct iwm_softc *sc,
+    struct iwm_rx_mpdu_desc *desc)
+{
+       int energy_a, energy_b;
+
+       energy_a = desc->v1.energy_a;
+       energy_b = desc->v1.energy_b;
+       energy_a = energy_a ? -energy_a : -256;
+       energy_b = energy_b ? -energy_b : -256;
+       return MAX(energy_a, energy_b);
+}
+
+/*
+ * iwm_rx_rx_mpdu - IWM_REPLY_RX_MPDU_CMD handler
  *
  * Handles the actual data of the Rx packet from the fw
  */
-static boolean_t
-iwm_mvm_rx_rx_mpdu(struct iwm_softc *sc, struct mbuf *m, uint32_t offset,
-       boolean_t stolen)
+static bool
+iwm_rx_rx_mpdu(struct iwm_softc *sc, struct mbuf *m, uint32_t offset,
+    bool stolen)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
        struct ieee80211_frame *wh;
-       struct ieee80211_node *ni;
        struct ieee80211_rx_stats rxs;
        struct iwm_rx_phy_info *phy_info;
        struct iwm_rx_mpdu_res_start *rx_res;
@@ -3154,17 +3271,17 @@
                device_printf(sc->sc_dev,
                    "dsp size out of range [0,20]: %d\n",
                    phy_info->cfg_phy_cnt);
-               goto fail;
+               return false;
        }

        if (!(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_CRC_OK) ||
            !(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_OVERRUN_OK)) {
                IWM_DPRINTF(sc, IWM_DEBUG_RECV,
                    "Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status);
-               goto fail;
+               return false;
        }

-       rssi = iwm_mvm_get_signal_strength(sc, phy_info);
+       rssi = iwm_rx_get_signal_strength(sc, phy_info);

        /* Map it to relative value */
        rssi = rssi - sc->sc_noise;
@@ -3173,7 +3290,7 @@
        if (!stolen && iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) {
                device_printf(sc->sc_dev, "%s: unable to add more buffers\n",
                    __func__);
-               goto fail;
+               return false;
        }

        m->m_data = pkt->data + sizeof(*rx_res);
@@ -3182,8 +3299,6 @@
        IWM_DPRINTF(sc, IWM_DEBUG_RECV,
            "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->sc_noise);

-       ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
-
        IWM_DPRINTF(sc, IWM_DEBUG_RECV,
            "%s: phy_info: channel=%d, flags=0x%08x\n",
            __func__,
@@ -3206,11 +3321,8 @@
        /* rssi is in 1/2db units */
        rxs.c_rssi = rssi * 2;
        rxs.c_nf = sc->sc_noise;
-       if (ieee80211_add_rx_params(m, &rxs) == 0) {
-               if (ni)
-                       ieee80211_free_node(ni);
-               goto fail;
-       }
+       if (ieee80211_add_rx_params(m, &rxs) == 0)
+               return false;

        if (ieee80211_radiotap_active_vap(vap)) {
                struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
@@ -3244,7 +3356,141 @@
                }
        }

+       return true;
+}
+
+static bool
+iwm_rx_mpdu_mq(struct iwm_softc *sc, struct mbuf *m, uint32_t offset,
+    bool stolen)
+{
+       struct ieee80211com *ic = &sc->sc_ic;
+       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+       struct ieee80211_frame *wh;
+       struct ieee80211_rx_stats rxs;
+       struct iwm_rx_mpdu_desc *desc;
+       struct iwm_rx_packet *pkt;
+       int rssi;
+       uint32_t hdrlen, len, rate_n_flags;
+       uint16_t phy_info;
+       uint8_t channel;
+
+       pkt = mtodo(m, offset);
+       desc = (void *)pkt->data;
+
+       if (!(desc->status & htole16(IWM_RX_MPDU_RES_STATUS_CRC_OK)) ||
+           !(desc->status & htole16(IWM_RX_MPDU_RES_STATUS_OVERRUN_OK))) {
+               IWM_DPRINTF(sc, IWM_DEBUG_RECV,
+                   "Bad CRC or FIFO: 0x%08X.\n", desc->status);
+               return false;
+       }
+
+       channel = desc->v1.channel;
+       len = le16toh(desc->mpdu_len);
+       phy_info = le16toh(desc->phy_info);
+       rate_n_flags = desc->v1.rate_n_flags;
+
+       wh = mtodo(m, sizeof(*desc));
+       m->m_data = pkt->data + sizeof(*desc);
+       m->m_pkthdr.len = m->m_len = len;
+       m->m_len = len;
+
+       /* Account for padding following the frame header. */
+       if ((desc->mac_flags2 & IWM_RX_MPDU_MFLG2_PAD)) {
+               hdrlen = ieee80211_anyhdrsize(wh);
+               memmove(mtodo(m, 2), mtodo(m, 0), hdrlen);
+               m->m_data = mtodo(m, 2);
+               wh = mtod(m, struct ieee80211_frame *);
+       }
+
+       /* Map it to relative value */
+       rssi = iwm_rxmq_get_signal_strength(sc, desc);
+       rssi = rssi - sc->sc_noise;
+
+       /* replenish ring for the buffer we're going to feed to the sharks */
+       if (!stolen && iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) {
+               device_printf(sc->sc_dev, "%s: unable to add more buffers\n",
+                   __func__);
+               return false;
+       }
+
+       IWM_DPRINTF(sc, IWM_DEBUG_RECV,
+           "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->sc_noise);
+
+       /*
+        * Populate an RX state struct with the provided information.
+        */
+       bzero(&rxs, sizeof(rxs));
+       rxs.r_flags |= IEEE80211_R_IEEE | IEEE80211_R_FREQ;
+       rxs.r_flags |= IEEE80211_R_NF | IEEE80211_R_RSSI;
+       rxs.c_ieee = channel;
+       rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee,
+           channel <= 14 ? IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ);
+
+       /* rssi is in 1/2db units */
+       rxs.c_rssi = rssi * 2;
+       rxs.c_nf = sc->sc_noise;
+       if (ieee80211_add_rx_params(m, &rxs) == 0)
+               return false;
+
+       if (ieee80211_radiotap_active_vap(vap)) {
+               struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
+
+               tap->wr_flags = 0;
+               if ((phy_info & IWM_RX_MPDU_PHY_SHORT_PREAMBLE) != 0)
+                       tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
+               tap->wr_chan_freq = htole16(rxs.c_freq);
+               /* XXX only if ic->ic_curchan->ic_ieee == rxs.c_ieee */
+               tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
+               tap->wr_dbm_antsignal = (int8_t)rssi;
+               tap->wr_dbm_antnoise = (int8_t)sc->sc_noise;
+               tap->wr_tsft = desc->v1.gp2_on_air_rise;
+               switch ((rate_n_flags & 0xff)) {
+               /* CCK rates. */
+               case  10: tap->wr_rate =   2; break;
+               case  20: tap->wr_rate =   4; break;
+               case  55: tap->wr_rate =  11; break;
+               case 110: tap->wr_rate =  22; break;
+               /* OFDM rates. */
+               case 0xd: tap->wr_rate =  12; break;
+               case 0xf: tap->wr_rate =  18; break;
+               case 0x5: tap->wr_rate =  24; break;
+               case 0x7: tap->wr_rate =  36; break;
+               case 0x9: tap->wr_rate =  48; break;
+               case 0xb: tap->wr_rate =  72; break;
+               case 0x1: tap->wr_rate =  96; break;
+               case 0x3: tap->wr_rate = 108; break;
+               /* Unknown rate: should not happen. */
+               default:  tap->wr_rate =   0;
+               }
+       }
+
+       return true;
+}
+
+static bool
+iwm_rx_mpdu(struct iwm_softc *sc, struct mbuf *m, uint32_t offset,
+    bool stolen)
+{
+       struct ieee80211com *ic;
+       struct ieee80211_frame *wh;
+       struct ieee80211_node *ni;
+       bool ret;
+
+       ic = &sc->sc_ic;
+
+       ret = sc->cfg->mqrx_supported ?
+           iwm_rx_mpdu_mq(sc, m, offset, stolen) :
+           iwm_rx_rx_mpdu(sc, m, offset, stolen);
+       if (!ret) {
+               counter_u64_add(ic->ic_ierrors, 1);
+               return (ret);
+       }
+
+       wh = mtod(m, struct ieee80211_frame *);
+       ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
+
        IWM_UNLOCK(sc);
+
        if (ni != NULL) {
                IWM_DPRINTF(sc, IWM_DEBUG_RECV, "input m %p\n", m);
                ieee80211_input_mimo(ni, m);
@@ -3253,20 +3499,17 @@
                IWM_DPRINTF(sc, IWM_DEBUG_RECV, "inputall m %p\n", m);
                ieee80211_input_mimo_all(ic, m);
        }
+
        IWM_LOCK(sc);

-       return TRUE;
-
-fail:
-       counter_u64_add(ic->ic_ierrors, 1);
-       return FALSE;
+       return true;
 }

 static int
-iwm_mvm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
+iwm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
        struct iwm_node *in)
 {
-       struct iwm_mvm_tx_resp *tx_resp = (void *)pkt->data;
+       struct iwm_tx_resp *tx_resp = (void *)pkt->data;
        struct ieee80211_ratectl_tx_status *txs = &sc->sc_txs;
        struct ieee80211_node *ni = &in->in_ni;
        struct ieee80211vap *vap = ni->ni_vap;
@@ -3325,15 +3568,14 @@
        }

        if (rate_matched) {
-               int rix;
                ieee80211_ratectl_tx_complete(ni, txs);

-               rix = ieee80211_ratectl_rate(vap->iv_bss, NULL, 0);
+               int rix = ieee80211_ratectl_rate(vap->iv_bss, NULL, 0);
                new_rate = vap->iv_bss->ni_txrate;
                if (new_rate != 0 && new_rate != cur_rate) {
                        struct iwm_node *in = IWM_NODE(vap->iv_bss);
                        iwm_setrates(sc, in, rix);
-                       iwm_mvm_send_lq_cmd(sc, &in->in_lq, FALSE);
+                       iwm_send_lq_cmd(sc, &in->in_lq, FALSE);
                }
        }

@@ -3341,16 +3583,23 @@
 }

 static void
-iwm_mvm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
+iwm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
 {
-       struct iwm_cmd_header *cmd_hdr = &pkt->hdr;
-       int idx = cmd_hdr->idx;
-       int qid = cmd_hdr->qid;
-       struct iwm_tx_ring *ring = &sc->txq[qid];
-       struct iwm_tx_data *txd = &ring->data[idx];
-       struct iwm_node *in = txd->in;
-       struct mbuf *m = txd->m;
-       int status;
+       struct iwm_cmd_header *cmd_hdr;
+       struct iwm_tx_ring *ring;
+       struct iwm_tx_data *txd;
+       struct iwm_node *in;
+       struct mbuf *m;
+       int idx, qid, qmsk, status;
+
+       cmd_hdr = &pkt->hdr;
+       idx = cmd_hdr->idx;
+       qid = cmd_hdr->qid;
+
+       ring = &sc->txq[qid];
+       txd = &ring->data[idx];
+       in = txd->in;
+       m = txd->m;

        KASSERT(txd->done == 0, ("txd not done"));
        KASSERT(txd->in != NULL, ("txd without node"));
@@ -3358,7 +3607,7 @@

        sc->sc_tx_timer = 0;

-       status = iwm_mvm_rx_tx_cmd_single(sc, pkt, in);
+       status = iwm_rx_tx_cmd_single(sc, pkt, in);

        /* Unmap and free mbuf. */
        bus_dmamap_sync(ring->data_dmat, txd->map, BUS_DMASYNC_POSTWRITE);
@@ -3372,11 +3621,11 @@

        ieee80211_tx_complete(&in->in_ni, m, status);

-       if (--ring->queued < IWM_TX_RING_LOMARK) {
-               sc->qfullmsk &= ~(1 << ring->qid);
-               if (sc->qfullmsk == 0) {
+       qmsk = 1 << qid;
+       if (--ring->queued < IWM_TX_RING_LOMARK && (sc->qfullmsk & qmsk) != 0) {
+               sc->qfullmsk &= ~qmsk;
+               if (sc->qfullmsk == 0)
                        iwm_start(sc);
-               }
        }
 }

@@ -3392,10 +3641,10 @@
 static void
 iwm_cmd_done(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
 {
-       struct iwm_tx_ring *ring = &sc->txq[IWM_MVM_CMD_QUEUE];
+       struct iwm_tx_ring *ring = &sc->txq[IWM_CMD_QUEUE];
        struct iwm_tx_data *data;

-       if (pkt->hdr.qid != IWM_MVM_CMD_QUEUE) {
+       if (pkt->hdr.qid != IWM_CMD_QUEUE) {
                return; /* Not a command ack. */
        }

@@ -3537,7 +3786,10 @@
            );

        /* XXX TODO: hard-coded TX antenna? */
-       rate_flags = 1 << IWM_RATE_MCS_ANT_POS;
+       if (sc->cfg->device_family == IWM_DEVICE_FAMILY_9000)
+               rate_flags = IWM_RATE_MCS_ANT_B_MSK;
+       else
+               rate_flags = IWM_RATE_MCS_ANT_A_MSK;
        if (IWM_RIDX_IS_CCK(ridx))
                rate_flags |= IWM_RATE_MCS_CCK_MSK;
        tx->rate_n_flags = htole32(rate_flags | rinfo->plcp);
@@ -3574,7 +3826,6 @@
        tid = 0;
        ring = &sc->txq[ac];
        desc = &ring->desc[ring->cur];
-       memset(desc, 0, sizeof(*desc));
        data = &ring->data[ring->cur];

        /* Fill out iwm_tx_cmd to send to the firmware */
@@ -3613,25 +3864,19 @@
                ieee80211_radiotap_tx(vap, m);
        }

-
-       totlen = m->m_pkthdr.len;
-
        flags = 0;
+       totlen = m->m_pkthdr.len;
        if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
                flags |= IWM_TX_CMD_FLG_ACK;
        }

-       if (type == IEEE80211_FC0_TYPE_DATA
-           && (totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold)
-           && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
+       if (type == IEEE80211_FC0_TYPE_DATA &&
+           totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold &&
+           !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
                flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
        }

-       if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
-           type != IEEE80211_FC0_TYPE_DATA)
-               tx->sta_id = sc->sc_aux_sta.sta_id;
-       else
-               tx->sta_id = IWM_STATION_ID;
+       tx->sta_id = IWM_STATION_ID;

        if (type == IEEE80211_FC0_TYPE_MGT) {
                uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
@@ -3651,12 +3896,12 @@
        if (hdrlen & 3) {
                /* First segment length must be a multiple of 4. */
                flags |= IWM_TX_CMD_FLG_MH_PAD;
+               tx->offload_assist |= htole16(1 << IWM_TX_CMD_OFFLD_PAD);
                pad = 4 - (hdrlen & 3);
-       } else
+       } else {
+               tx->offload_assist = 0;
                pad = 0;
-
-       tx->driver_txop = 0;
-       tx->next_frame_len = 0;
+       }

        tx->len = htole16(totlen);
        tx->tid_tspec = tid;
@@ -3667,7 +3912,7 @@
        tx->dram_msb_ptr = iwm_get_dma_hi_addr(data->scratch_paddr);

        /* Copy 802.11 header in TX command. */
-       memcpy(((uint8_t *)tx) + sizeof(*tx), wh, hdrlen);
+       memcpy((uint8_t *)tx + sizeof(*tx), wh, hdrlen);

        flags |= IWM_TX_CMD_FLG_BT_DIS | IWM_TX_CMD_FLG_SEQ_CTL;

@@ -3721,23 +3966,24 @@
            );

        /* Fill TX descriptor. */
+       memset(desc, 0, sizeof(*desc));
        desc->num_tbs = 2 + nsegs;

        desc->tbs[0].lo = htole32(data->cmd_paddr);
-       desc->tbs[0].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
-           (TB0_SIZE << 4);
+       desc->tbs[0].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr) |
+           (TB0_SIZE << 4));
        desc->tbs[1].lo = htole32(data->cmd_paddr + TB0_SIZE);
-       desc->tbs[1].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
-           ((sizeof(struct iwm_cmd_header) + sizeof(*tx)
-             + hdrlen + pad - TB0_SIZE) << 4);
+       desc->tbs[1].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr) |
+           ((sizeof(struct iwm_cmd_header) + sizeof(*tx) +
+           hdrlen + pad - TB0_SIZE) << 4));

        /* Other DMA segments are for data payload. */
        for (i = 0; i < nsegs; i++) {
                seg = &segs[i];
-               desc->tbs[i+2].lo = htole32(seg->ds_addr);
-               desc->tbs[i+2].hi_n_len = \
-                   htole16(iwm_get_dma_hi_addr(seg->ds_addr))
-                   | ((seg->ds_len) << 4);
+               desc->tbs[i + 2].lo = htole32(seg->ds_addr);
+               desc->tbs[i + 2].hi_n_len =
+                   htole16(iwm_get_dma_hi_addr(seg->ds_addr)) |
+                   (seg->ds_len << 4);
        }

        bus_dmamap_sync(ring->data_dmat, data->map,
@@ -3809,7 +4055,7 @@
  * 3) wait for the transport queues to be empty
  */
 int
-iwm_mvm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk, uint32_t flags)
+iwm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk, uint32_t flags)
 {
        int ret;
        struct iwm_tx_path_flush_cmd flush_cmd = {
@@ -3817,7 +4063,7 @@
                .flush_ctl = htole16(IWM_DUMP_TX_FIFO_FLUSH),
        };

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_TXPATH_FLUSH, flags,
+       ret = iwm_send_cmd_pdu(sc, IWM_TXPATH_FLUSH, flags,
            sizeof(flush_cmd), &flush_cmd);
        if (ret)
                 device_printf(sc->sc_dev,
@@ -3830,7 +4076,7 @@
  */

 static int
-iwm_mvm_update_quotas(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_update_quotas(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        struct iwm_time_quota_cmd cmd;
        int i, idx, ret, num_active_macs, quota, quota_rem;
@@ -3852,7 +4098,7 @@

        /*
         * The FW's scheduling session consists of
-        * IWM_MVM_MAX_QUOTA fragments. Divide these fragments
+        * IWM_MAX_QUOTA fragments. Divide these fragments
         * equally between all the bindings that require quota
         */
        num_active_macs = 0;
@@ -3864,8 +4110,8 @@
        quota = 0;
        quota_rem = 0;
        if (num_active_macs) {
-               quota = IWM_MVM_MAX_QUOTA / num_active_macs;
-               quota_rem = IWM_MVM_MAX_QUOTA % num_active_macs;
+               quota = IWM_MAX_QUOTA / num_active_macs;
+               quota_rem = IWM_MAX_QUOTA % num_active_macs;
        }

        for (idx = 0, i = 0; i < IWM_MAX_BINDINGS; i++) {
@@ -3888,7 +4134,7 @@
        /* Give the remainder of the session to the first binding */
        cmd.quotas[0].quota = htole32(le32toh(cmd.quotas[0].quota) + quota_rem);

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, IWM_CMD_SYNC,
+       ret = iwm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, IWM_CMD_SYNC,
            sizeof(cmd), &cmd);
        if (ret)
                device_printf(sc->sc_dev,
@@ -3972,13 +4218,13 @@
         * contexts that are required), let's do a dirty hack here.
         */
        if (iv->is_uploaded) {
-               if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
+               if ((error = iwm_mac_ctxt_changed(sc, vap)) != 0) {
                        device_printf(sc->sc_dev,
                            "%s: failed to update MAC\n", __func__);
                        goto out;
                }
        } else {
-               if ((error = iwm_mvm_mac_ctxt_add(sc, vap)) != 0) {
+               if ((error = iwm_mac_ctxt_add(sc, vap)) != 0) {
                        device_printf(sc->sc_dev,
                            "%s: failed to add MAC\n", __func__);
                        goto out;
@@ -3986,7 +4232,7 @@
        }
        sc->sc_firmware_state = 1;

-       if ((error = iwm_mvm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0],
+       if ((error = iwm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0],
            in->in_ni.ni_chan, 1, 1)) != 0) {
                device_printf(sc->sc_dev,
                    "%s: failed update phy ctxt\n", __func__);
@@ -3994,7 +4240,7 @@
        }
        iv->phy_ctxt = &sc->sc_phyctxt[0];

-       if ((error = iwm_mvm_binding_add_vif(sc, iv)) != 0) {
+       if ((error = iwm_binding_add_vif(sc, iv)) != 0) {
                device_printf(sc->sc_dev,
                    "%s: binding update cmd\n", __func__);
                goto out;
@@ -4006,7 +4252,7 @@
         * finished or is aborted.
         */
        iv->ps_disabled = TRUE;
-       error = iwm_mvm_power_update_mac(sc);
+       error = iwm_power_update_mac(sc);
        iv->ps_disabled = FALSE;
        if (error != 0) {
                device_printf(sc->sc_dev,
@@ -4014,7 +4260,7 @@
                    __func__);
                goto out;
        }
-       if ((error = iwm_mvm_add_sta(sc, in)) != 0) {
+       if ((error = iwm_add_sta(sc, in)) != 0) {
                device_printf(sc->sc_dev,
                    "%s: failed to add sta\n", __func__);
                goto out;
@@ -4026,8 +4272,8 @@
         * by "protecting" the session with a time event.
         */
        /* XXX duration is in units of TU, not MS */
-       duration = IWM_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS;
-       iwm_mvm_protect_session(sc, iv, duration, 500 /* XXX magic number */, 
TRUE);
+       duration = IWM_TE_SESSION_PROTECTION_MAX_TIME_MS;
+       iwm_protect_session(sc, iv, duration, 500 /* XXX magic number */, TRUE);

        error = 0;
 out:
@@ -4152,11 +4398,11 @@

 #if 0
                if (txant == 0)
-                       txant = iwm_mvm_get_valid_tx_ant(sc);
+                       txant = iwm_get_valid_tx_ant(sc);
                nextant = 1<<(ffs(txant)-1);
                txant &= ~nextant;
 #else
-               nextant = iwm_mvm_get_valid_tx_ant(sc);
+               nextant = iwm_get_valid_tx_ant(sc);
 #endif
                tab = iwm_rates[ridx].plcp;
                tab |= nextant << IWM_RATE_MCS_ANT_POS;
@@ -4207,8 +4453,8 @@
        ivp->iv_auth = 0;
        if (sc->sc_firmware_state == 3) {
                iwm_xmit_queue_drain(sc);
-//             iwm_mvm_flush_tx_path(sc, 0xf, IWM_CMD_SYNC);
-               error = iwm_mvm_rm_sta(sc, vap, TRUE);
+//             iwm_flush_tx_path(sc, 0xf, IWM_CMD_SYNC);
+               error = iwm_rm_sta(sc, vap, TRUE);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to remove station: %d\n",
@@ -4216,7 +4462,7 @@
                }
        }
        if (sc->sc_firmware_state == 3) {
-               error = iwm_mvm_mac_ctxt_changed(sc, vap);
+               error = iwm_mac_ctxt_changed(sc, vap);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to change mac context: %d\n",
@@ -4224,7 +4470,7 @@
                }
        }
        if (sc->sc_firmware_state == 3) {
-               error = iwm_mvm_sf_update(sc, vap, FALSE);
+               error = iwm_sf_update(sc, vap, FALSE);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to update smart FIFO: %d\n",
@@ -4232,7 +4478,7 @@
                }
        }
        if (sc->sc_firmware_state == 3) {
-               error = iwm_mvm_rm_sta_id(sc, vap);
+               error = iwm_rm_sta_id(sc, vap);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to remove station id: %d\n",
@@ -4240,7 +4486,7 @@
                }
        }
        if (sc->sc_firmware_state == 3) {
-               error = iwm_mvm_update_quotas(sc, NULL);
+               error = iwm_update_quotas(sc, NULL);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to update PHY quota: %d\n",
@@ -4249,7 +4495,7 @@
        }
        if (sc->sc_firmware_state == 3) {
                /* XXX Might need to specify bssid correctly. */
-               error = iwm_mvm_mac_ctxt_changed(sc, vap);
+               error = iwm_mac_ctxt_changed(sc, vap);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to change mac context: %d\n",
@@ -4260,7 +4506,7 @@
                sc->sc_firmware_state = 2;
        }
        if (sc->sc_firmware_state > 1) {
-               error = iwm_mvm_binding_remove_vif(sc, ivp);
+               error = iwm_binding_remove_vif(sc, ivp);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to remove channel ctx: %d\n",
@@ -4272,7 +4518,7 @@
        }
        ivp->phy_ctxt = NULL;
        if (sc->sc_firmware_state > 0) {
-               error = iwm_mvm_mac_ctxt_changed(sc, vap);
+               error = iwm_mac_ctxt_changed(sc, vap);
                if (error) {
                        device_printf(sc->sc_dev,
                            "%s: Failed to change mac context: %d\n",
@@ -4280,7 +4526,7 @@
                }
        }
        if (sc->sc_firmware_state > 0) {
-               error = iwm_mvm_power_update_mac(sc);
+               error = iwm_power_update_mac(sc);
                if (error != 0) {
                        device_printf(sc->sc_dev,
                            "%s: failed to update power management\n",
@@ -4317,9 +4563,9 @@
        }

        if (vap->iv_state == IEEE80211_S_RUN && nstate != IEEE80211_S_RUN) {
-               iwm_mvm_led_disable(sc);
+               iwm_led_disable(sc);
                /* disable beacon filtering if we're hopping out of RUN */
-               iwm_mvm_disable_beacon_filter(sc);
+               iwm_disable_beacon_filter(sc);
                if (((in = IWM_NODE(vap->iv_bss)) != NULL))
                        in->in_assoc = 0;
        }
@@ -4330,7 +4576,7 @@
            (nstate == IEEE80211_S_INIT ||
             nstate == IEEE80211_S_SCAN ||
             nstate == IEEE80211_S_AUTH)) {
-               iwm_mvm_stop_session_protection(sc, ivp);
+               iwm_stop_session_protection(sc, ivp);
        }

        if ((vap->iv_state == IEEE80211_S_RUN ||
@@ -4382,7 +4628,7 @@
                in = IWM_NODE(vap->iv_bss);
                /* Update the association state, now we have it all */
                /* (eg associd comes in at this point */
-               error = iwm_mvm_update_sta(sc, in);
+               error = iwm_update_sta(sc, in);
                if (error != 0) {
                        device_printf(sc->sc_dev,
                            "%s: failed to update STA\n", __func__);
@@ -4391,27 +4637,25 @@
                        return error;
                }
                in->in_assoc = 1;
-               error = iwm_mvm_mac_ctxt_changed(sc, vap);
+               error = iwm_mac_ctxt_changed(sc, vap);
                if (error != 0) {
                        device_printf(sc->sc_dev,
                            "%s: failed to update MAC: %d\n", __func__, error);
                }

-               iwm_mvm_sf_update(sc, vap, FALSE);
-               iwm_mvm_enable_beacon_filter(sc, ivp);
-               iwm_mvm_power_update_mac(sc);
-               iwm_mvm_update_quotas(sc, ivp);
-               {
+               iwm_sf_update(sc, vap, FALSE);
+               iwm_enable_beacon_filter(sc, ivp);
+               iwm_power_update_mac(sc);
+               iwm_update_quotas(sc, ivp);
                int rix = ieee80211_ratectl_rate(&in->in_ni, NULL, 0);
                iwm_setrates(sc, in, rix);

-               if ((error = iwm_mvm_send_lq_cmd(sc, &in->in_lq, TRUE)) != 0) {
+               if ((error = iwm_send_lq_cmd(sc, &in->in_lq, TRUE)) != 0) {
                        device_printf(sc->sc_dev,
                            "%s: IWM_LQ_CMD failed: %d\n", __func__, error);
                }

-               iwm_mvm_led_enable(sc);
-               }
+               iwm_led_enable(sc);
                break;

        default:
@@ -4444,16 +4688,15 @@
        bt_cmd.mode = htole32(IWM_BT_COEX_WIFI);
        bt_cmd.enabled_modules = htole32(IWM_BT_COEX_HIGH_BAND_RET);

-       return iwm_mvm_send_cmd_pdu(sc, IWM_BT_CONFIG, 0, sizeof(bt_cmd),
+       return iwm_send_cmd_pdu(sc, IWM_BT_CONFIG, 0, sizeof(bt_cmd),
            &bt_cmd);
 }

 static boolean_t
-iwm_mvm_is_lar_supported(struct iwm_softc *sc)
+iwm_is_lar_supported(struct iwm_softc *sc)
 {
        boolean_t nvm_lar = sc->nvm_data->lar_enabled;
-       boolean_t tlv_lar = fw_has_capa(&sc->sc_fw.ucode_capa,
-                                       IWM_UCODE_TLV_CAPA_LAR_SUPPORT);
+       boolean_t tlv_lar = iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_LAR_SUPPORT);

        if (iwm_lar_disable)
                return FALSE;
@@ -4462,19 +4705,17 @@
         * Enable LAR only if it is supported by the FW (TLV) &&
         * enabled in the NVM
         */
-       if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000)
+       if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000)
                return nvm_lar && tlv_lar;
        else
                return tlv_lar;
 }

 static boolean_t
-iwm_mvm_is_wifi_mcc_supported(struct iwm_softc *sc)
+iwm_is_wifi_mcc_supported(struct iwm_softc *sc)
 {
-       return fw_has_api(&sc->sc_fw.ucode_capa,
-                         IWM_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
-              fw_has_capa(&sc->sc_fw.ucode_capa,
-                          IWM_UCODE_TLV_CAPA_LAR_MULTI_MCC);
+       return iwm_fw_has_api(sc, IWM_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
+           iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_LAR_MULTI_MCC);
 }

 static int
@@ -4494,10 +4735,9 @@
        int n_channels;
        uint16_t mcc;
 #endif
-       int resp_v2 = fw_has_capa(&sc->sc_fw.ucode_capa,
-           IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2);
+       int resp_v2 = iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2);

-       if (!iwm_mvm_is_lar_supported(sc)) {
+       if (!iwm_is_lar_supported(sc)) {
                IWM_DPRINTF(sc, IWM_DEBUG_LAR, "%s: no LAR support\n",
                    __func__);
                return 0;
@@ -4505,7 +4745,7 @@

        memset(&mcc_cmd, 0, sizeof(mcc_cmd));
        mcc_cmd.mcc = htole16(alpha2[0] << 8 | alpha2[1]);
-       if (iwm_mvm_is_wifi_mcc_supported(sc))
+       if (iwm_is_wifi_mcc_supported(sc))
                mcc_cmd.source_id = IWM_MCC_SOURCE_GET_CURRENT;
        else
                mcc_cmd.source_id = IWM_MCC_SOURCE_OLD_FW;
@@ -4551,7 +4791,7 @@
 }

 static void
-iwm_mvm_tt_tx_backoff(struct iwm_softc *sc, uint32_t backoff)
+iwm_tt_tx_backoff(struct iwm_softc *sc, uint32_t backoff)
 {
        struct iwm_host_cmd cmd = {
                .id = IWM_REPLY_THERMAL_MNG_BACKOFF,
@@ -4578,8 +4818,8 @@
                return error;
        }

-       if ((error = iwm_run_init_mvm_ucode(sc, 0)) != 0) {
-               printf("iwm_run_init_mvm_ucode: failed %d\n", error);
+       if ((error = iwm_run_init_ucode(sc, 0)) != 0) {
+               printf("iwm_run_init_ucode: failed %d\n", error);
                return error;
        }

@@ -4595,13 +4835,13 @@
        }

        /* omstart, this time with the regular firmware */
-       error = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_REGULAR);
+       error = iwm_load_ucode_wait_alive(sc, IWM_UCODE_REGULAR);
        if (error) {
                device_printf(sc->sc_dev, "could not load firmware\n");
                goto error;
        }

-       error = iwm_mvm_sf_update(sc, NULL, FALSE);
+       error = iwm_sf_update(sc, NULL, FALSE);
        if (error)
                device_printf(sc->sc_dev, "Failed to initialize Smart Fifo\n");

@@ -4610,7 +4850,7 @@
                goto error;
        }

-       error = iwm_send_tx_ant_cfg(sc, iwm_mvm_get_valid_tx_ant(sc));
+       error = iwm_send_tx_ant_cfg(sc, iwm_get_valid_tx_ant(sc));
        if (error != 0) {
                device_printf(sc->sc_dev, "antenna config failed\n");
                goto error;
@@ -4626,7 +4866,7 @@
        }

        /* Add auxiliary station for scanning */
-       if ((error = iwm_mvm_add_aux_sta(sc)) != 0) {
+       if ((error = iwm_add_aux_sta(sc)) != 0) {
                device_printf(sc->sc_dev, "add_aux_sta failed\n");
                goto error;
        }
@@ -4637,39 +4877,39 @@
                 * going to be overwritten in the other flows.
                 * For now use the first channel we have.
                 */
-               if ((error = iwm_mvm_phy_ctxt_add(sc,
+               if ((error = iwm_phy_ctxt_add(sc,
                    &sc->sc_phyctxt[i], &ic->ic_channels[1], 1, 1)) != 0)
                        goto error;
        }

        /* Initialize tx backoffs to the minimum. */
        if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000)
-               iwm_mvm_tt_tx_backoff(sc, 0);
+               iwm_tt_tx_backoff(sc, 0);

-       if (iwm_mvm_config_ltr(sc) != 0)
+       if (iwm_config_ltr(sc) != 0)
                device_printf(sc->sc_dev, "PCIe LTR configuration failed\n");

-       error = iwm_mvm_power_update_device(sc);
+       error = iwm_power_update_device(sc);
        if (error)
                goto error;

        if ((error = iwm_send_update_mcc_cmd(sc, "ZZ")) != 0)
                goto error;

-       if (fw_has_capa(&sc->sc_fw.ucode_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
-               if ((error = iwm_mvm_config_umac_scan(sc)) != 0)
+       if (iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
+               if ((error = iwm_config_umac_scan(sc)) != 0)
                        goto error;
        }

        /* Enable Tx queues. */
        for (ac = 0; ac < WME_NUM_AC; ac++) {
                error = iwm_enable_txq(sc, IWM_STATION_ID, ac,
-                   iwm_mvm_ac_to_tx_fifo[ac]);
+                   iwm_ac_to_tx_fifo[ac]);
                if (error)
                        goto error;
        }

-       if ((error = iwm_mvm_disable_beacon_filter(sc)) != 0) {
+       if ((error = iwm_disable_beacon_filter(sc)) != 0) {
                device_printf(sc->sc_dev, "failed to disable beacon filter\n");
                goto error;
        }
@@ -4700,7 +4940,7 @@
        cmd->pass_all = 1;
        IEEE80211_ADDR_COPY(cmd->bssid, ni->ni_bssid);

-       error = iwm_mvm_send_cmd_pdu(sc, IWM_MCAST_FILTER_CMD,
+       error = iwm_send_cmd_pdu(sc, IWM_MCAST_FILTER_CMD,
            IWM_CMD_SYNC, size, cmd);
        free(cmd, M_DEVBUF);

@@ -5140,7 +5380,7 @@

                switch (code) {
                case IWM_REPLY_RX_PHY_CMD:
-                       iwm_mvm_rx_rx_phy_cmd(sc, pkt);
+                       iwm_rx_rx_phy_cmd(sc, pkt);
                        break;

                case IWM_REPLY_RX_MPDU_CMD: {
@@ -5156,7 +5396,7 @@
                             nextpkt->hdr.idx == 0) ||
                            (nextpkt->len_n_flags ==
                             htole32(IWM_FH_RSCSR_FRAME_INVALID))) {
-                               if (iwm_mvm_rx_rx_mpdu(sc, m, offset, stolen)) {
+                               if (iwm_rx_mpdu(sc, m, offset, stolen)) {
                                        stolen = FALSE;
                                        /* Make sure we abort the loop */
                                        nextoff = maxoff;
@@ -5167,14 +5407,14 @@
                        /*
                         * Use m_copym instead of m_split, because that
                         * makes it easier to keep a valid rx buffer in
-                        * the ring, when iwm_mvm_rx_rx_mpdu() fails.
+                        * the ring, when iwm_rx_mpdu() fails.
                         *
                         * We need to start m_copym() at offset 0, to get the
                         * M_PKTHDR flag preserved.
                         */
                        m1 = m_copym(m, 0, M_COPYALL, M_NOWAIT);
                        if (m1) {
-                               if (iwm_mvm_rx_rx_mpdu(sc, m1, offset, stolen))
+                               if (iwm_rx_mpdu(sc, m1, offset, stolen))
                                        stolen = TRUE;
                                else
                                        m_freem(m1);
@@ -5183,7 +5423,7 @@
                }

                case IWM_TX_CMD:
-                       iwm_mvm_rx_tx_cmd(sc, pkt);
+                       iwm_rx_tx_cmd(sc, pkt);
                        break;

                case IWM_MISSED_BEACONS_NOTIFICATION: {
@@ -5228,14 +5468,14 @@
                case IWM_MFUART_LOAD_NOTIFICATION:
                        break;

-               case IWM_MVM_ALIVE:
+               case IWM_ALIVE:
                        break;

                case IWM_CALIB_RES_NOTIF_PHY_DB:
                        break;

                case IWM_STATISTICS_NOTIFICATION:
-                       iwm_mvm_handle_rx_statistics(sc, pkt);
+                       iwm_handle_rx_statistics(sc, pkt);
                        break;

                case IWM_NVM_ACCESS_CMD:
@@ -5316,7 +5556,7 @@
                        break;

                case IWM_SCAN_OFFLOAD_COMPLETE:
-                       iwm_mvm_rx_lmac_scan_complete_notif(sc, pkt);
+                       iwm_rx_lmac_scan_complete_notif(sc, pkt);
                        if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
                                sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
                                ieee80211_runtask(ic, &sc->sc_es_task);
@@ -5330,7 +5570,7 @@
                }

                case IWM_SCAN_COMPLETE_UMAC:
-                       iwm_mvm_rx_umac_scan_complete_notif(sc, pkt);
+                       iwm_rx_umac_scan_complete_notif(sc, pkt);
                        if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
                                sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
                                ieee80211_runtask(ic, &sc->sc_es_task);
@@ -5359,7 +5599,7 @@
                }

                case IWM_TIME_EVENT_NOTIFICATION:
-                       iwm_mvm_rx_time_event_notif(sc, pkt);
+                       iwm_rx_time_event_notif(sc, pkt);
                        break;

                /*
@@ -5386,9 +5626,8 @@

                default:
                        device_printf(sc->sc_dev,
-                           "frame %d/%d %x UNHANDLED (this should "
-                           "not happen)\n", qid & ~0x80, idx,
-                           pkt->len_n_flags);
+                           "code %x, frame %d/%d %x unhandled\n",
+                           code, qid & ~0x80, idx, pkt->len_n_flags);
                        break;
                }

@@ -5423,11 +5662,21 @@
 static void
 iwm_notif_intr(struct iwm_softc *sc)
 {
+       int count;
+       uint32_t wreg;
        uint16_t hw;

        bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map,
            BUS_DMASYNC_POSTREAD);

+       if (sc->cfg->mqrx_supported) {
+               count = IWM_RX_MQ_RING_COUNT;
+               wreg = IWM_RFH_Q0_FRBDCB_WIDX_TRG;
+       } else {
+               count = IWM_RX_LEGACY_RING_COUNT;
+               wreg = IWM_FH_RSCSR_CHNL0_WPTR;
+       }
+
        hw = le16toh(sc->rxq.stat->closed_rb_num) & 0xfff;

        /*
@@ -5444,7 +5693,7 @@
                    "%s: hw = %d cur = %d\n", __func__, hw, ring->cur);
                iwm_handle_rxb(sc, data->m);

-               ring->cur = (ring->cur + 1) % IWM_RX_RING_COUNT;
+               ring->cur = (ring->cur + 1) % count;
        }

        /*
@@ -5453,8 +5702,8 @@
         * Seems like the hardware gets upset unless we align
         * the write by 8??
         */
-       hw = (hw == 0) ? IWM_RX_RING_COUNT - 1 : hw - 1;
-       IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, rounddown2(hw, 8));
+       hw = (hw == 0) ? count - 1 : hw - 1;
+       IWM_WRITE(sc, wreg, rounddown2(hw, 8));
 }

 static void
@@ -5526,7 +5775,7 @@
 #endif
                /* Dump driver status (TX and RX rings) while we're here. */
                device_printf(sc->sc_dev, "driver status:\n");
-               for (i = 0; i < IWM_MVM_MAX_QUEUES; i++) {
+               for (i = 0; i < IWM_MAX_QUEUES; i++) {
                        struct iwm_tx_ring *ring = &sc->txq[i];
                        device_printf(sc->sc_dev,
                            "  tx ring %2d: qid=%-2d cur=%-3d "
@@ -5634,6 +5883,9 @@
 #define        PCI_PRODUCT_INTEL_WL_8260_1     0x24f3
 #define        PCI_PRODUCT_INTEL_WL_8260_2     0x24f4
 #define        PCI_PRODUCT_INTEL_WL_8265_1     0x24fd
+#define        PCI_PRODUCT_INTEL_WL_9560_1     0x9df0
+#define        PCI_PRODUCT_INTEL_WL_9560_2     0xa370
+#define        PCI_PRODUCT_INTEL_WL_9260_1     0x2526

 static const struct iwm_devices {
        uint16_t                device;
@@ -5651,6 +5903,9 @@
        { PCI_PRODUCT_INTEL_WL_8260_1, &iwm8260_cfg },
        { PCI_PRODUCT_INTEL_WL_8260_2, &iwm8260_cfg },
        { PCI_PRODUCT_INTEL_WL_8265_1, &iwm8265_cfg },
+       { PCI_PRODUCT_INTEL_WL_9560_1, &iwm9560_cfg },
+       { PCI_PRODUCT_INTEL_WL_9560_2, &iwm9560_cfg },
+       { PCI_PRODUCT_INTEL_WL_9260_1, &iwm9260_cfg },
 };

 static int
@@ -5762,8 +6017,6 @@
                    rman_get_rid(sc->sc_mem), sc->sc_mem);
 }

-
-
 static int
 iwm_attach(device_t dev)
 {
@@ -5780,6 +6033,10 @@
        callout_init_mtx(&sc->sc_led_blink_to, &sc->sc_mtx, 0);
        TASK_INIT(&sc->sc_es_task, 0, iwm_endscan_cb, sc);

+       error = iwm_dev_check(dev);
+       if (error != 0)
+               goto fail;
+
        sc->sc_notif_wait = iwm_notification_wait_init(sc);
        if (sc->sc_notif_wait == NULL) {
                device_printf(dev, "failed to init notification wait struct\n");
@@ -5805,11 +6062,6 @@

        sc->sc_wantresp = -1;

-       /* Match device id */
-       error = iwm_dev_check(dev);
-       if (error != 0)
-               goto fail;
-
        sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV);
        /*
         * In the 8000 HW family the format of the 4 bytes of CSR_HW_REV have
@@ -5817,7 +6069,7 @@
         * "dash" value). To keep hw_rev backwards compatible - we'll store it
         * in the old format.
         */
-       if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) {
                int ret;
                uint32_t hw_step;

@@ -6026,7 +6278,7 @@
        if (ivp->is_uploaded && vap->iv_bss != NULL) {
                in = IWM_NODE(vap->iv_bss);
                if (in->in_assoc) {
-                       if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
+                       if ((error = iwm_mac_ctxt_changed(sc, vap)) != 0) {
                                device_printf(sc->sc_dev,
                                    "%s: failed to update MAC\n", __func__);
                        }
@@ -6056,7 +6308,7 @@
                goto fail;
        }

-       error = iwm_run_init_mvm_ucode(sc, 1);
+       error = iwm_run_init_ucode(sc, 1);
        iwm_stop_device(sc);
        if (error) {
                IWM_UNLOCK(sc);
@@ -6200,10 +6452,10 @@
                device_printf(sc->sc_dev,
                    "%s: Previous scan not completed yet\n", __func__);
        }
-       if (fw_has_capa(&sc->sc_fw.ucode_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN))
-               error = iwm_mvm_umac_scan(sc);
+       if (iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_UMAC_SCAN))
+               error = iwm_umac_scan(sc);
        else
-               error = iwm_mvm_lmac_scan(sc);
+               error = iwm_lmac_scan(sc);
        if (error != 0) {
                device_printf(sc->sc_dev, "could not initiate scan\n");
                IWM_UNLOCK(sc);
@@ -6224,7 +6476,7 @@
        IWM_LOCK(sc);
        iwm_led_blink_stop(sc);
        if (vap->iv_state == IEEE80211_S_RUN)
-               iwm_mvm_led_enable(sc);
+               iwm_led_enable(sc);
        if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
                /*
                 * Removing IWM_FLAG_SCAN_RUNNING now, is fine because
@@ -6232,7 +6484,7 @@
                 * taskqueue.
                 */
                sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
-               iwm_mvm_scan_stop_wait(sc);
+               iwm_scan_stop_wait(sc);
        }
        IWM_UNLOCK(sc);

@@ -6262,7 +6514,6 @@
 static void
 iwm_scan_mindwell(struct ieee80211_scan_state *ss)
 {
-       return;
 }

 void
@@ -6345,12 +6596,9 @@
        if (!sc->sc_attached)
                return 0;
        sc->sc_attached = 0;
-
-       if (do_net80211)
+       if (do_net80211) {
                ieee80211_draintask(&sc->sc_ic, &sc->sc_es_task);
-
-       callout_drain(&sc->sc_led_blink_to);
-       callout_drain(&sc->sc_watchdog_to);
+       }
        iwm_stop_device(sc);
        if (do_net80211) {
                IWM_LOCK(sc);
@@ -6358,6 +6606,8 @@
                IWM_UNLOCK(sc);
                ieee80211_ifdetach(&sc->sc_ic);
        }
+       callout_drain(&sc->sc_led_blink_to);
+       callout_drain(&sc->sc_watchdog_to);

        iwm_phy_db_free(sc->sc_phy_db);
        sc->sc_phy_db = NULL;
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_7000.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_7000.c
index b70809b..3da0cac 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_7000.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_7000.c
@@ -70,7 +70,7 @@
  *****************************************************************************/

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_7000.c 331665 2018-03-28 
07:59:16Z eadler $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -119,6 +119,7 @@
        .fw_name = IWM3168_FW,
        IWM_DEVICE_7000_COMMON,
        .host_interrupt_operation_mode = 0,
+       .nvm_type = IWM_NVM_SDP,
 };

 const struct iwm_cfg iwm7265_cfg = {
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_8000.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_8000.c
index b648770..59df625 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_8000.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_8000.c
@@ -69,7 +69,7 @@
  *****************************************************************************/

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_8000.c 324434 2017-10-09 
15:48:56Z gnn $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9000.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9000.c
new file mode 100644
index 0000000..fe7898c
--- /dev/null
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9000.c
@@ -0,0 +1,97 @@
+/*-
+ * Based on BSD-licensed source modules in the Linux iwlwifi driver,
+ * which were used as the reference documentation for this implementation.
+ *
+ ******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH
+ * Copyright(c) 2016 Intel Deutschland GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called COPYING.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <linuxwifi@xxxxxxxxx>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_wlan.h"
+#include "opt_iwm.h"
+
+#include <sys/param.h>
+
+#include "if_iwm_config.h"
+
+#define IWM9000_FW     "iwm9000fw"
+
+#define IWM_NVM_HW_SECTION_NUM_FAMILY_9000     10
+
+#define IWM_DEVICE_9000_COMMON                                         \
+       .device_family = IWM_DEVICE_FAMILY_9000,                        \
+       .eeprom_size = IWM_OTP_LOW_IMAGE_SIZE_FAMILY_9000,              \
+       .nvm_hw_section_num = IWM_NVM_HW_SECTION_NUM_FAMILY_9000
+
+const struct iwm_cfg iwm9560_cfg = {
+       .name = "Intel(R) Dual Band Wireless AC 9560",
+       .fw_name = IWM9000_FW,
+       IWM_DEVICE_9000_COMMON,
+       .host_interrupt_operation_mode = 0,
+       .mqrx_supported = 1,
+       .integrated = 1,
+};
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9260.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9260.c
new file mode 100644
index 0000000..a92ba9e
--- /dev/null
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_9260.c
@@ -0,0 +1,96 @@
+/*-
+ * Based on BSD-licensed source modules in the Linux iwlwifi driver,
+ * which were used as the reference documentation for this implementation.
+ *
+ ******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH
+ * Copyright(c) 2016 Intel Deutschland GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called COPYING.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <linuxwifi@xxxxxxxxx>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_wlan.h"
+#include "opt_iwm.h"
+
+#include <sys/param.h>
+
+#include "if_iwm_config.h"
+
+#define IWM9260_FW     "iwm9260fw"
+
+#define IWM_NVM_HW_SECTION_NUM_FAMILY_9260     10
+
+#define IWM_DEVICE_9260_COMMON                                         \
+       .device_family = IWM_DEVICE_FAMILY_9000,                        \
+       .eeprom_size = IWM_OTP_LOW_IMAGE_SIZE_FAMILY_9000,              \
+       .nvm_hw_section_num = IWM_NVM_HW_SECTION_NUM_FAMILY_9260
+
+const struct iwm_cfg iwm9260_cfg = {
+       .name = "Intel(R) Dual Band Wireless AC 9260",
+       .fw_name = IWM9260_FW,
+       IWM_DEVICE_9260_COMMON,
+       .host_interrupt_operation_mode = 0,
+       .mqrx_supported = 1,
+};
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.c
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.c
index 48ad9d1..28207c9 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.c
@@ -87,7 +87,7 @@
  */

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_binding.c 319577 2017-06-04 
21:05:58Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -146,21 +146,21 @@
  * BEGIN iwlwifi/mvm/binding.c
  */

-struct iwm_mvm_iface_iterator_data {
+struct iwm_iface_iterator_data {
        int idx;

-       struct iwm_mvm_phy_ctxt *phyctxt;
+       struct iwm_phy_ctxt *phyctxt;

        uint16_t ids[IWM_MAX_MACS_IN_BINDING];
        int16_t colors[IWM_MAX_MACS_IN_BINDING];
 };

 static int
-iwm_mvm_binding_cmd(struct iwm_softc *sc, uint32_t action,
-       struct iwm_mvm_iface_iterator_data *data)
+iwm_binding_cmd(struct iwm_softc *sc, uint32_t action,
+       struct iwm_iface_iterator_data *data)
 {
        struct iwm_binding_cmd cmd;
-       struct iwm_mvm_phy_ctxt *phyctxt = data->phyctxt;
+       struct iwm_phy_ctxt *phyctxt = data->phyctxt;
        int i, ret;
        uint32_t status;

@@ -178,7 +178,7 @@
                                                              data->colors[i]));

        status = 0;
-       ret = iwm_mvm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD,
+       ret = iwm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD,
            sizeof(cmd), &cmd, &status);
        if (ret) {
                device_printf(sc->sc_dev,
@@ -196,10 +196,10 @@
 }

 static int
-iwm_mvm_binding_update(struct iwm_softc *sc, struct iwm_vap *ivp,
-       struct iwm_mvm_phy_ctxt *phyctxt, boolean_t add)
+iwm_binding_update(struct iwm_softc *sc, struct iwm_vap *ivp,
+       struct iwm_phy_ctxt *phyctxt, boolean_t add)
 {
-       struct iwm_mvm_iface_iterator_data data = {
+       struct iwm_iface_iterator_data data = {
                .phyctxt = phyctxt,
        };
        uint32_t action;
@@ -215,11 +215,11 @@
                data.idx++;
        }

-       return iwm_mvm_binding_cmd(sc, action, &data);
+       return iwm_binding_cmd(sc, action, &data);
 }

 int
-iwm_mvm_binding_add_vif(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_binding_add_vif(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        if (!ivp->phy_ctxt)
                return EINVAL;
@@ -228,24 +228,24 @@
         * Update SF - Disable if needed. if this fails, SF might still be on
         * while many macs are bound, which is forbidden - so fail the binding.
         */
-       if (iwm_mvm_sf_update(sc, &ivp->iv_vap, FALSE))
+       if (iwm_sf_update(sc, &ivp->iv_vap, FALSE))
                return EINVAL;

-       return iwm_mvm_binding_update(sc, ivp, ivp->phy_ctxt, TRUE);
+       return iwm_binding_update(sc, ivp, ivp->phy_ctxt, TRUE);
 }

 int
-iwm_mvm_binding_remove_vif(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_binding_remove_vif(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        int ret;

        if (!ivp->phy_ctxt)
                return EINVAL;

-       ret = iwm_mvm_binding_update(sc, ivp, ivp->phy_ctxt, FALSE);
+       ret = iwm_binding_update(sc, ivp, ivp->phy_ctxt, FALSE);

        if (!ret) {
-               if (iwm_mvm_sf_update(sc, &ivp->iv_vap, TRUE))
+               if (iwm_sf_update(sc, &ivp->iv_vap, TRUE))
                        device_printf(sc->sc_dev,
                            "Failed to update SF state\n");
        }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.h
index 4151423..c3e20ed 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_binding.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_binding.h 318212 2017-05-12 
05:19:08Z adrian $ */
+/*     $FreeBSD$ */
 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
  * Copyright (c) 2014 Fixup Software Ltd.
@@ -105,7 +105,7 @@
 #ifndef        __IF_IWM_BINDING_H__
 #define        __IF_IWM_BINDING_H__

-extern int iwm_mvm_binding_add_vif(struct iwm_softc *sc, struct iwm_vap *ivp);
-extern int iwm_mvm_binding_remove_vif(struct iwm_softc *sc, struct iwm_vap 
*ivp);
+extern int iwm_binding_add_vif(struct iwm_softc *sc, struct iwm_vap *ivp);
+extern int iwm_binding_remove_vif(struct iwm_softc *sc, struct iwm_vap *ivp);

 #endif /* __IF_IWM_BINDING_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_config.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_config.h
index de53776..fabcfaa 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_config.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_config.h
@@ -68,7 +68,7 @@
  *****************************************************************************/

 /*
- * $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_config.h 331665 2018-03-28 
07:59:16Z eadler $
+ * $FreeBSD$
  */

 #ifndef __IWM_CONFIG_H__
@@ -78,6 +78,7 @@
        IWM_DEVICE_FAMILY_UNDEFINED,
        IWM_DEVICE_FAMILY_7000,
        IWM_DEVICE_FAMILY_8000,
+       IWM_DEVICE_FAMILY_9000,
 };

 #define IWM_DEFAULT_MAX_TX_POWER       22
@@ -104,6 +105,19 @@
 #define IWM_OTP_LOW_IMAGE_SIZE_FAMILY_8000     (32 * 512 * sizeof(uint16_t)) 
/* 32 KB */
 #define IWM_OTP_LOW_IMAGE_SIZE_FAMILY_9000     
IWM_OTP_LOW_IMAGE_SIZE_FAMILY_8000

+
+/**
+ * enum iwl_nvm_type - nvm formats
+ * @IWM_NVM: the regular format
+ * @IWM_NVM_EXT: extended NVM format
+ * @IWM_NVM_SDP: NVM format used by 3168 series
+ */
+enum iwm_nvm_type {
+       IWM_NVM,
+       IWM_NVM_EXT,
+       IWM_NVM_SDP,
+};
+
 /**
  * struct iwm_cfg
  * @name: Official name of the device
@@ -113,15 +127,19 @@
  * @nvm_hw_section_num: the ID of the HW NVM section
  * @apmg_wake_up_wa: should the MAC access REQ be asserted when a command
  *      is in flight. This is due to a HW bug in 7260, 3160 and 7265.
+ * @nvm_type: see &enum iwl_nvm_type
  */
 struct iwm_cfg {
        const char *name;
-        const char *fw_name;
-        uint16_t eeprom_size;
-        enum iwm_device_family device_family;
-        int host_interrupt_operation_mode;
-        uint8_t nvm_hw_section_num;
-        int apmg_wake_up_wa;
+       const char *fw_name;
+       uint16_t eeprom_size;
+       enum iwm_device_family device_family;
+       int host_interrupt_operation_mode;
+       int mqrx_supported;
+       int integrated;
+       uint8_t nvm_hw_section_num;
+       int apmg_wake_up_wa;
+       enum iwm_nvm_type nvm_type;
 };

 /*
@@ -135,5 +153,7 @@
 extern const struct iwm_cfg iwm7265d_cfg;
 extern const struct iwm_cfg iwm8260_cfg;
 extern const struct iwm_cfg iwm8265_cfg;
+extern const struct iwm_cfg iwm9560_cfg;
+extern const struct iwm_cfg iwm9260_cfg;

 #endif /* __IWM_CONFIG_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_constants.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_constants.h
index acb6323..b686fc5 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_constants.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_constants.h
@@ -69,86 +69,86 @@
  *
  *****************************************************************************/

-/* $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_constants.h 318005 2017-05-09 
04:15:07Z adrian $ */
+/* $FreeBSD$ */

 #ifndef __IF_IWM_CONSTANTS_H
 #define __IF_IWM_CONSTANTS_H

 /* <netproto/802_11/ieee80211_var.h> */

-#define IWM_MVM_DEFAULT_PS_TX_DATA_TIMEOUT     (100 * 1000)
-#define IWM_MVM_DEFAULT_PS_RX_DATA_TIMEOUT     (100 * 1000)
-#define IWM_MVM_WOWLAN_PS_TX_DATA_TIMEOUT      (10 * 1000)
-#define IWM_MVM_WOWLAN_PS_RX_DATA_TIMEOUT      (10 * 1000)
-#define IWM_MVM_SHORT_PS_TX_DATA_TIMEOUT       (2 * 1024) /* defined in TU */
-#define IWM_MVM_SHORT_PS_RX_DATA_TIMEOUT       (40 * 1024) /* defined in TU */
-#define IWM_MVM_P2P_LOWLATENCY_PS_ENABLE       0
-#define IWM_MVM_UAPSD_RX_DATA_TIMEOUT          (50 * 1000)
-#define IWM_MVM_UAPSD_TX_DATA_TIMEOUT          (50 * 1000)
+#define IWM_DEFAULT_PS_TX_DATA_TIMEOUT (100 * 1000)
+#define IWM_DEFAULT_PS_RX_DATA_TIMEOUT (100 * 1000)
+#define IWM_WOWLAN_PS_TX_DATA_TIMEOUT  (10 * 1000)
+#define IWM_WOWLAN_PS_RX_DATA_TIMEOUT  (10 * 1000)
+#define IWM_SHORT_PS_TX_DATA_TIMEOUT   (2 * 1024) /* defined in TU */
+#define IWM_SHORT_PS_RX_DATA_TIMEOUT   (40 * 1024) /* defined in TU */
+#define IWM_P2P_LOWLATENCY_PS_ENABLE   0
+#define IWM_UAPSD_RX_DATA_TIMEOUT              (50 * 1000)
+#define IWM_UAPSD_TX_DATA_TIMEOUT              (50 * 1000)
 #ifdef notyet
 /* XXX Find corresponding values from net80211 */
-#define IWM_MVM_UAPSD_QUEUES           (IEEE80211_WMM_IE_STA_QOSINFO_AC_VO |\
+#define IWM_UAPSD_QUEUES               (IEEE80211_WMM_IE_STA_QOSINFO_AC_VO |\
                                         IEEE80211_WMM_IE_STA_QOSINFO_AC_VI |\
                                         IEEE80211_WMM_IE_STA_QOSINFO_AC_BK |\
                                         IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
 #endif
-#define IWM_MVM_PS_HEAVY_TX_THLD_PACKETS       20
-#define IWM_MVM_PS_HEAVY_RX_THLD_PACKETS       8
-#define IWM_MVM_PS_SNOOZE_HEAVY_TX_THLD_PACKETS        30
-#define IWM_MVM_PS_SNOOZE_HEAVY_RX_THLD_PACKETS        20
-#define IWM_MVM_PS_HEAVY_TX_THLD_PERCENT       50
-#define IWM_MVM_PS_HEAVY_RX_THLD_PERCENT       50
-#define IWM_MVM_PS_SNOOZE_INTERVAL             25
-#define IWM_MVM_PS_SNOOZE_WINDOW               50
-#define IWM_MVM_WOWLAN_PS_SNOOZE_WINDOW                25
-#define IWM_MVM_LOWLAT_QUOTA_MIN_PERCENT       64
-#define IWM_MVM_BT_COEX_EN_RED_TXP_THRESH      62
-#define IWM_MVM_BT_COEX_DIS_RED_TXP_THRESH     65
-#define IWM_MVM_BT_COEX_SYNC2SCO               1
-#define IWM_MVM_BT_COEX_CORUNNING              0
-#define IWM_MVM_BT_COEX_MPLUT                  1
-#define IWM_MVM_BT_COEX_RRC                    1
-#define IWM_MVM_BT_COEX_TTC                    1
-#define IWM_MVM_BT_COEX_MPLUT_REG0             0x22002200
-#define IWM_MVM_BT_COEX_MPLUT_REG1             0x11118451
-#define IWM_MVM_BT_COEX_ANTENNA_COUPLING_THRS  30
-#define IWM_MVM_FW_MCAST_FILTER_PASS_ALL       0
-#define IWM_MVM_FW_BCAST_FILTER_PASS_ALL       0
-#define IWM_MVM_QUOTA_THRESHOLD                        4
-#define IWM_MVM_RS_RSSI_BASED_INIT_RATE         0
-#define IWM_MVM_RS_80_20_FAR_RANGE_TWEAK       1
-#define IWM_MVM_TOF_IS_RESPONDER               0
-#define IWM_MVM_SW_TX_CSUM_OFFLOAD             0
-#define IWM_MVM_HW_CSUM_DISABLE                        0
-#define IWM_MVM_COLLECT_FW_ERR_DUMP            1
-#define IWM_MVM_RS_NUM_TRY_BEFORE_ANT_TOGGLE    1
-#define IWM_MVM_RS_HT_VHT_RETRIES_PER_RATE      2
-#define IWM_MVM_RS_HT_VHT_RETRIES_PER_RATE_TW   1
-#define IWM_MVM_RS_INITIAL_MIMO_NUM_RATES       3
-#define IWM_MVM_RS_INITIAL_SISO_NUM_RATES       3
-#define IWM_MVM_RS_INITIAL_LEGACY_NUM_RATES     2
-#define IWM_MVM_RS_INITIAL_LEGACY_RETRIES       2
-#define IWM_MVM_RS_SECONDARY_LEGACY_RETRIES    1
-#define IWM_MVM_RS_SECONDARY_LEGACY_NUM_RATES   16
-#define IWM_MVM_RS_SECONDARY_SISO_NUM_RATES     3
-#define IWM_MVM_RS_SECONDARY_SISO_RETRIES       1
-#define IWM_MVM_RS_RATE_MIN_FAILURE_TH         3
-#define IWM_MVM_RS_RATE_MIN_SUCCESS_TH         8
-#define IWM_MVM_RS_STAY_IN_COLUMN_TIMEOUT      5       /* Seconds */
-#define IWM_MVM_RS_IDLE_TIMEOUT                        5       /* Seconds */
-#define IWM_MVM_RS_MISSED_RATE_MAX             15
-#define IWM_MVM_RS_LEGACY_FAILURE_LIMIT                160
-#define IWM_MVM_RS_LEGACY_SUCCESS_LIMIT                480
-#define IWM_MVM_RS_LEGACY_TABLE_COUNT          160
-#define IWM_MVM_RS_NON_LEGACY_FAILURE_LIMIT    400
-#define IWM_MVM_RS_NON_LEGACY_SUCCESS_LIMIT    4500
-#define IWM_MVM_RS_NON_LEGACY_TABLE_COUNT      1500
-#define IWM_MVM_RS_SR_FORCE_DECREASE           15      /* percent */
-#define IWM_MVM_RS_SR_NO_DECREASE              85      /* percent */
-#define IWM_MVM_RS_AGG_TIME_LIMIT              4000    /* 4 msecs. valid 
100-8000 */
-#define IWM_MVM_RS_AGG_DISABLE_START           3
-#define IWM_MVM_RS_TPC_SR_FORCE_INCREASE       75      /* percent */
-#define IWM_MVM_RS_TPC_SR_NO_INCREASE          85      /* percent */
-#define IWM_MVM_RS_TPC_TX_POWER_STEP           3
+#define IWM_PS_HEAVY_TX_THLD_PACKETS   20
+#define IWM_PS_HEAVY_RX_THLD_PACKETS   8
+#define IWM_PS_SNOOZE_HEAVY_TX_THLD_PACKETS    30
+#define IWM_PS_SNOOZE_HEAVY_RX_THLD_PACKETS    20
+#define IWM_PS_HEAVY_TX_THLD_PERCENT   50
+#define IWM_PS_HEAVY_RX_THLD_PERCENT   50
+#define IWM_PS_SNOOZE_INTERVAL         25
+#define IWM_PS_SNOOZE_WINDOW           50
+#define IWM_WOWLAN_PS_SNOOZE_WINDOW            25
+#define IWM_LOWLAT_QUOTA_MIN_PERCENT   64
+#define IWM_BT_COEX_EN_RED_TXP_THRESH  62
+#define IWM_BT_COEX_DIS_RED_TXP_THRESH 65
+#define IWM_BT_COEX_SYNC2SCO           1
+#define IWM_BT_COEX_CORUNNING          0
+#define IWM_BT_COEX_MPLUT                      1
+#define IWM_BT_COEX_RRC                        1
+#define IWM_BT_COEX_TTC                        1
+#define IWM_BT_COEX_MPLUT_REG0         0x22002200
+#define IWM_BT_COEX_MPLUT_REG1         0x11118451
+#define IWM_BT_COEX_ANTENNA_COUPLING_THRS      30
+#define IWM_FW_MCAST_FILTER_PASS_ALL   0
+#define IWM_FW_BCAST_FILTER_PASS_ALL   0
+#define IWM_QUOTA_THRESHOLD                    4
+#define IWM_RS_RSSI_BASED_INIT_RATE         0
+#define IWM_RS_80_20_FAR_RANGE_TWEAK   1
+#define IWM_TOF_IS_RESPONDER           0
+#define IWM_SW_TX_CSUM_OFFLOAD         0
+#define IWM_HW_CSUM_DISABLE                    0
+#define IWM_COLLECT_FW_ERR_DUMP                1
+#define IWM_RS_NUM_TRY_BEFORE_ANT_TOGGLE    1
+#define IWM_RS_HT_VHT_RETRIES_PER_RATE      2
+#define IWM_RS_HT_VHT_RETRIES_PER_RATE_TW   1
+#define IWM_RS_INITIAL_MIMO_NUM_RATES       3
+#define IWM_RS_INITIAL_SISO_NUM_RATES       3
+#define IWM_RS_INITIAL_LEGACY_NUM_RATES     2
+#define IWM_RS_INITIAL_LEGACY_RETRIES       2
+#define IWM_RS_SECONDARY_LEGACY_RETRIES        1
+#define IWM_RS_SECONDARY_LEGACY_NUM_RATES   16
+#define IWM_RS_SECONDARY_SISO_NUM_RATES     3
+#define IWM_RS_SECONDARY_SISO_RETRIES       1
+#define IWM_RS_RATE_MIN_FAILURE_TH             3
+#define IWM_RS_RATE_MIN_SUCCESS_TH             8
+#define IWM_RS_STAY_IN_COLUMN_TIMEOUT  5       /* Seconds */
+#define IWM_RS_IDLE_TIMEOUT                    5       /* Seconds */
+#define IWM_RS_MISSED_RATE_MAX         15
+#define IWM_RS_LEGACY_FAILURE_LIMIT            160
+#define IWM_RS_LEGACY_SUCCESS_LIMIT            480
+#define IWM_RS_LEGACY_TABLE_COUNT              160
+#define IWM_RS_NON_LEGACY_FAILURE_LIMIT        400
+#define IWM_RS_NON_LEGACY_SUCCESS_LIMIT        4500
+#define IWM_RS_NON_LEGACY_TABLE_COUNT  1500
+#define IWM_RS_SR_FORCE_DECREASE               15      /* percent */
+#define IWM_RS_SR_NO_DECREASE          85      /* percent */
+#define IWM_RS_AGG_TIME_LIMIT          4000    /* 4 msecs. valid 100-8000 */
+#define IWM_RS_AGG_DISABLE_START               3
+#define IWM_RS_TPC_SR_FORCE_INCREASE   75      /* percent */
+#define IWM_RS_TPC_SR_NO_INCREASE              85      /* percent */
+#define IWM_RS_TPC_TX_POWER_STEP               3

 #endif /* __IF_IWM_CONSTANTS_H */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_debug.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_debug.h
index 7bda743..35d6244 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_debug.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_debug.h
@@ -13,7 +13,7 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_debug.h 319578 2017-06-04 
21:10:14Z adrian $
+ * $FreeBSD$
  */

 #ifndef        __IF_IWM_DEBUG_H__
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.c
index 3a691bf..9383fe9 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.c
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.c
@@ -71,7 +71,7 @@
  */

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_fw.c 318001 2017-05-09 
02:38:23Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -336,7 +336,7 @@
                    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
        }

-       return iwm_mvm_send_cmd_pdu(sc, iwm_cmd_id(IWM_FW_PAGING_BLOCK_CMD,
+       return iwm_send_cmd_pdu(sc, iwm_cmd_id(IWM_FW_PAGING_BLOCK_CMD,
                                                   IWM_ALWAYS_LONG_GROUP, 0),
                                    0, sizeof(fw_paging_cmd), &fw_paging_cmd);
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.h
index 20c27db..66b3d84 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.h
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_fw.h
@@ -71,7 +71,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 /*
- * $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_fw.h 314209 2017-02-24 15:17:43Z 
adrian $
+ * $FreeBSD$
  */
 #ifndef        __IF_IWM_FW_H__
 #define        __IF_IWM_FW_H__
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.c
index 2e95516..f376bd1 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.c
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.c
@@ -87,7 +87,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_led.c 318001 2017-05-09 
02:38:23Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -139,20 +139,20 @@

 /* Set led register on */
 void
-iwm_mvm_led_enable(struct iwm_softc *sc)
+iwm_led_enable(struct iwm_softc *sc)
 {
        IWM_WRITE(sc, IWM_CSR_LED_REG, IWM_CSR_LED_REG_TURN_ON);
 }

 /* Set led register off */
 void
-iwm_mvm_led_disable(struct iwm_softc *sc)
+iwm_led_disable(struct iwm_softc *sc)
 {
        IWM_WRITE(sc, IWM_CSR_LED_REG, IWM_CSR_LED_REG_TURN_OFF);
 }

 static int
-iwm_mvm_led_is_enabled(struct iwm_softc *sc)
+iwm_led_is_enabled(struct iwm_softc *sc)
 {
        return (IWM_READ(sc, IWM_CSR_LED_REG) == IWM_CSR_LED_REG_TURN_ON);
 }
@@ -165,10 +165,10 @@
        if (sc->sc_attached == 0)
                return;

-       if (iwm_mvm_led_is_enabled(sc))
-               iwm_mvm_led_disable(sc);
+       if (iwm_led_is_enabled(sc))
+               iwm_led_disable(sc);
        else
-               iwm_mvm_led_enable(sc);
+               iwm_led_enable(sc);

        callout_reset(&sc->sc_led_blink_to, (200 * hz) / 1000,
            iwm_led_blink_timeout, sc);
@@ -184,5 +184,5 @@
 iwm_led_blink_stop(struct iwm_softc *sc)
 {
        callout_stop(&sc->sc_led_blink_to);
-       iwm_mvm_led_disable(sc);
+       iwm_led_disable(sc);
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.h
index acf0a15..df7afb0 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.h
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_led.h
@@ -86,13 +86,13 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_led.h 303327 2016-07-26 00:02:17Z 
sbruno $
+ * $FreeBSD$
  */
 #ifndef        __IF_IWM_LED_H__
 #define        __IF_IWM_LED_H__

-extern void iwm_mvm_led_enable(struct iwm_softc *);
-extern void iwm_mvm_led_disable(struct iwm_softc *);
+extern void iwm_led_enable(struct iwm_softc *);
+extern void iwm_led_disable(struct iwm_softc *);
 extern void iwm_led_blink_start(struct iwm_softc *);
 extern void iwm_led_blink_stop(struct iwm_softc *);

diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.c
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.c
index 2777a75c..7e0d3d8 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_mac_ctxt.c 318219 
2017-05-12 05:50:38Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -161,15 +161,15 @@
  * BEGIN mvm/mac-ctxt.c
  */

-const uint8_t iwm_mvm_ac_to_tx_fifo[] = {
-       IWM_MVM_TX_FIFO_BE,
-       IWM_MVM_TX_FIFO_BK,
-       IWM_MVM_TX_FIFO_VI,
-       IWM_MVM_TX_FIFO_VO,
+const uint8_t iwm_ac_to_tx_fifo[] = {
+       IWM_TX_FIFO_BE,
+       IWM_TX_FIFO_BK,
+       IWM_TX_FIFO_VI,
+       IWM_TX_FIFO_VO,
 };
 
 static void
-iwm_mvm_ack_rates(struct iwm_softc *sc, int is2ghz,
+iwm_ack_rates(struct iwm_softc *sc, int is2ghz,
        int *cck_rates, int *ofdm_rates, struct iwm_node *in)
 {
        int lowest_present_ofdm = 100;
@@ -253,7 +253,7 @@
 }

 static void
-iwm_mvm_mac_ctxt_cmd_common(struct iwm_softc *sc, struct iwm_node *in,
+iwm_mac_ctxt_cmd_common(struct iwm_softc *sc, struct iwm_node *in,
        struct iwm_mac_ctx_cmd *cmd, uint32_t action)
 {
        struct ieee80211com *ic = &sc->sc_ic;
@@ -305,8 +305,8 @@
         * XXX This workaround makes the firmware behave more correctly once
         *     we are associated, regularly giving us statistics notifications,
         *     as well as signaling missed beacons to us.
-        *     Since we only call iwm_mvm_mac_ctxt_add() and
-        *     iwm_mvm_mac_ctxt_changed() when already authenticating or
+        *     Since we only call iwm_mac_ctxt_add() and
+        *     iwm_mac_ctxt_changed() when already authenticating or
         *     associating, ni->ni_bssid should always make sense here.
         */
        if (ivp->iv_auth) {
@@ -325,7 +325,7 @@
        } else {
                is2ghz = 1;
        }
-       iwm_mvm_ack_rates(sc, is2ghz, &cck_ack_rates, &ofdm_ack_rates, in);
+       iwm_ack_rates(sc, is2ghz, &cck_ack_rates, &ofdm_ack_rates, in);
        cmd->cck_rates = htole32(cck_ack_rates);
        cmd->ofdm_rates = htole32(ofdm_ack_rates);

@@ -342,7 +342,7 @@
         */

        for (i = 0; i < WME_NUM_AC; i++) {
-               uint8_t txf = iwm_mvm_ac_to_tx_fifo[i];
+               uint8_t txf = iwm_ac_to_tx_fifo[i];

                cmd->ac[txf].cw_min = htole16(ivp->queue_params[i].cw_min);
                cmd->ac[txf].cw_max = htole16(ivp->queue_params[i].cw_max);
@@ -362,9 +362,9 @@
 }

 static int
-iwm_mvm_mac_ctxt_send_cmd(struct iwm_softc *sc, struct iwm_mac_ctx_cmd *cmd)
+iwm_mac_ctxt_send_cmd(struct iwm_softc *sc, struct iwm_mac_ctx_cmd *cmd)
 {
-       int ret = iwm_mvm_send_cmd_pdu(sc, IWM_MAC_CONTEXT_CMD, IWM_CMD_SYNC,
+       int ret = iwm_send_cmd_pdu(sc, IWM_MAC_CONTEXT_CMD, IWM_CMD_SYNC,
                                       sizeof(*cmd), cmd);
        if (ret)
                device_printf(sc->sc_dev,
@@ -377,7 +377,7 @@
  * Fill the specific data for mac context of type station or p2p client
  */
 static void
-iwm_mvm_mac_ctxt_cmd_fill_sta(struct iwm_softc *sc, struct iwm_node *in,
+iwm_mac_ctxt_cmd_fill_sta(struct iwm_softc *sc, struct iwm_node *in,
        struct iwm_mac_data_sta *ctxt_sta, int force_assoc_off)
 {
        struct ieee80211_node *ni = &in->in_ni;
@@ -444,15 +444,15 @@
            "%s: ni_intval: %d, bi_reciprocal: %d, dtim_interval: %d, 
dtim_reciprocal: %d\n",
            __func__,
            ni->ni_intval,
-           iwm_mvm_reciprocal(ni->ni_intval),
+           iwm_reciprocal(ni->ni_intval),
            ni->ni_intval * dtim_period,
-           iwm_mvm_reciprocal(ni->ni_intval * dtim_period));
+           iwm_reciprocal(ni->ni_intval * dtim_period));

        ctxt_sta->bi = htole32(ni->ni_intval);
-       ctxt_sta->bi_reciprocal = htole32(iwm_mvm_reciprocal(ni->ni_intval));
+       ctxt_sta->bi_reciprocal = htole32(iwm_reciprocal(ni->ni_intval));
        ctxt_sta->dtim_interval = htole32(ni->ni_intval * dtim_period);
        ctxt_sta->dtim_reciprocal =
-           htole32(iwm_mvm_reciprocal(ni->ni_intval * dtim_period));
+           htole32(iwm_reciprocal(ni->ni_intval * dtim_period));

        /* 10 = CONN_MAX_LISTEN_INTERVAL */
        ctxt_sta->listen_interval = htole32(10);
@@ -462,7 +462,7 @@
 }

 static int
-iwm_mvm_mac_ctxt_cmd_station(struct iwm_softc *sc, struct ieee80211vap *vap,
+iwm_mac_ctxt_cmd_station(struct iwm_softc *sc, struct ieee80211vap *vap,
        uint32_t action)
 {
        struct ieee80211_node *ni = vap->iv_bss;
@@ -473,7 +473,7 @@
            "%s: called; action=%d\n", __func__, action);

        /* Fill the common data for all mac context types */
-       iwm_mvm_mac_ctxt_cmd_common(sc, in, &cmd, action);
+       iwm_mac_ctxt_cmd_common(sc, in, &cmd, action);

        /* Allow beacons to pass through as long as we are not associated,or we
         * do not have dtim period information */
@@ -483,21 +483,21 @@
                cmd.filter_flags &= ~htole32(IWM_MAC_FILTER_IN_BEACON);

        /* Fill the data specific for station mode */
-       iwm_mvm_mac_ctxt_cmd_fill_sta(sc, in,
+       iwm_mac_ctxt_cmd_fill_sta(sc, in,
            &cmd.sta, action == IWM_FW_CTXT_ACTION_ADD);

-       return iwm_mvm_mac_ctxt_send_cmd(sc, &cmd);
+       return iwm_mac_ctxt_send_cmd(sc, &cmd);
 }

 static int
-iwm_mvm_mac_ctx_send(struct iwm_softc *sc, struct ieee80211vap *vap,
+iwm_mac_ctx_send(struct iwm_softc *sc, struct ieee80211vap *vap,
     uint32_t action)
 {
-       return iwm_mvm_mac_ctxt_cmd_station(sc, vap, action);
+       return iwm_mac_ctxt_cmd_station(sc, vap, action);
 }
 
 int
-iwm_mvm_mac_ctxt_add(struct iwm_softc *sc, struct ieee80211vap *vap)
+iwm_mac_ctxt_add(struct iwm_softc *sc, struct ieee80211vap *vap)
 {
        struct iwm_vap *iv = IWM_VAP(vap);
        int ret;
@@ -508,7 +508,7 @@
                return (EIO);
        }

-       ret = iwm_mvm_mac_ctx_send(sc, vap, IWM_FW_CTXT_ACTION_ADD);
+       ret = iwm_mac_ctx_send(sc, vap, IWM_FW_CTXT_ACTION_ADD);
        if (ret)
                return (ret);
        iv->is_uploaded = 1;
@@ -516,7 +516,7 @@
 }

 int
-iwm_mvm_mac_ctxt_changed(struct iwm_softc *sc, struct ieee80211vap *vap)
+iwm_mac_ctxt_changed(struct iwm_softc *sc, struct ieee80211vap *vap)
 {
        struct iwm_vap *iv = IWM_VAP(vap);

@@ -525,12 +525,12 @@
                    __func__);
                return (EIO);
        }
-       return iwm_mvm_mac_ctx_send(sc, vap, IWM_FW_CTXT_ACTION_MODIFY);
+       return iwm_mac_ctx_send(sc, vap, IWM_FW_CTXT_ACTION_MODIFY);
 }

 #if 0
 static int
-iwm_mvm_mac_ctxt_remove(struct iwm_softc *sc, struct iwm_node *in)
+iwm_mac_ctxt_remove(struct iwm_softc *sc, struct iwm_node *in)
 {
        struct iwm_mac_ctx_cmd cmd;
        int ret;
@@ -547,7 +547,7 @@
            IWM_DEFAULT_COLOR));
        cmd.action = htole32(IWM_FW_CTXT_ACTION_REMOVE);

-       ret = iwm_mvm_send_cmd_pdu(sc,
+       ret = iwm_send_cmd_pdu(sc,
            IWM_MAC_CONTEXT_CMD, IWM_CMD_SYNC, sizeof(cmd), &cmd);
        if (ret) {
                device_printf(sc->sc_dev,
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.h
index b0d0c19..e23f91e 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_mac_ctxt.h 318219 2017-05-12 
05:50:38Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -106,10 +106,10 @@
 #ifndef        __IF_IWM_MAC_CTXT_H__
 #define        __IF_IWM_MAC_CTXT_H__

-extern const uint8_t iwm_mvm_ac_to_tx_fifo[];
+extern const uint8_t iwm_ac_to_tx_fifo[];

-extern int iwm_mvm_mac_ctxt_add(struct iwm_softc *sc, struct ieee80211vap 
*vap);
-extern int iwm_mvm_mac_ctxt_changed(struct iwm_softc *sc, struct ieee80211vap 
*vap);
-extern int iwm_mvm_mac_ctxt_remove(struct iwm_softc *sc, struct ieee80211vap 
*vap);
+extern int iwm_mac_ctxt_add(struct iwm_softc *sc, struct ieee80211vap *vap);
+extern int iwm_mac_ctxt_changed(struct iwm_softc *sc, struct ieee80211vap 
*vap);
+extern int iwm_mac_ctxt_remove(struct iwm_softc *sc, struct ieee80211vap *vap);

 #endif /* __IF_IWM_MAC_CTXT_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.c
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.c
index 67ae03b..47f02a6 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.c
@@ -67,7 +67,7 @@
  *****************************************************************************/

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_notif_wait.c 318001 
2017-05-09 02:38:23Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -76,9 +76,9 @@
 #include <sys/systm.h>
 #include <sys/bus.h>
 #include <sys/kernel.h>
+#include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/mutex.h>
-#include <sys/lock.h>
 #include <sys/queue.h>

 #include <dev/iwm/if_iwm_notif_wait.h>
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.h
index 7608fe5..aa77023 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_notif_wait.h
@@ -66,7 +66,7 @@
  *
  *****************************************************************************/

-/* $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_notif_wait.h 313322 2017-02-06 
05:27:07Z adrian $ */
+/* $FreeBSD$ */

 #ifndef __IF_IWN_NOTIF_WAIT_H__
 #define __IF_IWN_NOTIF_WAIT_H__
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.c
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.c
index 30c58de..9178a1d 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_pcie_trans.c 318003 
2017-05-09 02:42:53Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -185,6 +185,27 @@
        IWM_WRITE(sc, IWM_HBUS_TARG_PRPH_WDAT, val);
 }

+void
+iwm_write_prph64(struct iwm_softc *sc, uint64_t addr, uint64_t val)
+{
+       iwm_write_prph(sc, (uint32_t)addr, val & 0xffffffff);
+       iwm_write_prph(sc, (uint32_t)addr + 4, val >> 32);
+}
+
+int
+iwm_poll_prph(struct iwm_softc *sc, uint32_t addr, uint32_t bits, uint32_t 
mask,
+    int timeout)
+{
+       do {
+               if ((iwm_read_prph(sc, addr) & mask) == (bits & mask))
+                       return (0);
+               DELAY(10);
+               timeout -= 10;
+       } while (timeout > 0);
+
+       return (ETIMEDOUT);
+}
+
 #ifdef IWM_DEBUG
 /* iwlwifi: pcie/trans.c */
 int
@@ -261,7 +282,7 @@
        IWM_SETBITS(sc, IWM_CSR_GP_CNTRL,
            IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);

-       if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000)
+       if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000)
                DELAY(2);

        if (iwm_poll_bit(sc, IWM_CSR_GP_CNTRL,
@@ -325,6 +346,8 @@
 {
        sc->sc_intmask = IWM_CSR_INT_BIT_RF_KILL;
        IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
+       IWM_SETBITS(sc, IWM_CSR_GP_CNTRL,
+           IWM_CSR_GP_CNTRL_REG_FLAG_RFKILL_WAKE_L1A_EN);
 }

 int
@@ -383,7 +406,9 @@
        if (iwm_set_hw_ready(sc))
                goto out;

-       DELAY(100);
+       IWM_SETBITS(sc, IWM_CSR_DBG_LINK_PWR_MGMT_REG,
+           IWM_CSR_RESET_LINK_PWR_MGMT_DISABLED);
+       DELAY(1000);

        /* If HW is not ready, prepare the conditions to check again */
        IWM_SETBITS(sc, IWM_CSR_HW_IF_CONFIG_REG,
@@ -454,7 +479,7 @@
        IWM_DPRINTF(sc, IWM_DEBUG_RESET, "iwm apm start\n");

        /* Disable L0S exit timer (platform NMI Work/Around) */
-       if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
+       if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) {
                IWM_SETBITS(sc, IWM_CSR_GIO_CHICKEN_BITS,
                    IWM_CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
        }
@@ -569,6 +594,16 @@
 void
 iwm_apm_stop(struct iwm_softc *sc)
 {
+       IWM_SETBITS(sc, IWM_CSR_DBG_LINK_PWR_MGMT_REG,
+           IWM_CSR_RESET_LINK_PWR_MGMT_DISABLED);
+       IWM_SETBITS(sc, IWM_CSR_HW_IF_CONFIG_REG,
+           IWM_CSR_HW_IF_CONFIG_REG_PREPARE |
+           IWM_CSR_HW_IF_CONFIG_REG_ENABLE_PME);
+       DELAY(1000);
+       IWM_CLRBITS(sc, IWM_CSR_DBG_LINK_PWR_MGMT_REG,
+           IWM_CSR_RESET_LINK_PWR_MGMT_DISABLED);
+       DELAY(5000);
+
        /* stop device's busmaster DMA activity */
        IWM_SETBITS(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_STOP_MASTER);

@@ -576,6 +611,14 @@
            IWM_CSR_RESET_REG_FLAG_MASTER_DISABLED,
            IWM_CSR_RESET_REG_FLAG_MASTER_DISABLED, 100))
                device_printf(sc->sc_dev, "timeout waiting for master\n");
+
+       /*
+        * Clear "initialization complete" bit to move adapter from
+        * D0A* (powered-up Active) --> D0U* (Uninitialized) state.
+        */
+       IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
+           IWM_CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
+
        IWM_DPRINTF(sc, IWM_DEBUG_TRANS, "%s: iwm apm stop\n", __func__);
 }

@@ -590,11 +633,15 @@

        /* Reset the entire device */
        IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET);
-       DELAY(10);
+       DELAY(5000);

        if ((error = iwm_apm_init(sc)) != 0)
                return error;

+       /* On newer chipsets MSI is disabled by default. */
+       if (sc->cfg->mqrx_supported)
+               iwm_write_prph(sc, IWM_UREG_CHICK, IWM_UREG_CHICK_MSI_ENABLE);
+
        iwm_enable_rfkill_int(sc);
        iwm_check_rfkill(sc);

@@ -613,13 +660,21 @@
 int
 iwm_pcie_rx_stop(struct iwm_softc *sc)
 {
-       int ret = 0;
+       int ret;
+
+       ret = 0;
        if (iwm_nic_lock(sc)) {
-               IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
-               ret = iwm_poll_bit(sc, IWM_FH_MEM_RSSR_RX_STATUS_REG,
-                   IWM_FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
-                   IWM_FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
-                   1000);
+               if (sc->cfg->mqrx_supported) {
+                       iwm_write_prph(sc, IWM_RFH_RXF_DMA_CFG, 0);
+                       ret = iwm_poll_prph(sc, IWM_RFH_GEN_STATUS,
+                           IWM_RXF_DMA_IDLE, IWM_RXF_DMA_IDLE, 1000);
+               } else {
+                       IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
+                       ret = iwm_poll_bit(sc, IWM_FH_MEM_RSSR_RX_STATUS_REG,
+                           IWM_FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
+                           IWM_FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
+                           1000);
+               }
                iwm_nic_unlock(sc);
        }
        return ret;
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.h
index 8fef440..bdbd854 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_pcie_trans.h
@@ -1,4 +1,4 @@
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_pcie_trans.h 313415 2017-02-08 
06:53:23Z adrian $ */
+/*     $FreeBSD$ */
 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
  * Copyright (c) 2014 Fixup Software Ltd.
@@ -106,6 +106,10 @@

 extern uint32_t iwm_read_prph(struct iwm_softc *sc, uint32_t addr);
 extern void iwm_write_prph(struct iwm_softc *sc, uint32_t addr, uint32_t val);
+extern void iwm_write_prph64(struct iwm_softc *sc, uint64_t addr,
+    uint64_t val);
+extern int iwm_poll_prph(struct iwm_softc *sc, uint32_t addr, uint32_t bits,
+    uint32_t mask, int timeout);
 extern int iwm_read_mem(struct iwm_softc *sc, uint32_t addr, void *buf, int 
dwords);
 extern int iwm_write_mem(struct iwm_softc *sc, uint32_t addr, const void *buf,
                int dwords);
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.c
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.c
index b3caac6..3815d13 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_phy_ctxt.c 318012 
2017-05-09 05:31:38Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -165,7 +165,7 @@
  * Construct the generic fields of the PHY context command
  */
 static void
-iwm_mvm_phy_ctxt_cmd_hdr(struct iwm_softc *sc, struct iwm_mvm_phy_ctxt *ctxt,
+iwm_phy_ctxt_cmd_hdr(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt,
        struct iwm_phy_context_cmd *cmd, uint32_t action, uint32_t apply_time)
 {
        memset(cmd, 0, sizeof(struct iwm_phy_context_cmd));
@@ -188,7 +188,7 @@
  * Add the phy configuration to the PHY context command
  */
 static void
-iwm_mvm_phy_ctxt_cmd_data(struct iwm_softc *sc,
+iwm_phy_ctxt_cmd_data(struct iwm_softc *sc,
        struct iwm_phy_context_cmd *cmd, struct ieee80211_channel *chan,
        uint8_t chains_static, uint8_t chains_dynamic)
 {
@@ -203,8 +203,8 @@
            ieee80211_chan2ieee(ic, chan),
            chains_static,
            chains_dynamic,
-           iwm_mvm_get_valid_rx_ant(sc),
-           iwm_mvm_get_valid_tx_ant(sc));
+           iwm_get_valid_rx_ant(sc),
+           iwm_get_valid_tx_ant(sc));


        cmd->ci.band = IEEE80211_IS_CHAN_2GHZ(chan) ?
@@ -225,18 +225,18 @@
         * between the two antennas is sufficiently different to impact
         * performance.
         */
-       if (active_cnt == 1 && iwm_mvm_rx_diversity_allowed(sc)) {
+       if (active_cnt == 1 && iwm_rx_diversity_allowed(sc)) {
                idle_cnt = 2;
                active_cnt = 2;
        }

-       cmd->rxchain_info = htole32(iwm_mvm_get_valid_rx_ant(sc) <<
+       cmd->rxchain_info = htole32(iwm_get_valid_rx_ant(sc) <<
                                        IWM_PHY_RX_CHAIN_VALID_POS);
        cmd->rxchain_info |= htole32(idle_cnt << IWM_PHY_RX_CHAIN_CNT_POS);
        cmd->rxchain_info |= htole32(active_cnt <<
            IWM_PHY_RX_CHAIN_MIMO_CNT_POS);

-       cmd->txchain_info = htole32(iwm_mvm_get_valid_tx_ant(sc));
+       cmd->txchain_info = htole32(iwm_get_valid_tx_ant(sc));
 }

 /*
@@ -246,8 +246,8 @@
  * configuration changed from the previous apply.
  */
 static int
-iwm_mvm_phy_ctxt_apply(struct iwm_softc *sc,
-       struct iwm_mvm_phy_ctxt *ctxt,
+iwm_phy_ctxt_apply(struct iwm_softc *sc,
+       struct iwm_phy_ctxt *ctxt,
        uint8_t chains_static, uint8_t chains_dynamic,
        uint32_t action, uint32_t apply_time)
 {
@@ -260,13 +260,13 @@
            ctxt->channel);

        /* Set the command header fields */
-       iwm_mvm_phy_ctxt_cmd_hdr(sc, ctxt, &cmd, action, apply_time);
+       iwm_phy_ctxt_cmd_hdr(sc, ctxt, &cmd, action, apply_time);

        /* Set the command data */
-       iwm_mvm_phy_ctxt_cmd_data(sc, &cmd, ctxt->channel,
+       iwm_phy_ctxt_cmd_data(sc, &cmd, ctxt->channel,
            chains_static, chains_dynamic);

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_PHY_CONTEXT_CMD, IWM_CMD_SYNC,
+       ret = iwm_send_cmd_pdu(sc, IWM_PHY_CONTEXT_CMD, IWM_CMD_SYNC,
            sizeof(struct iwm_phy_context_cmd), &cmd);
        if (ret) {
                device_printf(sc->sc_dev,
@@ -279,7 +279,7 @@
  * Send a command to add a PHY context based on the current HW configuration.
  */
 int
-iwm_mvm_phy_ctxt_add(struct iwm_softc *sc, struct iwm_mvm_phy_ctxt *ctxt,
+iwm_phy_ctxt_add(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt,
        struct ieee80211_channel *chan,
        uint8_t chains_static, uint8_t chains_dynamic)
 {
@@ -290,7 +290,7 @@
            __func__,
            ieee80211_chan2ieee(&sc->sc_ic, chan));

-       return iwm_mvm_phy_ctxt_apply(sc, ctxt,
+       return iwm_phy_ctxt_apply(sc, ctxt,
            chains_static, chains_dynamic, IWM_FW_CTXT_ACTION_ADD, 0);
 }

@@ -300,8 +300,8 @@
  * changed.
  */
 int
-iwm_mvm_phy_ctxt_changed(struct iwm_softc *sc,
-       struct iwm_mvm_phy_ctxt *ctxt, struct ieee80211_channel *chan,
+iwm_phy_ctxt_changed(struct iwm_softc *sc,
+       struct iwm_phy_ctxt *ctxt, struct ieee80211_channel *chan,
        uint8_t chains_static, uint8_t chains_dynamic)
 {
        ctxt->channel = chan;
@@ -311,7 +311,7 @@
            __func__,
            ieee80211_chan2ieee(&sc->sc_ic, chan));

-       return iwm_mvm_phy_ctxt_apply(sc, ctxt,
+       return iwm_phy_ctxt_apply(sc, ctxt,
            chains_static, chains_dynamic, IWM_FW_CTXT_ACTION_MODIFY, 0);
 }

diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.h
index 92b828e..f3cf282 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_phy_ctxt.h 286441 2015-08-08 
06:06:48Z rpaulo $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -106,12 +106,12 @@
 #ifndef        __IF_IWM_PHY_CTXT_H__
 #define        __IF_IWM_PHY_CTXT_H__

-extern int iwm_mvm_phy_ctxt_add(struct iwm_softc *sc,
-           struct iwm_mvm_phy_ctxt *ctxt,
+extern int iwm_phy_ctxt_add(struct iwm_softc *sc,
+           struct iwm_phy_ctxt *ctxt,
            struct ieee80211_channel *chan,
            uint8_t chains_static, uint8_t chains_dynamic);
-extern int iwm_mvm_phy_ctxt_changed(struct iwm_softc *sc,
-           struct iwm_mvm_phy_ctxt *ctxt, struct ieee80211_channel *chan,
+extern int iwm_phy_ctxt_changed(struct iwm_softc *sc,
+           struct iwm_phy_ctxt *ctxt, struct ieee80211_channel *chan,
            uint8_t chains_static, uint8_t chains_dynamic);

 #endif /* __IF_IWM_PHY_CTXT_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.c
index 3471e7d..40a0a05 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_phy_db.c 319581 2017-06-04 
21:13:13Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -203,7 +203,7 @@
 struct iwm_phy_db_cmd {
        uint16_t type;
        uint16_t length;
-       uint8_t data[0];
+       uint8_t data[];
 } __packed;

 /* for parsing of tx power channel group data that comes from the firmware*/
@@ -218,7 +218,7 @@
 struct iwm_calib_res_notif_phy_db {
        uint16_t type;
        uint16_t length;
-       uint8_t data[0];
+       uint8_t data[];
 } __packed;

 struct iwm_phy_db *
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.h
index 90dc904..7cab8a3 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_phy_db.h 313317 2017-02-06 
05:09:42Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.c
index 1a2773f..5507d6b 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.c
@@ -87,7 +87,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_power.c 318228 2017-05-12 
06:31:57Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -153,12 +153,12 @@
 #define IWM_POWER_KEEP_ALIVE_PERIOD_SEC    25

 static int
-iwm_mvm_beacon_filter_send_cmd(struct iwm_softc *sc,
+iwm_beacon_filter_send_cmd(struct iwm_softc *sc,
        struct iwm_beacon_filter_cmd *cmd)
 {
        int ret;

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_REPLY_BEACON_FILTERING_CMD,
+       ret = iwm_send_cmd_pdu(sc, IWM_REPLY_BEACON_FILTERING_CMD,
            0, sizeof(struct iwm_beacon_filter_cmd), cmd);

        if (!ret) {
@@ -200,14 +200,14 @@
 }

 static void
-iwm_mvm_beacon_filter_set_cqm_params(struct iwm_softc *sc,
+iwm_beacon_filter_set_cqm_params(struct iwm_softc *sc,
        struct iwm_vap *ivp, struct iwm_beacon_filter_cmd *cmd)
 {
        cmd->ba_enable_beacon_abort = htole32(sc->sc_bf.ba_enabled);
 }

 static void
-iwm_mvm_power_log(struct iwm_softc *sc, struct iwm_mac_power_cmd *cmd)
+iwm_power_log(struct iwm_softc *sc, struct iwm_mac_power_cmd *cmd)
 {
        IWM_DPRINTF(sc, IWM_DEBUG_PWRSAVE | IWM_DEBUG_CMD,
            "Sending power table command on mac id 0x%X for "
@@ -232,7 +232,7 @@
 }

 static boolean_t
-iwm_mvm_power_is_radar(struct iwm_softc *sc)
+iwm_power_is_radar(struct iwm_softc *sc)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211_channel *chan;
@@ -248,7 +248,7 @@
 }

 static void
-iwm_mvm_power_config_skip_dtim(struct iwm_softc *sc,
+iwm_power_config_skip_dtim(struct iwm_softc *sc,
        struct iwm_mac_power_cmd *cmd)
 {
        struct ieee80211com *ic = &sc->sc_ic;
@@ -260,7 +260,7 @@
        cmd->skip_dtim_periods = 0;
        cmd->flags &= ~htole16(IWM_POWER_FLAGS_SKIP_OVER_DTIM_MSK);

-        if (iwm_mvm_power_is_radar(sc))
+        if (iwm_power_is_radar(sc))
                 return;

        if (dtimper >= 10)
@@ -278,7 +278,7 @@
 }

 static void
-iwm_mvm_power_build_cmd(struct iwm_softc *sc, struct iwm_vap *ivp,
+iwm_power_build_cmd(struct iwm_softc *sc, struct iwm_vap *ivp,
        struct iwm_mac_power_cmd *cmd)
 {
        struct ieee80211vap *vap = &ivp->iv_vap;
@@ -317,34 +317,34 @@

        cmd->flags |= htole16(IWM_POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK);

-       iwm_mvm_power_config_skip_dtim(sc, cmd);
+       iwm_power_config_skip_dtim(sc, cmd);

        cmd->rx_data_timeout =
-               htole32(IWM_MVM_DEFAULT_PS_RX_DATA_TIMEOUT);
+               htole32(IWM_DEFAULT_PS_RX_DATA_TIMEOUT);
        cmd->tx_data_timeout =
-               htole32(IWM_MVM_DEFAULT_PS_TX_DATA_TIMEOUT);
+               htole32(IWM_DEFAULT_PS_TX_DATA_TIMEOUT);
 }

 static int
-iwm_mvm_power_send_cmd(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_power_send_cmd(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        struct iwm_mac_power_cmd cmd = {};

-       iwm_mvm_power_build_cmd(sc, ivp, &cmd);
-       iwm_mvm_power_log(sc, &cmd);
+       iwm_power_build_cmd(sc, ivp, &cmd);
+       iwm_power_log(sc, &cmd);

-       return iwm_mvm_send_cmd_pdu(sc, IWM_MAC_PM_POWER_TABLE, 0,
+       return iwm_send_cmd_pdu(sc, IWM_MAC_PM_POWER_TABLE, 0,
            sizeof(cmd), &cmd);
 }

 static int
-_iwm_mvm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_vap *ivp,
+_iwm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_vap *ivp,
        struct iwm_beacon_filter_cmd *cmd)
 {
        int ret;

-       iwm_mvm_beacon_filter_set_cqm_params(sc, ivp, cmd);
-       ret = iwm_mvm_beacon_filter_send_cmd(sc, cmd);
+       iwm_beacon_filter_set_cqm_params(sc, ivp, cmd);
+       ret = iwm_beacon_filter_send_cmd(sc, cmd);

        if (!ret)
                sc->sc_bf.bf_enabled = 1;
@@ -353,23 +353,23 @@
 }

 int
-iwm_mvm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        struct iwm_beacon_filter_cmd cmd = {
                IWM_BF_CMD_CONFIG_DEFAULTS,
                .bf_enable_beacon_filter = htole32(1),
        };

-       return _iwm_mvm_enable_beacon_filter(sc, ivp, &cmd);
+       return _iwm_enable_beacon_filter(sc, ivp, &cmd);
 }

 int
-iwm_mvm_disable_beacon_filter(struct iwm_softc *sc)
+iwm_disable_beacon_filter(struct iwm_softc *sc)
 {
        struct iwm_beacon_filter_cmd cmd = {};
        int ret;

-       ret = iwm_mvm_beacon_filter_send_cmd(sc, &cmd);
+       ret = iwm_beacon_filter_send_cmd(sc, &cmd);
        if (ret == 0)
                sc->sc_bf.bf_enabled = 0;

@@ -377,7 +377,7 @@
 }

 static int
-iwm_mvm_power_set_ps(struct iwm_softc *sc)
+iwm_power_set_ps(struct iwm_softc *sc)
 {
        struct ieee80211vap *vap;
        boolean_t disable_ps;
@@ -397,7 +397,7 @@
                boolean_t old_ps_disabled = sc->sc_ps_disabled;

                sc->sc_ps_disabled = disable_ps;
-               ret = iwm_mvm_power_update_device(sc);
+               ret = iwm_power_update_device(sc);
                if (ret) {
                        sc->sc_ps_disabled = old_ps_disabled;
                        return ret;
@@ -408,7 +408,7 @@
 }

 static int
-iwm_mvm_power_set_ba(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_power_set_ba(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        struct iwm_beacon_filter_cmd cmd = {
                IWM_BF_CMD_CONFIG_DEFAULTS,
@@ -427,49 +427,49 @@
        }
        sc->sc_bf.ba_enabled = !sc->sc_ps_disabled && bss_conf_ps;

-       return _iwm_mvm_enable_beacon_filter(sc, ivp, &cmd);
+       return _iwm_enable_beacon_filter(sc, ivp, &cmd);
 }

 int
-iwm_mvm_power_update_ps(struct iwm_softc *sc)
+iwm_power_update_ps(struct iwm_softc *sc)
 {
        struct ieee80211vap *vap = TAILQ_FIRST(&sc->sc_ic.ic_vaps);
        int ret;

-       ret = iwm_mvm_power_set_ps(sc);
+       ret = iwm_power_set_ps(sc);
        if (ret)
                return ret;

        if (vap != NULL)
-               return iwm_mvm_power_set_ba(sc, IWM_VAP(vap));
+               return iwm_power_set_ba(sc, IWM_VAP(vap));

        return 0;
 }

 int
-iwm_mvm_power_update_mac(struct iwm_softc *sc)
+iwm_power_update_mac(struct iwm_softc *sc)
 {
        struct ieee80211vap *vap = TAILQ_FIRST(&sc->sc_ic.ic_vaps);
        int ret;

-       ret = iwm_mvm_power_set_ps(sc);
+       ret = iwm_power_set_ps(sc);
        if (ret)
                return ret;

        if (vap != NULL) {
-               ret = iwm_mvm_power_send_cmd(sc, IWM_VAP(vap));
+               ret = iwm_power_send_cmd(sc, IWM_VAP(vap));
                if (ret)
                        return ret;
        }

        if (vap != NULL)
-               return iwm_mvm_power_set_ba(sc, IWM_VAP(vap));
+               return iwm_power_set_ba(sc, IWM_VAP(vap));

        return 0;
 }

 int
-iwm_mvm_power_update_device(struct iwm_softc *sc)
+iwm_power_update_device(struct iwm_softc *sc)
 {
        struct iwm_device_power_cmd cmd = {
                .flags = 0,
@@ -484,6 +484,6 @@
        IWM_DPRINTF(sc, IWM_DEBUG_PWRSAVE | IWM_DEBUG_CMD,
            "Sending device power command with flags = 0x%X\n", cmd.flags);

-       return iwm_mvm_send_cmd_pdu(sc,
+       return iwm_send_cmd_pdu(sc,
            IWM_POWER_TABLE_CMD, 0, sizeof(cmd), &cmd);
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.h
index 95883eb..0e7eeaa 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_power.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_power.h 318226 2017-05-12 
06:30:06Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -90,11 +90,11 @@
 #ifndef        __IF_IWM_POWER_H__
 #define        __IF_IWM_POWER_H__

-extern int iwm_mvm_power_update_device(struct iwm_softc *sc);
-extern int iwm_mvm_power_update_mac(struct iwm_softc *sc);
-extern int iwm_mvm_power_update_ps(struct iwm_softc *sc);
-extern int iwm_mvm_enable_beacon_filter(struct iwm_softc *sc,
+extern int iwm_power_update_device(struct iwm_softc *sc);
+extern int iwm_power_update_mac(struct iwm_softc *sc);
+extern int iwm_power_update_ps(struct iwm_softc *sc);
+extern int iwm_enable_beacon_filter(struct iwm_softc *sc,
            struct iwm_vap *ivp);
-extern int iwm_mvm_disable_beacon_filter(struct iwm_softc *sc);
+extern int iwm_disable_beacon_filter(struct iwm_softc *sc);

 #endif /* __IF_IWM_POWER_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.c
index ae410ca..cdf7985 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_scan.c 321507 2017-07-26 
05:26:01Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -166,12 +166,12 @@
 #define IWM_SPARSE_EBS_SCAN_RATIO 1

 static uint16_t
-iwm_mvm_scan_rx_chain(struct iwm_softc *sc)
+iwm_scan_rx_chain(struct iwm_softc *sc)
 {
        uint16_t rx_chain;
        uint8_t rx_ant;

-       rx_ant = iwm_mvm_get_valid_rx_ant(sc);
+       rx_ant = iwm_get_valid_rx_ant(sc);
        rx_chain = rx_ant << IWM_PHY_RX_CHAIN_VALID_POS;
        rx_chain |= rx_ant << IWM_PHY_RX_CHAIN_FORCE_MIMO_SEL_POS;
        rx_chain |= rx_ant << IWM_PHY_RX_CHAIN_FORCE_SEL_POS;
@@ -180,7 +180,7 @@
 }

 static uint32_t
-iwm_mvm_scan_rxon_flags(struct ieee80211_channel *c)
+iwm_scan_rxon_flags(struct ieee80211_channel *c)
 {
        if (IEEE80211_IS_CHAN_2GHZ(c))
                return htole32(IWM_PHY_BAND_24);
@@ -189,7 +189,7 @@
 }

 static uint32_t
-iwm_mvm_scan_rate_n_flags(struct iwm_softc *sc, int flags, int no_cck)
+iwm_scan_rate_n_flags(struct iwm_softc *sc, int flags, int no_cck)
 {
        uint32_t tx_ant;
        int i, ind;
@@ -197,7 +197,7 @@
        for (i = 0, ind = sc->sc_scan_last_antenna;
            i < IWM_RATE_MCS_ANT_NUM; i++) {
                ind = (ind + 1) % IWM_RATE_MCS_ANT_NUM;
-               if (iwm_mvm_get_valid_tx_ant(sc) & (1 << ind)) {
+               if (iwm_get_valid_tx_ant(sc) & (1 << ind)) {
                        sc->sc_scan_last_antenna = ind;
                        break;
                }
@@ -212,16 +212,15 @@
 }

 static inline boolean_t
-iwm_mvm_rrm_scan_needed(struct iwm_softc *sc)
+iwm_rrm_scan_needed(struct iwm_softc *sc)
 {
        /* require rrm scan whenever the fw supports it */
-       return fw_has_capa(&sc->sc_fw.ucode_capa,
-                          IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT);
+       return iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT);
 }

 #ifdef IWM_DEBUG
 static const char *
-iwm_mvm_ebs_status_str(enum iwm_scan_ebs_status status)
+iwm_ebs_status_str(enum iwm_scan_ebs_status status)
 {
        switch (status) {
        case IWM_SCAN_EBS_SUCCESS:
@@ -236,14 +235,14 @@
 }

 static const char *
-iwm_mvm_offload_status_str(enum iwm_scan_offload_complete_status status)
+iwm_offload_status_str(enum iwm_scan_offload_complete_status status)
 {
        return (status == IWM_SCAN_OFFLOAD_ABORTED) ? "aborted" : "completed";
 }
 #endif

 void
-iwm_mvm_rx_lmac_scan_complete_notif(struct iwm_softc *sc,
+iwm_rx_lmac_scan_complete_notif(struct iwm_softc *sc,
     struct iwm_rx_packet *pkt)
 {
        struct iwm_periodic_scan_complete *scan_notif = (void *)pkt->data;
@@ -251,7 +250,7 @@
        /* If this happens, the firmware has mistakenly sent an LMAC
         * notification during UMAC scans -- warn and ignore it.
         */
-       if (fw_has_capa(&sc->sc_fw.ucode_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
+       if (iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
                device_printf(sc->sc_dev,
                    "%s: Mistakenly got LMAC notification during UMAC scan\n",
                    __func__);
@@ -259,8 +258,8 @@
        }

        IWM_DPRINTF(sc, IWM_DEBUG_SCAN, "Regular scan %s, EBS status %s (FW)\n",
-           iwm_mvm_offload_status_str(scan_notif->status),
-           iwm_mvm_ebs_status_str(scan_notif->ebs_status));
+           iwm_offload_status_str(scan_notif->status),
+           iwm_ebs_status_str(scan_notif->ebs_status));

        sc->last_ebs_successful =
                        scan_notif->ebs_status == IWM_SCAN_EBS_SUCCESS ||
@@ -269,7 +268,7 @@
 }

 void
-iwm_mvm_rx_umac_scan_complete_notif(struct iwm_softc *sc,
+iwm_rx_umac_scan_complete_notif(struct iwm_softc *sc,
     struct iwm_rx_packet *pkt)
 {
        struct iwm_umac_scan_complete *notif = (void *)pkt->data;
@@ -277,8 +276,8 @@
        IWM_DPRINTF(sc, IWM_DEBUG_SCAN,
            "Scan completed, uid %u, status %s, EBS status %s\n",
            le32toh(notif->uid),
-           iwm_mvm_offload_status_str(notif->status),
-           iwm_mvm_ebs_status_str(notif->ebs_status));
+           iwm_offload_status_str(notif->status),
+           iwm_ebs_status_str(notif->ebs_status));

        if (notif->ebs_status != IWM_SCAN_EBS_SUCCESS &&
            notif->ebs_status != IWM_SCAN_EBS_INACTIVE)
@@ -286,7 +285,7 @@
 }

 static int
-iwm_mvm_scan_skip_channel(struct ieee80211_channel *c)
+iwm_scan_skip_channel(struct ieee80211_channel *c)
 {
        if (IEEE80211_IS_CHAN_2GHZ(c) && IEEE80211_IS_CHAN_B(c))
                return 0;
@@ -297,7 +296,7 @@
 }

 static uint8_t
-iwm_mvm_lmac_scan_fill_channels(struct iwm_softc *sc,
+iwm_lmac_scan_fill_channels(struct iwm_softc *sc,
     struct iwm_scan_channel_cfg_lmac *chan, int n_ssids)
 {
        struct ieee80211com *ic = &sc->sc_ic;
@@ -341,7 +340,7 @@
 }

 static uint8_t
-iwm_mvm_umac_scan_fill_channels(struct iwm_softc *sc,
+iwm_umac_scan_fill_channels(struct iwm_softc *sc,
     struct iwm_scan_channel_cfg_umac *chan, int n_ssids)
 {
        struct ieee80211com *ic = &sc->sc_ic;
@@ -380,7 +379,7 @@
 }

 static int
-iwm_mvm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq)
+iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
@@ -432,7 +431,7 @@
        preq->band_data[0].len = htole16(frm - pos);
        remain -= frm - pos;

-       if (iwm_mvm_rrm_scan_needed(sc)) {
+       if (iwm_rrm_scan_needed(sc)) {
                if (remain < 3)
                        return ENOBUFS;
                *frm++ = IEEE80211_ELEMID_DSPARMS;
@@ -476,7 +475,7 @@
 }

 int
-iwm_mvm_config_umac_scan(struct iwm_softc *sc)
+iwm_config_umac_scan(struct iwm_softc *sc)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
@@ -503,8 +502,8 @@
        if (scan_config == NULL)
                return ENOMEM;

-       scan_config->tx_chains = htole32(iwm_mvm_get_valid_tx_ant(sc));
-       scan_config->rx_chains = htole32(iwm_mvm_get_valid_rx_ant(sc));
+       scan_config->tx_chains = htole32(iwm_get_valid_tx_ant(sc));
+       scan_config->rx_chains = htole32(iwm_get_valid_rx_ant(sc));
        scan_config->legacy_rates = htole32(rates |
            IWM_SCAN_CONFIG_SUPPORTED_RATE(rates));

@@ -534,7 +533,7 @@
                 * Catch other channels, in case we have 900MHz channels or
                 * something in the chanlist.
                 */
-               if (iwm_mvm_scan_skip_channel(c))
+               if (iwm_scan_skip_channel(c))
                        continue;
                scan_config->channel_array[nchan++] =
                    ieee80211_mhz2ieee(c->ic_freq, 0);
@@ -567,7 +566,7 @@
 }

 static boolean_t
-iwm_mvm_scan_use_ebs(struct iwm_softc *sc)
+iwm_scan_use_ebs(struct iwm_softc *sc)
 {
        const struct iwm_ucode_capabilities *capa = &sc->sc_fw.ucode_capa;

@@ -581,8 +580,31 @@
                sc->last_ebs_successful);
 }

+static int
+iwm_scan_size(struct iwm_softc *sc)
+{
+       int base_size;
+
+       if (iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
+               if (iwm_fw_has_api(sc, IWM_UCODE_TLV_API_ADAPTIVE_DWELL))
+                       base_size = IWM_SCAN_REQ_UMAC_SIZE_V7;
+               else
+                       base_size = IWM_SCAN_REQ_UMAC_SIZE_V1;
+
+               return base_size +
+                   sizeof(struct iwm_scan_channel_cfg_umac) *
+                   sc->sc_fw.ucode_capa.n_scan_channels +
+                   sizeof(struct iwm_scan_req_umac_tail);
+       } else {
+               return sizeof(struct iwm_scan_req_lmac) +
+                   sizeof(struct iwm_scan_channel_cfg_lmac) *
+                   sc->sc_fw.ucode_capa.n_scan_channels +
+                   sizeof(struct iwm_scan_probe_req);
+       }
+}
+
 int
-iwm_mvm_umac_scan(struct iwm_softc *sc)
+iwm_umac_scan(struct iwm_softc *sc)
 {
        struct iwm_host_cmd hcmd = {
                .id = iwm_cmd_id(IWM_SCAN_REQ_UMAC, IWM_ALWAYS_LONG_GROUP, 0),
@@ -594,13 +616,11 @@
        struct iwm_scan_req_umac *req;
        struct iwm_scan_req_umac_tail *tail;
        size_t req_len;
-       uint8_t i, nssid;
+       uint16_t general_flags;
+       uint8_t channel_flags, i, nssid;
        int ret;

-       req_len = sizeof(struct iwm_scan_req_umac) +
-           (sizeof(struct iwm_scan_channel_cfg_umac) *
-           sc->sc_fw.ucode_capa.n_scan_channels) +
-           sizeof(struct iwm_scan_req_umac_tail);
+       req_len = iwm_scan_size(sc);
        if (req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
                return ENOMEM;
        req = malloc(req_len, M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -612,28 +632,58 @@

        IWM_DPRINTF(sc, IWM_DEBUG_SCAN, "Handling ieee80211 scan request\n");

-       /* These timings correspond to iwlwifi's UNASSOC scan. */
-       req->active_dwell = 10;
-       req->passive_dwell = 110;
-       req->fragmented_dwell = 44;
-       req->extended_dwell = 90;
-       req->max_out_time = 0;
-       req->suspend_time = 0;
+       nssid = MIN(ss->ss_nssid, IWM_PROBE_OPTION_MAX);

-       req->scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
+       general_flags = IWM_UMAC_SCAN_GEN_FLAGS_PASS_ALL |
+           IWM_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE;
+       if (!iwm_fw_has_api(sc, IWM_UCODE_TLV_API_ADAPTIVE_DWELL))
+               general_flags |= IWM_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL;
+       if (iwm_rrm_scan_needed(sc))
+               general_flags |= IWM_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED;
+       if (nssid != 0)
+               general_flags |= IWM_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT;
+       else
+               general_flags |= IWM_UMAC_SCAN_GEN_FLAGS_PASSIVE;
+
+       channel_flags = 0;
+       if (iwm_scan_use_ebs(sc))
+               channel_flags = IWM_SCAN_CHANNEL_FLAG_EBS |
+                   IWM_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
+                   IWM_SCAN_CHANNEL_FLAG_CACHE_ADD;
+
+       req->general_flags = htole16(general_flags);
        req->ooc_priority = htole32(IWM_SCAN_PRIORITY_HIGH);

-       nssid = MIN(ss->ss_nssid, IWM_PROBE_OPTION_MAX);
-       req->n_channels = iwm_mvm_umac_scan_fill_channels(sc,
-           (struct iwm_scan_channel_cfg_umac *)req->data, nssid);
+       /* These timings correspond to iwlwifi's UNASSOC scan. */
+       if (iwm_fw_has_api(sc, IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) {
+               req->v7.active_dwell = 10;
+               req->v7.passive_dwell = 110;
+               req->v7.fragmented_dwell = 44;
+               req->v7.adwell_default_n_aps_social = 10;
+               req->v7.adwell_default_n_aps = 2;
+               req->v7.adwell_max_budget = htole16(300);
+               req->v7.scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
+               req->v7.channel.flags = channel_flags;
+               req->v7.channel.count = iwm_umac_scan_fill_channels(sc,
+                   (struct iwm_scan_channel_cfg_umac *)req->v7.data, nssid);

-       req->general_flags = htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASS_ALL |
-           IWM_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE |
-           IWM_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL);
+               tail = (void *)((char *)&req->v7.data +
+                   sizeof(struct iwm_scan_channel_cfg_umac) *
+                   sc->sc_fw.ucode_capa.n_scan_channels);
+       } else {
+               req->v1.active_dwell = 10;
+               req->v1.passive_dwell = 110;
+               req->v1.fragmented_dwell = 44;
+               req->v1.extended_dwell = 90;
+               req->v1.scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
+               req->v1.channel.flags = channel_flags;
+               req->v1.channel.count = iwm_umac_scan_fill_channels(sc,
+                   (struct iwm_scan_channel_cfg_umac *)req->v1.data, nssid);

-       tail = (void *)((char *)&req->data +
-               sizeof(struct iwm_scan_channel_cfg_umac) *
-                       sc->sc_fw.ucode_capa.n_scan_channels);
+               tail = (void *)((char *)&req->v1.data +
+                   sizeof(struct iwm_scan_channel_cfg_umac) *
+                   sc->sc_fw.ucode_capa.n_scan_channels);
+       }

        /* Check if we're doing an active directed scan. */
        for (i = 0; i < nssid; i++) {
@@ -644,22 +694,8 @@
                    tail->direct_scan[i].len);
                /* XXX debug */
        }
-       if (nssid != 0) {
-               req->general_flags |=
-                   htole32(IWM_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT);
-       } else
-               req->general_flags |= htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASSIVE);

-       if (iwm_mvm_scan_use_ebs(sc))
-               req->channel_flags = IWM_SCAN_CHANNEL_FLAG_EBS |
-                                    IWM_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
-                                    IWM_SCAN_CHANNEL_FLAG_CACHE_ADD;
-
-       if (iwm_mvm_rrm_scan_needed(sc))
-               req->general_flags |=
-                   htole32(IWM_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED);
-
-       ret = iwm_mvm_fill_probe_req(sc, &tail->preq);
+       ret = iwm_fill_probe_req(sc, &tail->preq);
        if (ret) {
                free(req, M_DEVBUF);
                return ret;
@@ -678,7 +714,7 @@
 }

 int
-iwm_mvm_lmac_scan(struct iwm_softc *sc)
+iwm_lmac_scan(struct iwm_softc *sc)
 {
        struct iwm_host_cmd hcmd = {
                .id = IWM_SCAN_OFFLOAD_REQUEST_CMD,
@@ -695,9 +731,7 @@
        IWM_DPRINTF(sc, IWM_DEBUG_SCAN,
            "Handling ieee80211 scan request\n");

-       req_len = sizeof(struct iwm_scan_req_lmac) +
-           (sizeof(struct iwm_scan_channel_cfg_lmac) *
-           sc->sc_fw.ucode_capa.n_scan_channels) + sizeof(struct 
iwm_scan_probe_req);
+       req_len = iwm_scan_size(sc);
        if (req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
                return ENOMEM;
        req = malloc(req_len, M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -716,17 +750,17 @@
        req->suspend_time = 0;

        req->scan_prio = htole32(IWM_SCAN_PRIORITY_HIGH);
-       req->rx_chain_select = iwm_mvm_scan_rx_chain(sc);
+       req->rx_chain_select = iwm_scan_rx_chain(sc);
        req->iter_num = htole32(1);
        req->delay = 0;

-       req->scan_flags = htole32(IWM_MVM_LMAC_SCAN_FLAG_PASS_ALL |
-           IWM_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE |
-           IWM_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL);
-       if (iwm_mvm_rrm_scan_needed(sc))
-               req->scan_flags |= htole32(IWM_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED);
+       req->scan_flags = htole32(IWM_LMAC_SCAN_FLAG_PASS_ALL |
+           IWM_LMAC_SCAN_FLAG_ITER_COMPLETE |
+           IWM_LMAC_SCAN_FLAG_EXTENDED_DWELL);
+       if (iwm_rrm_scan_needed(sc))
+               req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAGS_RRM_ENABLED);

-       req->flags = iwm_mvm_scan_rxon_flags(sc->sc_ic.ic_scan->ss_chans[0]);
+       req->flags = iwm_scan_rxon_flags(sc->sc_ic.ic_scan->ss_chans[0]);

        req->filter_flags =
            htole32(IWM_MAC_FILTER_ACCEPT_GRP | IWM_MAC_FILTER_IN_BEACON);
@@ -735,14 +769,14 @@
        req->tx_cmd[0].tx_flags = htole32(IWM_TX_CMD_FLG_SEQ_CTL |
            IWM_TX_CMD_FLG_BT_DIS);
        req->tx_cmd[0].rate_n_flags =
-           iwm_mvm_scan_rate_n_flags(sc, IEEE80211_CHAN_2GHZ, 1/*XXX*/);
+           iwm_scan_rate_n_flags(sc, IEEE80211_CHAN_2GHZ, 1/*XXX*/);
        req->tx_cmd[0].sta_id = sc->sc_aux_sta.sta_id;

        /* Tx flags 5 GHz. */
        req->tx_cmd[1].tx_flags = htole32(IWM_TX_CMD_FLG_SEQ_CTL |
            IWM_TX_CMD_FLG_BT_DIS);
        req->tx_cmd[1].rate_n_flags =
-           iwm_mvm_scan_rate_n_flags(sc, IEEE80211_CHAN_5GHZ, 1/*XXX*/);
+           iwm_scan_rate_n_flags(sc, IEEE80211_CHAN_5GHZ, 1/*XXX*/);
        req->tx_cmd[1].sta_id = sc->sc_aux_sta.sta_id;

        /* Check if we're doing an active directed scan. */
@@ -757,14 +791,14 @@
        }
        if (nssid != 0) {
                req->scan_flags |=
-                   htole32(IWM_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION);
+                   htole32(IWM_LMAC_SCAN_FLAG_PRE_CONNECTION);
        } else
-               req->scan_flags |= htole32(IWM_MVM_LMAC_SCAN_FLAG_PASSIVE);
+               req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAG_PASSIVE);

-       req->n_channels = iwm_mvm_lmac_scan_fill_channels(sc,
+       req->n_channels = iwm_lmac_scan_fill_channels(sc,
            (struct iwm_scan_channel_cfg_lmac *)req->data, nssid);

-       ret = iwm_mvm_fill_probe_req(sc,
+       ret = iwm_fill_probe_req(sc,
                            (struct iwm_scan_probe_req *)(req->data +
                            (sizeof(struct iwm_scan_channel_cfg_lmac) *
                            sc->sc_fw.ucode_capa.n_scan_channels)));
@@ -777,7 +811,7 @@
        req->schedule[0].iterations = 1;
        req->schedule[0].full_scan_mul = 1;

-       if (iwm_mvm_scan_use_ebs(sc)) {
+       if (iwm_scan_use_ebs(sc)) {
                req->channel_opt[0].flags =
                        htole16(IWM_SCAN_CHANNEL_FLAG_EBS |
                                IWM_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
@@ -802,7 +836,7 @@
 }

 static int
-iwm_mvm_lmac_scan_abort(struct iwm_softc *sc)
+iwm_lmac_scan_abort(struct iwm_softc *sc)
 {
        int ret;
        struct iwm_host_cmd hcmd = {
@@ -813,7 +847,7 @@
        };
        uint32_t status;

-       ret = iwm_mvm_send_cmd_status(sc, &hcmd, &status);
+       ret = iwm_send_cmd_status(sc, &hcmd, &status);
        if (ret)
                return ret;

@@ -834,7 +868,7 @@
 }

 static int
-iwm_mvm_umac_scan_abort(struct iwm_softc *sc)
+iwm_umac_scan_abort(struct iwm_softc *sc)
 {
        struct iwm_umac_scan_abort cmd = {};
        int uid, ret;
@@ -844,7 +878,7 @@

        IWM_DPRINTF(sc, IWM_DEBUG_SCAN, "Sending scan abort, uid %u\n", uid);

-       ret = iwm_mvm_send_cmd_pdu(sc,
+       ret = iwm_send_cmd_pdu(sc,
                                   iwm_cmd_id(IWM_SCAN_ABORT_UMAC,
                                              IWM_ALWAYS_LONG_GROUP, 0),
                                   0, sizeof(cmd), &cmd);
@@ -853,7 +887,7 @@
 }

 int
-iwm_mvm_scan_stop_wait(struct iwm_softc *sc)
+iwm_scan_stop_wait(struct iwm_softc *sc)
 {
        struct iwm_notification_wait wait_scan_done;
        static const uint16_t scan_done_notif[] = { IWM_SCAN_COMPLETE_UMAC,
@@ -866,10 +900,10 @@

        IWM_DPRINTF(sc, IWM_DEBUG_SCAN, "Preparing to stop scan\n");

-       if (fw_has_capa(&sc->sc_fw.ucode_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN))
-               ret = iwm_mvm_umac_scan_abort(sc);
+       if (iwm_fw_has_capa(sc, IWM_UCODE_TLV_CAPA_UMAC_SCAN))
+               ret = iwm_umac_scan_abort(sc);
        else
-               ret = iwm_mvm_lmac_scan_abort(sc);
+               ret = iwm_lmac_scan_abort(sc);

        if (ret) {
                IWM_DPRINTF(sc, IWM_DEBUG_SCAN, "couldn't stop scan\n");
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.h
index 586e3f2..7859a75 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_scan.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_scan.h 315925 2017-03-25 
02:49:20Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -106,13 +106,13 @@
 #ifndef        __IF_IWN_SCAN_H__
 #define        __IF_IWN_SCAN_H__

-extern int iwm_mvm_lmac_scan(struct iwm_softc *);
-extern int iwm_mvm_config_umac_scan(struct iwm_softc *);
-extern int iwm_mvm_umac_scan(struct iwm_softc *);
-extern int iwm_mvm_scan_stop_wait(struct iwm_softc *);
-extern void iwm_mvm_rx_lmac_scan_complete_notif(struct iwm_softc *,
+extern int iwm_lmac_scan(struct iwm_softc *);
+extern int iwm_config_umac_scan(struct iwm_softc *);
+extern int iwm_umac_scan(struct iwm_softc *);
+extern int iwm_scan_stop_wait(struct iwm_softc *);
+extern void iwm_rx_lmac_scan_complete_notif(struct iwm_softc *,
                                                 struct iwm_rx_packet *);
-extern void iwm_mvm_rx_umac_scan_complete_notif(struct iwm_softc *,
+extern void iwm_rx_umac_scan_complete_notif(struct iwm_softc *,
                                                 struct iwm_rx_packet *);

 #endif /* __IF_IWN_SCAN_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.c
index 9183535..9ba92b6 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.c
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.c
@@ -88,7 +88,7 @@
  *****************************************************************************/

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_sf.c 319580 2017-06-04 
21:12:11Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -196,7 +196,7 @@
 };

 static void
-iwm_mvm_fill_sf_command(struct iwm_softc *sc, struct iwm_sf_cfg_cmd *sf_cmd,
+iwm_fill_sf_command(struct iwm_softc *sc, struct iwm_sf_cfg_cmd *sf_cmd,
        struct ieee80211_node *ni)
 {
        int i, j, watermark;
@@ -244,7 +244,7 @@
 }

 static int
-iwm_mvm_sf_config(struct iwm_softc *sc, struct ieee80211_node *ni,
+iwm_sf_config(struct iwm_softc *sc, struct ieee80211_node *ni,
        enum iwm_sf_state new_state)
 {
        struct iwm_sf_cfg_cmd sf_cmd = {
@@ -266,13 +266,13 @@

        switch (new_state) {
        case IWM_SF_UNINIT:
-               iwm_mvm_fill_sf_command(sc, &sf_cmd, NULL);
+               iwm_fill_sf_command(sc, &sf_cmd, NULL);
                break;
        case IWM_SF_FULL_ON:
-               iwm_mvm_fill_sf_command(sc, &sf_cmd, ni);
+               iwm_fill_sf_command(sc, &sf_cmd, ni);
                break;
        case IWM_SF_INIT_OFF:
-               iwm_mvm_fill_sf_command(sc, &sf_cmd, NULL);
+               iwm_fill_sf_command(sc, &sf_cmd, NULL);
                break;
        default:
                device_printf(sc->sc_dev,
@@ -281,7 +281,7 @@
                return EINVAL;
        }

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_REPLY_SF_CFG_CMD, IWM_CMD_ASYNC,
+       ret = iwm_send_cmd_pdu(sc, IWM_REPLY_SF_CFG_CMD, IWM_CMD_ASYNC,
                                   sizeof(sf_cmd), &sf_cmd);
        if (!ret)
                sc->sf_state = new_state;
@@ -295,7 +295,7 @@
  * and set new state accordingly.
  */
 int
-iwm_mvm_sf_update(struct iwm_softc *sc, struct ieee80211vap *changed_vif,
+iwm_sf_update(struct iwm_softc *sc, struct ieee80211vap *changed_vif,
        boolean_t remove_vif)
 {
        enum iwm_sf_state new_state;
@@ -326,5 +326,5 @@
                /* If there are multiple active macs - change to SF_UNINIT */
                new_state = IWM_SF_UNINIT;
        }
-       return iwm_mvm_sf_config(sc, ni, new_state);
+       return iwm_sf_config(sc, ni, new_state);
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.h
index 78cfa80..82af999 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.h
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sf.h
@@ -70,12 +70,12 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_sf.h 319577 2017-06-04 21:05:58Z 
adrian $
+ * $FreeBSD$
  */
 #ifndef        __IF_IWM_SF_H__
 #define        __IF_IWM_SF_H__

-extern int iwm_mvm_sf_update(struct iwm_softc *sc,
+extern int iwm_sf_update(struct iwm_softc *sc,
                              struct ieee80211vap *changed_vif,
                              boolean_t remove_vif);

diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.c
index 1eb30aa..3d9ff10 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.c
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.c
@@ -73,7 +73,7 @@
  *****************************************************************************/

 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_sta.c 321508 2017-07-26 
05:29:08Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -136,24 +136,19 @@
  * support both API versions.
  */
 static inline int
-iwm_mvm_add_sta_cmd_size(struct iwm_softc *sc)
+iwm_add_sta_cmd_size(struct iwm_softc *sc)
 {
-#ifdef notyet
-       return iwm_mvm_has_new_rx_api(mvm) ?
-               sizeof(struct iwm_mvm_add_sta_cmd) :
-               sizeof(struct iwm_mvm_add_sta_cmd_v7);
-#else
-       return sizeof(struct iwm_mvm_add_sta_cmd);
-#endif
+       return sc->cfg->mqrx_supported ? sizeof(struct iwm_add_sta_cmd) :
+           sizeof(struct iwm_add_sta_cmd_v7);
 }

 /* send station add/update command to firmware */
 int
-iwm_mvm_sta_send_to_fw(struct iwm_softc *sc, struct iwm_node *in,
+iwm_sta_send_to_fw(struct iwm_softc *sc, struct iwm_node *in,
        boolean_t update)
 {
        struct iwm_vap *ivp = IWM_VAP(in->in_ni.ni_vap);
-       struct iwm_mvm_add_sta_cmd add_sta_cmd = {
+       struct iwm_add_sta_cmd add_sta_cmd = {
                .sta_id = IWM_STATION_ID,
                .mac_id_n_color =
                    htole32(IWM_FW_CMD_ID_AND_COLOR(ivp->id, ivp->color)),
@@ -170,7 +165,7 @@
                int ac;
                for (ac = 0; ac < WME_NUM_AC; ac++) {
                        add_sta_cmd.tfd_queue_msk |=
-                           htole32(1 << iwm_mvm_ac_to_tx_fifo[ac]);
+                           htole32(1 << iwm_ac_to_tx_fifo[ac]);
                }
                IEEE80211_ADDR_COPY(&add_sta_cmd.addr, in->in_ni.ni_bssid);
        }
@@ -181,8 +176,8 @@
                htole32(mpdu_dens << IWM_STA_FLG_AGG_MPDU_DENS_SHIFT);

        status = IWM_ADD_STA_SUCCESS;
-       ret = iwm_mvm_send_cmd_pdu_status(sc, IWM_ADD_STA,
-                                         iwm_mvm_add_sta_cmd_size(sc),
+       ret = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA,
+                                         iwm_add_sta_cmd_size(sc),
                                          &add_sta_cmd, &status);
        if (ret)
                return ret;
@@ -201,21 +196,21 @@
 }

 int
-iwm_mvm_add_sta(struct iwm_softc *sc, struct iwm_node *in)
+iwm_add_sta(struct iwm_softc *sc, struct iwm_node *in)
 {
-       return iwm_mvm_sta_send_to_fw(sc, in, FALSE);
+       return iwm_sta_send_to_fw(sc, in, FALSE);
 }

 int
-iwm_mvm_update_sta(struct iwm_softc *sc, struct iwm_node *in)
+iwm_update_sta(struct iwm_softc *sc, struct iwm_node *in)
 {
-       return iwm_mvm_sta_send_to_fw(sc, in, TRUE);
+       return iwm_sta_send_to_fw(sc, in, TRUE);
 }

 int
-iwm_mvm_drain_sta(struct iwm_softc *sc, struct iwm_vap *ivp, boolean_t drain)
+iwm_drain_sta(struct iwm_softc *sc, struct iwm_vap *ivp, boolean_t drain)
 {
-       struct iwm_mvm_add_sta_cmd cmd = {};
+       struct iwm_add_sta_cmd cmd = {};
        int ret;
        uint32_t status;

@@ -227,8 +222,8 @@
        cmd.station_flags_msk = htole32(IWM_STA_FLG_DRAIN_FLOW);

        status = IWM_ADD_STA_SUCCESS;
-       ret = iwm_mvm_send_cmd_pdu_status(sc, IWM_ADD_STA,
-                                         iwm_mvm_add_sta_cmd_size(sc),
+       ret = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA,
+                                         iwm_add_sta_cmd_size(sc),
                                          &cmd, &status);
        if (ret)
                return ret;
@@ -254,14 +249,14 @@
  * only).
  */
 static int
-iwm_mvm_rm_sta_common(struct iwm_softc *sc)
+iwm_rm_sta_common(struct iwm_softc *sc)
 {
-       struct iwm_mvm_rm_sta_cmd rm_sta_cmd = {
+       struct iwm_rm_sta_cmd rm_sta_cmd = {
                .sta_id = IWM_STATION_ID,
        };
        int ret;

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_REMOVE_STA, 0,
+       ret = iwm_send_cmd_pdu(sc, IWM_REMOVE_STA, 0,
                                   sizeof(rm_sta_cmd), &rm_sta_cmd);
        if (ret) {
                device_printf(sc->sc_dev,
@@ -273,20 +268,20 @@
 }

 int
-iwm_mvm_rm_sta(struct iwm_softc *sc, struct ieee80211vap *vap,
+iwm_rm_sta(struct iwm_softc *sc, struct ieee80211vap *vap,
        boolean_t is_assoc)
 {
        uint32_t tfd_queue_msk = 0;
        int ret;
        int ac;

-       ret = iwm_mvm_drain_sta(sc, IWM_VAP(vap), TRUE);
+       ret = iwm_drain_sta(sc, IWM_VAP(vap), TRUE);
        if (ret)
                return ret;
        for (ac = 0; ac < WME_NUM_AC; ac++) {
-               tfd_queue_msk |= htole32(1 << iwm_mvm_ac_to_tx_fifo[ac]);
+               tfd_queue_msk |= htole32(1 << iwm_ac_to_tx_fifo[ac]);
        }
-       ret = iwm_mvm_flush_tx_path(sc, tfd_queue_msk, IWM_CMD_SYNC);
+       ret = iwm_flush_tx_path(sc, tfd_queue_msk, IWM_CMD_SYNC);
        if (ret)
                return ret;
 #ifdef notyet /* function not yet implemented */
@@ -295,7 +290,7 @@
        if (ret)
                return ret;
 #endif
-       ret = iwm_mvm_drain_sta(sc, IWM_VAP(vap), FALSE);
+       ret = iwm_drain_sta(sc, IWM_VAP(vap), FALSE);

        /* if we are associated - we can't remove the AP STA now */
        if (is_assoc)
@@ -303,30 +298,32 @@
 
        /* XXX wait until STA is drained */

-       ret = iwm_mvm_rm_sta_common(sc);
+       ret = iwm_rm_sta_common(sc);

        return ret;
 }

 int
-iwm_mvm_rm_sta_id(struct iwm_softc *sc, struct ieee80211vap *vap)
+iwm_rm_sta_id(struct iwm_softc *sc, struct ieee80211vap *vap)
 {
        /* XXX wait until STA is drained */

-       return iwm_mvm_rm_sta_common(sc);
+       return iwm_rm_sta_common(sc);
 }

 static int
-iwm_mvm_add_int_sta_common(struct iwm_softc *sc, struct iwm_int_sta *sta,
-       const uint8_t *addr, uint16_t mac_id, uint16_t color)
+iwm_add_int_sta_common(struct iwm_softc *sc, struct iwm_int_sta *sta,
+    const uint8_t *addr, uint16_t mac_id, uint16_t color)
 {
-       struct iwm_mvm_add_sta_cmd cmd;
+       struct iwm_add_sta_cmd cmd;
        int ret;
        uint32_t status;

        memset(&cmd, 0, sizeof(cmd));
        cmd.sta_id = sta->sta_id;
        cmd.mac_id_n_color = htole32(IWM_FW_CMD_ID_AND_COLOR(mac_id, color));
+       if (sta->sta_id == IWM_AUX_STA_ID && sc->cfg->mqrx_supported)
+               cmd.station_type = IWM_STA_AUX_ACTIVITY;

        cmd.tfd_queue_msk = htole32(sta->tfd_queue_msk);
        cmd.tid_disable_tx = htole16(0xffff);
@@ -334,8 +331,8 @@
        if (addr)
                IEEE80211_ADDR_COPY(cmd.addr, addr);

-       ret = iwm_mvm_send_cmd_pdu_status(sc, IWM_ADD_STA,
-                                         iwm_mvm_add_sta_cmd_size(sc),
+       ret = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA,
+                                         iwm_add_sta_cmd_size(sc),
                                          &cmd, &status);
        if (ret)
                return ret;
@@ -354,30 +351,31 @@
 }

 int
-iwm_mvm_add_aux_sta(struct iwm_softc *sc)
+iwm_add_aux_sta(struct iwm_softc *sc)
 {
        int ret;

        sc->sc_aux_sta.sta_id = IWM_AUX_STA_ID;
-       sc->sc_aux_sta.tfd_queue_msk = (1 << IWM_MVM_AUX_QUEUE);
+       sc->sc_aux_sta.tfd_queue_msk = (1 << IWM_AUX_QUEUE);

        /* Map Aux queue to fifo - needs to happen before adding Aux station */
-       ret = iwm_enable_txq(sc, 0, IWM_MVM_AUX_QUEUE, IWM_MVM_TX_FIFO_MCAST);
+       ret = iwm_enable_txq(sc, IWM_AUX_STA_ID, IWM_AUX_QUEUE,
+           IWM_TX_FIFO_MCAST);
        if (ret)
                return ret;

-       ret = iwm_mvm_add_int_sta_common(sc, &sc->sc_aux_sta, NULL,
+       ret = iwm_add_int_sta_common(sc, &sc->sc_aux_sta, NULL,
                                         IWM_MAC_INDEX_AUX, 0);

        if (ret) {
                memset(&sc->sc_aux_sta, 0, sizeof(sc->sc_aux_sta));
-               sc->sc_aux_sta.sta_id = IWM_MVM_STATION_COUNT;
+               sc->sc_aux_sta.sta_id = IWM_STATION_COUNT;
        }
        return ret;
 }

-void iwm_mvm_del_aux_sta(struct iwm_softc *sc)
+void iwm_del_aux_sta(struct iwm_softc *sc)
 {
        memset(&sc->sc_aux_sta, 0, sizeof(sc->sc_aux_sta));
-       sc->sc_aux_sta.sta_id = IWM_MVM_STATION_COUNT;
+       sc->sc_aux_sta.sta_id = IWM_STATION_COUNT;
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.h
index 225d692..51b697e 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.h
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_sta.h
@@ -73,7 +73,7 @@
  *
  *****************************************************************************/

-/* $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_sta.h 318229 2017-05-12 06:33:07Z 
adrian $ */
+/* $FreeBSD$ */

 #ifndef __IF_IWM_STA_H__
 #define __IF_IWM_STA_H__
@@ -88,14 +88,14 @@
  * keeps the fw's station table up to date with the ADD_STA command. Stations
  * can be removed by the REMOVE_STA command.
  *
- * All the data related to a station is held in the structure %iwl_mvm_sta
+ * All the data related to a station is held in the structure %iwl_sta
  * which is embed in the mac80211's %ieee80211_sta (in the drv_priv) area.
  * This data includes the index of the station in the fw, per tid information
  * (sequence numbers, Block-ack state machine, etc...). The stations are
  * created and deleted by the %sta_state callback from %ieee80211_ops.
  *
  * The driver holds a map: %fw_id_to_mac_id that allows to fetch a
- * %ieee80211_sta (and the %iwl_mvm_sta embedded into it) based on a fw
+ * %ieee80211_sta (and the %iwl_sta embedded into it) based on a fw
  * station index. That way, the driver is able to get the tid related data in
  * O(1) in time sensitive paths (Tx / Tx response / BA notification). These
  * paths are triggered by the fw, and the driver needs to get a pointer to the
@@ -133,8 +133,8 @@
  * The FW needs a few internal stations that are not reflected in
  * mac80211, such as broadcast station in AP / GO mode, or AUX sta for
  * scanning and P2P device (during the GO negotiation).
- * For these kind of stations we have %iwl_mvm_int_sta struct which holds the
- * data relevant for them from both %iwl_mvm_sta and %ieee80211_sta.
+ * For these kind of stations we have %iwl_int_sta struct which holds the
+ * data relevant for them from both %iwl_sta and %ieee80211_sta.
  * Usually the data for these stations is static, so no locking is required,
  * and no TID data as this is also not needed.
  * One thing to note, is that these stations have an ID in the fw, but not
@@ -150,7 +150,7 @@
 /**
  * DOC: station table - AP Station in STA mode
  *
- * %iwl_mvm_vif includes the index of the AP station in the fw's STA table:
+ * %iwl_vif includes the index of the AP station in the fw's STA table:
  * %ap_sta_id. To get the point to the corresponding %ieee80211_sta,
  * &fw_id_to_mac_id can be used. Due to the way the fw works, we must not 
remove
  * the AP station from the fw before setting the MAC context as unassociated.
@@ -173,10 +173,10 @@
  * the fw. In order to do so, we track the non-AMPDU packets for each station.
  * If mac80211 removes a STA and if it still has non-AMPDU packets pending in
  * the queues, we mark this station as %EBUSY in %fw_id_to_mac_id, and drop all
- * the frames for this STA (%iwl_mvm_rm_sta). When the last frame is dropped
+ * the frames for this STA (%iwl_rm_sta). When the last frame is dropped
  * (we know about it with its Tx response), we remove the station in fw and set
  * it as %NULL in %fw_id_to_mac_id: this is the purpose of
- * %iwl_mvm_sta_drained_wk.
+ * %iwl_sta_drained_wk.
  */

 /**
@@ -186,14 +186,14 @@
  * driver, we require mac80211 to reconfigure the driver. Since the private
  * data of the stations is embed in mac80211's %ieee80211_sta, that data will
  * not be zeroed and needs to be reinitialized manually.
- * %IWL_MVM_STATUS_IN_HW_RESTART is set during restart and that will hint us
+ * %IWL_STATUS_IN_HW_RESTART is set during restart and that will hint us
  * that we must not allocate a new sta_id but reuse the previous one. This
  * means that the stations being re-added after the reset will have the same
  * place in the fw as before the reset. We do need to zero the %fw_id_to_mac_id
  * map, since the stations aren't in the fw any more. Internal stations that
  * are not added by mac80211 will be re-added in the init flow that is called
- * after the restart: mac80211 call's %iwl_mvm_mac_start which calls to
- * %iwl_mvm_up.
+ * after the restart: mac80211 call's %iwl_mac_start which calls to
+ * %iwl_up.
  */

 /**
@@ -206,18 +206,18 @@
  * @flags: if update==true, this marks what is being changed via ORs of values
  *     from enum iwm_sta_modify_flag. Otherwise, this is ignored.
  */
-extern int iwm_mvm_sta_send_to_fw(struct iwm_softc *sc, struct iwm_node *in,
+extern int iwm_sta_send_to_fw(struct iwm_softc *sc, struct iwm_node *in,
                                   boolean_t update);
-extern int iwm_mvm_add_sta(struct iwm_softc *sc, struct iwm_node *in);
-extern int iwm_mvm_update_sta(struct iwm_softc *sc, struct iwm_node *in);
-extern int iwm_mvm_rm_sta(struct iwm_softc *sc, struct ieee80211vap *vap,
+extern int iwm_add_sta(struct iwm_softc *sc, struct iwm_node *in);
+extern int iwm_update_sta(struct iwm_softc *sc, struct iwm_node *in);
+extern int iwm_rm_sta(struct iwm_softc *sc, struct ieee80211vap *vap,
                           boolean_t is_assoc);
-extern int iwm_mvm_rm_sta_id(struct iwm_softc *sc, struct ieee80211vap *vap);
+extern int iwm_rm_sta_id(struct iwm_softc *sc, struct ieee80211vap *vap);

-extern int iwm_mvm_add_aux_sta(struct iwm_softc *sc);
-extern void iwm_mvm_del_aux_sta(struct iwm_softc *sc);
+extern int iwm_add_aux_sta(struct iwm_softc *sc);
+extern void iwm_del_aux_sta(struct iwm_softc *sc);

-extern int iwm_mvm_drain_sta(struct iwm_softc *sc, struct iwm_vap *ivp,
+extern int iwm_drain_sta(struct iwm_softc *sc, struct iwm_vap *ivp,
                              boolean_t drain);

 #endif /* __IF_IWM_STA_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.c
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.c
index d9a9b52..03aefb1 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_time_event.c 318212 
2017-05-12 05:19:08Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -162,7 +162,7 @@
 #define TU_TO_HZ(tu)   (((uint64_t)(tu) * 1024 * hz) / 1000000)

 static void
-iwm_mvm_te_clear_data(struct iwm_softc *sc)
+iwm_te_clear_data(struct iwm_softc *sc)
 {
        sc->sc_time_event_uid = 0;
        sc->sc_time_event_duration = 0;
@@ -178,7 +178,7 @@
  * @notif: the notification data corresponding the time event data.
  */
 static void
-iwm_mvm_te_handle_notif(struct iwm_softc *sc,
+iwm_te_handle_notif(struct iwm_softc *sc,
     struct iwm_time_event_notif *notif)
 {
        IWM_DPRINTF(sc, IWM_DEBUG_TE,
@@ -202,7 +202,7 @@
                    "TE ended - current time %d, estimated end %d\n",
                    ticks, sc->sc_time_event_end_ticks);

-               iwm_mvm_te_clear_data(sc);
+               iwm_te_clear_data(sc);
        } else if (le32toh(notif->action) & IWM_TE_V2_NOTIF_HOST_EVENT_START) {
                sc->sc_time_event_end_ticks =
                    ticks + TU_TO_HZ(sc->sc_time_event_duration);
@@ -215,7 +215,7 @@
  * The Rx handler for time event notifications
  */
 void
-iwm_mvm_rx_time_event_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
+iwm_rx_time_event_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
 {
        struct iwm_time_event_notif *notif = (void *)pkt->data;

@@ -224,11 +224,11 @@
            le32toh(notif->unique_id),
            le32toh(notif->action));

-       iwm_mvm_te_handle_notif(sc, notif);
+       iwm_te_handle_notif(sc, notif);
 }

 static int
-iwm_mvm_te_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
+iwm_te_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
     void *data)
 {
        struct iwm_time_event_notif *resp;
@@ -259,7 +259,7 @@
 }

 static int
-iwm_mvm_time_event_response(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
+iwm_time_event_response(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
     void *data)
 {
        struct iwm_time_event_resp *resp;
@@ -292,7 +292,7 @@
 /* XXX Use the te_data function argument properly, like in iwlwifi's code. */

 static int
-iwm_mvm_time_event_send_add(struct iwm_softc *sc, struct iwm_vap *ivp,
+iwm_time_event_send_add(struct iwm_softc *sc, struct iwm_vap *ivp,
        void *te_data, struct iwm_time_event_cmd *te_cmd)
 {
        static const uint16_t time_event_response[] = { IWM_TIME_EVENT_CMD };
@@ -316,9 +316,9 @@
        iwm_init_notification_wait(sc->sc_notif_wait, &wait_time_event,
                                   time_event_response,
                                   nitems(time_event_response),
-                                  iwm_mvm_time_event_response, 
/*te_data*/NULL);
+                                  iwm_time_event_response, /*te_data*/NULL);

-       ret = iwm_mvm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, 0, sizeof(*te_cmd),
+       ret = iwm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, 0, sizeof(*te_cmd),
            te_cmd);
        if (ret) {
                IWM_DPRINTF(sc, IWM_DEBUG_TE,
@@ -343,7 +343,7 @@
 }

 void
-iwm_mvm_protect_session(struct iwm_softc *sc, struct iwm_vap *ivp,
+iwm_protect_session(struct iwm_softc *sc, struct iwm_vap *ivp,
        uint32_t duration, uint32_t max_delay, boolean_t wait_for_notif)
 {
        const uint16_t te_notif_response[] = { IWM_TIME_EVENT_NOTIFICATION };
@@ -373,7 +373,7 @@
                IWM_T2_V2_START_IMMEDIATELY);

        if (!wait_for_notif) {
-               iwm_mvm_time_event_send_add(sc, ivp, /*te_data*/NULL, 
&time_cmd);
+               iwm_time_event_send_add(sc, ivp, /*te_data*/NULL, &time_cmd);
                DELAY(100);
                sc->sc_flags |= IWM_FLAG_TE_ACTIVE;
                return;
@@ -385,10 +385,10 @@
         */
        iwm_init_notification_wait(sc->sc_notif_wait, &wait_te_notif,
            te_notif_response, nitems(te_notif_response),
-           iwm_mvm_te_notif, /*te_data*/NULL);
+           iwm_te_notif, /*te_data*/NULL);

        /* If TE was sent OK - wait for the notification that started */
-       if (iwm_mvm_time_event_send_add(sc, ivp, /*te_data*/NULL, &time_cmd)) {
+       if (iwm_time_event_send_add(sc, ivp, /*te_data*/NULL, &time_cmd)) {
                IWM_DPRINTF(sc, IWM_DEBUG_TE,
                    "%s: Failed to add TE to protect session\n", __func__);
                iwm_remove_notification(sc->sc_notif_wait, &wait_te_notif);
@@ -406,7 +406,7 @@
 }

 void
-iwm_mvm_stop_session_protection(struct iwm_softc *sc, struct iwm_vap *ivp)
+iwm_stop_session_protection(struct iwm_softc *sc, struct iwm_vap *ivp)
 {
        struct iwm_time_event_cmd time_cmd = {};

@@ -421,9 +421,9 @@

        IWM_DPRINTF(sc, IWM_DEBUG_TE,
            "%s: Removing TE 0x%x\n", __func__, le32toh(time_cmd.id));
-       if (iwm_mvm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, 0, sizeof(time_cmd),
+       if (iwm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, 0, sizeof(time_cmd),
            &time_cmd) == 0)
-               iwm_mvm_te_clear_data(sc);
+               iwm_te_clear_data(sc);

        DELAY(100);
 }
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.h
 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.h
index 43ac2fb..aae3baf 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_time_event.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_time_event.h 318212 2017-05-12 
05:19:08Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -107,11 +107,11 @@
 #ifndef        __IF_IWM_TIME_EVENT_H__
 #define        __IF_IWM_TIME_EVENT_H__

-extern void iwm_mvm_rx_time_event_notif(struct iwm_softc *sc,
+extern void iwm_rx_time_event_notif(struct iwm_softc *sc,
            struct iwm_rx_packet *pkt);
-extern void iwm_mvm_protect_session(struct iwm_softc *sc, struct iwm_vap *ivp,
+extern void iwm_protect_session(struct iwm_softc *sc, struct iwm_vap *ivp,
            uint32_t duration, uint32_t max_delay, boolean_t wait_for_notif);
-extern void iwm_mvm_stop_session_protection(struct iwm_softc *sc,
+extern void iwm_stop_session_protection(struct iwm_softc *sc,
            struct iwm_vap *ivp);

 #endif /* __IF_IWM_TIME_EVENT_H__ */
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.c
index d7bc4aa..4783b33 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.c
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.c
@@ -103,7 +103,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_util.c 321510 2017-07-26 
05:51:31Z adrian $");
+__FBSDID("$FreeBSD$");

 #include "opt_wlan.h"
 #include "opt_iwm.h"
@@ -169,7 +169,7 @@
 int
 iwm_send_cmd(struct iwm_softc *sc, struct iwm_host_cmd *hcmd)
 {
-       struct iwm_tx_ring *ring = &sc->txq[IWM_MVM_CMD_QUEUE];
+       struct iwm_tx_ring *ring = &sc->txq[IWM_CMD_QUEUE];
        struct iwm_tfd *desc;
        struct iwm_tx_data *txdata = NULL;
        struct iwm_device_cmd *cmd;
@@ -225,12 +225,11 @@
        }

        if (paylen > datasz) {
-               size_t totlen;
                IWM_DPRINTF(sc, IWM_DEBUG_CMD,
                    "large command paylen=%u len0=%u\n",
                        paylen, hcmd->len[0]);
                /* Command is too large */
-               totlen = hdrlen + paylen;
+               size_t totlen = hdrlen + paylen;
                if (paylen > IWM_MAX_CMD_PAYLOAD_SIZE) {
                        device_printf(sc->sc_dev,
                            "firmware command too long (%zd bytes)\n",
@@ -347,7 +346,7 @@

 /* iwlwifi: mvm/utils.c */
 int
-iwm_mvm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id,
+iwm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id,
        uint32_t flags, uint16_t len, const void *data)
 {
        struct iwm_host_cmd cmd = {
@@ -362,7 +361,7 @@

 /* iwlwifi: mvm/utils.c */
 int
-iwm_mvm_send_cmd_status(struct iwm_softc *sc,
+iwm_send_cmd_status(struct iwm_softc *sc,
        struct iwm_host_cmd *cmd, uint32_t *status)
 {
        struct iwm_rx_packet *pkt;
@@ -403,7 +402,7 @@

 /* iwlwifi/mvm/utils.c */
 int
-iwm_mvm_send_cmd_pdu_status(struct iwm_softc *sc, uint32_t id,
+iwm_send_cmd_pdu_status(struct iwm_softc *sc, uint32_t id,
        uint16_t len, const void *data, uint32_t *status)
 {
        struct iwm_host_cmd cmd = {
@@ -412,7 +411,7 @@
                .data = { data, },
        };

-       return iwm_mvm_send_cmd_status(sc, &cmd, status);
+       return iwm_send_cmd_status(sc, &cmd, status);
 }

 void
@@ -491,7 +490,7 @@
 }

 /**
- * iwm_mvm_send_lq_cmd() - Send link quality command
+ * iwm_send_lq_cmd() - Send link quality command
  * @init: This command is sent as part of station initialization right
  *        after station has been added.
  *
@@ -501,7 +500,7 @@
  * progress.
  */
 int
-iwm_mvm_send_lq_cmd(struct iwm_softc *sc, struct iwm_lq_cmd *lq, boolean_t 
init)
+iwm_send_lq_cmd(struct iwm_softc *sc, struct iwm_lq_cmd *lq, boolean_t init)
 {
        struct iwm_host_cmd cmd = {
                .id = IWM_LQ_CMD,
@@ -510,16 +509,16 @@
                .data = { lq, },
        };

-       if (lq->sta_id == IWM_MVM_STATION_COUNT)
+       if (lq->sta_id == IWM_STATION_COUNT)
                return EINVAL;

        return iwm_send_cmd(sc, &cmd);
 }

 boolean_t
-iwm_mvm_rx_diversity_allowed(struct iwm_softc *sc)
+iwm_rx_diversity_allowed(struct iwm_softc *sc)
 {
-       if (num_of_ant(iwm_mvm_get_valid_rx_ant(sc)) == 1)
+       if (num_of_ant(iwm_get_valid_rx_ant(sc)) == 1)
                return FALSE;

        /*
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.h
index 60eb8e7..1ac304c 100644
--- 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.h
+++ 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwm_util.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwm_util.h 321510 2017-07-26 
05:51:31Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -107,12 +107,12 @@
 #define        __IF_IWM_UTIL_H__

 extern int iwm_send_cmd(struct iwm_softc *sc, struct iwm_host_cmd *hcmd);
-extern int iwm_mvm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id,
+extern int iwm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id,
            uint32_t flags, uint16_t len, const void *data);

-extern int iwm_mvm_send_cmd_status(struct iwm_softc *sc,
+extern int iwm_send_cmd_status(struct iwm_softc *sc,
            struct iwm_host_cmd *cmd, uint32_t *status);
-extern int iwm_mvm_send_cmd_pdu_status(struct iwm_softc *sc, uint32_t id,
+extern int iwm_send_cmd_pdu_status(struct iwm_softc *sc, uint32_t id,
        uint16_t len, const void *data, uint32_t *status);
 extern void iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cmd *hcmd);

@@ -120,18 +120,18 @@
                                 bus_size_t size, bus_size_t alignment);
 extern void iwm_dma_contig_free(struct iwm_dma_info *);

-extern int iwm_mvm_send_lq_cmd(struct iwm_softc *sc, struct iwm_lq_cmd *lq,
+extern int iwm_send_lq_cmd(struct iwm_softc *sc, struct iwm_lq_cmd *lq,
                                boolean_t init);

-extern boolean_t iwm_mvm_rx_diversity_allowed(struct iwm_softc *sc);
+extern boolean_t iwm_rx_diversity_allowed(struct iwm_softc *sc);

 extern uint8_t iwm_ridx2rate(struct ieee80211_rateset *rs, int ridx);
 extern int iwm_enable_txq(struct iwm_softc *sc, int sta_id, int qid, int fifo);
-extern int iwm_mvm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk,
+extern int iwm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk,
                                  uint32_t flags);

 static inline uint8_t
-iwm_mvm_get_valid_tx_ant(struct iwm_softc *sc)
+iwm_get_valid_tx_ant(struct iwm_softc *sc)
 {
        return sc->nvm_data && sc->nvm_data->valid_tx_ant ?
               sc->sc_fw.valid_tx_ant & sc->nvm_data->valid_tx_ant :
@@ -139,7 +139,7 @@
 }

 static inline uint8_t
-iwm_mvm_get_valid_rx_ant(struct iwm_softc *sc)
+iwm_get_valid_rx_ant(struct iwm_softc *sc)
 {
        return sc->nvm_data && sc->nvm_data->valid_rx_ant ?
               sc->sc_fw.valid_rx_ant & sc->nvm_data->valid_rx_ant :
@@ -147,12 +147,12 @@
 }

 static inline uint32_t
-iwm_mvm_get_phy_config(struct iwm_softc *sc)
+iwm_get_phy_config(struct iwm_softc *sc)
 {
        uint32_t phy_config = ~(IWM_FW_PHY_CFG_TX_CHAIN |
                                IWM_FW_PHY_CFG_RX_CHAIN);
-       uint32_t valid_rx_ant = iwm_mvm_get_valid_rx_ant(sc);
-       uint32_t valid_tx_ant = iwm_mvm_get_valid_tx_ant(sc);
+       uint32_t valid_rx_ant = iwm_get_valid_rx_ant(sc);
+       uint32_t valid_tx_ant = iwm_get_valid_tx_ant(sc);

        phy_config |= valid_tx_ant << IWM_FW_PHY_CFG_TX_CHAIN_POS |
                      valid_rx_ant << IWM_FW_PHY_CFG_RX_CHAIN_POS;
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmreg.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmreg.h
index 8258146..310b2d5 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmreg.h
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmreg.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwmreg.h,v 1.4 2015/06/15 08:06:11 stsp Exp $      */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwmreg.h 327231 2017-12-27 
03:23:21Z eadler $ */
+/*     $FreeBSD$ */

 /******************************************************************************
  *
@@ -289,7 +289,7 @@
 #define IWM_CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN           (0x00000001)

 #define IWM_CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE         (0x07000000)
-#define IWM_CSR_GP_CNTRL_REG_FLAG_MAC_POWER_SAVE         (0x04000000)
+#define IWM_CSR_GP_CNTRL_REG_FLAG_RFKILL_WAKE_L1A_EN     (0x04000000)
 #define IWM_CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW          (0x08000000)


@@ -457,6 +457,10 @@
 #define IWM_LMPM_CHICK                         0xa01ff8
 #define IWM_LMPM_CHICK_EXTENDED_ADDR_SPACE     0x01

+#define        IWM_UREG_CHICK                  0xa05c00
+#define        IWM_UREG_CHICK_MSI_ENABLE       0x01000000
+#define        IWM_UREG_CHICK_MSIX_ENABLE      0x02000000
+
 #define IWM_FH_TCSR_0_REG0 (0x1D00)

 /*
@@ -635,6 +639,40 @@
  *     longer than the passive one, which is essential for fragmented scan.
  * @IWM_UCODE_TLV_API_WIFI_MCC_UPDATE: ucode supports MCC updates with source.
  * @IWM_UCODE_TLV_API_LQ_SS_PARAMS: Configure STBC/BFER via LQ CMD ss_params
+ * @IWM_UCODE_TLV_API_NEW_VERSION: new versioning format
+ * @IWM_UCODE_TLV_API_SCAN_TSF_REPORT: Scan start time reported in scan
+ *     iteration complete notification, and the timestamp reported for RX
+ *     received during scan, are reported in TSF of the mac specified in the
+ *     scan request.
+ * @IWM_UCODE_TLV_API_TKIP_MIC_KEYS: This ucode supports version 2 of
+ *     ADD_MODIFY_STA_KEY_API_S_VER_2.
+ * @IWM_UCODE_TLV_API_STA_TYPE: This ucode supports station type assignement.
+ * @IWM_UCODE_TLV_API_NAN2_VER2: This ucode supports NAN API version 2
+ * @IWM_UCODE_TLV_API_NEW_RX_STATS: should new RX STATISTICS API be used
+ * @IWM_UCODE_TLV_API_QUOTA_LOW_LATENCY: Quota command includes a field
+ *     indicating low latency direction.
+ * @IWM_UCODE_TLV_API_DEPRECATE_TTAK: RX status flag TTAK ok (bit 7) is
+ *     deprecated.
+ * @IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2: This ucode supports version 8
+ *     of scan request: SCAN_REQUEST_CMD_UMAC_API_S_VER_8
+ * @IWM_UCODE_TLV_API_FRAG_EBS: This ucode supports fragmented EBS
+ * @IWM_UCODE_TLV_API_REDUCE_TX_POWER: This ucode supports v5 of
+ *     the REDUCE_TX_POWER_CMD.
+ * @IWM_UCODE_TLV_API_SHORT_BEACON_NOTIF: This ucode supports the short
+ *     version of the beacon notification.
+ * @IWM_UCODE_TLV_API_BEACON_FILTER_V4: This ucode supports v4 of
+ *     BEACON_FILTER_CONFIG_API_S_VER_4.
+ * @IWM_UCODE_TLV_API_REGULATORY_NVM_INFO: This ucode supports v4 of
+ *     REGULATORY_NVM_GET_INFO_RSP_API_S.
+ * @IWM_UCODE_TLV_API_FTM_NEW_RANGE_REQ: This ucode supports v7 of
+ *     LOCATION_RANGE_REQ_CMD_API_S and v6 of LOCATION_RANGE_RESP_NTFY_API_S.
+ * @IWM_UCODE_TLV_API_SCAN_OFFLOAD_CHANS: This ucode supports v2 of
+ *     SCAN_OFFLOAD_PROFILE_MATCH_RESULTS_S and v3 of
+ *     SCAN_OFFLOAD_PROFILES_QUERY_RSP_S.
+ * @IWM_UCODE_TLV_API_MBSSID_HE: This ucode supports v2 of
+ *     STA_CONTEXT_DOT11AX_API_S
+ * @IWM_UCODE_TLV_CAPA_SAR_TABLE_VER: This ucode supports different sar
+ *     version tables.
  *
  * @IWM_NUM_UCODE_TLV_API: number of bits used
  */
@@ -642,13 +680,36 @@
        IWM_UCODE_TLV_API_FRAGMENTED_SCAN       = 8,
        IWM_UCODE_TLV_API_WIFI_MCC_UPDATE       = 9,
        IWM_UCODE_TLV_API_LQ_SS_PARAMS          = 18,
+       IWM_UCODE_TLV_API_NEW_VERSION           = 20,
+       IWM_UCODE_TLV_API_SCAN_TSF_REPORT       = 28,
+       IWM_UCODE_TLV_API_TKIP_MIC_KEYS         = 29,
+       IWM_UCODE_TLV_API_STA_TYPE              = 30,
+       IWM_UCODE_TLV_API_NAN2_VER2             = 31,
+       IWM_UCODE_TLV_API_ADAPTIVE_DWELL        = 32,
+       IWM_UCODE_TLV_API_OCE                   = 33,
+       IWM_UCODE_TLV_API_NEW_BEACON_TEMPLATE   = 34,
+       IWM_UCODE_TLV_API_NEW_RX_STATS          = 35,
+       IWM_UCODE_TLV_API_WOWLAN_KEY_MATERIAL   = 36,
+       IWM_UCODE_TLV_API_QUOTA_LOW_LATENCY     = 38,
+       IWM_UCODE_TLV_API_DEPRECATE_TTAK        = 41,
+       IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2     = 42,
+       IWM_UCODE_TLV_API_FRAG_EBS              = 44,
+       IWM_UCODE_TLV_API_REDUCE_TX_POWER       = 45,
+       IWM_UCODE_TLV_API_SHORT_BEACON_NOTIF    = 46,
+       IWM_UCODE_TLV_API_BEACON_FILTER_V4      = 47,
+       IWM_UCODE_TLV_API_REGULATORY_NVM_INFO   = 48,
+       IWM_UCODE_TLV_API_FTM_NEW_RANGE_REQ     = 49,
+       IWM_UCODE_TLV_API_SCAN_OFFLOAD_CHANS    = 50,
+       IWM_UCODE_TLV_API_MBSSID_HE             = 52,
+       IWM_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE   = 53,
+       IWM_UCODE_TLV_API_FTM_RTT_ACCURACY      = 54,
+       IWM_UCODE_TLV_API_SAR_TABLE_VER         = 55,
+       IWM_UCODE_TLV_API_ADWELL_HB_DEF_N_AP    = 57,
+       IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER     = 58,

-       IWM_NUM_UCODE_TLV_API = 32
+       IWM_NUM_UCODE_TLV_API                   = 128,
 };

-#define IWM_UCODE_TLV_API_BITS \
-       
"\020\10FRAGMENTED_SCAN\11WIFI_MCC_UPDATE\16WIDE_CMD_HDR\22LQ_SS_PARAMS\30EXT_SCAN_PRIO\33TX_POWER_CHAIN"
-
 /**
  * enum iwm_ucode_tlv_capa - ucode capabilities
  * @IWM_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3
@@ -845,7 +906,7 @@
  */
 struct iwm_fw_cscheme_list {
        uint8_t size;
-       struct iwm_fw_cipher_scheme cs[0];
+       struct iwm_fw_cipher_scheme cs[];
 } __packed;

 /*
@@ -933,6 +994,7 @@
        IWM_UCODE_TLV_FW_DBG_DEST       = 38,
        IWM_UCODE_TLV_FW_DBG_CONF       = 39,
        IWM_UCODE_TLV_FW_DBG_TRIGGER    = 40,
+       IWM_UCODE_TLV_CMD_VERSIONS      = 48,
        IWM_UCODE_TLV_FW_GSCAN_CAPA     = 50,
        IWM_UCODE_TLV_FW_MEM_SEG        = 51,
 };
@@ -1469,6 +1531,52 @@

 #define IWM_FH_MEM_TFDIB_REG1_ADDR_BITSHIFT    28

+/* 9000 rx series registers */
+
+#define IWM_RFH_Q0_FRBDCB_BA_LSB       0xa08000
+#define IWM_RFH_Q_FRBDCB_BA_LSB                (IWM_RFH_Q0_FRBDCB_BA_LSB + (q) 
* 8)
+/* Write index table */
+#define IWM_RFH_Q0_FRBDCB_WIDX         0xa08080
+#define IWM_RFH_Q_FRBDCB_WIDX          (IWM_RFH_Q0_FRBDCB_WIDX + (q) * 4)
+/* Write index table - shadow registers */
+#define IWM_RFH_Q0_FRBDCB_WIDX_TRG     0x1c80
+#define IWM_RFH_Q_FRBDCB_WIDX_TRG      (IWM_RFH_Q0_FRBDCB_WIDX_TRG + (q) * 4)
+/* Read index table */
+#define IWM_RFH_Q0_FRBDCB_RIDX         0xa080c0
+#define IWM_RFH_Q_FRBDCB_RIDX          (IWM_RFH_Q0_FRBDCB_RIDX + (q) * 4)
+/* Used list table */
+#define IWM_RFH_Q0_URBDCB_BA_LSB       0xa08100
+#define IWM_RFH_Q_URBDCB_BA_LSB                (IWM_RFH_Q0_URBDCB_BA_LSB + (q) 
* 8)
+/* Write index table */
+#define IWM_RFH_Q0_URBDCB_WIDX         0xa08180
+#define IWM_RFH_Q_URBDCB_WIDX          (IWM_RFH_Q0_URBDCB_WIDX + (q) * 4)
+/* stts */
+#define IWM_RFH_Q0_URBD_STTS_WPTR_LSB  0xa08200
+#define IWM_RFH_Q_URBD_STTS_WPTR_LSB (IWM_RFH_Q0_URBD_STTS_WPTR_LSB + (q) * 8)
+
+#define IWM_RFH_GEN_STATUS             0xa09808
+#define IWM_RXF_DMA_IDLE               0x80000000
+
+/* DMA configuration */
+#define IWM_RFH_RXF_DMA_CFG            0xa09820
+#define IWM_RFH_RXF_DMA_RB_SIZE_1K     0x00010000
+#define IWM_RFH_RXF_DMA_RB_SIZE_2K     0x00020000
+#define IWM_RFH_RXF_DMA_RB_SIZE_4K     0x00040000
+#define IWM_RFH_RXF_DMA_RBDCB_SIZE_512 0x00900000
+#define IWM_RFH_RXF_DMA_MIN_RB_4_8     0x03000000
+#define IWM_RFH_RXF_DMA_DROP_TOO_LARGE_MASK 0x04000000
+#define IWM_RFH_DMA_EN_ENABLE_VAL      0x80000000
+
+#define IWM_RFH_GEN_CFG                        0xa09800
+#define IWM_RFH_GEN_CFG_SERVICE_DMA_SNOOP 0x00000001
+#define IWM_RFH_GEN_CFG_RFH_DMA_SNOOP  0x00000002
+#define IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_128 0x00000010
+#define IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_64 0x00000000
+
+#define IWM_RFH_RXF_RXQ_ACTIVE         0xa0980c
+
+/* end of 9000 rx series registers */
+
 /* TFDB  Area - TFDs buffer table */
 #define IWM_FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK      (0xFFFFFFFF)
 #define IWM_FH_TFDIB_LOWER_BOUND       (IWM_FH_MEM_LOWER_BOUND + 0x900)
@@ -1706,29 +1814,29 @@
  */

 /* Maximum number of Tx queues. */
-#define IWM_MVM_MAX_QUEUES     31
+#define IWM_MAX_QUEUES 31

 /* Tx queue numbers */
 enum {
-       IWM_MVM_OFFCHANNEL_QUEUE = 8,
-       IWM_MVM_CMD_QUEUE = 9,
-       IWM_MVM_AUX_QUEUE = 15,
+       IWM_OFFCHANNEL_QUEUE = 8,
+       IWM_CMD_QUEUE = 9,
+       IWM_AUX_QUEUE = 15,
 };

-enum iwm_mvm_tx_fifo {
-       IWM_MVM_TX_FIFO_BK = 0,
-       IWM_MVM_TX_FIFO_BE,
-       IWM_MVM_TX_FIFO_VI,
-       IWM_MVM_TX_FIFO_VO,
-       IWM_MVM_TX_FIFO_MCAST = 5,
-       IWM_MVM_TX_FIFO_CMD = 7,
+enum iwm_tx_fifo {
+       IWM_TX_FIFO_BK = 0,
+       IWM_TX_FIFO_BE,
+       IWM_TX_FIFO_VI,
+       IWM_TX_FIFO_VO,
+       IWM_TX_FIFO_MCAST = 5,
+       IWM_TX_FIFO_CMD = 7,
 };

-#define IWM_MVM_STATION_COUNT  16
+#define IWM_STATION_COUNT      16

 /* commands */
 enum {
-       IWM_MVM_ALIVE = 0x1,
+       IWM_ALIVE = 0x1,
        IWM_REPLY_ERROR = 0x2,

        IWM_INIT_COMPLETE_NOTIF = 0x4,
@@ -2032,6 +2140,7 @@
        IWM_NVM_SECTION_TYPE_REGULATORY = 3,
        IWM_NVM_SECTION_TYPE_CALIBRATION = 4,
        IWM_NVM_SECTION_TYPE_PRODUCTION = 5,
+       IWM_NVM_SECTION_TYPE_REGULATORY_SDP = 8,
        IWM_NVM_SECTION_TYPE_MAC_OVERRIDE = 11,
        IWM_NVM_SECTION_TYPE_PHY_SKU = 12,
        IWM_NVM_MAX_NUM_SECTIONS = 13,
@@ -2052,7 +2161,7 @@
        uint16_t type;
        uint16_t offset;
        uint16_t length;
-       uint8_t data[0];
+       uint8_t data[];
 } __packed; /* IWM_NVM_ACCESS_CMD_API_S_VER_2 */

 #define IWM_NUM_OF_FW_PAGING_BLOCKS 33 /* 32 for data and 1 block for CSS */
@@ -2106,10 +2215,10 @@
        uint16_t length;
        uint16_t type;
        uint16_t status;
-       uint8_t data[0];
+       uint8_t data[];
 } __packed; /* IWM_NVM_ACCESS_CMD_RESP_API_S_VER_2 */

-/* IWM_MVM_ALIVE 0x1 */
+/* IWM_ALIVE 0x1 */

 /* alive response is_valid values */
 #define IWM_ALIVE_RESP_UCODE_OK        (1 << 0)
@@ -2167,14 +2276,14 @@
        uint32_t dbg_print_buff_addr;
 } __packed; /* UMAC_ALIVE_DATA_API_S_VER_2 */

-struct iwm_mvm_alive_resp_v3 {
+struct iwm_alive_resp_v3 {
        uint16_t status;
        uint16_t flags;
        struct iwm_lmac_alive lmac_data;
        struct iwm_umac_alive umac_data;
 } __packed; /* ALIVE_RES_API_S_VER_3 */

-struct iwm_mvm_alive_resp {
+struct iwm_alive_resp {
        uint16_t status;
        uint16_t flags;
        struct iwm_lmac_alive lmac_data[2];
@@ -2513,7 +2622,7 @@
 } __packed; /* IWM_BINDING_CMD_API_S_VER_1 */

 /* The maximal number of fragments in the FW's schedule session */
-#define IWM_MVM_MAX_QUOTA 128
+#define IWM_MAX_QUOTA 128

 /**
  * struct iwm_time_quota_data - configuration of time quota per binding
@@ -2737,7 +2846,7 @@
 };

 /**
- * enum iwm_mvm_rx_status - written by fw for each Rx packet
+ * enum iwm_rx_status - written by fw for each Rx packet
  * @IWM_RX_MPDU_RES_STATUS_CRC_OK: CRC is fine
  * @IWM_RX_MPDU_RES_STATUS_OVERRUN_OK: there was no RXE overflow
  * @IWM_RX_MPDU_RES_STATUS_SRC_STA_FOUND:
@@ -2768,7 +2877,7 @@
  * @IWM_RX_MPDU_RES_STATUS_FILTERING_MSK:
  * @IWM_RX_MPDU_RES_STATUS2_FILTERING_MSK:
  */
-enum iwm_mvm_rx_status {
+enum iwm_rx_status {
        IWM_RX_MPDU_RES_STATUS_CRC_OK                   = (1 << 0),
        IWM_RX_MPDU_RES_STATUS_OVERRUN_OK               = (1 << 1),
        IWM_RX_MPDU_RES_STATUS_SRC_STA_FOUND            = (1 << 2),
@@ -2798,6 +2907,69 @@
        IWM_RX_MPDU_RES_STATUS2_FILTERING_MSK           = (0xc0000000),
 };

+enum iwm_rx_mpdu_mac_flags1 {
+       IWM_RX_MPDU_MFLG1_ADDRTYPE_MASK         = 0x03,
+       IWM_RX_MPDU_MFLG1_MIC_CRC_LEN_MASK      = 0xf0,
+       IWM_RX_MPDU_MFLG1_MIC_CRC_LEN_SHIFT     = 3,
+};
+
+enum iwm_rx_mpdu_mac_flags2 {
+       IWM_RX_MPDU_MFLG2_HDR_LEN_MASK          = 0x1f,
+       IWM_RX_MPDU_MFLG2_PAD                   = 0x20,
+       IWM_RX_MPDU_MFLG2_AMSDU                 = 0x40,
+};
+
+enum iwm_rx_mpdu_phy_info {
+       IWM_RX_MPDU_PHY_AMPDU                   = (1 << 5),
+       IWM_RX_MPDU_PHY_AMPDU_TOGGLE            = (1 << 6),
+       IWM_RX_MPDU_PHY_SHORT_PREAMBLE          = (1 << 7),
+       IWM_RX_MPDU_PHY_NCCK_ADDTL_NTFY         = (1 << 7),
+       IWM_RX_MPDU_PHY_TSF_OVERLOAD            = (1 << 8),
+};
+
+struct iwm_rx_mpdu_desc_v1 {
+       union {
+               uint32_t rss_hash;
+               uint32_t phy_data2;
+       };
+       union {
+               uint32_t filter_match;
+               uint32_t phy_data3;
+       };
+       uint32_t rate_n_flags;
+       uint8_t energy_a;
+       uint8_t energy_b;
+       uint8_t channel;
+       uint8_t mac_context;
+       uint32_t gp2_on_air_rise;
+       union {
+               uint64_t tsf_on_air_rise;
+               struct {
+                       uint32_t phy_data0;
+                       uint32_t phy_data1;
+               };
+       };
+} __packed;
+
+struct iwm_rx_mpdu_desc {
+       uint16_t mpdu_len;
+       uint8_t mac_flags1;
+       uint8_t mac_flags2;
+       uint8_t amsdu_info;
+       uint16_t phy_info;
+       uint8_t mac_phy_idx;
+       uint16_t raw_csum;
+       union {
+               uint16_t l3l4_flags;
+               uint16_t phy_data4;
+       };
+       uint16_t status;
+       uint8_t hash_filter;
+       uint8_t sta_id_flags;
+       uint32_t reorder_data;
+       struct iwm_rx_mpdu_desc_v1 v1;
+} __packed;
+
 /**
  * struct iwm_radio_version_notif - information on the radio version
  * ( IWM_RADIO_VERSION_NOTIFICATION = 0x68 )
@@ -2914,14 +3086,14 @@
 /***********************************
  * Statistics API
  ***********************************/
-struct iwm_mvm_statistics_dbg {
+struct iwm_statistics_dbg {
        uint32_t burst_check;
        uint32_t burst_count;
        uint32_t wait_for_silence_timeout_cnt;
        uint32_t reserved[3];
 } __packed; /* IWM_STATISTICS_DEBUG_API_S_VER_2 */

-struct iwm_mvm_statistics_div {
+struct iwm_statistics_div {
        uint32_t tx_on_a;
        uint32_t tx_on_b;
        uint32_t exec_time;
@@ -2930,7 +3102,7 @@
        uint32_t reserved2;
 } __packed; /* IWM_STATISTICS_SLOW_DIV_API_S_VER_2 */

-struct iwm_mvm_statistics_rx_non_phy {
+struct iwm_statistics_rx_non_phy {
        uint32_t bogus_cts;     /* CTS received when not expecting CTS */
        uint32_t bogus_ack;     /* ACK received when not expecting ACK */
        uint32_t non_bssid_frames;      /* number of frames with BSSID that
@@ -2964,7 +3136,7 @@
        uint32_t directed_data_mpdu;
 } __packed; /* IWM_STATISTICS_RX_NON_PHY_API_S_VER_3 */

-struct iwm_mvm_statistics_rx_phy {
+struct iwm_statistics_rx_phy {
        uint32_t ina_cnt;
        uint32_t fina_cnt;
        uint32_t plcp_err;
@@ -2987,7 +3159,7 @@
        uint32_t reserved;
 } __packed; /* IWM_STATISTICS_RX_PHY_API_S_VER_2 */

-struct iwm_mvm_statistics_rx_ht_phy {
+struct iwm_statistics_rx_ht_phy {
        uint32_t plcp_err;
        uint32_t overrun_err;
        uint32_t early_overrun_err;
@@ -3000,7 +3172,7 @@
        uint32_t unsupport_mcs;
 } __packed;  /* IWM_STATISTICS_HT_RX_PHY_API_S_VER_1 */

-struct iwm_mvm_statistics_tx_non_phy {
+struct iwm_statistics_tx_non_phy {
        uint32_t preamble_cnt;
        uint32_t rx_detected_cnt;
        uint32_t bt_prio_defer_cnt;
@@ -3019,7 +3191,7 @@

 #define IWM_MAX_CHAINS 3

-struct iwm_mvm_statistics_tx_non_phy_agg {
+struct iwm_statistics_tx_non_phy_agg {
        uint32_t ba_timeout;
        uint32_t ba_reschedule_frames;
        uint32_t scd_query_agg_frame_cnt;
@@ -3035,7 +3207,7 @@
        uint32_t reserved2;
 } __packed; /* IWM_STATISTICS_TX_NON_PHY_AGG_API_S_VER_1 */

-struct iwm_mvm_statistics_tx_channel_width {
+struct iwm_statistics_tx_channel_width {
        uint32_t ext_cca_narrow_ch20[1];
        uint32_t ext_cca_narrow_ch40[2];
        uint32_t ext_cca_narrow_ch80[3];
@@ -3046,14 +3218,14 @@
        uint32_t fail_per_ch_width[4];
 }; /* IWM_STATISTICS_TX_CHANNEL_WIDTH_API_S_VER_1 */

-struct iwm_mvm_statistics_tx {
-       struct iwm_mvm_statistics_tx_non_phy general;
-       struct iwm_mvm_statistics_tx_non_phy_agg agg;
-       struct iwm_mvm_statistics_tx_channel_width channel_width;
+struct iwm_statistics_tx {
+       struct iwm_statistics_tx_non_phy general;
+       struct iwm_statistics_tx_non_phy_agg agg;
+       struct iwm_statistics_tx_channel_width channel_width;
 } __packed; /* IWM_STATISTICS_TX_API_S_VER_4 */

 
-struct iwm_mvm_statistics_bt_activity {
+struct iwm_statistics_bt_activity {
        uint32_t hi_priority_tx_req_cnt;
        uint32_t hi_priority_tx_denied_cnt;
        uint32_t lo_priority_tx_req_cnt;
@@ -3064,15 +3236,15 @@
        uint32_t lo_priority_rx_denied_cnt;
 } __packed;  /* IWM_STATISTICS_BT_ACTIVITY_API_S_VER_1 */

-struct iwm_mvm_statistics_general_v8 {
+struct iwm_statistics_general_v8 {
        uint32_t radio_temperature;
        uint32_t radio_voltage;
-       struct iwm_mvm_statistics_dbg dbg;
+       struct iwm_statistics_dbg dbg;
        uint32_t sleep_time;
        uint32_t slots_out;
        uint32_t slots_idle;
        uint32_t ttl_timestamp;
-       struct iwm_mvm_statistics_div slow_div;
+       struct iwm_statistics_div slow_div;
        uint32_t rx_enable_counter;
        /*
         * num_of_sos_states:
@@ -3087,7 +3259,7 @@
        uint8_t beacon_filter_current_energy;
        uint8_t beacon_filter_reserved;
        uint32_t beacon_filter_delta_time;
-       struct iwm_mvm_statistics_bt_activity bt_activity;
+       struct iwm_statistics_bt_activity bt_activity;
        uint64_t rx_time;
        uint64_t on_time_rf;
        uint64_t on_time_scan;
@@ -3097,11 +3269,11 @@
        uint8_t reserved[4 - (IWM_NUM_MAC_INDEX % 4)];
 } __packed; /* IWM_STATISTICS_GENERAL_API_S_VER_8 */

-struct iwm_mvm_statistics_rx {
-       struct iwm_mvm_statistics_rx_phy ofdm;
-       struct iwm_mvm_statistics_rx_phy cck;
-       struct iwm_mvm_statistics_rx_non_phy general;
-       struct iwm_mvm_statistics_rx_ht_phy ofdm_ht;
+struct iwm_statistics_rx {
+       struct iwm_statistics_rx_phy ofdm;
+       struct iwm_statistics_rx_phy cck;
+       struct iwm_statistics_rx_non_phy general;
+       struct iwm_statistics_rx_ht_phy ofdm_ht;
 } __packed; /* IWM_STATISTICS_RX_API_S_VER_3 */

 /*
@@ -3114,9 +3286,9 @@

 struct iwm_notif_statistics_v10 {
        uint32_t flag;
-       struct iwm_mvm_statistics_rx rx;
-       struct iwm_mvm_statistics_tx tx;
-       struct iwm_mvm_statistics_general_v8 general;
+       struct iwm_statistics_rx rx;
+       struct iwm_statistics_tx tx;
+       struct iwm_statistics_general_v8 general;
 } __packed; /* IWM_STATISTICS_NTFY_API_S_VER_10 */

 #define IWM_STATISTICS_FLG_CLEAR               0x1
@@ -3505,7 +3677,7 @@
        };
 } __packed; /* IWM_MAC_CONTEXT_CMD_API_S_VER_1 */
 
-static inline uint32_t iwm_mvm_reciprocal(uint32_t v)
+static inline uint32_t iwm_reciprocal(uint32_t v)
 {
        if (!v)
                return 0;
@@ -4305,13 +4477,41 @@
 #define IWM_BAR_DFAULT_RETRY_LIMIT             60
 #define IWM_LOW_RETRY_LIMIT                    7

+/**
+ * enum iwm_tx_offload_assist_flags_pos -  set %iwm_tx_cmd offload_assist 
values
+ * @IWM_TX_CMD_OFFLD_IP_HDR: offset to start of IP header (in words)
+ *     from mac header end. For normal case it is 4 words for SNAP.
+ *     note: tx_cmd, mac header and pad are not counted in the offset.
+ *     This is used to help the offload in case there is tunneling such as
+ *     IPv6 in IPv4, in such case the ip header offset should point to the
+ *     inner ip header and IPv4 checksum of the external header should be
+ *     calculated by driver.
+ * @IWM_TX_CMD_OFFLD_L4_EN: enable TCP/UDP checksum
+ * @IWM_TX_CMD_OFFLD_L3_EN: enable IP header checksum
+ * @IWM_TX_CMD_OFFLD_MH_SIZE: size of the mac header in words. Includes the IV
+ *     field. Doesn't include the pad.
+ * @IWM_TX_CMD_OFFLD_PAD: mark 2-byte pad was inserted after the mac header for
+ *     alignment
+ * @IWM_TX_CMD_OFFLD_AMSDU: mark TX command is A-MSDU
+ */
+enum iwm_tx_offload_assist_flags_pos {
+       IWM_TX_CMD_OFFLD_IP_HDR =       0,
+       IWM_TX_CMD_OFFLD_L4_EN =        6,
+       IWM_TX_CMD_OFFLD_L3_EN =        7,
+       IWM_TX_CMD_OFFLD_MH_SIZE =      8,
+       IWM_TX_CMD_OFFLD_PAD =          13,
+       IWM_TX_CMD_OFFLD_AMSDU =        14,
+};
+
+#define IWM_TX_CMD_OFFLD_MH_MASK       0x1f
+#define IWM_TX_CMD_OFFLD_IP_HDR_MASK   0x3f
+
 /* TODO: complete documentation for try_cnt and btkill_cnt */
 /**
  * struct iwm_tx_cmd - TX command struct to FW
  * ( IWM_TX_CMD = 0x1c )
  * @len: in bytes of the payload, see below for details
- * @next_frame_len: same as len, but for next frame (0 if not applicable)
- *     Used for fragmentation and bursting, but not in 11n aggregation.
+ * @offload_assist: TX offload configuration
  * @tx_flags: combination of IWM_TX_CMD_FLG_*
  * @rate_n_flags: rate for *all* Tx attempts, if IWM_TX_CMD_FLG_STA_RATE_MSK is
  *     cleared. Combination of IWM_RATE_MCS_*
@@ -4347,7 +4547,7 @@
  */
 struct iwm_tx_cmd {
        uint16_t len;
-       uint16_t next_frame_len;
+       uint16_t offload_assist;
        uint32_t tx_flags;
        struct {
                uint8_t try_cnt;
@@ -4360,8 +4560,7 @@
        uint8_t initial_rate_index;
        uint8_t reserved2;
        uint8_t key[16];
-       uint16_t next_frame_flags;
-       uint16_t reserved3;
+       uint32_t reserved3;
        uint32_t life_time;
        uint32_t dram_lsb_ptr;
        uint8_t dram_msb_ptr;
@@ -4369,7 +4568,7 @@
        uint8_t data_retry_limit;
        uint8_t tid_tspec;
        uint16_t pm_frame_timeout;
-       uint16_t driver_txop;
+       uint16_t reserved4;
        uint8_t payload[0];
        struct ieee80211_frame hdr[0];
 } __packed; /* IWM_TX_CMD_API_S_VER_3 */
@@ -4555,11 +4754,11 @@
 #define IWM_TX_RES_RATE_TABLE_COLOR_MSK 0x70
 #define IWM_TX_RES_INV_RATE_INDEX_MSK 0x80

-#define IWM_MVM_TX_RES_GET_TID(_ra_tid) ((_ra_tid) & 0x0f)
-#define IWM_MVM_TX_RES_GET_RA(_ra_tid) ((_ra_tid) >> 4)
+#define IWM_TX_RES_GET_TID(_ra_tid) ((_ra_tid) & 0x0f)
+#define IWM_TX_RES_GET_RA(_ra_tid) ((_ra_tid) >> 4)

 /**
- * struct iwm_mvm_tx_resp - notifies that fw is TXing a packet
+ * struct iwm_tx_resp - notifies that fw is TXing a packet
  * ( IWM_REPLY_TX = 0x1c )
  * @frame_count: 1 no aggregation, >1 aggregation
  * @bt_kill_count: num of times blocked by bluetooth (unused for agg)
@@ -4586,9 +4785,9 @@
  *     follow this one, up to frame_count.
  *
  * After the array of statuses comes the SSN of the SCD. Look at
- * %iwm_mvm_get_scd_ssn for more details.
+ * %iwm_get_scd_ssn for more details.
  */
-struct iwm_mvm_tx_resp {
+struct iwm_tx_resp {
        uint8_t frame_count;
        uint8_t bt_kill_count;
        uint8_t failure_rts;
@@ -4615,7 +4814,7 @@
 } __packed; /* IWM_TX_RSP_API_S_VER_3 */

 /**
- * struct iwm_mvm_ba_notif - notifies about reception of BA
+ * struct iwm_ba_notif - notifies about reception of BA
  * ( IWM_BA_NOTIF = 0xc5 )
  * @sta_addr_lo32: lower 32 bits of the MAC address
  * @sta_addr_hi16: upper 16 bits of the MAC address
@@ -4628,7 +4827,7 @@
  * @txed: number of Txed frames in this batch
  * @txed_2_done: number of Acked frames in this batch
  */
-struct iwm_mvm_ba_notif {
+struct iwm_ba_notif {
        uint32_t sta_addr_lo32;
        uint16_t sta_addr_hi16;
        uint16_t reserved;
@@ -4662,7 +4861,7 @@
 } __packed;

 struct iwm_beacon_notif {
-       struct iwm_mvm_tx_resp beacon_notify_hdr;
+       struct iwm_tx_resp beacon_notify_hdr;
        uint64_t tsf;
        uint32_t ibss_mgr_status;
 } __packed;
@@ -4689,7 +4888,7 @@
 } __packed; /* IWM_TX_PATH_FLUSH_CMD_API_S_VER_1 */

 /**
- * iwm_mvm_get_scd_ssn - returns the SSN of the SCD
+ * iwm_get_scd_ssn - returns the SSN of the SCD
  * @tx_resp: the Tx response from the fw (agg or non-agg)
  *
  * When the fw sends an AMPDU, it fetches the MPDUs one after the other. Since
@@ -4701,7 +4900,7 @@
  * whole struct at a variable offset. This function knows how to cope with the
  * variable offset and returns the SSN of the SCD.
  */
-static inline uint32_t iwm_mvm_get_scd_ssn(struct iwm_mvm_tx_resp *tx_resp)
+static inline uint32_t iwm_get_scd_ssn(struct iwm_tx_resp *tx_resp)
 {
        return le32_to_cpup((uint32_t *)&tx_resp->status +
                            tx_resp->frame_count) & 0xfff;
@@ -4723,7 +4922,7 @@
  * @scd_queue: scheduler queue to confiug
  * @enable: 1 queue enable, 0 queue disable
  * @aggregate: 1 aggregated queue, 0 otherwise
- * @tx_fifo: %enum iwm_mvm_tx_fifo
+ * @tx_fifo: %enum iwm_tx_fifo
  * @window: BA window size
  * @ssn: SSN for the BA agreement
  */
@@ -4883,30 +5082,30 @@
 } __packed;

 /**
- * iwm_mvm_lmac_scan_flags
- * @IWM_MVM_LMAC_SCAN_FLAG_PASS_ALL: pass all beacons and probe responses
+ * iwm_lmac_scan_flags
+ * @IWM_LMAC_SCAN_FLAG_PASS_ALL: pass all beacons and probe responses
  *      without filtering.
- * @IWM_MVM_LMAC_SCAN_FLAG_PASSIVE: force passive scan on all channels
- * @IWM_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION: single channel scan
- * @IWM_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE: send iteration complete notification
- * @IWM_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS multiple SSID matching
- * @IWM_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
- * @IWM_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
+ * @IWM_LMAC_SCAN_FLAG_PASSIVE: force passive scan on all channels
+ * @IWM_LMAC_SCAN_FLAG_PRE_CONNECTION: single channel scan
+ * @IWM_LMAC_SCAN_FLAG_ITER_COMPLETE: send iteration complete notification
+ * @IWM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS multiple SSID matching
+ * @IWM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
+ * @IWM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
  *      and DS parameter set IEs into probe requests.
- * @IWM_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL: use extended dwell time on channels
+ * @IWM_LMAC_SCAN_FLAG_EXTENDED_DWELL: use extended dwell time on channels
  *      1, 6 and 11.
- * @IWM_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
+ * @IWM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
  */
-enum iwm_mvm_lmac_scan_flags {
-       IWM_MVM_LMAC_SCAN_FLAG_PASS_ALL         = (1 << 0),
-       IWM_MVM_LMAC_SCAN_FLAG_PASSIVE          = (1 << 1),
-       IWM_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION   = (1 << 2),
-       IWM_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE    = (1 << 3),
-       IWM_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS   = (1 << 4),
-       IWM_MVM_LMAC_SCAN_FLAG_FRAGMENTED       = (1 << 5),
-       IWM_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED     = (1 << 6),
-       IWM_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL   = (1 << 7),
-       IWM_MVM_LMAC_SCAN_FLAG_MATCH            = (1 << 9),
+enum iwm_lmac_scan_flags {
+       IWM_LMAC_SCAN_FLAG_PASS_ALL             = (1 << 0),
+       IWM_LMAC_SCAN_FLAG_PASSIVE              = (1 << 1),
+       IWM_LMAC_SCAN_FLAG_PRE_CONNECTION       = (1 << 2),
+       IWM_LMAC_SCAN_FLAG_ITER_COMPLETE        = (1 << 3),
+       IWM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS       = (1 << 4),
+       IWM_LMAC_SCAN_FLAG_FRAGMENTED   = (1 << 5),
+       IWM_LMAC_SCAN_FLAGS_RRM_ENABLED = (1 << 6),
+       IWM_LMAC_SCAN_FLAG_EXTENDED_DWELL       = (1 << 7),
+       IWM_LMAC_SCAN_FLAG_MATCH                = (1 << 9),
 };

 enum iwm_scan_priority {
@@ -4925,7 +5124,7 @@
  * @extended_dwell: dwell time for channels 1, 6 and 11 (in certain cases)
  * @reserved2: for alignment and future use
  * @rx_chain_selct: PHY_RX_CHAIN_* flags
- * @scan_flags: &enum iwm_mvm_lmac_scan_flags
+ * @scan_flags: &enum iwm_lmac_scan_flags
  * @max_out_time: max time (in TU) to be out of associated channel
  * @suspend_time: pause scan this long (TUs) when returning to service channel
  * @flags: RXON flags
@@ -4964,7 +5163,7 @@
        uint32_t delay;
        struct iwm_scan_schedule_lmac schedule[IWM_MAX_SCHED_SCAN_PLANS];
        struct iwm_scan_channel_opt channel_opt[2];
-       uint8_t data[0];
+       uint8_t data[];
 } __packed;

 /**
@@ -5102,7 +5301,7 @@
        uint8_t last_channel;
        uint32_t tsf_low;
        uint32_t tsf_high;
-       struct iwm_scan_results_notif results[0];
+       struct iwm_scan_results_notif results[];
 } __packed;


@@ -5117,10 +5316,10 @@
 /* UMAC Scan API */

 /* The maximum of either of these cannot exceed 8, because we use an
- * 8-bit mask (see IWM_MVM_SCAN_MASK).
+ * 8-bit mask (see IWM_SCAN_MASK).
  */
-#define IWM_MVM_MAX_UMAC_SCANS 8
-#define IWM_MVM_MAX_LMAC_SCANS 1
+#define IWM_MAX_UMAC_SCANS 8
+#define IWM_MAX_LMAC_SCANS 1

 enum iwm_scan_config_flags {
        IWM_SCAN_CONFIG_FLAG_ACTIVATE                   = (1 << 0),
@@ -5205,7 +5404,7 @@
        uint8_t mac_addr[IEEE80211_ADDR_LEN];
        uint8_t bcast_sta_id;
        uint8_t channel_flags;
-       uint8_t channel_array[0];
+       uint8_t channel_array[];
 } __packed; /* SCAN_CONFIG_DB_CMD_API_S */

 /**
@@ -5289,21 +5488,44 @@
 } __packed;

 /**
+ * struct iwm_scan_uma_chan_param
+ * @flags: channel flags &enum iwm_scan_channel_flags
+ * @count: num of channels in scan request
+ * @reserved: for future use and alignment
+ */
+struct iwm_scan_umac_chan_param {
+       uint8_t flags;
+       uint8_t count;
+       uint16_t reserved;
+} __packed;
+
+/**
  * struct iwm_scan_req_umac
  * @flags: &enum iwm_umac_scan_flags
  * @uid: scan id, &enum iwm_umac_scan_uid_offsets
  * @ooc_priority: out of channel priority - &enum iwm_scan_priority
  * @general_flags: &enum iwm_umac_scan_general_flags
+ * @scan_start_mac_id: report the scan start TSF time according to this mac TSF
  * @extended_dwell: dwell time for channels 1, 6 and 11
- * @active_dwell: dwell time for active scan
- * @passive_dwell: dwell time for passive scan
+ * @active_dwell: dwell time for active scan per LMAC
+ * @passive_dwell: dwell time for passive scan per LMAC
  * @fragmented_dwell: dwell time for fragmented passive scan
- * @max_out_time: max out of serving channel time
- * @suspend_time: max suspend time
- * @scan_priority: scan internal prioritization &enum iwm_scan_priority
- * @channel_flags: &enum iwm_scan_channel_flags
- * @n_channels: num of channels in scan request
+ * @adwell_default_n_aps: for adaptive dwell the default number of APs
+ *     per channel
+ * @adwell_default_n_aps_social: for adaptive dwell the default
+ *     number of APs per social (1,6,11) channel
+ * @general_flags2: &enum iwl_umac_scan_general_flags2
+ * @adwell_max_budget: for adaptive dwell the maximal budget of TU to be added
+ *     to total scan time
+ * @max_out_time: max out of serving channel time, per LMAC - for CDB there
+ *     are 2 LMACs
+ * @suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs
+ * @scan_priority: scan internal prioritization &enum iwl_scan_priority
+ * @num_of_fragments: Number of fragments needed for full coverage per band.
+ *     Relevant only for fragmented scan.
+ * @channel: &struct iwl_scan_umac_chan_param
  * @reserved: for future use and alignment
+ * @reserved3: for future use and alignment
  * @data: &struct iwm_scan_channel_cfg_umac and
  *     &struct iwm_scan_req_umac_tail
  */
@@ -5311,21 +5533,40 @@
        uint32_t flags;
        uint32_t uid;
        uint32_t ooc_priority;
-       /* SCAN_GENERAL_PARAMS_API_S_VER_1 */
-       uint32_t general_flags;
-       uint8_t extended_dwell;
-       uint8_t active_dwell;
-       uint8_t passive_dwell;
-       uint8_t fragmented_dwell;
-       uint32_t max_out_time;
-       uint32_t suspend_time;
-       uint32_t scan_priority;
-       /* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
-       uint8_t channel_flags;
-       uint8_t n_channels;
-       uint16_t reserved;
-       uint8_t data[0];
-} __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */
+       uint16_t general_flags;
+       uint8_t reserved;
+       uint8_t scan_start_mac_id;
+       union {
+               struct {
+                       uint8_t extended_dwell;
+                       uint8_t active_dwell;
+                       uint8_t passive_dwell;
+                       uint8_t fragmented_dwell;
+                       uint32_t max_out_time;
+                       uint32_t suspend_time;
+                       uint32_t scan_priority;
+                       struct iwm_scan_umac_chan_param channel;
+                       uint8_t data[];
+               } v1;
+               struct {
+                       uint8_t active_dwell;
+                       uint8_t passive_dwell;
+                       uint8_t fragmented_dwell;
+                       uint8_t adwell_default_n_aps;
+                       uint8_t adwell_default_n_aps_social;
+                       uint8_t reserved3;
+                       uint16_t adwell_max_budget;
+                       uint32_t max_out_time[2];
+                       uint32_t suspend_time[2];
+                       uint32_t scan_priority;
+                       struct iwm_scan_umac_chan_param channel;
+                       uint8_t data[];
+               } v7;
+       };
+} __packed;
+
+#define IWM_SCAN_REQ_UMAC_SIZE_V7 48
+#define IWM_SCAN_REQ_UMAC_SIZE_V1 36

 /**
  * struct iwm_umac_scan_abort
@@ -5421,7 +5662,7 @@
        uint8_t last_channel;
        uint32_t tsf_low;
        uint32_t tsf_high;
-       struct iwm_scan_results_notif results[0];
+       struct iwm_scan_results_notif results[];
 } __packed; /* SCAN_ITER_COMPLETE_NTF_UMAC_API_S_VER_1 */

 /* Please keep this enum *SORTED* by hex value.
@@ -5606,7 +5847,7 @@
 #define IWM_STA_KEY_LEN_WEP104 (13)

 /**
- * struct iwm_mvm_keyinfo - key information
+ * struct iwm_keyinfo - key information
  * @key_flags: type %iwm_sta_key_flag
  * @tkip_rx_tsc_byte2: TSC[2] for key mix ph1 detection
  * @tkip_rx_ttak: 10-byte unicast TKIP TTAK for Rx
@@ -5616,7 +5857,7 @@
  * @hw_tkip_mic_rx_key: byte: MIC Rx Key - used for TKIP only
  * @hw_tkip_mic_tx_key: byte: MIC Tx Key - used for TKIP only
  */
-struct iwm_mvm_keyinfo {
+struct iwm_keyinfo {
        uint16_t key_flags;
        uint8_t tkip_rx_tsc_byte2;
        uint8_t reserved1;
@@ -5635,30 +5876,34 @@
 #define IWM_ADD_STA_BAID_SHIFT         8

 /**
- * struct iwm_mvm_add_sta_cmd - Add/modify a station in the fw's sta table.
+ * struct iwl_add_sta_cmd_v7 - Add/modify a station in the fw's sta table.
  * ( REPLY_ADD_STA = 0x18 )
- * @add_modify: 1: modify existing, 0: add new station
- * @awake_acs:
+ * @add_modify: see &enum iwl_sta_mode
+ * @awake_acs: ACs to transmit data on while station is sleeping (for U-APSD)
  * @tid_disable_tx: is tid BIT(tid) enabled for Tx. Clear BIT(x) to enable
- *     AMPDU for tid x. Set %IWM_STA_MODIFY_TID_DISABLE_TX to change this 
field.
- * @mac_id_n_color: the Mac context this station belongs to
- * @addr[IEEE80211_ADDR_LEN]: station's MAC address
+ *     AMPDU for tid x. Set %STA_MODIFY_TID_DISABLE_TX to change this field.
+ * @mac_id_n_color: the Mac context this station belongs to,
+ *     see &enum iwl_ctxt_id_and_color
+ * @addr: station's MAC address
+ * @reserved2: reserved
  * @sta_id: index of station in uCode's station table
- * @modify_mask: IWM_STA_MODIFY_*, selects which parameters to modify vs. leave
+ * @modify_mask: STA_MODIFY_*, selects which parameters to modify vs. leave
  *     alone. 1 - modify, 0 - don't change.
- * @station_flags: look at %iwm_sta_flags
- * @station_flags_msk: what of %station_flags have changed
+ * @reserved3: reserved
+ * @station_flags: look at &enum iwl_sta_flags
+ * @station_flags_msk: what of %station_flags have changed,
+ *     also &enum iwl_sta_flags
  * @add_immediate_ba_tid: tid for which to add block-ack support (Rx)
- *     Set %IWM_STA_MODIFY_ADD_BA_TID to use this field, and also set
+ *     Set %STA_MODIFY_ADD_BA_TID to use this field, and also set
  *     add_immediate_ba_ssn.
  * @remove_immediate_ba_tid: tid for which to remove block-ack support (Rx)
- *     Set %IWM_STA_MODIFY_REMOVE_BA_TID to use this field
+ *     Set %STA_MODIFY_REMOVE_BA_TID to use this field
  * @add_immediate_ba_ssn: ssn for the Rx block-ack session. Used together with
  *     add_immediate_ba_tid.
  * @sleep_tx_count: number of packets to transmit to station even though it is
  *     asleep. Used to synchronise PS-poll and u-APSD responses while ucode
  *     keeps track of STA sleep state.
- * @sleep_state_flags: Look at %iwm_sta_sleep_flag.
+ * @sleep_state_flags: Look at &enum iwl_sta_sleep_flag.
  * @assoc_id: assoc_id to be sent in VHT PLCP (9-bit), for grp use 0, for AP
  *     mac-addr.
  * @beamform_flags: beam forming controls
@@ -5666,12 +5911,12 @@
  *
  * The device contains an internal table of per-station information, with info
  * on security keys, aggregation parameters, and Tx rates for initial Tx
- * attempt and any retries (set by IWM_REPLY_TX_LINK_QUALITY_CMD).
+ * attempt and any retries (set by REPLY_TX_LINK_QUALITY_CMD).
  *
  * ADD_STA sets up the table entry for one station, either creating a new
  * entry, or modifying a pre-existing one.
  */
-struct iwm_mvm_add_sta_cmd {
+struct iwm_add_sta_cmd_v7 {
        uint8_t add_modify;
        uint8_t awake_acs;
        uint16_t tid_disable_tx;
@@ -5694,7 +5939,98 @@
 } __packed; /* ADD_STA_CMD_API_S_VER_7 */

 /**
- * struct iwm_mvm_add_sta_key_cmd - add/modify sta key
+ * enum iwm_sta_type - FW station types
+ * ( REPLY_ADD_STA = 0x18 )
+ * @IWM_STA_LINK: Link station - normal RX and TX traffic.
+ * @IWM_STA_GENERAL_PURPOSE: General purpose. In AP mode used for beacons
+ *     and probe responses.
+ * @IWM_STA_MULTICAST: multicast traffic,
+ * @IWM_STA_TDLS_LINK: TDLS link station
+ * @IWM_STA_AUX_ACTIVITY: auxilary station (scan, ROC and so on).
+ */
+enum iwm_sta_type {
+       IWM_STA_LINK,
+       IWM_STA_GENERAL_PURPOSE,
+       IWM_STA_MULTICAST,
+       IWM_STA_TDLS_LINK,
+       IWM_STA_AUX_ACTIVITY,
+};
+
+/**
+ * struct iwm_add_sta_cmd - Add/modify a station in the fw's sta table.
+ * ( REPLY_ADD_STA = 0x18 )
+ * @add_modify: see &enum iwm_sta_mode
+ * @awake_acs: ACs to transmit data on while station is sleeping (for U-APSD)
+ * @tid_disable_tx: is tid BIT(tid) enabled for Tx. Clear BIT(x) to enable
+ *     AMPDU for tid x. Set %STA_MODIFY_TID_DISABLE_TX to change this field.
+ * @mac_id_n_color: the Mac context this station belongs to,
+ *     see &enum iwl_ctxt_id_and_color
+ * @addr: station's MAC address
+ * @reserved2: reserved
+ * @sta_id: index of station in uCode's station table
+ * @modify_mask: STA_MODIFY_*, selects which parameters to modify vs. leave
+ *     alone. 1 - modify, 0 - don't change.
+ * @reserved3: reserved
+ * @station_flags: look at &enum iwm_sta_flags
+ * @station_flags_msk: what of %station_flags have changed,
+ *     also &enum iwm_sta_flags
+ * @add_immediate_ba_tid: tid for which to add block-ack support (Rx)
+ *     Set %STA_MODIFY_ADD_BA_TID to use this field, and also set
+ *     add_immediate_ba_ssn.
+ * @remove_immediate_ba_tid: tid for which to remove block-ack support (Rx)
+ *     Set %STA_MODIFY_REMOVE_BA_TID to use this field
+ * @add_immediate_ba_ssn: ssn for the Rx block-ack session. Used together with
+ *     add_immediate_ba_tid.
+ * @sleep_tx_count: number of packets to transmit to station even though it is
+ *     asleep. Used to synchronise PS-poll and u-APSD responses while ucode
+ *     keeps track of STA sleep state.
+ * @station_type: type of this station. See &enum iwl_sta_type.
+ * @sleep_state_flags: Look at &enum iwl_sta_sleep_flag.
+ * @assoc_id: assoc_id to be sent in VHT PLCP (9-bit), for grp use 0, for AP
+ *     mac-addr.
+ * @beamform_flags: beam forming controls
+ * @tfd_queue_msk: tfd queues used by this station.
+ *     Obselete for new TX API (9 and above).
+ * @rx_ba_window: aggregation window size
+ * @sp_length: the size of the SP in actual number of frames
+ * @uapsd_acs:  4 LS bits are trigger enabled ACs, 4 MS bits are the deliver
+ *     enabled ACs.
+ *
+ * The device contains an internal table of per-station information, with info
+ * on security keys, aggregation parameters, and Tx rates for initial Tx
+ * attempt and any retries (set by REPLY_TX_LINK_QUALITY_CMD).
+ *
+ * ADD_STA sets up the table entry for one station, either creating a new
+ * entry, or modifying a pre-existing one.
+ */
+struct iwm_add_sta_cmd {
+       uint8_t add_modify;
+       uint8_t awake_acs;
+       uint16_t tid_disable_tx;
+       uint32_t mac_id_n_color;
+       uint8_t addr[IEEE80211_ADDR_LEN]; /* _STA_ID_MODIFY_INFO_API_S_VER_1 */
+       uint16_t reserved2;
+       uint8_t sta_id;
+       uint8_t modify_mask;
+       uint16_t reserved3;
+       uint32_t station_flags;
+       uint32_t station_flags_msk;
+       uint8_t add_immediate_ba_tid;
+       uint8_t remove_immediate_ba_tid;
+       uint16_t add_immediate_ba_ssn;
+       uint16_t sleep_tx_count;
+       uint8_t sleep_state_flags;
+       uint8_t station_type;
+       uint16_t assoc_id;
+       uint16_t beamform_flags;
+       uint32_t tfd_queue_msk;
+       uint16_t rx_ba_window;
+       uint8_t sp_length;
+       uint8_t uapsd_acs;
+} __packed; /* ADD_STA_CMD_API_S_VER_10 */
+
+/**
+ * struct iwm_add_sta_key_cmd - add/modify sta key
  * ( IWM_REPLY_ADD_STA_KEY = 0x17 )
  * @sta_id: index of station in uCode's station table
  * @key_offset: key offset in key storage
@@ -5705,7 +6041,7 @@
  * @tkip_rx_tsc_byte2: TSC[2] for key mix ph1 detection
  * @tkip_rx_ttak: 10-byte unicast TKIP TTAK for Rx
  */
-struct iwm_mvm_add_sta_key_cmd {
+struct iwm_add_sta_key_cmd {
        uint8_t sta_id;
        uint8_t key_offset;
        uint16_t key_flags;
@@ -5718,14 +6054,14 @@
 } __packed; /* IWM_ADD_MODIFY_STA_KEY_API_S_VER_1 */

 /**
- * enum iwm_mvm_add_sta_rsp_status - status in the response to ADD_STA command
+ * enum iwm_add_sta_rsp_status - status in the response to ADD_STA command
  * @IWM_ADD_STA_SUCCESS: operation was executed successfully
  * @IWM_ADD_STA_STATIONS_OVERLOAD: no room left in the fw's station table
  * @IWM_ADD_STA_IMMEDIATE_BA_FAILURE: can't add Rx block ack session
  * @IWM_ADD_STA_MODIFY_NON_EXISTING_STA: driver requested to modify a station
  *     that doesn't exist.
  */
-enum iwm_mvm_add_sta_rsp_status {
+enum iwm_add_sta_rsp_status {
        IWM_ADD_STA_SUCCESS                     = 0x1,
        IWM_ADD_STA_STATIONS_OVERLOAD           = 0x2,
        IWM_ADD_STA_IMMEDIATE_BA_FAILURE        = 0x4,
@@ -5733,17 +6069,17 @@
 };

 /**
- * struct iwm_mvm_rm_sta_cmd - Add / modify a station in the fw's station table
+ * struct iwm_rm_sta_cmd - Add / modify a station in the fw's station table
  * ( IWM_REMOVE_STA = 0x19 )
  * @sta_id: the station id of the station to be removed
  */
-struct iwm_mvm_rm_sta_cmd {
+struct iwm_rm_sta_cmd {
        uint8_t sta_id;
        uint8_t reserved[3];
 } __packed; /* IWM_REMOVE_STA_CMD_API_S_VER_2 */

 /**
- * struct iwm_mvm_mgmt_mcast_key_cmd
+ * struct iwm_mgmt_mcast_key_cmd
  * ( IWM_MGMT_MCAST_KEY = 0x1f )
  * @ctrl_flags: %iwm_sta_key_flag
  * @IGTK:
@@ -5753,7 +6089,7 @@
  * @key_id:
  * @receive_seq_cnt: initial RSC/PN needed for replay check
  */
-struct iwm_mvm_mgmt_mcast_key_cmd {
+struct iwm_mgmt_mcast_key_cmd {
        uint32_t ctrl_flags;
        uint8_t IGTK[16];
        uint8_t K1[16];
@@ -5763,7 +6099,7 @@
        uint64_t receive_seq_cnt;
 } __packed; /* SEC_MGMT_MULTICAST_KEY_CMD_API_S_VER_1 */

-struct iwm_mvm_wep_key {
+struct iwm_wep_key {
        uint8_t key_index;
        uint8_t key_offset;
        uint16_t reserved1;
@@ -5772,13 +6108,13 @@
        uint8_t key[16];
 } __packed;

-struct iwm_mvm_wep_key_cmd {
+struct iwm_wep_key_cmd {
        uint32_t mac_id_n_color;
        uint8_t num_keys;
        uint8_t decryption_type;
        uint8_t flags;
        uint8_t reserved;
-       struct iwm_mvm_wep_key wep_key[0];
+       struct iwm_wep_key wep_key[0];
 } __packed; /* SEC_CURR_WEP_KEY_CMD_API_S_VER_2 */

 /*
@@ -6088,7 +6424,7 @@
         */
        uint32_t len_n_flags;
        struct iwm_cmd_header hdr;
-       uint8_t data[0];
+       uint8_t data[];
 } __packed;

 #define        IWM_FH_RSCSR_FRAME_SIZE_MSK     0x00003fff
diff --git 
a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmvar.h 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmvar.h
index c660a07..a2452b1 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmvar.h
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm/if_iwmvar.h
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_iwmvar.h,v 1.7 2015/03/02 13:51:10 jsg Exp $       */
-/*     $FreeBSD: releng/12.0/sys/dev/iwm/if_iwmvar.h 321509 2017-07-26 
05:40:52Z adrian $ */
+/*     $FreeBSD$ */

 /*
  * Copyright (c) 2014 genua mbh <info@xxxxxxxx>
@@ -113,7 +113,7 @@
        uint16_t        wr_chan_flags;
        int8_t          wr_dbm_antsignal;
        int8_t          wr_dbm_antnoise;
-} __packed;
+} __packed __aligned(8);
 
 #define IWM_RX_RADIOTAP_PRESENT                                                
\
        ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
@@ -165,20 +165,6 @@
        uint8_t enabled_capa[howmany(IWM_NUM_UCODE_TLV_CAPA, NBBY)];
 };

-static inline int
-fw_has_api(const struct iwm_ucode_capabilities *capabilities,
-          unsigned int api)
-{
-       return isset(capabilities->enabled_api, api);
-}
-
-static inline int
-fw_has_capa(const struct iwm_ucode_capabilities *capabilities,
-           unsigned int capa)
-{
-       return isset(capabilities->enabled_capa, capa);
-}
-
 /* one for each uCode image (inst/data, init/runtime/wowlan) */
 struct iwm_fw_desc {
        const void *data;       /* vmalloc'ed data */
@@ -299,11 +285,12 @@
        int                     cur;
 };

-#define IWM_RX_RING_COUNT      256
-/* Linux driver optionally uses 8k buffer */
+#define IWM_RX_LEGACY_RING_COUNT       256
+#define IWM_RX_MQ_RING_COUNT           512
+
 #define IWM_RBUF_SIZE          4096

-#define        IWM_MAX_SCATTER         20
+#define IWM_MAX_SCATTER                20

 struct iwm_rx_data {
        struct mbuf     *m;
@@ -311,12 +298,13 @@
 };

 struct iwm_rx_ring {
-       struct iwm_dma_info     desc_dma;
+       struct iwm_dma_info     free_desc_dma;
+       struct iwm_dma_info     used_desc_dma;
        struct iwm_dma_info     stat_dma;
        struct iwm_dma_info     buf_dma;
-       uint32_t                *desc;
+       void                    *desc;
        struct iwm_rb_status    *stat;
-       struct iwm_rx_data      data[IWM_RX_RING_COUNT];
+       struct iwm_rx_data      data[512];
        bus_dmamap_t            spare_map;      /* for iwm_rx_addbuf() */
        bus_dma_tag_t           data_dmat;
        int                     cur;
@@ -324,8 +312,8 @@

 #define IWM_CMD_RESP_MAX PAGE_SIZE

-#define IWM_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS 500
-#define IWM_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS 400
+#define IWM_TE_SESSION_PROTECTION_MAX_TIME_MS 500
+#define IWM_TE_SESSION_PROTECTION_MIN_TIME_MS 400

 /*
  * Command headers are in iwl-trans.h, which is full of all
@@ -348,7 +336,7 @@
        uint32_t tfd_queue_msk;
 };

-struct iwm_mvm_phy_ctxt {
+struct iwm_phy_ctxt {
        uint16_t id;
        uint16_t color;
        uint32_t ref;
@@ -370,7 +358,7 @@
        int                     (*iv_newstate)(struct ieee80211vap *,
                                    enum ieee80211_state, int);

-       struct iwm_mvm_phy_ctxt *phy_ctxt;
+       struct iwm_phy_ctxt     *phy_ctxt;

        uint16_t                id;
        uint16_t                color;
@@ -455,12 +443,10 @@
        uint32_t                scd_base_addr;

        /* TX/RX rings. */
-       struct iwm_tx_ring      txq[IWM_MVM_MAX_QUEUES];
+       struct iwm_tx_ring      txq[IWM_MAX_QUEUES];
        struct iwm_rx_ring      rxq;
        int                     qfullmsk;

-       int                     sc_sf_state;
-
        /* ICT table. */
        struct iwm_dma_info     ict_dma;
        int                     ict_cur;
@@ -521,13 +507,11 @@
        struct iwm_int_sta      sc_aux_sta;

        /* phy contexts.  we only use the first one */
-       struct iwm_mvm_phy_ctxt sc_phyctxt[IWM_NUM_PHY_CTX];
+       struct iwm_phy_ctxt     sc_phyctxt[IWM_NUM_PHY_CTX];

        struct iwm_notif_statistics_v10 sc_stats;
        int                     sc_noise;
 
-       caddr_t                 sc_drvbpf;
-
        struct iwm_rx_radiotap_header sc_rxtap;
        struct iwm_tx_radiotap_header sc_txtap;

@@ -585,3 +569,15 @@
 #define        IWM_LOCK(_sc)           mtx_lock(&(_sc)->sc_mtx)
 #define        IWM_UNLOCK(_sc)         mtx_unlock(&(_sc)->sc_mtx)
 #define IWM_LOCK_DESTROY(_sc)  mtx_destroy(&(_sc)->sc_mtx)
+
+static inline bool
+iwm_fw_has_api(struct iwm_softc *sc, unsigned int api)
+{
+       return isset(sc->sc_fw.ucode_capa.enabled_api, api);
+}
+
+static inline bool
+iwm_fw_has_capa(struct iwm_softc *sc, unsigned int capa)
+{
+       return isset(sc->sc_fw.ucode_capa.enabled_capa, capa);
+}
diff --git a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c 
b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c
index a221c12..258f226 100644
--- a/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c
+++ b/src/add-ons/kernel/drivers/network/wlan/idualwifi7260/glue.c
@@ -34,6 +34,8 @@
        {"iwm7265Dfw", "iwm-7265D-22.ucode"},
        {"iwm8000Cfw", "iwm-8000C-22.ucode"},
        {"iwm8265fw", "iwm-8265-22.ucode"},
+       {"iwm9000fw", "iwm-9000-34.ucode"},
+       {"iwm9260fw", "iwm-9260-34.ucode"},
 });



--
To view, visit https://review.haiku-os.org/c/haiku/+/2733
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I43385e91b91201732397b79c38bd9bb4f3a18f1b
Gerrit-Change-Number: 2733
Gerrit-PatchSet: 1
Gerrit-Owner: waddlesplash <waddlesplash@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: idualwifi7260: Port changes from newer FreeBSD. - Gerrit