* [PATCH v3 0/3] wifi: iwlwifi: add Device Tree hardware integration information
@ 2026-05-13 6:05 Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 1/3] dt-bindings: net: wireless: Add Intel Wi-Fi 7 BE200 PCIe adapter Avinash Bhatt
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Avinash Bhatt @ 2026-05-13 6:05 UTC (permalink / raw)
To: devicetree, linux-wireless
Cc: robh, krzk+dt, conor+dt, johannes, miriam.rachel.korenblit,
linux-kernel, kobi.guetta, emmanuel.grumbach
Add Device Tree support for Intel Wi-Fi hardware integration information
on platforms that do not provide UEFI variables or ACPI methods.
Patch 1/3 adds the DT binding schema for the Intel iwlwifi compatible
node. Patches 2/3 and 3/3 add the driver infrastructure and integrate
DT as the lowest-priority fallback after UEFI and ACPI; they are
included for reference to show how the binding is consumed by the
driver and will be merged through the regular iwlwifi upstreaming
process, not through the DT tree.
Changes since v2:
Binding (patch 1/3):
- Subject and title updated to describe the BE200 hardware
- Revision header cell removed from all properties; each property is
now a scalar uint32 or plain fixed-size array
- intel,wrds: reduced to 49 cells (mode word + 4x12 SAR values)
- intel,uats: reduced to 338 bytes (26x13 country nibble matrix)
- Removed allOf/items const: 0 constraints from all properties
- intel,srd: changed from integer enum to string enum
(active-scan/passive-scan/disabled)
- Removed "reserved, must be 0" annotations; bits with no assigned
meaning are not documented
- Added allOf: $ref: /schemas/net/wireless/ieee80211.yaml#
Driver (patch 2/3):
- Removed dsm_func_to_prop_name() and all IWL_DT_PROP_* defines;
each property function now calls of_property_read_*() directly with
the literal property string
- Driver updated to match binding changes (no revision cells,
string-based intel,srd, scalar uint32 DSM properties, 338-byte
intel,uats)
- Added iwl_dt_init() to validate DT node compatible at probe time;
all DT reads gated on fwrt->dt_compatible
- fw/dt.h now includes fw/runtime.h directly, making it self-contained
Fallback integration (patch 3/3):
- No changes from v2
Link to v2: https://patchwork.kernel.org/project/linux-wireless/patch/20260504095327.30892-1-avinash.bhatt@intel.com/
Link to v1: https://patchwork.kernel.org/project/linux-wireless/patch/20260429081403.46087-2-avinash.bhatt@intel.com/
Link to RFC: https://patchwork.kernel.org/project/devicetree/patch/20260408055709.11579-2-avinash.bhatt@intel.com/
Avinash Bhatt (3):
dt-bindings: net: wireless: Add Intel Wi-Fi 7 BE200 PCIe adapter
wifi: iwlwifi: dt: add Device Tree BIOS configuration infrastructure
wifi: iwlwifi: dt: use Device Tree as fallback BIOS configuration source
.../bindings/net/wireless/intel,iwlwifi.yaml | 248 +++++++++++++++++
MAINTAINERS | 1 +
drivers/net/wireless/intel/iwlwifi/Makefile | 1 +
drivers/net/wireless/intel/iwlwifi/fw/acpi.h | 5 +-
.../wireless/intel/iwlwifi/fw/api/nvm-reg.h | 4 +-
drivers/net/wireless/intel/iwlwifi/fw/dt.c | 332 +++++++++++++++++++
drivers/net/wireless/intel/iwlwifi/fw/dt.h | 161 +++++++++
drivers/net/wireless/intel/iwlwifi/fw/init.c | 4 +-
.../wireless/intel/iwlwifi/fw/regulatory.c | 3 +++
.../wireless/intel/iwlwifi/fw/regulatory.h | 3 +-
drivers/net/wireless/intel/iwlwifi/fw/runtime.h | 6 +-
drivers/net/wireless/intel/iwlwifi/mld/mld.c | 3 +++
.../intel/iwlwifi/mld/regulatory.c | 5 ++-
13 files changed, 772 insertions(+), 11 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/3] dt-bindings: net: wireless: Add Intel Wi-Fi 7 BE200 PCIe adapter
2026-05-13 6:05 [PATCH v3 0/3] wifi: iwlwifi: add Device Tree hardware integration information Avinash Bhatt
@ 2026-05-13 6:05 ` Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 2/3] wifi: iwlwifi: dt: add Device Tree BIOS configuration infrastructure Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 3/3] wifi: iwlwifi: dt: use Device Tree as fallback BIOS configuration source Avinash Bhatt
2 siblings, 0 replies; 4+ messages in thread
From: Avinash Bhatt @ 2026-05-13 6:05 UTC (permalink / raw)
To: devicetree, linux-wireless
Cc: robh, krzk+dt, conor+dt, johannes, miriam.rachel.korenblit,
linux-kernel, kobi.guetta, emmanuel.grumbach
The Intel Wi-Fi 7 BE200 is a discrete PCIe Wi-Fi adapter supporting
802.11be with tri-band operation including the 6 GHz band.
Signed-off-by: Avinash Bhatt <avinash.bhatt@intel.com>
---
.../bindings/net/wireless/intel,iwlwifi.yaml | 248 ++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 249 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/wireless/intel,iwlwifi.yaml
diff --git a/Documentation/devicetree/bindings/net/wireless/intel,iwlwifi.yaml b/Documentation/devicetree/bindings/net/wireless/intel,iwlwifi.yaml
new file mode 100644
index 000000000000..e5ba5e7608e2
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/wireless/intel,iwlwifi.yaml
@@ -0,0 +1,248 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright (c) 2026 Intel Corporation
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/net/wireless/intel,iwlwifi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Intel Wi-Fi 7 BE200 PCIe adapter
+
+maintainers:
+ - Avinash Bhatt <avinash.bhatt@intel.com>
+ - Miri Korenblit <miriam.rachel.korenblit@intel.com>
+
+description:
+ Intel Wi-Fi 7 BE200 (BE200NGW) IEEE 802.11be discrete PCIe adapter.
+
+allOf:
+ - $ref: /schemas/net/wireless/ieee80211.yaml#
+
+properties:
+ compatible:
+ enum:
+ - pci8086,272b
+
+ reg:
+ maxItems: 1
+
+ intel,wrds:
+ description: |
+ SAR (Specific Absorption Rate) transmit power limits per antenna chain
+ and frequency subband, in units of 0.125 dBm.
+
+ First cell is the mode word: bit 0 set enables SAR limiting, bit 0
+ clear disables it (device uses its certified maximum).
+
+ Followed by 48 limit values for four antenna chains in order:
+ chain A, chain B, CDB chain A, CDB chain B. Each chain has 12
+ subband values covering the following frequency ranges:
+
+ [0] 2.4 GHz ch 1-13 (2412-2472 MHz)
+ [1] 5 GHz ch 36-64 (5180-5320 MHz)
+ [2] 5 GHz ch 68-96 (5340-5480 MHz)
+ [3] 5 GHz ch 100-144 (5500-5720 MHz)
+ [4] 5 GHz ch 149-177 (5745-5885 MHz)
+ [5] 6 GHz ch 1-45 (5955-6175 MHz)
+ [6] 6 GHz ch 49-93 (6195-6415 MHz)
+ [7] 6 GHz ch 97-115 (6435-6525 MHz)
+ [8] 6 GHz ch 117-151 (6535-6705 MHz)
+ [9] 6 GHz ch 153-183 (6715-6865 MHz)
+ [10] 6 GHz ch 185-233 (6875-7115 MHz)
+ [11] 6 GHz ch 237-253 (7135-7215 MHz)
+ $ref: /schemas/types.yaml#/definitions/uint32-array
+ minItems: 49
+ maxItems: 49
+
+ intel,uats:
+ description: |
+ Per-country enablement matrix for 6 GHz AP types. 338-byte array
+ encoding which AP types (AFC, VLP, LPI) are permitted per country.
+
+ Countries are identified by ISO 3166-1 alpha-2 code. The matrix
+ covers all 26x26 = 676 two-letter combinations (AA..ZZ), stored
+ column-major (all second-letter variants for first letter A first,
+ then B, and so on). 26 columns x 13 bytes = 338 bytes total.
+
+ Each country occupies 4 bits (a nibble); two countries are packed
+ per byte, low nibble first:
+ bit 0: AFC (Standard Power AP) permitted
+ bit 1: VLP (Very Low Power AP) permitted
+ bit 2: LPI (Low Power Indoor AP) permitted
+
+ A bit is only effective when the corresponding control bit in
+ intel,6e-uhb is also set (bit 30 for AFC, bit 29 for VLP,
+ bit 31 for LPI per-country mode).
+ $ref: /schemas/types.yaml#/definitions/uint8-array
+ minItems: 338
+ maxItems: 338
+
+ intel,srd:
+ description: |
+ ETSI 5.8 GHz SRD (Short Range Device) channel behaviour in the
+ 5725-5875 MHz band for ETSI regulatory domains.
+
+ active-scan - active scanning permitted (default)
+ passive-scan - device may associate and transfer data but must
+ not transmit probe requests on SRD channels
+ disabled - device must not scan, associate, or operate on
+ any SRD channel
+ enum:
+ - active-scan
+ - passive-scan
+ - disabled
+
+ intel,6e-uhb:
+ description: |
+ 6-7 GHz Ultra-High Band (UHB) per-country enable bitmask.
+
+ bit 0: override control; 0 = use device defaults,
+ 1 = force-disable all countries not explicitly
+ enabled in bits 1-25
+ bit 1: USA
+ bit 2: Rest of World (ROW)
+ bit 3: EU
+ bit 4: South Korea
+ bit 5: Brazil
+ bit 6: Chile
+ bit 7: Japan
+ bit 8: Canada
+ bit 9: Morocco
+ bit 10: Mongolia
+ bit 11: Malaysia
+ bit 12: Saudi Arabia
+ bit 13: Mexico
+ bit 14: Nigeria
+ bit 15: Thailand
+ bit 16: Singapore
+ bit 17: Taiwan
+ bit 18: South Africa
+ bit 19: Philippines
+ bit 20: Serbia
+ bit 21: Indonesia
+ bit 22: Azerbaijan
+ bit 23: Paraguay
+ bit 24: Vietnam
+ bit 25: India
+ bit 27: enable VLP active scan, SoftAP, and P2P-GO in Japan
+ bit 29: enable VLP mode per intel,uats country table
+ bit 30: enable AFC mode per intel,uats country table
+ bit 31: use intel,uats country table for LPI (0 = group mode)
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+ intel,regulatory-special:
+ description: |
+ Special regulatory configuration flags.
+
+ bit 4: enable Australia UHB band extension
+ bit 5: Bangladesh 6 GHz UHB enablement
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+ intel,activate-channel:
+ description: |
+ Indoor channel activation bitmask. Enables specific frequency bands
+ for active use when the platform is operating indoors.
+
+ bit 0: EU U-NII-1 (5150-5250 MHz)
+ bit 1: Japan U-NII-1 (5150-5250 MHz)
+ bit 2: China Mainland U-NII-1 (5150-5250 MHz)
+ bit 3: USA U-NII-4 (5850-5925 MHz)
+ bit 4: Worldwide U-NII-1 (5150-5250 MHz) for any country
+ where the band is permitted indoors
+ bit 5: Canada U-NII-4 (5850-5925 MHz)
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+ intel,force-disable-channels:
+ description: |
+ Per-band force-disable bitmask. Permanently disables specific
+ frequency bands regardless of regulatory domain.
+
+ bit 0: 2.4 GHz (ch 1-13, 2412-2472 MHz)
+ bit 1: 5.2 GHz (ch 36-48, 5180-5240 MHz)
+ bit 2: 5.3 GHz (ch 52-64, 5260-5320 MHz)
+ bit 3: 5.5 GHz (ch 100-144, 5500-5720 MHz)
+ bit 4: 5.8 GHz (ch 149-165, 5745-5825 MHz)
+ bit 5: 5.9 GHz (ch 169-177, 5845-5885 MHz)
+ bit 6: 6.2 GHz (ch 1-93, 5955-6415 MHz)
+ bit 7: 6.5 GHz (ch 97-113, 6435-6525 MHz)
+ bit 8: 6.6 GHz (ch 117-153, 6535-6705 MHz)
+ bit 9: 6.8 GHz (ch 157-185, 6715-6885 MHz)
+ bit 10: 7.0 GHz (ch 185-233, 6875-7115 MHz)
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+ intel,11be:
+ description: |
+ 802.11be (Wi-Fi 7) per-country enable bitmask.
+
+ bit 0: China (CN)
+ bit 1: South Korea
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+ intel,splc:
+ description:
+ Platform thermal power limit for the Wi-Fi core in mW. The device
+ will not exceed this limit regardless of regulatory maximums.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 1
+
+ intel,wcpe:
+ description: |
+ 802.11be channel puncturing enable bitmask. When set, allows the
+ device to puncture (skip) sub-channels within a wide channel for
+ coexistence with incumbents, subject to country certification.
+
+ bit 0: USA
+ bit 1: Canada
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+ intel,wbem:
+ description: |
+ 320 MHz channel bandwidth enable bitmask per country. Each bit
+ takes effect only if the installed module is certified for 320 MHz
+ in that country.
+
+ bit 0: Japan
+ bit 1: South Korea
+ $ref: /schemas/types.yaml#/definitions/uint32
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ pcie {
+ #address-cells = <3>;
+ #size-cells = <2>;
+
+ pcie@0 {
+ device_type = "pci";
+ reg = <0x0 0x0 0x0 0x0 0x0>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+ ranges;
+ bus-range = <0x01 0xff>;
+
+ wifi@0 {
+ compatible = "pci8086,272b";
+ reg = <0x10000 0x0 0x0 0x0 0x0>;
+
+ /* SAR power limits: mode + 4 chains x 12 subbands */
+ intel,wrds = <
+ 0x01
+ 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38
+ 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38 0x38
+ 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c
+ 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c 0x3c
+ >;
+
+ intel,splc = <4500>;
+ intel,wcpe = <0x03>;
+ intel,wbem = <0x03>;
+ intel,srd = "passive-scan";
+ intel,activate-channel = <0x01>;
+ intel,6e-uhb = <0x06>;
+ };
+ };
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index 77fdfcb55f06..674320ef137e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13256,6 +13256,7 @@ L: linux-wireless@vger.kernel.org
S: Supported
W: https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi
T: git https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next.git/
+F: Documentation/devicetree/bindings/net/wireless/intel,iwlwifi.yaml
F: drivers/net/wireless/intel/iwlwifi/
INTEL VISION SENSING CONTROLLER DRIVER
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/3] wifi: iwlwifi: dt: add Device Tree BIOS configuration infrastructure
2026-05-13 6:05 [PATCH v3 0/3] wifi: iwlwifi: add Device Tree hardware integration information Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 1/3] dt-bindings: net: wireless: Add Intel Wi-Fi 7 BE200 PCIe adapter Avinash Bhatt
@ 2026-05-13 6:05 ` Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 3/3] wifi: iwlwifi: dt: use Device Tree as fallback BIOS configuration source Avinash Bhatt
2 siblings, 0 replies; 4+ messages in thread
From: Avinash Bhatt @ 2026-05-13 6:05 UTC (permalink / raw)
To: devicetree, linux-wireless
Cc: robh, krzk+dt, conor+dt, johannes, miriam.rachel.korenblit,
linux-kernel, kobi.guetta, emmanuel.grumbach
On platforms that use Device Tree and do not provide UEFI variables or
ACPI methods, discrete Intel Wi-Fi adapters have no way to receive BIOS
configuration. Add Device Tree as a supported configuration source for
SAR limits and 6 GHz AP type support, with stub hooks for TAS and
per-platform antenna gain tables.
DT support is gated on CONFIG_OF and is a no-op on x86. BIOS_SOURCE_DT
is added to enum bios_source to track the configuration origin.
Signed-off-by: Avinash Bhatt <avinash.bhatt@intel.com>
---
drivers/net/wireless/intel/iwlwifi/Makefile | 1 +
drivers/net/wireless/intel/iwlwifi/fw/acpi.h | 5 +-
.../wireless/intel/iwlwifi/fw/api/nvm-reg.h | 4 +-
drivers/net/wireless/intel/iwlwifi/fw/dt.c | 332 ++++++++++++++++++
drivers/net/wireless/intel/iwlwifi/fw/dt.h | 161 +++++++++
drivers/net/wireless/intel/iwlwifi/fw/init.c | 4 +-
.../wireless/intel/iwlwifi/fw/regulatory.h | 3 +-
.../net/wireless/intel/iwlwifi/fw/runtime.h | 6 +-
intc-scripts/publishable-files | 2 +
9 files changed, 510 insertions(+), 8 deletions(-)
create mode 100644 drivers/net/wireless/intel/iwlwifi/fw/dt.c
create mode 100644 drivers/net/wireless/intel/iwlwifi/fw/dt.h
diff --git a/drivers/net/wireless/intel/iwlwifi/Makefile b/drivers/net/wireless/intel/iwlwifi/Makefile
index 060604fa6c..c7a2d5ee66 100644
--- a/drivers/net/wireless/intel/iwlwifi/Makefile
+++ b/drivers/net/wireless/intel/iwlwifi/Makefile
@@ -18,6 +18,7 @@ iwlwifi-$(CPTCFG_IWLMVM) += fw/paging.o fw/smem.o fw/init.o
iwlwifi-$(CPTCFG_IWLMLD) += fw/smem.o fw/init.o
iwlwifi-$(CONFIG_ACPI) += fw/acpi.o
iwlwifi-$(CONFIG_EFI) += fw/uefi.o
+iwlwifi-$(CONFIG_OF) += fw/dt.o
iwlwifi-$(CPTCFG_IWLXVT) += fw/paging.o fw/smem.o
iwlwifi-$(CPTCFG_IWLPROD) += fw/init.o
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
index a1f89ced15..2356365db2 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* Copyright (C) 2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2023, 2025 Intel Corporation
+ * Copyright (C) 2018-2023, 2025-2026 Intel Corporation
*/
#ifndef __iwl_fw_acpi__
#define __iwl_fw_acpi__
@@ -115,9 +115,6 @@
#define ACPI_PPAG_WIFI_DATA_SIZE_V3 ((ACPI_PPAG_NUM_CHAINS * \
ACPI_PPAG_NUM_BANDS_V3) + 2)
-#define IWL_SAR_ENABLE_MSK BIT(0)
-#define IWL_REDUCE_POWER_FLAGS_POS 1
-
/* The Inidcator whether UEFI WIFI GUID tables are locked is read from ACPI */
#define UEFI_WIFI_GUID_UNLOCKED 0
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h b/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
index 2bec56937c..4b3b97f137 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
- * Copyright (C) 2012-2014, 2018-2025 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2026 Intel Corporation
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
* Copyright (C) 2016-2017 Intel Deutschland GmbH
*/
@@ -527,11 +527,13 @@ struct iwl_tas_config_cmd_v2_v4 {
* @BIOS_SOURCE_NONE: BIOS source is not defined
* @BIOS_SOURCE_ACPI: BIOS source is ACPI
* @BIOS_SOURCE_UEFI: BIOS source is UEFI
+ * @BIOS_SOURCE_DT: BIOS source is Device Tree
*/
enum bios_source {
BIOS_SOURCE_NONE,
BIOS_SOURCE_ACPI,
BIOS_SOURCE_UEFI,
+ BIOS_SOURCE_DT,
};
/**
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dt.c b/drivers/net/wireless/intel/iwlwifi/fw/dt.c
new file mode 100644
index 0000000000..5fd7628ec1
--- /dev/null
+++ b/drivers/net/wireless/intel/iwlwifi/fw/dt.c
@@ -0,0 +1,332 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2026 Intel Corporation
+ */
+#include <linux/of.h>
+#include "iwl-drv.h"
+#include "iwl-debug.h"
+#include "fw/runtime.h"
+#include "fw/regulatory.h"
+#include "dt.h"
+
+/* PCI compatible strings for supported hardware */
+static const char * const iwl_dt_compatible[] = {
+ "pci8086,272b", /* Intel Wi-Fi 7 BE200 */
+ NULL
+};
+
+void iwl_dt_init(struct iwl_fw_runtime *fwrt)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ const char * const *compat;
+
+ if (!node)
+ return;
+
+ for (compat = iwl_dt_compatible; *compat; compat++) {
+ if (of_device_is_compatible(node, *compat)) {
+ fwrt->dt_compatible = true;
+ return;
+ }
+ }
+
+ IWL_ERR(fwrt,
+ "DT node compatible does not match any supported hardware - ignoring DT\n");
+}
+IWL_EXPORT_SYMBOL(iwl_dt_init);
+
+/* intel,wcpe - channel puncturing enable bits */
+#define IWL_DT_WCPE_USA_EN BIT(0) /* USA */
+#define IWL_DT_WCPE_CANADA_EN BIT(1) /* Canada */
+#define IWL_DT_WCPE_MASK \
+ (IWL_DT_WCPE_USA_EN | IWL_DT_WCPE_CANADA_EN)
+
+/* SAR layout for "intel,wrds": 4 chains x 12 subbands */
+#define IWL_DT_WRDS_NUM_CHAINS 4
+#define IWL_DT_WRDS_NUM_SUBBANDS 12
+/* Total cell count: 1-cell mode header + SAR data */
+#define IWL_DT_WRDS_MAX_CELLS \
+ (1 + IWL_DT_WRDS_NUM_CHAINS * IWL_DT_WRDS_NUM_SUBBANDS)
+
+int iwl_dt_get_wrds_table(struct iwl_fw_runtime *fwrt)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ u32 buf[IWL_DT_WRDS_MAX_CELLS];
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32_array(node, "intel,wrds", buf,
+ IWL_DT_WRDS_MAX_CELLS);
+ if (ret) {
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,wrds read failed (%d)\n", ret);
+ return ret;
+ }
+
+ IWL_DEBUG_RADIO(fwrt,
+ "DT: reading intel,wrds (%u chains, %u subbands)\n",
+ IWL_DT_WRDS_NUM_CHAINS, IWL_DT_WRDS_NUM_SUBBANDS);
+
+ /* buf[0]: mode; bit 0 (IWL_SAR_ENABLE_MSK) enables SAR */
+
+ BUILD_BUG_ON(IWL_DT_WRDS_NUM_CHAINS > BIOS_SAR_MAX_CHAINS_PER_PROFILE);
+ BUILD_BUG_ON(IWL_DT_WRDS_NUM_SUBBANDS > BIOS_SAR_MAX_SUB_BANDS_NUM);
+
+ /* buf[1..]: chains[0..N-1] x subbands[0..M-1] in row-major order */
+ for (int i = 0; i < IWL_DT_WRDS_NUM_CHAINS; i++) {
+ for (int j = 0; j < IWL_DT_WRDS_NUM_SUBBANDS; j++) {
+ u32 val = buf[1 + i * IWL_DT_WRDS_NUM_SUBBANDS + j];
+
+ if (val > U8_MAX) {
+ IWL_DEBUG_RADIO(fwrt,
+ "DT: intel,wrds OOB [%u][%u]=%u\n",
+ i, j, val);
+ return -EINVAL;
+ }
+ fwrt->sar_profiles[0].chains[i].subbands[j] = (u8)val;
+ }
+ }
+
+ if (buf[0] & IWL_SAR_ENABLE_MSK)
+ fwrt->sar_profiles[0].enabled = true;
+
+ return 0;
+}
+
+void iwl_dt_get_uats_table(struct iwl_fw_runtime *fwrt)
+{
+ size_t map_size = sizeof(fwrt->ap_type_cmd.mcc_to_ap_type_map);
+ struct device_node *node = dev_of_node(fwrt->dev);
+ const u8 *prop_data;
+ int len;
+
+ if (!node)
+ return;
+
+ prop_data = of_get_property(node, "intel,uats", &len);
+ if (!prop_data)
+ return;
+
+ if (len != (int)map_size) {
+ IWL_DEBUG_FW(fwrt,
+ "DT: intel,uats bad length %d (expected %zu)\n",
+ len, map_size);
+ return;
+ }
+
+ IWL_DEBUG_FW(fwrt, "DT: reading intel,uats\n");
+ memcpy(fwrt->ap_type_cmd.mcc_to_ap_type_map, prop_data, map_size);
+ fwrt->ap_type_cmd_valid = true;
+}
+IWL_EXPORT_SYMBOL(iwl_dt_get_uats_table);
+
+int iwl_dt_get_srd(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ const char *str;
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_string(node, "intel,srd", &str);
+ if (ret)
+ return ret;
+
+ if (!strcmp(str, "active-scan"))
+ *value = 0;
+ else if (!strcmp(str, "passive-scan"))
+ *value = 1;
+ else if (!strcmp(str, "disabled"))
+ *value = 2;
+ else
+ return -EINVAL;
+
+ if (fwrt->dsm_source == BIOS_SOURCE_NONE) {
+ fwrt->dsm_source = BIOS_SOURCE_DT;
+ fwrt->dsm_revision = 0;
+ }
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,srd = %s (%u)\n", str, *value);
+ return 0;
+}
+
+int iwl_dt_get_6e_uhb(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,6e-uhb", value);
+ if (ret)
+ return ret;
+
+ if (fwrt->dsm_source == BIOS_SOURCE_NONE) {
+ fwrt->dsm_source = BIOS_SOURCE_DT;
+ fwrt->dsm_revision = 0;
+ }
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,6e-uhb = 0x%x\n", *value);
+ return 0;
+}
+
+int iwl_dt_get_regulatory_special(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,regulatory-special", value);
+ if (ret)
+ return ret;
+
+ if (fwrt->dsm_source == BIOS_SOURCE_NONE) {
+ fwrt->dsm_source = BIOS_SOURCE_DT;
+ fwrt->dsm_revision = 0;
+ }
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,regulatory-special = 0x%x\n", *value);
+ return 0;
+}
+
+int iwl_dt_get_activate_channel(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,activate-channel", value);
+ if (ret)
+ return ret;
+
+ if (fwrt->dsm_source == BIOS_SOURCE_NONE) {
+ fwrt->dsm_source = BIOS_SOURCE_DT;
+ fwrt->dsm_revision = 0;
+ }
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,activate-channel = 0x%x\n", *value);
+ return 0;
+}
+
+int iwl_dt_get_force_disable_channels(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,force-disable-channels", value);
+ if (ret)
+ return ret;
+
+ if (fwrt->dsm_source == BIOS_SOURCE_NONE) {
+ fwrt->dsm_source = BIOS_SOURCE_DT;
+ fwrt->dsm_revision = 0;
+ }
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,force-disable-channels = 0x%x\n",
+ *value);
+ return 0;
+}
+
+int iwl_dt_get_11be(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,11be", value);
+ if (ret)
+ return ret;
+
+ if (fwrt->dsm_source == BIOS_SOURCE_NONE) {
+ fwrt->dsm_source = BIOS_SOURCE_DT;
+ fwrt->dsm_revision = 0;
+ }
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,11be = 0x%x\n", *value);
+ return 0;
+}
+
+int iwl_dt_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
+ u32 *value)
+{
+ switch (func) {
+ case DSM_FUNC_DISABLE_SRD:
+ return iwl_dt_get_srd(fwrt, value);
+ case DSM_FUNC_ENABLE_6E:
+ return iwl_dt_get_6e_uhb(fwrt, value);
+ case DSM_FUNC_REGULATORY_CONFIG:
+ return iwl_dt_get_regulatory_special(fwrt, value);
+ case DSM_FUNC_ACTIVATE_CHANNEL:
+ return iwl_dt_get_activate_channel(fwrt, value);
+ case DSM_FUNC_FORCE_DISABLE_CHANNELS:
+ return iwl_dt_get_force_disable_channels(fwrt, value);
+ case DSM_FUNC_ENABLE_11BE:
+ return iwl_dt_get_11be(fwrt, value);
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+int iwl_dt_get_pwr_limit(struct iwl_fw_runtime *fwrt, u64 *data)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ u32 val;
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,splc", &val);
+ if (ret)
+ return ret;
+
+ *data = val;
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,splc = %u mW\n", val);
+ return 0;
+}
+
+int iwl_dt_get_wbem(struct iwl_fw_runtime *fwrt, u32 *data)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ int ret;
+
+ if (!node)
+ return -ENOENT;
+
+ ret = of_property_read_u32(node, "intel,wbem", data);
+ if (ret)
+ return ret;
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,wbem = 0x%x\n", *data);
+ return 0;
+}
+
+int iwl_dt_get_puncturing(struct iwl_fw_runtime *fwrt)
+{
+ struct device_node *node = dev_of_node(fwrt->dev);
+ u32 val;
+ int ret;
+
+ if (!node)
+ return 0;
+
+ ret = of_property_read_u32(node, "intel,wcpe", &val);
+ if (ret)
+ return 0;
+
+ IWL_DEBUG_RADIO(fwrt, "DT: intel,wcpe = 0x%x\n", val);
+ return val & IWL_DT_WCPE_MASK;
+}
+IWL_EXPORT_SYMBOL(iwl_dt_get_puncturing);
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dt.h b/drivers/net/wireless/intel/iwlwifi/fw/dt.h
new file mode 100644
index 0000000000..70ab6f309b
--- /dev/null
+++ b/drivers/net/wireless/intel/iwlwifi/fw/dt.h
@@ -0,0 +1,161 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2026 Intel Corporation
+ */
+#ifndef __iwl_fw_dt_h__
+#define __iwl_fw_dt_h__
+
+#include "fw/runtime.h"
+
+/*
+ * Device Tree property parsing for Intel Wi-Fi 7 BE200 PCIe adapters.
+ *
+ * On platforms without UEFI variables or ACPI methods, regulatory and
+ * power configuration can be supplied via Device Tree properties in the
+ * Wi-Fi PCIe device node.
+ *
+ * DT is the lowest-priority source: UEFI variables take precedence, then
+ * ACPI methods, and finally these DT properties.
+ */
+
+#if IS_ENABLED(CONFIG_OF)
+
+/* Functions implemented in fw/dt.c */
+void iwl_dt_init(struct iwl_fw_runtime *fwrt);
+
+static inline bool iwl_dt_is_compatible(struct iwl_fw_runtime *fwrt)
+{
+ return fwrt->dt_compatible;
+}
+
+int iwl_dt_get_wrds_table(struct iwl_fw_runtime *fwrt);
+void iwl_dt_get_uats_table(struct iwl_fw_runtime *fwrt);
+int iwl_dt_get_srd(struct iwl_fw_runtime *fwrt, u32 *value);
+int iwl_dt_get_6e_uhb(struct iwl_fw_runtime *fwrt, u32 *value);
+int iwl_dt_get_regulatory_special(struct iwl_fw_runtime *fwrt, u32 *value);
+int iwl_dt_get_activate_channel(struct iwl_fw_runtime *fwrt, u32 *value);
+int iwl_dt_get_force_disable_channels(struct iwl_fw_runtime *fwrt, u32 *value);
+int iwl_dt_get_11be(struct iwl_fw_runtime *fwrt, u32 *value);
+int iwl_dt_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
+ u32 *value);
+int iwl_dt_get_pwr_limit(struct iwl_fw_runtime *fwrt, u64 *data);
+int iwl_dt_get_wbem(struct iwl_fw_runtime *fwrt, u32 *data);
+int iwl_dt_get_puncturing(struct iwl_fw_runtime *fwrt);
+#else /* !CONFIG_OF */
+
+static inline void iwl_dt_init(struct iwl_fw_runtime *fwrt) {}
+
+static inline bool iwl_dt_is_compatible(struct iwl_fw_runtime *fwrt)
+{
+ return false;
+}
+
+static inline int iwl_dt_get_wrds_table(struct iwl_fw_runtime *fwrt)
+{
+ return -ENOENT;
+}
+
+static inline void iwl_dt_get_uats_table(struct iwl_fw_runtime *fwrt) {}
+
+static inline int iwl_dt_get_srd(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_6e_uhb(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_regulatory_special(struct iwl_fw_runtime *fwrt,
+ u32 *value)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_activate_channel(struct iwl_fw_runtime *fwrt,
+ u32 *value)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_force_disable_channels(struct iwl_fw_runtime *fwrt,
+ u32 *value)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_11be(struct iwl_fw_runtime *fwrt, u32 *value)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_pwr_limit(struct iwl_fw_runtime *fwrt, u64 *data)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_wbem(struct iwl_fw_runtime *fwrt, u32 *data)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_puncturing(struct iwl_fw_runtime *fwrt)
+{
+ return 0;
+}
+
+static inline int iwl_dt_get_dsm(struct iwl_fw_runtime *fwrt,
+ enum iwl_dsm_funcs func, u32 *value)
+{
+ return -ENOENT;
+}
+
+#endif /* CONFIG_OF */
+
+/*
+ * The following tables have no Device Tree implementation regardless of
+ * CONFIG_OF. Callers fall back gracefully when these return -ENOENT.
+ */
+static inline int iwl_dt_get_ppag_table(struct iwl_fw_runtime *fwrt)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_tas_table(struct iwl_fw_runtime *fwrt,
+ struct iwl_tas_data *data)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_ewrd_table(struct iwl_fw_runtime *fwrt)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_wgds_table(struct iwl_fw_runtime *fwrt)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_phy_filters(struct iwl_fw_runtime *fwrt)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_mcc(struct iwl_fw_runtime *fwrt, char *data)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_eckv(struct iwl_fw_runtime *fwrt, u32 *data)
+{
+ return -ENOENT;
+}
+
+static inline int iwl_dt_get_dsbr(struct iwl_fw_runtime *fwrt, u32 *data)
+{
+ return -ENOENT;
+}
+
+#endif /* __iwl_fw_dt_h__ */
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/init.c b/drivers/net/wireless/intel/iwlwifi/fw/init.c
index d1d8058ad2..7d365947b3 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/init.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/init.c
@@ -1,12 +1,13 @@
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/*
* Copyright (C) 2017 Intel Deutschland GmbH
- * Copyright (C) 2019-2021, 2024-2025 Intel Corporation
+ * Copyright (C) 2019-2021, 2024-2026 Intel Corporation
*/
#include "iwl-drv.h"
#include "runtime.h"
#include "dbg.h"
#include "debugfs.h"
+#include "dt.h"
#include "fw/api/system.h"
#include "fw/api/commands.h"
@@ -36,6 +37,7 @@ void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans,
INIT_DELAYED_WORK(&fwrt->dump.wks[i].wk, iwl_fw_error_dump_wk);
}
iwl_fwrt_dbgfs_register(fwrt, dbgfs_dir);
+ iwl_dt_init(fwrt);
}
IWL_EXPORT_SYMBOL(iwl_fw_runtime_init);
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/regulatory.h b/drivers/net/wireless/intel/iwlwifi/fw/regulatory.h
index 0f6bc61142..a6add973ba 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/regulatory.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/regulatory.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
- * Copyright (C) 2023-2025 Intel Corporation
+ * Copyright (C) 2023-2026 Intel Corporation
*/
#ifndef __fw_regulatory_h__
@@ -30,6 +30,7 @@
#define BIOS_GEO_MIN_PROFILE_NUM 3
#define IWL_SAR_ENABLE_MSK BIT(0)
+#define IWL_REDUCE_POWER_FLAGS_POS 1
/* PPAG gain value bounds in 1/8 dBm */
#define IWL_PPAG_MIN_LB -16
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/runtime.h b/drivers/net/wireless/intel/iwlwifi/fw/runtime.h
index cc976195b1..28161da63c 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/runtime.h
+++ b/drivers/net/wireless/intel/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-2025 Intel Corporation
+ * Copyright (C) 2018-2026 Intel Corporation
*/
#ifndef __iwl_fw_runtime_h__
#define __iwl_fw_runtime_h__
@@ -108,6 +108,7 @@ struct iwl_txf_iter_data {
* @dump: debug dump data
* @ap_type_cmd: AP type tables (for enablement on 6 GHz)
* @ap_type_cmd_valid: if &ap_type_cmd is valid
+ * @dt_compatible: true if the DT node compatible matches a supported device
* @uefi_tables_lock_status: The status of the WIFI GUID UEFI variables lock:
* 0: Unlocked, 1 and 2: Locked.
* Only read the UEFI variables if locked.
@@ -217,6 +218,9 @@ struct iwl_fw_runtime {
bool sgom_enabled;
struct iwl_mcc_allowed_ap_type_cmd ap_type_cmd;
bool ap_type_cmd_valid;
+#if IS_ENABLED(CONFIG_OF)
+ bool dt_compatible;
+#endif
u8 uefi_tables_lock_status;
struct iwl_phy_specific_cfg phy_filters;
enum bios_source dsm_source;
diff --git a/intc-scripts/publishable-files b/intc-scripts/publishable-files
index 81871178ba..91fc3f4d15 100644
--- a/intc-scripts/publishable-files
+++ b/intc-scripts/publishable-files
@@ -76,6 +76,8 @@ drivers/net/wireless/intel/iwlwifi/fw/dbg.h
drivers/net/wireless/intel/iwlwifi/fw/debugfs.c
drivers/net/wireless/intel/iwlwifi/fw/debugfs.h
drivers/net/wireless/intel/iwlwifi/fw/dhc-utils.h
+drivers/net/wireless/intel/iwlwifi/fw/dt.c
+drivers/net/wireless/intel/iwlwifi/fw/dt.h
drivers/net/wireless/intel/iwlwifi/fw/dump.c
drivers/net/wireless/intel/iwlwifi/fw/error-dump.h
drivers/net/wireless/intel/iwlwifi/fw/file.h
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 3/3] wifi: iwlwifi: dt: use Device Tree as fallback BIOS configuration source
2026-05-13 6:05 [PATCH v3 0/3] wifi: iwlwifi: add Device Tree hardware integration information Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 1/3] dt-bindings: net: wireless: Add Intel Wi-Fi 7 BE200 PCIe adapter Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 2/3] wifi: iwlwifi: dt: add Device Tree BIOS configuration infrastructure Avinash Bhatt
@ 2026-05-13 6:05 ` Avinash Bhatt
2 siblings, 0 replies; 4+ messages in thread
From: Avinash Bhatt @ 2026-05-13 6:05 UTC (permalink / raw)
To: devicetree, linux-wireless
Cc: robh, krzk+dt, conor+dt, johannes, miriam.rachel.korenblit,
linux-kernel, kobi.guetta, emmanuel.grumbach
When neither UEFI variables nor ACPI methods provide a BIOS
configuration table, fall back to Device Tree. This preserves the
existing UEFI -> ACPI priority order and extends it with DT as the
lowest-priority source.
Signed-off-by: Avinash Bhatt <avinash.bhatt@intel.com>
---
drivers/net/wireless/intel/iwlwifi/fw/regulatory.c | 3 +++
drivers/net/wireless/intel/iwlwifi/mld/mld.c | 3 +++
drivers/net/wireless/intel/iwlwifi/mld/regulatory.c | 5 ++++-
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/regulatory.c b/drivers/net/wireless/intel/iwlwifi/fw/regulatory.c
index 640e729091..d7ead787c2 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/regulatory.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/regulatory.c
@@ -8,6 +8,7 @@
#include "regulatory.h"
#include "fw/runtime.h"
#include "fw/uefi.h"
+#include "fw/dt.h"
#define GET_BIOS_TABLE(__name, ...) \
do { \
@@ -16,6 +17,8 @@ do { \
ret = iwl_uefi_get_ ## __name(__VA_ARGS__); \
if (ret < 0) \
ret = iwl_acpi_get_ ## __name(__VA_ARGS__); \
+ if (ret < 0 && iwl_dt_is_compatible(fwrt)) \
+ ret = iwl_dt_get_ ## __name(__VA_ARGS__); \
return ret; \
} while (0)
diff --git a/drivers/net/wireless/intel/iwlwifi/mld/mld.c b/drivers/net/wireless/intel/iwlwifi/mld/mld.c
index 130eba60b4..1a95b19d33 100644
--- a/drivers/net/wireless/intel/iwlwifi/mld/mld.c
+++ b/drivers/net/wireless/intel/iwlwifi/mld/mld.c
@@ -12,6 +12,7 @@
#include "fw/api/coex.h"
#include "fw/dbg.h"
#include "fw/uefi.h"
+#include "fw/dt.h"
#include "mld.h"
#include "mlo.h"
@@ -466,6 +467,8 @@ iwl_op_mode_mld_start(struct iwl_trans *trans, const struct iwl_rf_cfg *cfg,
iwl_mld_get_bios_tables(mld);
iwl_uefi_get_sgom_table(trans, &mld->fwrt);
mld->bios_enable_puncturing = iwl_uefi_get_puncturing(&mld->fwrt);
+ if (!mld->bios_enable_puncturing && iwl_dt_is_compatible(&mld->fwrt))
+ mld->bios_enable_puncturing = iwl_dt_get_puncturing(&mld->fwrt);
mld->rfi.bios_enabled = iwl_rfi_is_enabled_in_bios(&mld->fwrt);
iwl_mld_hw_set_regulatory(mld);
diff --git a/drivers/net/wireless/intel/iwlwifi/mld/regulatory.c b/drivers/net/wireless/intel/iwlwifi/mld/regulatory.c
index 97b2283f51..ce539a0be7 100644
--- a/drivers/net/wireless/intel/iwlwifi/mld/regulatory.c
+++ b/drivers/net/wireless/intel/iwlwifi/mld/regulatory.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/*
- * Copyright (C) 2024-2025 Intel Corporation
+ * Copyright (C) 2024-2026 Intel Corporation
*/
#include <linux/dmi.h>
@@ -8,6 +8,7 @@
#include "fw/regulatory.h"
#include "fw/acpi.h"
#include "fw/uefi.h"
+#include "fw/dt.h"
#include "regulatory.h"
#include "mld.h"
@@ -64,6 +65,8 @@ void iwl_mld_get_bios_tables(struct iwl_mld *mld)
}
iwl_uefi_get_uats_table(mld->trans, &mld->fwrt);
+ if (!mld->fwrt.ap_type_cmd_valid && iwl_dt_is_compatible(&mld->fwrt))
+ iwl_dt_get_uats_table(&mld->fwrt);
iwl_uefi_get_uneb_table(mld->trans, &mld->fwrt);
iwl_bios_get_phy_filters(&mld->fwrt);
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-05-13 6:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-13 6:05 [PATCH v3 0/3] wifi: iwlwifi: add Device Tree hardware integration information Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 1/3] dt-bindings: net: wireless: Add Intel Wi-Fi 7 BE200 PCIe adapter Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 2/3] wifi: iwlwifi: dt: add Device Tree BIOS configuration infrastructure Avinash Bhatt
2026-05-13 6:05 ` [PATCH v3 3/3] wifi: iwlwifi: dt: use Device Tree as fallback BIOS configuration source Avinash Bhatt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox