The branch main has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=fac1f59384114a3fe14076815fc4ede68d6bb1ba

commit fac1f59384114a3fe14076815fc4ede68d6bb1ba
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2022-05-16 15:54:57 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2022-05-16 15:54:57 +0000

    iwlwifi: update driver from iwlwifi-next
    
    Import code update from iwlwifi-next
     at e89600ebeeb14d18c0b062837a84196f72542830.
    
    This amongst other things removes the deprecated BCAST_FILTERING option,
    which we had disabled before due to firmware issues.
    Also prepares us for the next firmware update.
    
    The "enable_ini" module option has become an integer with a
    sysctl proc equivalent handler.  Disable the module parameter changing
    for the moment until we'll have working LinuxKPI support or implement
    it as SYSCTL_PROC in FreeBSD directly.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      3 days
---
 sys/contrib/dev/iwlwifi/cfg/22000.c             |  19 +-
 sys/contrib/dev/iwlwifi/fw/acpi.c               | 222 ++++++++++++++++++-
 sys/contrib/dev/iwlwifi/fw/acpi.h               |  28 +++
 sys/contrib/dev/iwlwifi/fw/api/commands.h       |   5 -
 sys/contrib/dev/iwlwifi/fw/api/filter.h         |  88 --------
 sys/contrib/dev/iwlwifi/fw/api/power.h          |  27 ++-
 sys/contrib/dev/iwlwifi/fw/api/rs.h             |   1 -
 sys/contrib/dev/iwlwifi/fw/dbg.c                |  34 ++-
 sys/contrib/dev/iwlwifi/fw/file.h               |  30 ---
 sys/contrib/dev/iwlwifi/fw/img.h                |  12 --
 sys/contrib/dev/iwlwifi/fw/rs.c                 |  33 +--
 sys/contrib/dev/iwlwifi/fw/runtime.h            |   3 +-
 sys/contrib/dev/iwlwifi/iwl-config.h            |   5 +-
 sys/contrib/dev/iwlwifi/iwl-context-info-gen3.h |   4 +-
 sys/contrib/dev/iwlwifi/iwl-csr.h               |   3 +-
 sys/contrib/dev/iwlwifi/iwl-dbg-tlv.h           |   4 +-
 sys/contrib/dev/iwlwifi/iwl-drv.c               |  73 ++++---
 sys/contrib/dev/iwlwifi/iwl-modparams.h         |   5 +-
 sys/contrib/dev/iwlwifi/iwl-nvm-parse.c         |   3 +-
 sys/contrib/dev/iwlwifi/mvm/debugfs.c           | 214 +-----------------
 sys/contrib/dev/iwlwifi/mvm/fw.c                | 223 ++++---------------
 sys/contrib/dev/iwlwifi/mvm/mac80211.c          | 274 +-----------------------
 sys/contrib/dev/iwlwifi/mvm/mvm.h               |  16 +-
 sys/contrib/dev/iwlwifi/mvm/ops.c               |   1 -
 sys/contrib/dev/iwlwifi/mvm/tx.c                |   2 +-
 sys/contrib/dev/iwlwifi/pcie/ctxt-info-gen3.c   |   5 +-
 sys/contrib/dev/iwlwifi/pcie/drv.c              |   3 +-
 sys/contrib/dev/iwlwifi/pcie/trans-gen2.c       |   3 +-
 sys/contrib/dev/iwlwifi/pcie/trans.c            |   5 +-
 sys/contrib/dev/iwlwifi/queue/tx.c              |   4 +
 sys/modules/iwlwifi/Makefile                    |   1 -
 31 files changed, 456 insertions(+), 894 deletions(-)

diff --git a/sys/contrib/dev/iwlwifi/cfg/22000.c 
b/sys/contrib/dev/iwlwifi/cfg/22000.c
index 918dd0f6f8b5..8ff967edc8f0 100644
--- a/sys/contrib/dev/iwlwifi/cfg/22000.c
+++ b/sys/contrib/dev/iwlwifi/cfg/22000.c
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
  * Copyright (C) 2015-2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2021 Intel Corporation
+ * Copyright (C) 2018-2022 Intel Corporation
  */
 #include <linux/module.h>
 #include <linux/stringify.h>
@@ -10,7 +10,7 @@
 #include "fw/api/txq.h"
 
 /* Highest firmware API version supported */
-#define IWL_22000_UCODE_API_MAX        70
+#define IWL_22000_UCODE_API_MAX        72
 
 /* Lowest firmware API version supported */
 #define IWL_22000_UCODE_API_MIN        39
@@ -391,6 +391,21 @@ const struct iwl_cfg_trans_params 
iwl_so_long_latency_trans_cfg = {
        .ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US,
 };
 
+const struct iwl_cfg_trans_params iwl_so_long_latency_imr_trans_cfg = {
+       .mq_rx_supported = true,
+       .use_tfh = true,
+       .rf_id = true,
+       .gen2 = true,
+       .device_family = IWL_DEVICE_FAMILY_AX210,
+       .base_params = &iwl_ax210_base_params,
+       .umac_prph_offset = 0x300000,
+       .integrated = true,
+       .low_latency_xtal = true,
+       .xtal_latency = 12000,
+       .ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US,
+       .imr_enabled = true,
+};
+
 /*
  * If the device doesn't support HE, no need to have that many buffers.
  * 22000 devices can split multiple frames into a single RB, so fewer are
diff --git a/sys/contrib/dev/iwlwifi/fw/acpi.c 
b/sys/contrib/dev/iwlwifi/fw/acpi.c
index 0e9e61508ae5..33aae639ad37 100644
--- a/sys/contrib/dev/iwlwifi/fw/acpi.c
+++ b/sys/contrib/dev/iwlwifi/fw/acpi.c
@@ -1,9 +1,10 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
  * Copyright (C) 2017 Intel Deutschland GmbH
- * Copyright (C) 2019-2021 Intel Corporation
+ * Copyright (C) 2019-2022 Intel Corporation
  */
 #include <linux/uuid.h>
