Site Tools


Sidebar

work

Projects travel Socials (External)

projects:software:fedora_iwlwifi_wi-fi_6ghz_dsm_unlock

Fedora iwlwifi Wi-Fi 6GHz DSM Unlock

Problem Statement

From Linux kernels ≥5.16, Intel committed a new feature to iwlwifi, “iwlwifi: mvm: read 6E enablement flags from DSM and pass to FW”.

In an ideal world, the commit results in this process flow:

  1. Computer OEM builds laptop integrating an Intel 802.11ax Wi-Fi card e.g. Intel AX210
  2. Computer OEM adds ACPI Device Specific Methods into their BIOS ACPI tables that control Intel Wi-Fi features to fulfil regulatory responsibilities, such as:
    • Enabling Wi-Fi 6E
    • Enabling 802.11ax
    • Enabling UNII-4 channels (channel 149-165)
    • Etc.
  3. Intel driver reads ACPI DSMs
  4. Intel driver forwards DSMs to the Intel 802.11ax card's firmware
  5. Intel 802.11ax Wi-Fi card firmware restricts card features accordingly

However, there are already OEMs who have neglected to set Wi-Fi 6E/6GHz enablement in their BIOS ACPI tables accordingly, e.g.:

Notably, these are products which list Wi-Fi 6E among their features in their spec sheets (P360 Tiny|P14s Gen 2 Intel|Framework).

Unfortunately, there is no way to bypass the regulatory restrictions set by iwlwifi, as the Linux wireless regulatory framework now allows wireless drivers to managed its own regulatory rules, taking precedence over the userspace regulatory domain.

Essentially, with the combination of:

  • Intel 802.11ax Wi-Fi card (MVM firmware)
  • Linux kernel ≥5.16
  • OEM (Lenovo, Framework, others?) BIOS with (mis)configured Intel Wi-Fi ACPI DSM tables

…, Wi-Fi 6GHz band cannot be utilized in userspace even when in an environment where Wi-Fi 6E is available for unlicensed, indoor use, without a BIOS update from the OEM.

Unlocking Wi-Fi 6E

The simplest fix to re-enable Wi-Fi 6E with the above combination of hardware and software, is to just bypass the code block introduced by the iwlwifi commit:

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
index 1d5ee4330..ab182a1f8 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
@@ -1229,13 +1229,13 @@ static void iwl_mvm_lari_cfg(struct iwl_mvm *mvm)
 				   &iwl_guid, &value);
 	if (!ret)
 		cmd.chan_state_active_bitmap = cpu_to_le32(value);
-
+/*
 	ret = iwl_acpi_get_dsm_u32(mvm->fwrt.dev, 0,
 				   DSM_FUNC_ENABLE_6E,
 				   &iwl_guid, &value);
 	if (!ret)
 		cmd.oem_uhb_allow_bitmap = cpu_to_le32(value);
-
+*/
 	ret = iwl_acpi_get_dsm_u32(mvm->fwrt.dev, 0,
 				   DSM_FUNC_FORCE_DISABLE_CHANNELS,
 				   &iwl_guid, &value);

Re-compiling your kernel is going to be easier than convincing your OEM's tech support to issue a BIOS update, so let's do that on Fedora in the meantime.

  1. Follow the Fedora documentation on building a kernel from the Fedora dist-git but stop before the fedpkg local step
    • Remember to checkout the correct branch for the Fedora version you are running
  2. Edit linux-kernel-test.patch and paste the above patch in
  • I tried adding the patch as a different file and adding a patch to kernel.spec but fedpkg no longer iterates through additional patch definitions
  1. Optional but highly recommended: sudo dnf install ccache, if your kernel build fails for any reason, this greatly speeds up subsequent rebuilds (fedpkg clears the build folder each time it is invocated)
  2. fedpkg local
  3. cd x86_64 && ls
  4. sudo dnf install followed by the packages you need, probably:
    • kernel kernel-core kernel-modules kernel-modules-core kernel-modules-extra
    • If you use DKMS, probably kernel-devel kernel-devel-matched
  5. Reboot into the new kernel
    • If you use Secure Boot, be sure to enrol the new MOK key
  6. Verify Wi-Fi 6E channels are now either enabled or no IR rather than disabled:
    $ iw list|egrep "\* 6[0-9]+ MHz"
    			* 6015 MHz [13] (22.0 dBm) (no IR)
    			* 6035 MHz [17] (22.0 dBm) (no IR)
    			* 6055 MHz [21] (22.0 dBm) (no IR)
    			* 6075 MHz [25] (22.0 dBm) (no IR)
    			* 6095 MHz [29] (22.0 dBm) (no IR)
    			* 6115 MHz [33] (22.0 dBm) (no IR)
    			* 6135 MHz [37] (22.0 dBm) (no IR)
    			* 6155 MHz [41] (22.0 dBm) (no IR)
    			* 6175 MHz [45] (22.0 dBm) (no IR)
    			* 6195 MHz [49] (22.0 dBm) (no IR)
    			* 6215 MHz [53] (22.0 dBm) (no IR)
    			* 6235 MHz [57] (22.0 dBm) (no IR)
    			* 6255 MHz [61] (22.0 dBm) (no IR)
    			* 6275 MHz [65] (22.0 dBm) (no IR)
    			* 6295 MHz [69] (22.0 dBm) (no IR)
    			* 6315 MHz [73] (22.0 dBm) (no IR)
    			* 6335 MHz [77] (22.0 dBm) (no IR)
    			* 6355 MHz [81] (22.0 dBm) (no IR)
    			* 6375 MHz [85] (22.0 dBm) (no IR)
    			* 6395 MHz [89] (22.0 dBm) (no IR)
    			* 6415 MHz [93] (22.0 dBm) (no IR)
    [snip]
projects/software/fedora_iwlwifi_wi-fi_6ghz_dsm_unlock.txt · Last modified: 2024/03/23 11:22 by 127.0.0.1