diff options
author | Stefan Sperling <stsp@cvs.openbsd.org> | 2021-06-01 18:03:57 +0000 |
---|---|---|
committer | Stefan Sperling <stsp@cvs.openbsd.org> | 2021-06-01 18:03:57 +0000 |
commit | 8577b10f1b2943b1d657a39d89dd024bb1e21954 (patch) | |
tree | 372d924d135c94953a9e85dc52c0cf0498f563be | |
parent | 30058e2e2e599c3a4823fbf5f5dd9a6d8c466475 (diff) |
Revert iwm(4) firmware updates for now; robert@ reports stalled Tx on 9260
-rw-r--r-- | sys/dev/pci/if_iwm.c | 569 | ||||
-rw-r--r-- | sys/dev/pci/if_iwmreg.h | 268 | ||||
-rw-r--r-- | sys/dev/pci/if_iwmvar.h | 9 |
3 files changed, 108 insertions, 738 deletions
diff --git a/sys/dev/pci/if_iwm.c b/sys/dev/pci/if_iwm.c index e39658af20a..180f46391f1 100644 --- a/sys/dev/pci/if_iwm.c +++ b/sys/dev/pci/if_iwm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwm.c,v 1.327 2021/06/01 13:21:08 stsp Exp $ */ +/* $OpenBSD: if_iwm.c,v 1.328 2021/06/01 18:03:56 stsp Exp $ */ /* * Copyright (c) 2014, 2016 genua gmbh <info@genua.de> @@ -253,11 +253,8 @@ int iwm_firmware_store_section(struct iwm_softc *, enum iwm_ucode_type, uint8_t *, size_t); int iwm_set_default_calib(struct iwm_softc *, const void *); void iwm_fw_info_free(struct iwm_fw_info *); -void iwm_fw_version_str(char *, size_t, uint32_t, uint32_t, uint32_t); int iwm_read_firmware(struct iwm_softc *, enum iwm_ucode_type); -uint32_t iwm_read_prph_unlocked(struct iwm_softc *, uint32_t); uint32_t iwm_read_prph(struct iwm_softc *, uint32_t); -void iwm_write_prph_unlocked(struct iwm_softc *, uint32_t, uint32_t); void iwm_write_prph(struct iwm_softc *, uint32_t, uint32_t); int iwm_read_mem(struct iwm_softc *, uint32_t, void *, int); int iwm_write_mem(struct iwm_softc *, uint32_t, const void *, int); @@ -295,7 +292,6 @@ void iwm_apm_stop(struct iwm_softc *); int iwm_allow_mcast(struct iwm_softc *); void iwm_init_msix_hw(struct iwm_softc *); void iwm_conf_msix_hw(struct iwm_softc *, int); -int iwm_clear_persistence_bit(struct iwm_softc *); int iwm_start_hw(struct iwm_softc *); void iwm_stop_device(struct iwm_softc *); void iwm_nic_config(struct iwm_softc *); @@ -406,8 +402,6 @@ void iwm_rx_compressed_ba(struct iwm_softc *, struct iwm_rx_packet *, void iwm_rx_bmiss(struct iwm_softc *, struct iwm_rx_packet *, struct iwm_rx_data *); int iwm_binding_cmd(struct iwm_softc *, struct iwm_node *, uint32_t); -int iwm_phy_ctxt_cmd_uhb(struct iwm_softc *, struct iwm_phy_ctxt *, uint8_t, - uint8_t, uint32_t, uint32_t); void iwm_phy_ctxt_cmd_hdr(struct iwm_softc *, struct iwm_phy_ctxt *, struct iwm_phy_context_cmd *, uint32_t, uint32_t); void iwm_phy_ctxt_cmd_data(struct iwm_softc *, struct iwm_phy_context_cmd *, @@ -460,7 +454,6 @@ int iwm_fill_probe_req(struct iwm_softc *, struct iwm_scan_probe_req *); int iwm_lmac_scan(struct iwm_softc *, int); int iwm_config_umac_scan(struct iwm_softc *); int iwm_umac_scan(struct iwm_softc *, int); -void iwm_mcc_update(struct iwm_softc *, struct iwm_mcc_chub_notif *); uint8_t iwm_ridx2rate(struct ieee80211_rateset *, int); int iwm_rval2ridx(int); void iwm_ack_rates(struct iwm_softc *, struct iwm_node *, int *, int *); @@ -477,8 +470,6 @@ int iwm_bgscan(struct ieee80211com *); int iwm_umac_scan_abort(struct iwm_softc *); int iwm_lmac_scan_abort(struct iwm_softc *); int iwm_scan_abort(struct iwm_softc *); -int iwm_phy_ctxt_update(struct iwm_softc *, struct iwm_phy_ctxt *, - struct ieee80211_channel *, uint8_t, uint8_t, uint32_t); int iwm_auth(struct iwm_softc *); int iwm_deauth(struct iwm_softc *); int iwm_assoc(struct iwm_softc *); @@ -504,9 +495,7 @@ void iwm_fill_sf_command(struct iwm_softc *, struct iwm_sf_cfg_cmd *, struct ieee80211_node *); int iwm_sf_config(struct iwm_softc *, int); int iwm_send_bt_init_conf(struct iwm_softc *); -int iwm_send_soc_conf(struct iwm_softc *); int iwm_send_update_mcc_cmd(struct iwm_softc *, const char *); -int iwm_send_temp_report_ths_cmd(struct iwm_softc *); void iwm_tt_tx_backoff(struct iwm_softc *, uint32_t); void iwm_free_fw_paging(struct iwm_softc *); int iwm_save_fw_paging(struct iwm_softc *, const struct iwm_fw_sects *); @@ -557,21 +546,6 @@ int iwm_resume(struct iwm_softc *); void iwm_radiotap_attach(struct iwm_softc *); #endif -uint8_t -iwm_lookup_cmd_ver(struct iwm_softc *sc, uint8_t grp, uint8_t cmd) -{ - const struct iwm_fw_cmd_version *entry; - int i; - - for (i = 0; i < sc->n_cmd_versions; i++) { - entry = &sc->cmd_versions[i]; - if (entry->group == grp && entry->cmd == cmd) - return entry->cmd_ver; - } - - return IWM_FW_CMD_VER_UNKNOWN; -} - int iwm_is_mimo_ht_plcp(uint8_t ht_plcp) { @@ -667,20 +641,6 @@ iwm_fw_info_free(struct iwm_fw_info *fw) /* don't touch fw->fw_status */ memset(fw->fw_sects, 0, sizeof(fw->fw_sects)); } - -void -iwm_fw_version_str(char *buf, size_t bufsize, - uint32_t major, uint32_t minor, uint32_t api) -{ - /* - * Starting with major version 35 the Linux driver prints the minor - * version in hexadecimal. - */ - if (major >= 35) - snprintf(buf, bufsize, "%u.%08x.%u", major, minor, api); - else - snprintf(buf, bufsize, "%u.%u.%u", major, minor, api); -} int iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) @@ -717,8 +677,7 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) sc->sc_capaflags = 0; sc->sc_capa_n_scan_channels = IWM_DEFAULT_SCAN_CHANNELS; memset(sc->sc_enabled_capa, 0, sizeof(sc->sc_enabled_capa)); - memset(sc->sc_ucode_api, 0, sizeof(sc->sc_ucode_api)); - sc->n_cmd_versions = 0; + memset(sc->sc_fw_mcc, 0, sizeof(sc->sc_fw_mcc)); uhdr = (void *)fw->fw_rawdata; if (*(uint32_t *)fw->fw_rawdata != 0 @@ -729,11 +688,10 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) goto out; } - iwm_fw_version_str(sc->sc_fwver, sizeof(sc->sc_fwver), + snprintf(sc->sc_fwver, sizeof(sc->sc_fwver), "%d.%d (API ver %d)", IWM_UCODE_MAJOR(le32toh(uhdr->ver)), IWM_UCODE_MINOR(le32toh(uhdr->ver)), IWM_UCODE_API(le32toh(uhdr->ver))); - data = uhdr->data; len = fw->fw_rawsize - sizeof(*uhdr); @@ -889,23 +847,7 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) break; } - case IWM_UCODE_TLV_CMD_VERSIONS: - if (tlv_len % sizeof(struct iwm_fw_cmd_version)) { - tlv_len /= sizeof(struct iwm_fw_cmd_version); - tlv_len *= sizeof(struct iwm_fw_cmd_version); - } - if (sc->n_cmd_versions != 0) { - err = EINVAL; - goto parse_out; - } - if (tlv_len > sizeof(sc->cmd_versions)) { - err = EINVAL; - goto parse_out; - } - memcpy(&sc->cmd_versions[0], tlv_data, tlv_len); - sc->n_cmd_versions = tlv_len / sizeof(struct iwm_fw_cmd_version); - break; - + case 48: /* undocumented TLV */ case IWM_UCODE_TLV_SDIO_ADMA_ADDR: case IWM_UCODE_TLV_FW_GSCAN_CAPA: /* ignore, not used by current driver */ @@ -968,8 +910,8 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) err = EINVAL; goto parse_out; } - - iwm_fw_version_str(sc->sc_fwver, sizeof(sc->sc_fwver), + snprintf(sc->sc_fwver, sizeof(sc->sc_fwver), + "%u.%u.%u", le32toh(((uint32_t *)tlv_data)[0]), le32toh(((uint32_t *)tlv_data)[1]), le32toh(((uint32_t *)tlv_data)[2])); @@ -977,26 +919,11 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) case IWM_UCODE_TLV_FW_DBG_DEST: case IWM_UCODE_TLV_FW_DBG_CONF: - case IWM_UCODE_TLV_UMAC_DEBUG_ADDRS: - case IWM_UCODE_TLV_LMAC_DEBUG_ADDRS: - case IWM_UCODE_TLV_TYPE_DEBUG_INFO: - case IWM_UCODE_TLV_TYPE_BUFFER_ALLOCATION: - case IWM_UCODE_TLV_TYPE_HCMD: - case IWM_UCODE_TLV_TYPE_REGIONS: - case IWM_UCODE_TLV_TYPE_TRIGGERS: - break; - - case IWM_UCODE_TLV_HW_TYPE: break; case IWM_UCODE_TLV_FW_MEM_SEG: break; - /* undocumented TLVs found in iwm-9000-43 image */ - case 0x1000003: - case 0x1000004: - break; - default: err = EINVAL; goto parse_out; @@ -1027,24 +954,19 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) } uint32_t -iwm_read_prph_unlocked(struct iwm_softc *sc, uint32_t addr) +iwm_read_prph(struct iwm_softc *sc, uint32_t addr) { + iwm_nic_assert_locked(sc); IWM_WRITE(sc, IWM_HBUS_TARG_PRPH_RADDR, ((addr & 0x000fffff) | (3 << 24))); IWM_BARRIER_READ_WRITE(sc); return IWM_READ(sc, IWM_HBUS_TARG_PRPH_RDAT); } -uint32_t -iwm_read_prph(struct iwm_softc *sc, uint32_t addr) -{ - iwm_nic_assert_locked(sc); - return iwm_read_prph_unlocked(sc, addr); -} - void -iwm_write_prph_unlocked(struct iwm_softc *sc, uint32_t addr, uint32_t val) +iwm_write_prph(struct iwm_softc *sc, uint32_t addr, uint32_t val) { + iwm_nic_assert_locked(sc); IWM_WRITE(sc, IWM_HBUS_TARG_PRPH_WADDR, ((addr & 0x000fffff) | (3 << 24))); IWM_BARRIER_WRITE(sc); @@ -1052,13 +974,6 @@ iwm_write_prph_unlocked(struct iwm_softc *sc, uint32_t addr, uint32_t val) } void -iwm_write_prph(struct iwm_softc *sc, uint32_t addr, uint32_t val) -{ - iwm_nic_assert_locked(sc); - iwm_write_prph_unlocked(sc, addr, val); -} - -void iwm_write_prph64(struct iwm_softc *sc, uint64_t addr, uint64_t val) { iwm_write_prph(sc, (uint32_t)addr, val & 0xffffffff); @@ -1995,26 +1910,6 @@ iwm_conf_msix_hw(struct iwm_softc *sc, int stopped) } int -iwm_clear_persistence_bit(struct iwm_softc *sc) -{ - uint32_t hpm, wprot; - - hpm = iwm_read_prph_unlocked(sc, IWM_HPM_DEBUG); - if (hpm != 0xa5a5a5a0 && (hpm & IWM_HPM_PERSISTENCE_BIT)) { - wprot = iwm_read_prph_unlocked(sc, IWM_PREG_PRPH_WPROT_9000); - if (wprot & IWM_PREG_WFPM_ACCESS) { - printf("%s: cannot clear persistence bit\n", - DEVNAME(sc)); - return EPERM; - } - iwm_write_prph_unlocked(sc, IWM_HPM_DEBUG, - hpm & ~IWM_HPM_PERSISTENCE_BIT); - } - - return 0; -} - -int iwm_start_hw(struct iwm_softc *sc) { int err; @@ -2023,12 +1918,6 @@ iwm_start_hw(struct iwm_softc *sc) if (err) return err; - if (sc->sc_device_family == IWM_DEVICE_FAMILY_9000) { - err = iwm_clear_persistence_bit(sc); - if (err) - return err; - } - /* Reset the entire device */ IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET); DELAY(5000); @@ -5771,7 +5660,6 @@ iwm_binding_cmd(struct iwm_softc *sc, struct iwm_node *in, uint32_t action) uint32_t mac_id = IWM_FW_CMD_ID_AND_COLOR(in->in_id, in->in_color); int i, err, active = (sc->sc_flags & IWM_FLAG_BINDING_ACTIVE); uint32_t status; - size_t len; if (action == IWM_FW_CTXT_ACTION_ADD && active) panic("binding already added"); @@ -5792,19 +5680,9 @@ iwm_binding_cmd(struct iwm_softc *sc, struct iwm_node *in, uint32_t action) for (i = 1; i < IWM_MAX_MACS_IN_BINDING; i++) cmd.macs[i] = htole32(IWM_FW_CTXT_INVALID); - if (IEEE80211_IS_CHAN_2GHZ(phyctxt->channel) || - !isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_CDB_SUPPORT)) - cmd.lmac_id = htole32(IWM_LMAC_24G_INDEX); - else - cmd.lmac_id = htole32(IWM_LMAC_5G_INDEX); - - if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT)) - len = sizeof(cmd); - else - len = sizeof(struct iwm_binding_cmd_v1); status = 0; - err = iwm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD, len, &cmd, - &status); + err = iwm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD, + sizeof(cmd), &cmd, &status); if (err == 0 && status != 0) err = EIO; @@ -5851,57 +5729,12 @@ iwm_phy_ctxt_cmd_data(struct iwm_softc *sc, struct iwm_phy_context_cmd *cmd, } int -iwm_phy_ctxt_cmd_uhb(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt, - uint8_t chains_static, uint8_t chains_dynamic, uint32_t action, - uint32_t apply_time) -{ - struct ieee80211com *ic = &sc->sc_ic; - struct iwm_phy_context_cmd_uhb cmd; - uint8_t active_cnt, idle_cnt; - struct ieee80211_channel *chan = ctxt->channel; - - memset(&cmd, 0, sizeof(cmd)); - cmd.id_and_color = htole32(IWM_FW_CMD_ID_AND_COLOR(ctxt->id, - ctxt->color)); - cmd.action = htole32(action); - cmd.apply_time = htole32(apply_time); - - cmd.ci.band = IEEE80211_IS_CHAN_2GHZ(chan) ? - IWM_PHY_BAND_24 : IWM_PHY_BAND_5; - cmd.ci.channel = htole32(ieee80211_chan2ieee(ic, chan)); - cmd.ci.width = IWM_PHY_VHT_CHANNEL_MODE20; - cmd.ci.ctrl_pos = IWM_PHY_VHT_CTRL_POS_1_BELOW; - - idle_cnt = chains_static; - active_cnt = chains_dynamic; - cmd.rxchain_info = htole32(iwm_fw_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_fw_valid_tx_ant(sc)); - - return iwm_send_cmd_pdu(sc, IWM_PHY_CONTEXT_CMD, 0, sizeof(cmd), &cmd); -} - -int iwm_phy_ctxt_cmd(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt, uint8_t chains_static, uint8_t chains_dynamic, uint32_t action, uint32_t apply_time) { struct iwm_phy_context_cmd cmd; - /* - * Intel increased the size of the fw_channel_info struct and neglected - * to bump the phy_context_cmd struct, which contains an fw_channel_info - * member in the middle. - * To keep things simple we use a separate function to handle the larger - * variant of the phy context command. - */ - if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS)) - return iwm_phy_ctxt_cmd_uhb(sc, ctxt, chains_static, - chains_dynamic, action, apply_time); - iwm_phy_ctxt_cmd_hdr(sc, ctxt, &cmd, action, apply_time); iwm_phy_ctxt_cmd_data(sc, &cmd, ctxt->channel, @@ -6287,8 +6120,6 @@ iwm_tx_fill_cmd(struct iwm_softc *sc, struct iwm_node *in, rinfo = &iwm_rates[ridx]; if (iwm_is_mimo_ht_plcp(rinfo->ht_plcp)) rate_flags = IWM_RATE_MCS_ANT_AB_MSK; - else if (sc->sc_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)) @@ -6594,8 +6425,8 @@ int iwm_flush_tx_path(struct iwm_softc *sc, int tfd_queue_msk) { struct iwm_tx_path_flush_cmd flush_cmd = { - .sta_id = htole32(IWM_STATION_ID), - .tid_mask = htole16(0xffff), + .queues_ctl = htole32(tfd_queue_msk), + .flush_ctl = htole16(IWM_DUMP_TX_FIFO_FLUSH), }; int err; @@ -7025,14 +6856,15 @@ iwm_flush_sta(struct iwm_softc *sc, struct iwm_node *in) goto done; } - /* - * Flushing Tx rings may fail if the AP has disappeared. - * We can rely on iwm_newstate_task() to reset everything and begin - * scanning again if we are left with outstanding frames on queues. - */ err = iwm_wait_tx_queues_empty(sc); - if (err) + if (err) { + printf("%s: Could not empty Tx queues (error %d)\n", + DEVNAME(sc), err); +#if 1 + iwm_dump_driver_status(sc); +#endif goto done; + } err = iwm_drain_sta(sc, in, 0); done: @@ -7118,12 +6950,7 @@ iwm_lmac_scan_fill_channels(struct iwm_softc *sc, chan->iter_count = htole16(1); chan->iter_interval = 0; chan->flags = htole32(IWM_UNIFIED_SCAN_CHANNEL_PARTIAL); - /* - * Firmware may become unresponsive when asked to send - * a directed probe request on a passive channel. - */ - if (n_ssids != 0 && !bgscan && - (c->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) + if (n_ssids != 0 && !bgscan) chan->flags |= htole32(1 << 1); /* select SSID 0 */ chan++; nchan++; @@ -7150,12 +6977,7 @@ iwm_umac_scan_fill_channels(struct iwm_softc *sc, chan->channel_num = ieee80211_mhz2ieee(c->ic_freq, 0); chan->iter_count = 1; chan->iter_interval = htole16(0); - /* - * Firmware may become unresponsive when asked to send - * a directed probe request on a passive channel. - */ - if (n_ssids != 0 && !bgscan && - (c->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) + if (n_ssids != 0 && !bgscan) chan->flags = htole32(1 << 0); /* select SSID 0 */ chan++; nchan++; @@ -7193,7 +7015,7 @@ iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq) memset(preq, 0, sizeof(*preq)); - if (remain < sizeof(*wh) + 2) + if (remain < sizeof(*wh) + 2 + ic->ic_des_esslen) return ENOBUFS; /* @@ -7210,15 +7032,12 @@ iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq) *(uint16_t *)&wh->i_seq[0] = 0; /* filled by HW */ frm = (uint8_t *)(wh + 1); + frm = ieee80211_add_ssid(frm, ic->ic_des_essid, ic->ic_des_esslen); - *frm++ = IEEE80211_ELEMID_SSID; - *frm++ = 0; - /* hardware inserts SSID */ - - /* Tell firmware where the MAC header and SSID IE are. */ + /* Tell the firmware where the MAC header is. */ preq->mac_header.offset = 0; preq->mac_header.len = htole16(frm - (uint8_t *)wh); - remain -= (frm - (uint8_t *)wh); + remain -= frm - (uint8_t *)wh; /* Fill in 2GHz IEs and tell firmware where they are. */ rs = &ic->ic_sup_rates[IEEE80211_MODE_11G]; @@ -7232,6 +7051,7 @@ iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq) frm = ieee80211_add_rates(frm, rs); if (rs->rs_nrates > IEEE80211_RATE_SIZE) frm = ieee80211_add_xrates(frm, rs); + preq->band_data[0].len = htole16(frm - pos); remain -= frm - pos; if (isset(sc->sc_enabled_capa, @@ -7243,7 +7063,6 @@ iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq) *frm++ = 0; remain -= 3; } - preq->band_data[0].len = htole16(frm - pos); if (sc->sc_nvm.sku_cap_band_52GHz_enable) { /* Fill in 5GHz IEs. */ @@ -7331,9 +7150,7 @@ iwm_lmac_scan(struct iwm_softc *sc, int bgscan) req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAG_PRE_CONNECTION); if (isset(sc->sc_enabled_capa, - IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT) && - isset(sc->sc_enabled_capa, - IWM_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT)) + IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT)) req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAGS_RRM_ENABLED); req->flags = htole32(IWM_PHY_BAND_24); @@ -7473,6 +7290,10 @@ iwm_umac_scan_size(struct iwm_softc *sc) base_size = IWM_SCAN_REQ_UMAC_SIZE_V8; else if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) base_size = IWM_SCAN_REQ_UMAC_SIZE_V7; +#ifdef notyet + else if (sc->sc_device_family >= IWM_DEVICE_FAMILY_22000) + base_size = IWM_SCAN_REQ_UMAC_SIZE_V6; +#endif if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER)) tail_size = sizeof(struct iwm_scan_req_umac_tail_v2); else @@ -7491,7 +7312,10 @@ iwm_get_scan_req_umac_chan_param(struct iwm_softc *sc, if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) return &req->v7.channel; - +#ifdef notyet + if (sc->sc_device_family >= IWM_DEVICE_FAMILY_22000) + return &req->v6.channel; +#endif return &req->v1.channel; } @@ -7503,7 +7327,10 @@ iwm_get_scan_req_umac_data(struct iwm_softc *sc, struct iwm_scan_req_umac *req) if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) return (void *)&req->v7.data; - +#ifdef notyet + if (sc->sc_device_family >= IWM_DEVICE_FAMILY_22000) + return (void *)&req->v6.data; +#endif return (void *)&req->v1.data; } @@ -7583,8 +7410,6 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan) req->v1.passive_dwell = 110; req->v1.fragmented_dwell = 44; req->v1.extended_dwell = 90; - - req->v1.scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH); } if (bgscan) { @@ -7603,6 +7428,7 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan) } } + req->v1.scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH); req->ooc_priority = htole32(IWM_SCAN_PRIORITY_HIGH); cmd_data = iwm_get_scan_req_umac_data(sc, req); @@ -7620,10 +7446,6 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan) req->general_flags = htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASS_ALL | IWM_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE); - if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2)) { - req->v8.general_flags2 = - IWM_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER; - } /* Check if we're doing an active directed scan. */ if (ic->ic_des_esslen != 0) { @@ -7644,9 +7466,7 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan) req->general_flags |= htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASSIVE); if (isset(sc->sc_enabled_capa, - IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT) && - isset(sc->sc_enabled_capa, - IWM_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT)) + IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT)) req->general_flags |= htole32(IWM_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED); @@ -7676,24 +7496,6 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan) return err; } -void -iwm_mcc_update(struct iwm_softc *sc, struct iwm_mcc_chub_notif *notif) -{ - struct ieee80211com *ic = &sc->sc_ic; - struct ifnet *ifp = IC2IFP(ic); - char alpha2[3]; - - snprintf(alpha2, sizeof(alpha2), "%c%c", - (le16toh(notif->mcc) & 0xff00) >> 8, le16toh(notif->mcc) & 0xff); - - if (ifp->if_flags & IFF_DEBUG) { - printf("%s: firmware has detected regulatory domain '%s' " - "(0x%x)\n", DEVNAME(sc), alpha2, le16toh(notif->mcc)); - } - - /* TODO: Schedule a task to send MCC_UPDATE_CMD? */ -} - uint8_t iwm_ridx2rate(struct ieee80211_rateset *rs, int ridx) { @@ -7965,7 +7767,7 @@ iwm_mac_ctxt_cmd(struct iwm_softc *sc, struct iwm_node *in, uint32_t action, int iwm_update_quotas(struct iwm_softc *sc, struct iwm_node *in, int running) { - struct iwm_time_quota_cmd_v1 cmd; + struct iwm_time_quota_cmd cmd; int i, idx, num_active_macs, quota, quota_rem; int colors[IWM_MAX_BINDINGS] = { -1, -1, -1, -1, }; int n_ifs[IWM_MAX_BINDINGS] = {0, }; @@ -8020,22 +7822,8 @@ iwm_update_quotas(struct iwm_softc *sc, struct iwm_node *in, int running) /* Give the remainder of the session to the first binding */ cmd.quotas[0].quota = htole32(le32toh(cmd.quotas[0].quota) + quota_rem); - if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_QUOTA_LOW_LATENCY)) { - struct iwm_time_quota_cmd cmd_v2; - - memset(&cmd_v2, 0, sizeof(cmd_v2)); - for (i = 0; i < IWM_MAX_BINDINGS; i++) { - cmd_v2.quotas[i].id_and_color = - cmd.quotas[i].id_and_color; - cmd_v2.quotas[i].quota = cmd.quotas[i].quota; - cmd_v2.quotas[i].max_duration = - cmd.quotas[i].max_duration; - } - return iwm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, 0, - sizeof(cmd_v2), &cmd_v2); - } - - return iwm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, 0, sizeof(cmd), &cmd); + return iwm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, 0, + sizeof(cmd), &cmd); } void @@ -8183,47 +7971,6 @@ iwm_scan_abort(struct iwm_softc *sc) } int -iwm_phy_ctxt_update(struct iwm_softc *sc, struct iwm_phy_ctxt *phyctxt, - struct ieee80211_channel *chan, uint8_t chains_static, - uint8_t chains_dynamic, uint32_t apply_time) -{ - uint16_t band_flags = (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_5GHZ); - int err; - - if (isset(sc->sc_enabled_capa, - IWM_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT) && - (phyctxt->channel->ic_flags & band_flags) != - (chan->ic_flags & band_flags)) { - err = iwm_phy_ctxt_cmd(sc, phyctxt, chains_static, - chains_dynamic, IWM_FW_CTXT_ACTION_REMOVE, apply_time); - if (err) { - printf("%s: could not remove PHY context " - "(error %d)\n", DEVNAME(sc), err); - return err; - } - phyctxt->channel = chan; - err = iwm_phy_ctxt_cmd(sc, phyctxt, chains_static, - chains_dynamic, IWM_FW_CTXT_ACTION_ADD, apply_time); - if (err) { - printf("%s: could not remove PHY context " - "(error %d)\n", DEVNAME(sc), err); - return err; - } - } else { - phyctxt->channel = chan; - err = iwm_phy_ctxt_cmd(sc, phyctxt, chains_static, - chains_dynamic, IWM_FW_CTXT_ACTION_MODIFY, apply_time); - if (err) { - printf("%s: could not update PHY context (error %d)\n", - DEVNAME(sc), err); - return err; - } - } - - return 0; -} - -int iwm_auth(struct iwm_softc *sc) { struct ieee80211com *ic = &sc->sc_ic; @@ -8233,16 +7980,16 @@ iwm_auth(struct iwm_softc *sc) splassert(IPL_NET); - if (ic->ic_opmode == IEEE80211_M_MONITOR) { - err = iwm_phy_ctxt_update(sc, &sc->sc_phyctxt[0], - ic->ic_ibss_chan, 1, 1, 0); - if (err) - return err; - } else { - err = iwm_phy_ctxt_update(sc, &sc->sc_phyctxt[0], - in->in_ni.ni_chan, 1, 1, 0); - if (err) - return err; + if (ic->ic_opmode == IEEE80211_M_MONITOR) + sc->sc_phyctxt[0].channel = ic->ic_ibss_chan; + else + sc->sc_phyctxt[0].channel = in->in_ni.ni_chan; + err = iwm_phy_ctxt_cmd(sc, &sc->sc_phyctxt[0], 1, 1, + IWM_FW_CTXT_ACTION_MODIFY, 0); + if (err) { + printf("%s: could not update PHY context (error %d)\n", + DEVNAME(sc), err); + return err; } in->in_phyctxt = &sc->sc_phyctxt[0]; @@ -8350,12 +8097,6 @@ iwm_deauth(struct iwm_softc *sc) sc->sc_flags &= ~IWM_FLAG_MAC_ACTIVE; } - /* Move unused PHY context to a default channel. */ - err = iwm_phy_ctxt_update(sc, &sc->sc_phyctxt[0], - &ic->ic_channels[1], 1, 1, 0); - if (err) - return err; - return 0; } @@ -8433,10 +8174,11 @@ iwm_run(struct iwm_softc *sc) if ((ic->ic_opmode == IEEE80211_M_MONITOR || (in->in_ni.ni_flags & IEEE80211_NODE_HT)) && iwm_mimo_enabled(sc)) { - err = iwm_phy_ctxt_update(sc, &sc->sc_phyctxt[0], - in->in_ni.ni_chan, 2, 2, 0); + err = iwm_phy_ctxt_cmd(sc, &sc->sc_phyctxt[0], + 2, 2, IWM_FW_CTXT_ACTION_MODIFY, 0); if (err) { - printf("%s: failed to update PHY\n", DEVNAME(sc)); + printf("%s: failed to update PHY\n", + DEVNAME(sc)); return err; } } @@ -8496,13 +8238,11 @@ iwm_run(struct iwm_softc *sc) return err; } - if (!isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_DYNAMIC_QUOTA)) { - err = iwm_update_quotas(sc, in, 1); - if (err) { - printf("%s: could not update quotas (error %d)\n", - DEVNAME(sc), err); - return err; - } + err = iwm_update_quotas(sc, in, 1); + if (err) { + printf("%s: could not update quotas (error %d)\n", + DEVNAME(sc), err); + return err; } ieee80211_amrr_node_init(&sc->sc_amrr, &in->in_amn); @@ -8542,13 +8282,11 @@ iwm_run_stop(struct iwm_softc *sc) iwm_disable_beacon_filter(sc); - if (!isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_DYNAMIC_QUOTA)) { - err = iwm_update_quotas(sc, in, 0); - if (err) { - printf("%s: could not update quotas (error %d)\n", - DEVNAME(sc), err); - return err; - } + err = iwm_update_quotas(sc, in, 0); + if (err) { + printf("%s: could not update quotas (error %d)\n", + DEVNAME(sc), err); + return err; } err = iwm_mac_ctxt_cmd(sc, in, IWM_FW_CTXT_ACTION_MODIFY, 0); @@ -8560,8 +8298,8 @@ iwm_run_stop(struct iwm_softc *sc) /* Reset Tx chains in case MIMO was enabled. */ if ((in->in_ni.ni_flags & IEEE80211_NODE_HT) && iwm_mimo_enabled(sc)) { - err = iwm_phy_ctxt_update(sc, &sc->sc_phyctxt[0], - in->in_ni.ni_chan, 1, 1, 0); + err = iwm_phy_ctxt_cmd(sc, &sc->sc_phyctxt[0], 1, 1, + IWM_FW_CTXT_ACTION_MODIFY, 0); if (err) { printf("%s: failed to update PHY\n", DEVNAME(sc)); return err; @@ -8797,8 +8535,6 @@ iwm_setrates(struct iwm_node *in, int async) if (iwm_is_mimo_ht_plcp(ht_plcp)) tab |= IWM_RATE_MCS_ANT_AB_MSK; - else if (sc->sc_device_family == IWM_DEVICE_FAMILY_9000) - tab |= IWM_RATE_MCS_ANT_B_MSK; else tab |= IWM_RATE_MCS_ANT_A_MSK; @@ -8814,17 +8550,11 @@ iwm_setrates(struct iwm_node *in, int async) tab = iwm_rates[ridx_min].plcp; if (IWM_RIDX_IS_CCK(ridx_min)) tab |= IWM_RATE_MCS_CCK_MSK; - if (sc->sc_device_family == IWM_DEVICE_FAMILY_9000) - tab |= IWM_RATE_MCS_ANT_B_MSK; - else - tab |= IWM_RATE_MCS_ANT_A_MSK; + tab |= IWM_RATE_MCS_ANT_A_MSK; lqcmd.rs_table[j++] = htole32(tab); } - if (sc->sc_device_family == IWM_DEVICE_FAMILY_9000) - lqcmd.single_stream_ant_msk = IWM_ANT_B; - else - lqcmd.single_stream_ant_msk = IWM_ANT_A; + lqcmd.single_stream_ant_msk = IWM_ANT_A; lqcmd.dual_stream_ant_msk = IWM_ANT_AB; lqcmd.agg_time_limit = htole16(4000); /* 4ms */ @@ -9149,45 +8879,6 @@ iwm_send_bt_init_conf(struct iwm_softc *sc) } int -iwm_send_soc_conf(struct iwm_softc *sc) -{ - struct iwm_soc_configuration_cmd cmd; - int err; - uint32_t cmd_id, flags = 0; - - memset(&cmd, 0, sizeof(cmd)); - - /* - * In VER_1 of this command, the discrete value is considered - * an integer; In VER_2, it's a bitmask. Since we have only 2 - * values in VER_1, this is backwards-compatible with VER_2, - * as long as we don't set any other flag bits. - */ - if (!sc->sc_integrated) { /* VER_1 */ - flags = IWM_SOC_CONFIG_CMD_FLAGS_DISCRETE; - } else { /* VER_2 */ - uint8_t scan_cmd_ver; - if (sc->sc_ltr_delay != IWM_SOC_FLAGS_LTR_APPLY_DELAY_NONE) - flags |= (sc->sc_ltr_delay & - IWM_SOC_FLAGS_LTR_APPLY_DELAY_MASK); - scan_cmd_ver = iwm_lookup_cmd_ver(sc, IWM_LONG_GROUP, - IWM_SCAN_REQ_UMAC); - if (scan_cmd_ver != IWM_FW_CMD_VER_UNKNOWN && - scan_cmd_ver >= 2 && sc->sc_low_latency_xtal) - flags |= IWM_SOC_CONFIG_CMD_FLAGS_LOW_LATENCY; - } - cmd.flags = htole32(flags); - - cmd.latency = htole32(sc->sc_xtal_latency); - - cmd_id = iwm_cmd_id(IWM_SOC_CONFIGURATION_CMD, IWM_SYSTEM_GROUP, 0); - err = iwm_send_cmd_pdu(sc, cmd_id, 0, sizeof(cmd), &cmd); - if (err) - printf("%s: failed to set soc latency: %d\n", DEVNAME(sc), err); - return err; -} - -int iwm_send_update_mcc_cmd(struct iwm_softc *sc, const char *alpha2) { struct iwm_mcc_update_cmd mcc_cmd; @@ -9196,10 +8887,9 @@ iwm_send_update_mcc_cmd(struct iwm_softc *sc, const char *alpha2) .flags = IWM_CMD_WANT_RESP, .data = { &mcc_cmd }, }; - struct iwm_rx_packet *pkt; - struct iwm_mcc_update_resp_v3 *resp; - size_t resp_len; int err; + int resp_v2 = isset(sc->sc_enabled_capa, + IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2); if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000 && !sc->sc_nvm.lar_enabled) { @@ -9214,58 +8904,23 @@ iwm_send_update_mcc_cmd(struct iwm_softc *sc, const char *alpha2) else mcc_cmd.source_id = IWM_MCC_SOURCE_OLD_FW; - hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd); - hcmd.resp_pkt_len = IWM_CMD_RESP_MAX; + if (resp_v2) { + hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd); + hcmd.resp_pkt_len = sizeof(struct iwm_rx_packet) + + sizeof(struct iwm_mcc_update_resp); + } else { + hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd_v1); + hcmd.resp_pkt_len = sizeof(struct iwm_rx_packet) + + sizeof(struct iwm_mcc_update_resp_v1); + } err = iwm_send_cmd(sc, &hcmd); if (err) return err; - pkt = hcmd.resp_pkt; - if (!pkt || (pkt->hdr.flags & IWM_CMD_FAILED_MSK)) { - err = EIO; - goto out; - } - - resp_len = iwm_rx_packet_payload_len(pkt); - if (resp_len < sizeof(*resp)) { - err = EIO; - goto out; - } - - resp = (void *)pkt->data; - if (resp_len != sizeof(*resp) + - resp->n_channels * sizeof(resp->channels[0])) { - err = EIO; - goto out; - } - -out: iwm_free_resp(sc, &hcmd); - return err; -} - -int -iwm_send_temp_report_ths_cmd(struct iwm_softc *sc) -{ - struct iwm_temp_report_ths_cmd cmd; - int err; - /* - * In order to give responsibility for critical-temperature-kill - * and TX backoff to FW we need to send an empty temperature - * reporting command at init time. - */ - memset(&cmd, 0, sizeof(cmd)); - - err = iwm_send_cmd_pdu(sc, - IWM_WIDE_ID(IWM_PHY_OPS_GROUP, IWM_TEMP_REPORTING_THRESHOLDS_CMD), - 0, sizeof(cmd), &cmd); - if (err) - printf("%s: TEMP_REPORT_THS_CMD command failed (error %d)\n", - DEVNAME(sc), err); - - return err; + return 0; } void @@ -9567,13 +9222,6 @@ iwm_init_hw(struct iwm_softc *sc) return err; } - if (isset(sc->sc_enabled_capa, - IWM_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT)) { - err = iwm_send_soc_conf(sc); - if (err) - return err; - } - if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_DQA_SUPPORT)) { err = iwm_send_dqa_cmd(sc); if (err) @@ -9588,13 +9236,12 @@ iwm_init_hw(struct iwm_softc *sc) goto err; } - for (i = 0; i < IWM_NUM_PHY_CTX; i++) { + for (i = 0; i < 1; i++) { /* * The channel used here isn't relevant as it's * going to be overwritten in the other flows. * For now use the first channel we have. */ - sc->sc_phyctxt[i].id = i; sc->sc_phyctxt[i].channel = &ic->ic_channels[1]; err = iwm_phy_ctxt_cmd(sc, &sc->sc_phyctxt[i], 1, 1, IWM_FW_CTXT_ACTION_ADD, 0); @@ -9616,12 +9263,6 @@ iwm_init_hw(struct iwm_softc *sc) DEVNAME(sc), err); } - if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_CT_KILL_BY_FW)) { - err = iwm_send_temp_report_ths_cmd(sc); - if (err) - goto err; - } - err = iwm_power_update_device(sc); if (err) { printf("%s: could not send power command (error %d)\n", @@ -10451,29 +10092,17 @@ iwm_rx_pkt(struct iwm_softc *sc, struct iwm_rx_data *data, struct mbuf_list *ml) case IWM_MCC_CHUB_UPDATE_CMD: { struct iwm_mcc_chub_notif *notif; SYNC_RESP_STRUCT(notif, pkt); - iwm_mcc_update(sc, notif); - break; + + sc->sc_fw_mcc[0] = (notif->mcc & 0xff00) >> 8; + sc->sc_fw_mcc[1] = notif->mcc & 0xff; + sc->sc_fw_mcc[2] = '\0'; } case IWM_DTS_MEASUREMENT_NOTIFICATION: case IWM_WIDE_ID(IWM_PHY_OPS_GROUP, IWM_DTS_MEASUREMENT_NOTIF_WIDE): - case IWM_WIDE_ID(IWM_PHY_OPS_GROUP, - IWM_TEMP_REPORTING_THRESHOLDS_CMD): break; - case IWM_WIDE_ID(IWM_PHY_OPS_GROUP, - IWM_CT_KILL_NOTIFICATION): { - struct iwm_ct_kill_notif *notif; - SYNC_RESP_STRUCT(notif, pkt); - printf("%s: device at critical temperature (%u degC), " - "stopping device\n", - DEVNAME(sc), le16toh(notif->temperature)); - sc->sc_flags |= IWM_FLAG_HW_ERR; - task_add(systq, &sc->init_task); - break; - } - case IWM_ADD_STA_KEY: case IWM_PHY_CONFIGURATION_CMD: case IWM_TX_ANT_CONFIGURATION_CMD: @@ -10610,9 +10239,6 @@ iwm_rx_pkt(struct iwm_softc *sc, struct iwm_rx_data *data, struct mbuf_list *ml) case IWM_WIDE_ID(IWM_DATA_PATH_GROUP, IWM_DQA_ENABLE_CMD): break; - case IWM_WIDE_ID(IWM_SYSTEM_GROUP, IWM_SOC_CONFIGURATION_CMD): - break; - default: handled = 0; printf("%s: unhandled firmware response 0x%x/0x%x " @@ -11059,7 +10685,7 @@ iwm_attach(struct device *parent, struct device *self, void *aux) break; case PCI_PRODUCT_INTEL_WL_3165_1: case PCI_PRODUCT_INTEL_WL_3165_2: - sc->sc_fwname = "iwm-7265D-29"; + sc->sc_fwname = "iwm-7265-17"; sc->host_interrupt_operation_mode = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_7000; sc->sc_fwdmasegsz = IWM_FWDMASEGSZ; @@ -11085,7 +10711,7 @@ iwm_attach(struct device *parent, struct device *self, void *aux) break; case PCI_PRODUCT_INTEL_WL_7265_1: case PCI_PRODUCT_INTEL_WL_7265_2: - sc->sc_fwname = "iwm-7265D-29"; + sc->sc_fwname = "iwm-7265-17"; sc->host_interrupt_operation_mode = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_7000; sc->sc_fwdmasegsz = IWM_FWDMASEGSZ; @@ -11094,7 +10720,7 @@ iwm_attach(struct device *parent, struct device *self, void *aux) break; case PCI_PRODUCT_INTEL_WL_8260_1: case PCI_PRODUCT_INTEL_WL_8260_2: - sc->sc_fwname = "iwm-8000C-36"; + sc->sc_fwname = "iwm-8000C-34"; sc->host_interrupt_operation_mode = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_8000; sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000; @@ -11102,7 +10728,7 @@ iwm_attach(struct device *parent, struct device *self, void *aux) sc->nvm_type = IWM_NVM_EXT; break; case PCI_PRODUCT_INTEL_WL_8265_1: - sc->sc_fwname = "iwm-8265-36"; + sc->sc_fwname = "iwm-8265-34"; sc->host_interrupt_operation_mode = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_8000; sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000; @@ -11110,7 +10736,7 @@ iwm_attach(struct device *parent, struct device *self, void *aux) sc->nvm_type = IWM_NVM_EXT; break; case PCI_PRODUCT_INTEL_WL_9260_1: - sc->sc_fwname = "iwm-9260-46"; + sc->sc_fwname = "iwm-9260-34"; sc->host_interrupt_operation_mode = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_9000; sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000; @@ -11119,14 +10745,13 @@ iwm_attach(struct device *parent, struct device *self, void *aux) break; case PCI_PRODUCT_INTEL_WL_9560_1: case PCI_PRODUCT_INTEL_WL_9560_2: - sc->sc_fwname = "iwm-9000-46"; + sc->sc_fwname = "iwm-9000-34"; sc->host_interrupt_operation_mode = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_9000; sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000; sc->sc_nvm_max_section_size = 32768; sc->sc_mqrx_supported = 1; sc->sc_integrated = 1; - sc->sc_xtal_latency = 650; break; default: printf("%s: unknown adapter type\n", DEVNAME(sc)); diff --git a/sys/dev/pci/if_iwmreg.h b/sys/dev/pci/if_iwmreg.h index ab7ebf43b9b..77a861455d3 100644 --- a/sys/dev/pci/if_iwmreg.h +++ b/sys/dev/pci/if_iwmreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwmreg.h,v 1.51 2021/06/01 13:21:08 stsp Exp $ */ +/* $OpenBSD: if_iwmreg.h,v 1.52 2021/06/01 18:03:56 stsp Exp $ */ /****************************************************************************** * @@ -824,19 +824,8 @@ enum msix_ivar_for_cause { #define IWM_UCODE_TLV_API_STA_TYPE 30 #define IWM_UCODE_TLV_API_NAN2_VER2 31 #define IWM_UCODE_TLV_API_ADAPTIVE_DWELL 32 -#define IWM_UCODE_TLV_API_NEW_BEACON_TEMPLATE 34 #define IWM_UCODE_TLV_API_NEW_RX_STATS 35 -#define IWM_UCODE_TLV_API_WOWLAN_KEY_MATERIAL 36 -#define IWM_UCODE_TLV_API_QUOTA_LOW_LATENCY 38 -#define IWM_UCODE_TLV_API_DEPRECATE_TTAK 41 #define IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2 42 -#define IWM_UCODE_TLV_API_NAN_NOTIF_V2 43 -#define IWM_UCODE_TLV_API_REDUCE_TX_POWER 45 -#define IWM_UCODE_TLV_API_SHORT_BEACON_NOTIF 46 -#define IWM_UCODE_TLV_API_REGULATORY_NVM_INFO 48 -#define IWM_UCODE_TLV_API_FTM_NEW_RANGE_REQ 49 -#define IWM_UCODE_TLV_API_FTM_RTT_ACCURACY 54 -#define IWM_UCODE_TLV_API_SAR_TABLE_VER 55 #define IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER 58 #define IWM_NUM_UCODE_TLV_API 128 @@ -926,16 +915,10 @@ enum msix_ivar_for_cause { #define IWM_UCODE_TLV_CAPA_GSCAN_SUPPORT 31 #define IWM_UCODE_TLV_CAPA_NAN_SUPPORT 34 #define IWM_UCODE_TLV_CAPA_UMAC_UPLOAD 35 -#define IWM_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT 37 -#define IWM_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT 39 -#define IWM_UCODE_TLV_CAPA_CDB_SUPPORT 40 -#define IWM_UCODE_TLV_CAPA_DYNAMIC_QUOTA 44 -#define IWM_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS 48 #define IWM_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE 64 #define IWM_UCODE_TLV_CAPA_SHORT_PM_TIMEOUTS 65 #define IWM_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT 67 #define IWM_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT 68 -#define IWM_UCODE_TLV_CAPA_CSA_AND_TBTT_OFFLOAD 70 #define IWM_UCODE_TLV_CAPA_BEACON_ANT_SELECTION 71 #define IWM_UCODE_TLV_CAPA_BEACON_STORING 72 #define IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2 73 @@ -946,10 +929,6 @@ enum msix_ivar_for_cause { #define IWM_UCODE_TLV_CAPA_LMAC_UPLOAD 79 #define IWM_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG 80 #define IWM_UCODE_TLV_CAPA_LQM_SUPPORT 81 -#define IWM_UCODE_TLV_CAPA_TX_POWER_ACK 84 -#define IWM_UCODE_TLV_CAPA_D3_DEBUG 87 -#define IWM_UCODE_TLV_CAPA_LED_CMD_SUPPORT 88 -#define IWM_UCODE_TLV_CAPA_DBG_SUSPEND_RESUME_CMD_SUPP 92 #define IWM_NUM_UCODE_TLV_CAPA 128 @@ -1111,20 +1090,8 @@ struct iwm_ucode_header { #define IWM_UCODE_TLV_FW_DBG_DEST 38 #define IWM_UCODE_TLV_FW_DBG_CONF 39 #define IWM_UCODE_TLV_FW_DBG_TRIGGER 40 -#define IWM_UCODE_TLV_CMD_VERSIONS 48 #define IWM_UCODE_TLV_FW_GSCAN_CAPA 50 #define IWM_UCODE_TLV_FW_MEM_SEG 51 -#define IWM_UCODE_TLV_UMAC_DEBUG_ADDRS 54 -#define IWM_UCODE_TLV_LMAC_DEBUG_ADDRS 55 -#define IWM_UCODE_TLV_HW_TYPE 58 - -#define IWM_UCODE_TLV_DEBUG_BASE 0x1000005 -#define IWM_UCODE_TLV_TYPE_DEBUG_INFO (IWM_UCODE_TLV_DEBUG_BASE + 0) -#define IWM_UCODE_TLV_TYPE_BUFFER_ALLOCATION (IWM_UCODE_TLV_DEBUG_BASE + 1) -#define IWM_UCODE_TLV_TYPE_HCMD (IWM_UCODE_TLV_DEBUG_BASE + 2) -#define IWM_UCODE_TLV_TYPE_REGIONS (IWM_UCODE_TLV_DEBUG_BASE + 3) -#define IWM_UCODE_TLV_TYPE_TRIGGERS (IWM_UCODE_TLV_DEBUG_BASE + 4) -#define IWM_UCODE_TLV_DEBUG_MAX IWM_UCODE_TLV_TYPE_TRIGGERS struct iwm_ucode_tlv { uint32_t type; /* see above */ @@ -2099,13 +2066,6 @@ struct iwm_agn_scd_bc_tbl { #define IWM_DATA_PATH_GROUP 0x5 #define IWM_PROT_OFFLOAD_GROUP 0xb -/* SYSTEM_GROUP group subcommand IDs */ - -#define IWM_SHARED_MEM_CFG_CMD 0x00 -#define IWM_SOC_CONFIGURATION_CMD 0x01 -#define IWM_INIT_EXTENDED_CFG_CMD 0x03 -#define IWM_FW_ERROR_RECOVERY_CMD 0x07 - /* DATA_PATH group subcommand IDs */ #define IWM_DQA_ENABLE_CMD 0x00 @@ -2201,31 +2161,6 @@ struct iwm_phy_cfg_cmd { #define IWM_PHY_CFG_RX_CHAIN_B (1 << 13) #define IWM_PHY_CFG_RX_CHAIN_C (1 << 14) -#define IWM_MAX_DTS_TRIPS 8 - -/** - * struct iwm_ct_kill_notif - CT-kill entry notification - * - * @temperature: the current temperature in celsius - * @reserved: reserved - */ -struct iwm_ct_kill_notif { - uint16_t temperature; - uint16_t reserved; -} __packed; /* GRP_PHY_CT_KILL_NTF */ - -/** - * struct iwm_temp_report_ths_cmd - set temperature thresholds - * (IWM_TEMP_REPORTING_THRESHOLDS_CMD) - * - * @num_temps: number of temperature thresholds passed - * @thresholds: array with the thresholds to be configured - */ -struct iwm_temp_report_ths_cmd { - uint32_t num_temps; - uint16_t thresholds[IWM_MAX_DTS_TRIPS]; -} __packed; /* GRP_PHY_TEMP_REPORTING_THRESHOLDS_CMD */ - /* * PHY db */ @@ -2564,32 +2499,6 @@ struct iwm_alive_resp_v3 { uint32_t dbg_print_buff_addr; } __packed; /* ALIVE_RES_API_S_VER_3 */ -#define IWM_SOC_CONFIG_CMD_FLAGS_DISCRETE (1 << 0) -#define IWM_SOC_CONFIG_CMD_FLAGS_LOW_LATENCY (1 << 1) - -#define IWM_SOC_FLAGS_LTR_APPLY_DELAY_MASK 0xc -#define IWM_SOC_FLAGS_LTR_APPLY_DELAY_NONE 0 -#define IWM_SOC_FLAGS_LTR_APPLY_DELAY_200 1 -#define IWM_SOC_FLAGS_LTR_APPLY_DELAY_2500 2 -#define IWM_SOC_FLAGS_LTR_APPLY_DELAY_1820 3 - -/** - * struct iwm_soc_configuration_cmd - Set device stabilization latency - * - * @flags: soc settings flags. In VER_1, we can only set the DISCRETE - * flag, because the FW treats the whole value as an integer. In - * VER_2, we can set the bits independently. - * @latency: time for SOC to ensure stable power & XTAL - */ -struct iwm_soc_configuration_cmd { - uint32_t flags; - uint32_t latency; -} __packed; /* - * SOC_CONFIGURATION_CMD_S_VER_1 (see description above) - * SOC_CONFIGURATION_CMD_S_VER_2 - */ - - /* Error response/notification */ #define IWM_FW_ERR_UNKNOWN_CMD 0x0 #define IWM_FW_ERR_INVALID_CMD_PARAM 0x1 @@ -2622,22 +2531,6 @@ struct iwm_error_resp { uint64_t timestamp; } __packed; -#define IWM_FW_CMD_VER_UNKNOWN 99 - -/** - * struct iwm_fw_cmd_version - firmware command version entry - * @cmd: command ID - * @group: group ID - * @cmd_ver: command version - * @notif_ver: notification version - */ -struct iwm_fw_cmd_version { - uint8_t cmd; - uint8_t group; - uint8_t cmd_ver; - uint8_t notif_ver; -} __packed; - /* Common PHY, MAC and Bindings definitions */ @@ -2948,31 +2841,12 @@ struct iwm_time_event_notif { /* Bindings and Time Quota */ /** - * struct iwm_binding_cmd_v1 - configuring bindings - * ( IWM_BINDING_CONTEXT_CMD = 0x2b ) - * @id_and_color: ID and color of the relevant Binding - * @action: action to perform, one of IWM_FW_CTXT_ACTION_* - * @macs: array of MAC id and colors which belong to the binding - * @phy: PHY id and color which belongs to the binding - * @lmac_id: the lmac id the binding belongs to - */ -struct iwm_binding_cmd_v1 { - /* COMMON_INDEX_HDR_API_S_VER_1 */ - uint32_t id_and_color; - uint32_t action; - /* IWM_BINDING_DATA_API_S_VER_1 */ - uint32_t macs[IWM_MAX_MACS_IN_BINDING]; - uint32_t phy; -} __packed; /* IWM_BINDING_CMD_API_S_VER_1 */ - -/** * struct iwm_binding_cmd - configuring bindings * ( IWM_BINDING_CONTEXT_CMD = 0x2b ) * @id_and_color: ID and color of the relevant Binding * @action: action to perform, one of IWM_FW_CTXT_ACTION_* * @macs: array of MAC id and colors which belong to the binding * @phy: PHY id and color which belongs to the binding - * @lmac_id: the lmac id the binding belongs to */ struct iwm_binding_cmd { /* COMMON_INDEX_HDR_API_S_VER_1 */ @@ -2981,11 +2855,7 @@ struct iwm_binding_cmd { /* IWM_BINDING_DATA_API_S_VER_1 */ uint32_t macs[IWM_MAX_MACS_IN_BINDING]; uint32_t phy; - uint32_t lmac_id; -} __packed; /* IWM_BINDING_CMD_API_S_VER_2 */ - -#define IWM_LMAC_24G_INDEX 0 -#define IWM_LMAC_5G_INDEX 1 +} __packed; /* IWM_BINDING_CMD_API_S_VER_1 */ /* The maximal number of fragments in the FW's schedule session */ #define IWM_MAX_QUOTA 128 @@ -2997,7 +2867,7 @@ struct iwm_binding_cmd { * remainig quota (after Time Events) according to this quota. * @max_duration: max uninterrupted context duration in TU */ -struct iwm_time_quota_data_v1 { +struct iwm_time_quota_data { uint32_t id_and_color; uint32_t quota; uint32_t max_duration; @@ -3008,40 +2878,9 @@ struct iwm_time_quota_data_v1 { * ( IWM_TIME_QUOTA_CMD = 0x2c ) * @quotas: allocations per binding */ -struct iwm_time_quota_cmd_v1 { - struct iwm_time_quota_data_v1 quotas[IWM_MAX_BINDINGS]; -} __packed; /* IWM_TIME_QUOTA_ALLOCATION_CMD_API_S_VER_1 */ - -#define IWM_QUOTA_LOW_LATENCY_NONE 0 -#define IWM_QUOTA_LOW_LATENCY_TX (1 << 0) -#define IWM_QUOTA_LOW_LATENCY_RX (1 << 1) - -/** - * struct iwm_time_quota_data - configuration of time quota per binding - * @id_and_color: ID and color of the relevant Binding. - * @quota: absolute time quota in TU. The scheduler will try to divide the - * remainig quota (after Time Events) according to this quota. - * @max_duration: max uninterrupted context duration in TU - * @low_latency: low latency status IWM_QUOTA_LOW_LATENCY_* - */ -struct iwm_time_quota_data { - uint32_t id_and_color; - uint32_t quota; - uint32_t max_duration; - uint32_t low_latency; -}; /* TIME_QUOTA_DATA_API_S_VER_2 */ - -/** - * struct iwm_time_quota_cmd - configuration of time quota between bindings - * ( TIME_QUOTA_CMD = 0x2c ) - * Note: on non-CDB the fourth one is the auxilary mac and is essentially zero. - * On CDB the fourth one is a regular binding. - * - * @quotas: allocations per binding - */ struct iwm_time_quota_cmd { struct iwm_time_quota_data quotas[IWM_MAX_BINDINGS]; -}; /* TIME_QUOTA_ALLOCATION_CMD_API_S_VER_2 */ +} __packed; /* IWM_TIME_QUOTA_ALLOCATION_CMD_API_S_VER_1 */ /* PHY context */ @@ -3083,30 +2922,12 @@ struct iwm_time_quota_cmd { * @width: PHY_[VHT|LEGACY]_CHANNEL_* * @ctrl channel: PHY_[VHT|LEGACY]_CTRL_* */ -struct iwm_fw_channel_info_v1 { - uint8_t band; - uint8_t channel; - uint8_t width; - uint8_t ctrl_pos; -} __packed; /* CHANNEL_CONFIG_API_S_VER_1 */ - -/* - * struct iwm_fw_channel_info - channel information - * - * @channel: channel number - * @band: PHY_BAND_* - * @width: PHY_[VHT|LEGACY]_CHANNEL_* - * @ctrl channel: PHY_[VHT|LEGACY]_CTRL_* - * @reserved: for future use and alignment - */ struct iwm_fw_channel_info { - uint32_t channel; uint8_t band; + uint8_t channel; uint8_t width; uint8_t ctrl_pos; - uint8_t reserved; -} __packed; /* CHANNEL_CONFIG_API_S_VER_2 */ - +} __packed; #define IWM_PHY_RX_CHAIN_DRIVER_FORCE_POS (0) #define IWM_PHY_RX_CHAIN_DRIVER_FORCE_MSK \ @@ -3148,28 +2969,6 @@ struct iwm_fw_channel_info { * @acquisition_data: ??? * @dsp_cfg_flags: set to 0 */ -/* - * XXX Intel forgot to bump the PHY_CONTEXT command API when they increased - * the size of fw_channel_info from v1 to v2. - * To keep things simple we define two versions of this struct, and both - * are labled as CMD_API_VER_1. (The Linux iwlwifi driver performs dark - * magic with pointers to struct members instead.) - */ -/* This version must be used if IWM_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS is set: */ -struct iwm_phy_context_cmd_uhb { - /* COMMON_INDEX_HDR_API_S_VER_1 */ - uint32_t id_and_color; - uint32_t action; - /* IWM_PHY_CONTEXT_DATA_API_S_VER_1 */ - uint32_t apply_time; - uint32_t tx_param_color; - struct iwm_fw_channel_info ci; - uint32_t txchain_info; - uint32_t rxchain_info; - uint32_t acquisition_data; - uint32_t dsp_cfg_flags; -} __packed; /* IWM_PHY_CONTEXT_CMD_API_VER_1 */ -/* This version must be used otherwise: */ struct iwm_phy_context_cmd { /* COMMON_INDEX_HDR_API_S_VER_1 */ uint32_t id_and_color; @@ -3177,7 +2976,7 @@ struct iwm_phy_context_cmd { /* IWM_PHY_CONTEXT_DATA_API_S_VER_1 */ uint32_t apply_time; uint32_t tx_param_color; - struct iwm_fw_channel_info_v1 ci; + struct iwm_fw_channel_info ci; uint32_t txchain_info; uint32_t rxchain_info; uint32_t acquisition_data; @@ -5210,25 +5009,13 @@ struct iwm_beacon_notif { * @flush_ctl: control flags * @reserved: reserved */ -struct iwm_tx_path_flush_cmd_v1 { +struct iwm_tx_path_flush_cmd { uint32_t queues_ctl; uint16_t flush_ctl; uint16_t reserved; } __packed; /* IWM_TX_PATH_FLUSH_CMD_API_S_VER_1 */ /** - * struct iwl_tx_path_flush_cmd -- queue/FIFO flush command - * @sta_id: station ID to flush - * @tid_mask: TID mask to flush - * @reserved: reserved - */ -struct iwm_tx_path_flush_cmd { - uint32_t sta_id; - uint16_t tid_mask; - uint16_t reserved; -} __packed; /* TX_PATH_FLUSH_CMD_API_S_VER_2 */ - -/** * iwm_get_scd_ssn - returns the SSN of the SCD * @tx_resp: the Tx response from the fw (agg or non-agg) * @@ -5749,16 +5536,6 @@ struct iwm_scan_config { #define IWM_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE (1 << 15) /** - * UMAC scan general flags #2 - * @IWM_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL: Whether to send a complete - * notification per channel or not. - * @IWM_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER: Whether to allow channel - * reorder optimization or not. - */ -#define IWM_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL (1 << 0) -#define IWM_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER (1 << 1) - -/** * struct iwm_scan_channel_cfg_umac * @flags: bitmap - 0-19: directed scan to i'th ssid. * @channel_num: channel number 1-13 etc. @@ -6607,7 +6384,7 @@ struct iwm_mcc_update_resp_v1 { * @channels: channel control data map, DWORD for each channel. Only the first * 16bits are used. */ -struct iwm_mcc_update_resp_v2 { +struct iwm_mcc_update_resp { uint32_t status; uint16_t mcc; uint8_t cap; @@ -6619,33 +6396,6 @@ struct iwm_mcc_update_resp_v2 { } __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_2 */ /** - * iwm_mcc_update_resp_v3 - response to MCC_UPDATE_CMD. - * Contains the new channel control profile map, if changed, and the new MCC - * (mobile country code). - * The new MCC may be different than what was requested in MCC_UPDATE_CMD. - * @status: see &enum iwm_mcc_update_status - * @mcc: the new applied MCC - * @cap: capabilities for all channels which matches the MCC - * @source_id: the MCC source, see IWM_MCC_SOURCE_* - * @time: time elapsed from the MCC test start (in 30 seconds TU) - * @reserved: reserved. - * @n_channels: number of channels in @channels_data (may be 14, 39, 50 or 51 - * channels, depending on platform) - * @channels: channel control data map, DWORD for each channel. Only the first - * 16bits are used. - */ -struct iwm_mcc_update_resp_v3 { - uint32_t status; - uint16_t mcc; - uint8_t cap; - uint8_t source_id; - uint16_t time; - uint16_t geo_info; - uint32_t n_channels; - uint32_t channels[0]; -} __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_3 */ - -/** * struct iwm_mcc_chub_notif - chub notifies of mcc change * (MCC_CHUB_UPDATE_CMD = 0xc9) * The Chub (Communication Hub, CommsHUB) is a HW component that connects to diff --git a/sys/dev/pci/if_iwmvar.h b/sys/dev/pci/if_iwmvar.h index 9eb2ba4401e..51d725fa7ce 100644 --- a/sys/dev/pci/if_iwmvar.h +++ b/sys/dev/pci/if_iwmvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwmvar.h,v 1.63 2021/06/01 13:21:08 stsp Exp $ */ +/* $OpenBSD: if_iwmvar.h,v 1.64 2021/06/01 18:03:56 stsp Exp $ */ /* * Copyright (c) 2014 genua mbh <info@genua.de> @@ -545,9 +545,7 @@ struct iwm_softc { int sc_capa_n_scan_channels; uint8_t sc_ucode_api[howmany(IWM_NUM_UCODE_TLV_API, NBBY)]; uint8_t sc_enabled_capa[howmany(IWM_NUM_UCODE_TLV_CAPA, NBBY)]; -#define IWM_MAX_FW_CMD_VERSIONS 64 - struct iwm_fw_cmd_version cmd_versions[IWM_MAX_FW_CMD_VERSIONS]; - int n_cmd_versions; + char sc_fw_mcc[3]; int sc_intmask; int sc_flags; @@ -620,9 +618,6 @@ struct iwm_softc { int sc_mqrx_supported; int sc_integrated; - int sc_ltr_delay; - int sc_xtal_latency; - int sc_low_latency_xtal; /* * Paging parameters - All of the parameters should be set by the |