+#include <linux/dmi.h>
 #include "iwl-drv.h"
 #include "iwl-debug.h"
 #include "acpi.h"
@@ -19,6 +20,30 @@ const guid_t iwl_rfi_guid = GUID_INIT(0x7266172C, 0x220B, 
0x4B29,
                                      0xDD, 0x26, 0xB5, 0xFD);
 IWL_EXPORT_SYMBOL(iwl_rfi_guid);
 
+static const struct dmi_system_id dmi_ppag_approved_list[] = {
+       { .ident = "HP",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+               },
+       },
+       { .ident = "SAMSUNG",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., 
LTD"),
+               },
+       },
+       { .ident = "MSFT",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
+               },
+       },
+       { .ident = "ASUS",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek COMPUTER INC."),
+               },
+       },
+       {}
+};
+
 static int iwl_acpi_get_handle(struct device *dev, acpi_string method,
                               acpi_handle *ret_handle)
 {
@@ -537,8 +562,8 @@ IWL_EXPORT_SYMBOL(iwl_sar_select_profile);
 int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
 {
        union acpi_object *wifi_pkg, *table, *data;
-       bool enabled;
        int ret, tbl_rev;
+       u32 flags;
        u8 num_chains, num_sub_bands;
 
        data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD);
@@ -604,7 +629,8 @@ read_table:
 
        IWL_DEBUG_RADIO(fwrt, "Reading WRDS tbl_rev=%d\n", tbl_rev);
 
-       enabled = !!(wifi_pkg->package.elements[1].integer.value);
+       flags = wifi_pkg->package.elements[1].integer.value;
+       fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS;
 
        /* position of the actual table */
        table = &wifi_pkg->package.elements[2];
@@ -612,7 +638,8 @@ read_table:
        /* The profile from WRDS is officially profile 1, but goes
         * into sar_profiles[0] (because we don't have a profile 0).
         */
-       ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0], enabled,
+       ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0],
+                                 flags & IWL_SAR_ENABLE_MSK,
                                  num_chains, num_sub_bands);
 out_free:
        kfree(data);
@@ -896,10 +923,11 @@ bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
         * only one using version 36, so skip this version entirely.
         */
        return IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) >= 38 ||
-              IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 ||
-              (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 &&
-               ((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==
-                CSR_HW_REV_TYPE_7265D));
+               (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 &&
+                fwrt->trans->hw_rev != CSR_HW_REV_TYPE_3160) ||
+               (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 &&
+                ((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==
+                 CSR_HW_REV_TYPE_7265D));
 }
 IWL_EXPORT_SYMBOL(iwl_sar_geo_support);
 
@@ -969,3 +997,181 @@ __le32 iwl_acpi_get_lari_config_bitmap(struct 
iwl_fw_runtime *fwrt)
        return config_bitmap;
 }
 IWL_EXPORT_SYMBOL(iwl_acpi_get_lari_config_bitmap);
