From af8abf141d84d9b72199d0648248bd3c5f4f123e Mon Sep 17 00:00:00 2001 From: Vincent Haupert Date: Mon, 4 Jan 2021 19:47:44 +0100 Subject: [PATCH] kernelPatches: ath driver: allow setting regulatory domain Ports an OpenWRT patch for Atheros wireless drivers (ath*) which allows the user to change the regulatory domain code to the one which actually applies. All Atheros devices have a regulatory domain burned into their EEPROM. When using a device as AP, this domain is frequently overly restrictive when compared to the regulation which applies in the country the device actually operates in; often, this restriction disallows IR on all channels making it impossible to use the device as an AP at all. This commit introduces the NixOS config option networking.wireless.athUserRegulatoryDomain which, if enabled, applies the patch and sets the kernel config option ATH_USER_REGD. The original OpenWRT patch targets Linux 5.8. --- .../hardware/network/ath-user-regd.nix | 31 +++++++++++++++++++ nixos/modules/module-list.nix | 1 + pkgs/os-specific/linux/kernel/patches.nix | 13 ++++++++ 3 files changed, 45 insertions(+) create mode 100644 nixos/modules/hardware/network/ath-user-regd.nix diff --git a/nixos/modules/hardware/network/ath-user-regd.nix b/nixos/modules/hardware/network/ath-user-regd.nix new file mode 100644 index 000000000000..b5ade5ed5010 --- /dev/null +++ b/nixos/modules/hardware/network/ath-user-regd.nix @@ -0,0 +1,31 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + kernelVersion = config.boot.kernelPackages.kernel.version; + linuxKernelMinVersion = "5.8"; + kernelPatch = pkgs.kernelPatches.ath_regd_optional // { + extraConfig = '' + ATH_USER_REGD y + ''; + }; +in +{ + options.networking.wireless.athUserRegulatoryDomain = mkOption { + default = false; + type = types.bool; + description = '' + If enabled, sets the ATH_USER_REGD kernel config switch to true to + disable the enforcement of EEPROM regulatory restrictions for ath + drivers. Requires at least Linux ${linuxKernelMinVersion}. + ''; + }; + + config = mkIf config.networking.wireless.athUserRegulatoryDomain { + assertions = singleton { + assertion = lessThan 0 (builtins.compareVersions kernelVersion linuxKernelMinVersion); + message = "ATH_USER_REGD patch for kernels older than ${linuxKernelMinVersion} not ported yet!"; + }; + boot.kernelPatches = [ kernelPatch ]; + }; +} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 8fd5d4519fdd..f5c4c0b67152 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -52,6 +52,7 @@ ./hardware/ledger.nix ./hardware/logitech.nix ./hardware/mcelog.nix + ./hardware/network/ath-user-regd.nix ./hardware/network/b43.nix ./hardware/network/intel-2200bg.nix ./hardware/nitrokey.nix diff --git a/pkgs/os-specific/linux/kernel/patches.nix b/pkgs/os-specific/linux/kernel/patches.nix index b0eb2be2a4c9..45e21784c9bd 100644 --- a/pkgs/os-specific/linux/kernel/patches.nix +++ b/pkgs/os-specific/linux/kernel/patches.nix @@ -1,6 +1,19 @@ { lib, fetchpatch, fetchurl }: { + ath_regd_optional = rec { + name = "ath_regd_optional"; + patch = fetchpatch { + name = name + ".patch"; + url = "https://github.com/openwrt/openwrt/raw/ed2015c38617ed6624471e77f27fbb0c58c8c660/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch"; + sha256 = "1ssDXSweHhF+pMZyd6kSrzeW60eb6MO6tlf0il17RC0="; + postFetch = '' + sed -i 's/CPTCFG_/CONFIG_/g' $out + sed -i '/--- a\/local-symbols/,$d' $out + ''; + }; + }; + bridge_stp_helper = { name = "bridge-stp-helper"; patch = ./bridge-stp-helper.patch;