diff --git a/framework/13-inch/common/default.nix b/framework/13-inch/common/default.nix index 904c2d7..f9c7808 100644 --- a/framework/13-inch/common/default.nix +++ b/framework/13-inch/common/default.nix @@ -2,6 +2,7 @@ imports = [ ../../../common/pc/laptop ../../../common/pc/laptop/ssd + ../../bluetooth.nix ../../kmod.nix ../../framework-tool.nix ]; diff --git a/framework/16-inch/common/default.nix b/framework/16-inch/common/default.nix index 190956f..5ec8a17 100644 --- a/framework/16-inch/common/default.nix +++ b/framework/16-inch/common/default.nix @@ -2,6 +2,7 @@ imports = [ ../../../common/pc/laptop ../../../common/pc/laptop/ssd + ../../bluetooth.nix ../../kmod.nix ../../framework-tool.nix ]; diff --git a/framework/bluetooth.nix b/framework/bluetooth.nix new file mode 100644 index 0000000..fdb7da3 --- /dev/null +++ b/framework/bluetooth.nix @@ -0,0 +1,37 @@ +# There is apparently a bug that affects Framework computers that causes black +# screen on resume from sleep or hibernate with kernel version 6.11. Framework +# have published a workaround; this applies that workaround. +# +# https://fosstodon.org/@frameworkcomputer/113406887743149089 +# https://github.com/FrameworkComputer/linux-docs/blob/main/hibernation/kernel-6-11-workarounds/suspend-hibernate-bluetooth-workaround.md#workaround-for-suspendhibernate-black-screen-on-resume-kernel-611 +{ + config, + lib, + pkgs, + ... +}: lib.mkIf ((config.boot.kernelPackages.kernelAtLeast "6.11") && (config.boot.kernelPackages.kernelOlder "6.12")) { + systemd.services = { + bluetooth-rfkill-suspend = { + description = "Soft block Bluetooth on suspend/hibernate"; + before = ["sleep.target"]; + unitConfig.StopWhenUnneeded = true; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${pkgs.util-linux}/bin/rfkill block bluetooth"; + ExecStartPost = "${pkgs.coreutils}/bin/sleep 3"; + RemainAfterExit = true; + }; + wantedBy = ["suspend.target" "hibernate.target" "suspend-then-hibernate.target"]; + }; + + bluetooth-rfkill-resume = { + description = "Unblock Bluetooth on resume"; + after = ["suspend.target" "hibernate.target" "suspend-then-hibernate.target"]; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${pkgs.util-linux}/bin/rfkill unblock bluetooth"; + }; + wantedBy = ["suspend.target" "hibernate.target" "suspend-then-hibernate.target"]; + }; + }; +}