+
+int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
+{
+       union acpi_object *wifi_pkg, *data, *flags;
+       int i, j, ret, tbl_rev, num_sub_bands = 0;
+       int idx = 2;
+
+       fwrt->ppag_flags = 0;
+
+       data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD);
+       if (IS_ERR(data))
+               return PTR_ERR(data);
+
+       /* try to read ppag table rev 2 or 1 (both have the same data size) */
+       wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
+                               ACPI_PPAG_WIFI_DATA_SIZE_V2, &tbl_rev);
+
+       if (!IS_ERR(wifi_pkg)) {
+               if (tbl_rev == 1 || tbl_rev == 2) {
+                       num_sub_bands = IWL_NUM_SUB_BANDS_V2;
+                       IWL_DEBUG_RADIO(fwrt,
+                                       "Reading PPAG table v2 (tbl_rev=%d)\n",
+                                       tbl_rev);
+                       goto read_table;
+               } else {
+                       ret = -EINVAL;
+                       goto out_free;
+               }
+       }
+
+       /* try to read ppag table revision 0 */
+       wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
+                       ACPI_PPAG_WIFI_DATA_SIZE_V1, &tbl_rev);
+
+       if (!IS_ERR(wifi_pkg)) {
+               if (tbl_rev != 0) {
+                       ret = -EINVAL;
+                       goto out_free;
+               }
+               num_sub_bands = IWL_NUM_SUB_BANDS_V1;
+               IWL_DEBUG_RADIO(fwrt, "Reading PPAG table v1 (tbl_rev=0)\n");
+               goto read_table;
+       }
+
+read_table:
+       fwrt->ppag_ver = tbl_rev;
+       flags = &wifi_pkg->package.elements[1];
+
+       if (flags->type != ACPI_TYPE_INTEGER) {
+               ret = -EINVAL;
+               goto out_free;
+       }
+
+       fwrt->ppag_flags = flags->integer.value & ACPI_PPAG_MASK;
+
+       if (!fwrt->ppag_flags) {
+               ret = 0;
+               goto out_free;
+       }
+
+       /*
+        * read, verify gain values and save them into the PPAG table.
+        * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the
+        * following sub-bands to High-Band (5GHz).
+        */
+       for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
+               for (j = 0; j < num_sub_bands; j++) {
+                       union acpi_object *ent;
+
+                       ent = &wifi_pkg->package.elements[idx++];
+                       if (ent->type != ACPI_TYPE_INTEGER) {
+                               ret = -EINVAL;
+                               goto out_free;
+                       }
+
+                       fwrt->ppag_chains[i].subbands[j] = ent->integer.value;
+
+                       if ((j == 0 &&
+                               (fwrt->ppag_chains[i].subbands[j] > 
ACPI_PPAG_MAX_LB ||
+                                fwrt->ppag_chains[i].subbands[j] < 
ACPI_PPAG_MIN_LB)) ||
+                               (j != 0 &&
+                               (fwrt->ppag_chains[i].subbands[j] > 
ACPI_PPAG_MAX_HB ||
+                               fwrt->ppag_chains[i].subbands[j] < 
ACPI_PPAG_MIN_HB))) {
+                                       fwrt->ppag_flags = 0;
+                                       ret = -EINVAL;
+                                       goto out_free;
+                               }
+               }
+       }
+
+
+       ret = 0;
+
+out_free:
+       kfree(data);
+       return ret;
+}
+IWL_EXPORT_SYMBOL(iwl_acpi_get_ppag_table);
+
+int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt, union iwl_ppag_table_cmd 
*cmd,
+                       int *cmd_size)
+{
+        u8 cmd_ver;
+        int i, j, num_sub_bands;
+        s8 *gain;
+
+        if (!fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) {
+                IWL_DEBUG_RADIO(fwrt,
+                                "PPAG capability not supported by FW, command 
not sent.\n");
+                return -EINVAL;
+        }
+        if (!fwrt->ppag_flags) {
+                IWL_DEBUG_RADIO(fwrt, "PPAG not enabled, command not sent.\n");
+                return -EINVAL;
+        }
+
+        /* The 'flags' field is the same in v1 and in v2 so we can just
+         * use v1 to access it.
+         */
+        cmd->v1.flags = cpu_to_le32(fwrt->ppag_flags);
+        cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw,
+                                        WIDE_ID(PHY_OPS_GROUP, 
PER_PLATFORM_ANT_GAIN_CMD),
+                                        IWL_FW_CMD_VER_UNKNOWN);
+       if (cmd_ver == 1) {
+                num_sub_bands = IWL_NUM_SUB_BANDS_V1;
+                gain = cmd->v1.gain[0];
+                *cmd_size = sizeof(cmd->v1);
+                if (fwrt->ppag_ver == 1 || fwrt->ppag_ver == 2) {
+                        IWL_DEBUG_RADIO(fwrt,
+                                        "PPAG table rev is %d but FW supports 
v1, sending truncated table\n",
+                                        fwrt->ppag_ver);
+                        cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);
+               }
+       } else if (cmd_ver == 2 || cmd_ver == 3) {
+                num_sub_bands = IWL_NUM_SUB_BANDS_V2;
+                gain = cmd->v2.gain[0];
+                *cmd_size = sizeof(cmd->v2);
+                if (fwrt->ppag_ver == 0) {
+                        IWL_DEBUG_RADIO(fwrt,
+                                        "PPAG table is v1 but FW supports v2, 
sending padded table\n");
+                } else if (cmd_ver == 2 && fwrt->ppag_ver == 2) {
+                        IWL_DEBUG_RADIO(fwrt,
+                                        "PPAG table is v3 but FW supports v2, 
sending partial bitmap.\n");
+                        cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);
+                }
+        } else {
+                IWL_DEBUG_RADIO(fwrt, "Unsupported PPAG command version\n");
+                return -EINVAL;
+        }
+
+       for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
+                for (j = 0; j < num_sub_bands; j++) {
+                        gain[i * num_sub_bands + j] =
+                                fwrt->ppag_chains[i].subbands[j];
+                        IWL_DEBUG_RADIO(fwrt,
+                                        "PPAG table: chain[%d] band[%d]: gain 
= %d\n",
+                                        i, j, gain[i * num_sub_bands + j]);
+                }
+        }
+
+       return 0;
+}
+IWL_EXPORT_SYMBOL(iwl_read_ppag_table);
+
+bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt)
+{
+
+       if (!dmi_check_system(dmi_ppag_approved_list)) {
+               IWL_DEBUG_RADIO(fwrt,
+                       "System vendor '%s' is not in the approved list, 
disabling PPAG.\n",
+                       dmi_get_system_info(DMI_SYS_VENDOR));
+                       fwrt->ppag_flags = 0;
+                       return false;
+       }
+
+       return true;
+}
+IWL_EXPORT_SYMBOL(iwl_acpi_is_ppag_approved);
diff --git a/sys/contrib/dev/iwlwifi/fw/acpi.h 
b/sys/contrib/dev/iwlwifi/fw/acpi.h
index 466c95c21aa9..6f361c59106f 100644
--- a/sys/contrib/dev/iwlwifi/fw/acpi.h
+++ b/sys/contrib/dev/iwlwifi/fw/acpi.h
@@ -91,6 +91,11 @@
 #define ACPI_PPAG_MAX_LB 24
 #define ACPI_PPAG_MIN_HB -16
 #define ACPI_PPAG_MAX_HB 40
+#define ACPI_PPAG_MASK 3
+#define IWL_PPAG_ETSI_MASK BIT(0)
+
+#define IWL_SAR_ENABLE_MSK             BIT(0)
+#define IWL_REDUCE_POWER_FLAGS_POS     1
 
 /*
  * The profile for revision 2 is a superset of revision 1, which is in
@@ -220,6 +225,13 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
 
 __le32 iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt);
 
+int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt);
+
+int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt, union iwl_ppag_table_cmd 
*cmd,
+                       int *cmd_size);
+
+bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt);
+
 #else /* CONFIG_ACPI */
 
 static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method)
@@ -307,6 +319,22 @@ static inline __le32 
iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt
        return 0;
 }
 
+static inline int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
+{
+       return -ENOENT;
+}
+
+static inline int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt,
+                                   union iwl_ppag_table_cmd *cmd, int 
*cmd_size)
+{
+       return -ENOENT;
+}
+
+static inline bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt)
+{
+       return false;
+}
+
 #endif /* CONFIG_ACPI */
 
 static inline union acpi_object *
diff --git a/sys/contrib/dev/iwlwifi/fw/api/commands.h 
b/sys/contrib/dev/iwlwifi/fw/api/commands.h
index a91bd66ecb30..c78d2f1c722c 100644
--- a/sys/contrib/dev/iwlwifi/fw/api/commands.h
+++ b/sys/contrib/dev/iwlwifi/fw/api/commands.h
@@ -493,11 +493,6 @@ enum iwl_legacy_cmds {
         */
        DEBUG_LOG_MSG = 0xf7,
 
-       /**
-        * @BCAST_FILTER_CMD: &struct iwl_bcast_filter_cmd
-        */
-       BCAST_FILTER_CMD = 0xcf,
-
        /**
         * @MCAST_FILTER_CMD: &struct iwl_mcast_filter_cmd
         */
diff --git a/sys/contrib/dev/iwlwifi/fw/api/filter.h 
b/sys/contrib/dev/iwlwifi/fw/api/filter.h
index dd62a63956b3..e44c70b7c790 100644
--- a/sys/contrib/dev/iwlwifi/fw/api/filter.h
+++ b/sys/contrib/dev/iwlwifi/fw/api/filter.h
@@ -36,92 +36,4 @@ struct iwl_mcast_filter_cmd {
        u8 addr_list[0];
 } __packed; /* MCAST_FILTERING_CMD_API_S_VER_1 */
 
-#define MAX_BCAST_FILTERS 8
-#define MAX_BCAST_FILTER_ATTRS 2
-
-/**
- * enum iwl_mvm_bcast_filter_attr_offset - written by fw for each Rx packet
- * @BCAST_FILTER_OFFSET_PAYLOAD_START: offset is from payload start.
- * @BCAST_FILTER_OFFSET_IP_END: offset is from ip header end (i.e.
- *     start of ip payload).
- */
-enum iwl_mvm_bcast_filter_attr_offset {
-       BCAST_FILTER_OFFSET_PAYLOAD_START = 0,
-       BCAST_FILTER_OFFSET_IP_END = 1,
-};
-
-/**
- * struct iwl_fw_bcast_filter_attr - broadcast filter attribute
- * @offset_type:       &enum iwl_mvm_bcast_filter_attr_offset.
- * @offset:    starting offset of this pattern.
- * @reserved1: reserved
- * @val:       value to match - big endian (MSB is the first
- *             byte to match from offset pos).
- * @mask:      mask to match (big endian).
- */
-struct iwl_fw_bcast_filter_attr {
-       u8 offset_type;
-       u8 offset;
-       __le16 reserved1;
-       __be32 val;
-       __be32 mask;
-} __packed; /* BCAST_FILTER_ATT_S_VER_1 */
-
-/**
- * enum iwl_mvm_bcast_filter_frame_type - filter frame type
- * @BCAST_FILTER_FRAME_TYPE_ALL: consider all frames.
- * @BCAST_FILTER_FRAME_TYPE_IPV4: consider only ipv4 frames
- */
-enum iwl_mvm_bcast_filter_frame_type {
-       BCAST_FILTER_FRAME_TYPE_ALL = 0,
-       BCAST_FILTER_FRAME_TYPE_IPV4 = 1,
-};
-
-/**
- * struct iwl_fw_bcast_filter - broadcast filter
- * @discard: discard frame (1) or let it pass (0).
- * @frame_type: &enum iwl_mvm_bcast_filter_frame_type.
- * @reserved1: reserved
- * @num_attrs: number of valid attributes in this filter.
- * @attrs: attributes of this filter. a filter is considered matched
- *     only when all its attributes are matched (i.e. AND relationship)
- */
-struct iwl_fw_bcast_filter {
-       u8 discard;
-       u8 frame_type;
-       u8 num_attrs;
-       u8 reserved1;
-       struct iwl_fw_bcast_filter_attr attrs[MAX_BCAST_FILTER_ATTRS];
-} __packed; /* BCAST_FILTER_S_VER_1 */
-
-/**
- * struct iwl_fw_bcast_mac - per-mac broadcast filtering configuration.
- * @default_discard: default action for this mac (discard (1) / pass (0)).
- * @reserved1: reserved
- * @attached_filters: bitmap of relevant filters for this mac.
- */
-struct iwl_fw_bcast_mac {
-       u8 default_discard;
-       u8 reserved1;
-       __le16 attached_filters;
-} __packed; /* BCAST_MAC_CONTEXT_S_VER_1 */
-
-/**
- * struct iwl_bcast_filter_cmd - broadcast filtering configuration
- * @disable: enable (0) / disable (1)
- * @max_bcast_filters: max number of filters (MAX_BCAST_FILTERS)
- * @max_macs: max number of macs (NUM_MAC_INDEX_DRIVER)
- * @reserved1: reserved
- * @filters: broadcast filters
- * @macs: broadcast filtering configuration per-mac
- */
-struct iwl_bcast_filter_cmd {
-       u8 disable;
-       u8 max_bcast_filters;
-       u8 max_macs;
-       u8 reserved1;
-       struct iwl_fw_bcast_filter filters[MAX_BCAST_FILTERS];
-       struct iwl_fw_bcast_mac macs[NUM_MAC_INDEX_DRIVER];
-} __packed; /* BCAST_FILTERING_HCMD_API_S_VER_1 */
-
 #endif /* __iwl_fw_api_filter_h__ */
diff --git a/sys/contrib/dev/iwlwifi/fw/api/power.h 
b/sys/contrib/dev/iwlwifi/fw/api/power.h
index 81318208f2f6..f92cac1da764 100644
--- a/sys/contrib/dev/iwlwifi/fw/api/power.h
+++ b/sys/contrib/dev/iwlwifi/fw/api/power.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2012-2014, 2018-2021 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2022 Intel Corporation
  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
  * Copyright (C) 2015-2017 Intel Deutschland GmbH
  */
@@ -340,7 +340,7 @@ struct iwl_dev_tx_power_cmd_v5 {
 } __packed; /* TX_REDUCED_POWER_API_S_VER_5 */
 
 /**
- * struct iwl_dev_tx_power_cmd_v5 - TX power reduction command version 5
+ * struct iwl_dev_tx_power_cmd_v6 - TX power reduction command version 6
  * @per_chain: per chain restrictions
  * @enable_ack_reduction: enable or disable close range ack TX power
  *     reduction.
@@ -360,6 +360,28 @@ struct iwl_dev_tx_power_cmd_v6 {
        __le32 timer_period;
 } __packed; /* TX_REDUCED_POWER_API_S_VER_6 */
 
+/**
+ * struct iwl_dev_tx_power_cmd_v7 - TX power reduction command version 7
+ * @per_chain: per chain restrictions
+ * @enable_ack_reduction: enable or disable close range ack TX power
+ *     reduction.
+ * @per_chain_restriction_changed: is per_chain_restriction has changed
+ *     from last command. used if set_mode is
+ *     IWL_TX_POWER_MODE_SET_SAR_TIMER.
+ *     note: if not changed, the command is used for keep alive only.
+ * @reserved: reserved (padding)
+ * @timer_period: timer in milliseconds. if expires FW will change to default
+ *     BIOS values. relevant if setMode is IWL_TX_POWER_MODE_SET_SAR_TIMER
+ * @flags: reduce power flags.
+ */
+struct iwl_dev_tx_power_cmd_v7 {
+       __le16 
per_chain[IWL_NUM_CHAIN_TABLES_V2][IWL_NUM_CHAIN_LIMITS][IWL_NUM_SUB_BANDS_V2];
+       u8 enable_ack_reduction;
+       u8 per_chain_restriction_changed;
+       u8 reserved[2];
+       __le32 timer_period;
+       __le32 flags;
+} __packed; /* TX_REDUCED_POWER_API_S_VER_7 */
 /**
  * struct iwl_dev_tx_power_cmd - TX power reduction command (multiversion)
  * @common: common part of the command
@@ -375,6 +397,7 @@ struct iwl_dev_tx_power_cmd {
                struct iwl_dev_tx_power_cmd_v4 v4;
                struct iwl_dev_tx_power_cmd_v5 v5;
                struct iwl_dev_tx_power_cmd_v6 v6;
+               struct iwl_dev_tx_power_cmd_v7 v7;
        };
 };
 
diff --git a/sys/contrib/dev/iwlwifi/fw/api/rs.h 
b/sys/contrib/dev/iwlwifi/fw/api/rs.h
index 2198ca5269e1..687f804c46b7 100644
--- a/sys/contrib/dev/iwlwifi/fw/api/rs.h
+++ b/sys/contrib/dev/iwlwifi/fw/api/rs.h
@@ -752,7 +752,6 @@ struct iwl_lq_cmd {
 
 u8 iwl_fw_rate_idx_to_plcp(int idx);
 u32 iwl_new_rate_from_v1(u32 rate_v1);
-u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags);
 const struct iwl_rate_mcs_info *iwl_rate_mcs(int idx);
 const char *iwl_rs_pretty_ant(u8 ant);
 const char *iwl_rs_pretty_bw(int bw);
diff --git a/sys/contrib/dev/iwlwifi/fw/dbg.c b/sys/contrib/dev/iwlwifi/fw/dbg.c
index 2b21b69b23da..c2928d1f2b65 100644
--- a/sys/contrib/dev/iwlwifi/fw/dbg.c
+++ b/sys/contrib/dev/iwlwifi/fw/dbg.c
@@ -2443,6 +2443,9 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime 
*fwrt,
        struct iwl_dump_ini_region_data reg_data = {
                .dump_data = dump_data,
        };
+       struct iwl_dump_ini_region_data imr_reg_data = {
+               .dump_data = dump_data,
+       };
        int i;
        u32 size = 0;
        u64 regions_mask = le64_to_cpu(trigger->regions_mask) &
@@ -2478,10 +2481,32 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime 
*fwrt,
                                 tp_id);
                        continue;
                }
+               /*
+                * DRAM_IMR can be collected only for FW/HW error timepoint
+                * when fw is not alive. In addition, it must be collected
+                * lastly as it overwrites SRAM that can possibly contain
+                * debug data which also need to be collected.
+                */
+               if (reg_type == IWL_FW_INI_REGION_DRAM_IMR) {
+                       if (tp_id == IWL_FW_INI_TIME_POINT_FW_ASSERT ||
+                           tp_id == IWL_FW_INI_TIME_POINT_FW_HW_ERROR)
+                               imr_reg_data.reg_tlv = 
fwrt->trans->dbg.active_regions[i];
+                       else
+                               IWL_INFO(fwrt,
+                                        "WRT: trying to collect DRAM_IMR at 
time point: %d, skipping\n",
+                                        tp_id);
+               /* continue to next region */
+                       continue;
+               }
+
 
                size += iwl_dump_ini_mem(fwrt, list, &reg_data,
                                         &iwl_dump_ini_region_ops[reg_type]);
        }
+       /* collect DRAM_IMR region in the last */
+       if (imr_reg_data.reg_tlv)
+               size += iwl_dump_ini_mem(fwrt, list, &reg_data,
+                                        
&iwl_dump_ini_region_ops[IWL_FW_INI_REGION_DRAM_IMR]);
 
        if (size)
                size += iwl_dump_ini_info(fwrt, trigger, list);
@@ -2897,6 +2922,11 @@ static void iwl_fw_dbg_collect_sync(struct 
iwl_fw_runtime *fwrt, u8 wk_idx)
        if (!test_bit(wk_idx, &fwrt->dump.active_wks))
                return;
 
+       if (!dump_data->trig) {
+               IWL_ERR(fwrt, "dump trigger data is not set\n");
+               goto out;
+       }
+
        if (!test_bit(STATUS_DEVICE_ENABLED, &fwrt->trans->status)) {
                IWL_ERR(fwrt, "Device is not enabled - cannot dump error\n");
                goto out;
@@ -2984,10 +3014,10 @@ int iwl_fw_dbg_ini_collect(struct iwl_fw_runtime *fwrt,
                 "WRT: Collecting data: ini trigger %d fired (delay=%dms).\n",
                 tp_id, (u32)(delay / USEC_PER_MSEC));
 
-       schedule_delayed_work(&fwrt->dump.wks[idx].wk, usecs_to_jiffies(delay));
-
        if (sync)
                iwl_fw_dbg_collect_sync(fwrt, idx);
+       else
+               schedule_delayed_work(&fwrt->dump.wks[idx].wk, 
usecs_to_jiffies(delay));
 
        return 0;
 }
diff --git a/sys/contrib/dev/iwlwifi/fw/file.h 
b/sys/contrib/dev/iwlwifi/fw/file.h
index fa2a73ae4183..5679a78758be 100644
--- a/sys/contrib/dev/iwlwifi/fw/file.h
+++ b/sys/contrib/dev/iwlwifi/fw/file.h
@@ -181,7 +181,6 @@ struct iwl_ucode_capa {
  * @IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version)
  * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: General support for uAPSD
  * @IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD: P2P client supports uAPSD power save
- * @IWL_UCODE_TLV_FLAGS_BCAST_FILTERING: uCode supports broadcast filtering.
  * @IWL_UCODE_TLV_FLAGS_EBS_SUPPORT: this uCode image supports EBS.
  */
 enum iwl_ucode_tlv_flag {
@@ -196,7 +195,6 @@ enum iwl_ucode_tlv_flag {
        IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT       = BIT(24),
        IWL_UCODE_TLV_FLAGS_EBS_SUPPORT         = BIT(25),
        IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD        = BIT(26),
-       IWL_UCODE_TLV_FLAGS_BCAST_FILTERING     = BIT(29),
 };
 
 typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
@@ -518,34 +516,6 @@ enum iwl_fw_phy_cfg {
        FW_PHY_CFG_SHARED_CLK = BIT(31),
 };
 
-#define IWL_UCODE_MAX_CS               1
-
-/**
- * struct iwl_fw_cipher_scheme - a cipher scheme supported by FW.
- * @cipher: a cipher suite selector
- * @flags: cipher scheme flags (currently reserved for a future use)
- * @hdr_len: a size of MPDU security header
- * @pn_len: a size of PN
- * @pn_off: an offset of pn from the beginning of the security header
- * @key_idx_off: an offset of key index byte in the security header
- * @key_idx_mask: a bit mask of key_idx bits
- * @key_idx_shift: bit shift needed to get key_idx
- * @mic_len: mic length in bytes
- * @hw_cipher: a HW cipher index used in host commands
- */
-struct iwl_fw_cipher_scheme {
-       __le32 cipher;
-       u8 flags;
-       u8 hdr_len;
-       u8 pn_len;
-       u8 pn_off;
-       u8 key_idx_off;
-       u8 key_idx_mask;
-       u8 key_idx_shift;
-       u8 mic_len;
-       u8 hw_cipher;
-} __packed;
-
 enum iwl_fw_dbg_reg_operator {
        CSR_ASSIGN,
        CSR_SETBIT,
diff --git a/sys/contrib/dev/iwlwifi/fw/img.h b/sys/contrib/dev/iwlwifi/fw/img.h
index 89869edb23e8..f878ac508801 100644
--- a/sys/contrib/dev/iwlwifi/fw/img.h
+++ b/sys/contrib/dev/iwlwifi/fw/img.h
@@ -133,16 +133,6 @@ struct iwl_fw_paging {
        u32 fw_offs;
 };
 
-/**
- * struct iwl_fw_cscheme_list - a cipher scheme list
- * @size: a number of entries
- * @cs: cipher scheme entries
- */
-struct iwl_fw_cscheme_list {
-       u8 size;
-       struct iwl_fw_cipher_scheme cs[];
-} __packed;
-
 /**
  * enum iwl_fw_type - iwlwifi firmware type
  * @IWL_FW_DVM: DVM firmware
@@ -197,7 +187,6 @@ struct iwl_dump_exclude {
  * @inst_evtlog_size: event log size for runtime ucode.
  * @inst_errlog_ptr: error log offfset for runtime ucode.
  * @type: firmware type (&enum iwl_fw_type)
- * @cipher_scheme: optional external cipher scheme.
  * @human_readable: human readable version
  *     we get the ALIVE from the uCode
  * @phy_integration_ver: PHY integration version string
@@ -228,7 +217,6 @@ struct iwl_fw {
 
        enum iwl_fw_type type;
 
-       struct iwl_fw_cipher_scheme cs[IWL_UCODE_MAX_CS];
        u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
 
        struct iwl_fw_dbg dbg;
diff --git a/sys/contrib/dev/iwlwifi/fw/rs.c b/sys/contrib/dev/iwlwifi/fw/rs.c
index a21c3befd93b..a835214611ce 100644
--- a/sys/contrib/dev/iwlwifi/fw/rs.c
+++ b/sys/contrib/dev/iwlwifi/fw/rs.c
@@ -91,6 +91,20 @@ const char *iwl_rs_pretty_bw(int bw)
 }
 IWL_EXPORT_SYMBOL(iwl_rs_pretty_bw);
 
+static u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags)
+{
+       int rate = rate_n_flags & RATE_LEGACY_RATE_MSK_V1;
+       int idx;
+       bool ofdm = !(rate_n_flags & RATE_MCS_CCK_MSK_V1);
+       int offset = ofdm ? IWL_FIRST_OFDM_RATE : 0;
+       int last = ofdm ? IWL_RATE_COUNT_LEGACY : IWL_FIRST_OFDM_RATE;
+
+       for (idx = offset; idx < last; idx++)
+               if (iwl_fw_rate_idx_to_plcp(idx) == rate)
+                       return idx - offset;
+       return IWL_RATE_INVALID;
+}
+
 u32 iwl_new_rate_from_v1(u32 rate_v1)
 {
        u32 rate_v2 = 0;
@@ -144,7 +158,10 @@ u32 iwl_new_rate_from_v1(u32 rate_v1)
        } else {
                u32 legacy_rate = iwl_legacy_rate_to_fw_idx(rate_v1);
 
-               WARN_ON(legacy_rate < 0);
+               if (WARN_ON_ONCE(legacy_rate == IWL_RATE_INVALID))
+                       legacy_rate = (rate_v1 & RATE_MCS_CCK_MSK_V1) ?
+                               IWL_FIRST_CCK_RATE : IWL_FIRST_OFDM_RATE;
+
                rate_v2 |= legacy_rate;
                if (!(rate_v1 & RATE_MCS_CCK_MSK_V1))
                        rate_v2 |= RATE_MCS_LEGACY_OFDM_MSK;
@@ -172,20 +189,6 @@ u32 iwl_new_rate_from_v1(u32 rate_v1)
 }
 IWL_EXPORT_SYMBOL(iwl_new_rate_from_v1);
 
-u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags)
-{
-       int rate = rate_n_flags & RATE_LEGACY_RATE_MSK_V1;
-       int idx;
-       bool ofdm = !(rate_n_flags & RATE_MCS_CCK_MSK_V1);
-       int offset = ofdm ? IWL_FIRST_OFDM_RATE : 0;
-       int last = ofdm ? IWL_RATE_COUNT_LEGACY : IWL_FIRST_OFDM_RATE;
-
-       for (idx = offset; idx < last; idx++)
-               if (iwl_fw_rate_idx_to_plcp(idx) == rate)
-                       return idx - offset;
-       return -1;
-}
-
 int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
 {
        char *type;
diff --git a/sys/contrib/dev/iwlwifi/fw/runtime.h 
b/sys/contrib/dev/iwlwifi/fw/runtime.h
index afc822cab674..d3cb1ae68a96 100644
--- a/sys/contrib/dev/iwlwifi/fw/runtime.h
+++ b/sys/contrib/dev/iwlwifi/fw/runtime.h
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
  * Copyright (C) 2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2020 Intel Corporation
+ * Copyright (C) 2018-2022 Intel Corporation
  */
 #ifndef __iwl_fw_runtime_h__
 #define __iwl_fw_runtime_h__
@@ -163,6 +163,7 @@ struct iwl_fw_runtime {
        u32 ppag_ver;
        struct iwl_sar_offset_mapping_cmd sgom_table;
        bool sgom_enabled;
+       u8 reduced_power_flags;
 #endif
 };
 
diff --git a/sys/contrib/dev/iwlwifi/iwl-config.h 
b/sys/contrib/dev/iwlwifi/iwl-config.h
index b7e430ad5e2a..f5b556a103e8 100644
--- a/sys/contrib/dev/iwlwifi/iwl-config.h
+++ b/sys/contrib/dev/iwlwifi/iwl-config.h
@@ -260,6 +260,7 @@ enum iwl_cfg_trans_ltr_delay {
  * @integrated: discrete or integrated
  * @low_latency_xtal: use the low latency xtal if supported
  * @ltr_delay: LTR delay parameter, &enum iwl_cfg_trans_ltr_delay.
+ * @imr_enabled: use the IMR if supported.
  */
 struct iwl_cfg_trans_params {
        const struct iwl_base_params *base_params;
@@ -274,7 +275,8 @@ struct iwl_cfg_trans_params {
            integrated:1,
            low_latency_xtal:1,
            bisr_workaround:1,
-           ltr_delay:2;
+           ltr_delay:2,
+           imr_enabled:1;
 };
 
 /**
@@ -491,6 +493,7 @@ extern const struct iwl_cfg_trans_params 
iwl_ax200_trans_cfg;
 extern const struct iwl_cfg_trans_params iwl_snj_trans_cfg;
 extern const struct iwl_cfg_trans_params iwl_so_trans_cfg;
 extern const struct iwl_cfg_trans_params iwl_so_long_latency_trans_cfg;
+extern const struct iwl_cfg_trans_params iwl_so_long_latency_imr_trans_cfg;
 extern const struct iwl_cfg_trans_params iwl_ma_trans_cfg;
 extern const struct iwl_cfg_trans_params iwl_bz_trans_cfg;
 extern const char iwl9162_name[];
diff --git a/sys/contrib/dev/iwlwifi/iwl-context-info-gen3.h 
b/sys/contrib/dev/iwlwifi/iwl-context-info-gen3.h
index 5adf485db38e..b84884034c74 100644
--- a/sys/contrib/dev/iwlwifi/iwl-context-info-gen3.h
+++ b/sys/contrib/dev/iwlwifi/iwl-context-info-gen3.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2018, 2020-2021 Intel Corporation
+ * Copyright (C) 2018, 2020-2022 Intel Corporation
  */
 #ifndef __iwl_context_info_file_gen3_h__
 #define __iwl_context_info_file_gen3_h__
@@ -34,6 +34,7 @@ enum iwl_prph_scratch_mtr_format {
 
 /**
  * enum iwl_prph_scratch_flags - PRPH scratch control flags
+ * @IWL_PRPH_SCRATCH_IMR_DEBUG_EN: IMR support for debug
  * @IWL_PRPH_SCRATCH_EARLY_DEBUG_EN: enable early debug conf
  * @IWL_PRPH_SCRATCH_EDBG_DEST_DRAM: use DRAM, with size allocated
  *     in hwm config.
@@ -55,6 +56,7 @@ enum iwl_prph_scratch_mtr_format {
  * @IWL_PRPH_SCRATCH_RB_SIZE_EXT_16K: 16kB RB size
  */
 enum iwl_prph_scratch_flags {
+       IWL_PRPH_SCRATCH_IMR_DEBUG_EN           = BIT(1),
        IWL_PRPH_SCRATCH_EARLY_DEBUG_EN         = BIT(4),
        IWL_PRPH_SCRATCH_EDBG_DEST_DRAM         = BIT(8),
        IWL_PRPH_SCRATCH_EDBG_DEST_INTERNAL     = BIT(9),
diff --git a/sys/contrib/dev/iwlwifi/iwl-csr.h 
b/sys/contrib/dev/iwlwifi/iwl-csr.h
index c0a18e820b51..3e1f011e93aa 100644
--- a/sys/contrib/dev/iwlwifi/iwl-csr.h
+++ b/sys/contrib/dev/iwlwifi/iwl-csr.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2005-2014, 2018-2021 Intel Corporation
+ * Copyright (C) 2005-2014, 2018-2022 Intel Corporation
  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
  * Copyright (C) 2016 Intel Deutschland GmbH
  */
@@ -329,6 +329,7 @@ enum {
 #define CSR_HW_REV_TYPE_2x00           (0x0000100)
 #define CSR_HW_REV_TYPE_105            (0x0000110)
 #define CSR_HW_REV_TYPE_135            (0x0000120)
+#define CSR_HW_REV_TYPE_3160           (0x0000164)
 #define CSR_HW_REV_TYPE_7265D          (0x0000210)
 #define CSR_HW_REV_TYPE_NONE           (0x00001F0)
 #define CSR_HW_REV_TYPE_QNJ            (0x0000360)
diff --git a/sys/contrib/dev/iwlwifi/iwl-dbg-tlv.h 
b/sys/contrib/dev/iwlwifi/iwl-dbg-tlv.h
index 79287708bd6e..128059ca77e6 100644
--- a/sys/contrib/dev/iwlwifi/iwl-dbg-tlv.h
+++ b/sys/contrib/dev/iwlwifi/iwl-dbg-tlv.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2018-2021 Intel Corporation
+ * Copyright (C) 2018-2022 Intel Corporation
  */
 #ifndef __iwl_dbg_tlv_h__
 #define __iwl_dbg_tlv_h__
@@ -10,6 +10,8 @@
 #include <fw/file.h>
 #include <fw/api/dbg-tlv.h>
 
+#define IWL_DBG_TLV_MAX_PRESET 15
+
 /**
  * struct iwl_dbg_tlv_node - debug TLV node
  * @list: list of &struct iwl_dbg_tlv_node
diff --git a/sys/contrib/dev/iwlwifi/iwl-drv.c 
b/sys/contrib/dev/iwlwifi/iwl-drv.c
index f372d5c5ec87..263126a739b5 100644
--- a/sys/contrib/dev/iwlwifi/iwl-drv.c
+++ b/sys/contrib/dev/iwlwifi/iwl-drv.c
@@ -335,30 +335,6 @@ static void set_sec_offset(struct iwl_firmware_pieces 
*pieces,
        pieces->img[type].sec[sec].offset = offset;
 }
 
-static int iwl_store_cscheme(struct iwl_fw *fw, const u8 *data, const u32 len)
-{
-       int i, j;
-       const struct iwl_fw_cscheme_list *l =
-               (const struct iwl_fw_cscheme_list *)data;
-       const struct iwl_fw_cipher_scheme *fwcs;
-
-       if (len < sizeof(*l) ||
-           len < sizeof(l->size) + l->size * sizeof(l->cs[0]))
-               return -EINVAL;
-
-       for (i = 0, j = 0; i < IWL_UCODE_MAX_CS && i < l->size; i++) {
-               fwcs = &l->cs[j];
-
-               /* we skip schemes with zero cipher suite selector */
-               if (!fwcs->cipher)
-                       continue;
-
-               fw->cs[j++] = *fwcs;
-       }
-
-       return 0;
*** 1192 LINES SKIPPED ***

Reply via email to