diff --git a/system/options.nix b/system/options.nix index b422815c33f..9115cedc7b1 100644 --- a/system/options.nix +++ b/system/options.nix @@ -3,13 +3,6 @@ [ - { - name = ["networking" "hostName"]; - default = "nixos"; - description = "The name of the machine."; - } - - { name = ["time" "timeZone"]; default = "CET"; @@ -186,6 +179,13 @@ } + { + name = ["networking" "hostName"]; + default = "nixos"; + description = "The name of the machine."; + } + + { name = ["networking" "useDHCP"]; default = true; @@ -234,6 +234,19 @@ } + { + name = ["networking" "enableIntel2200BGFirmware"]; + default = false; + description = " + Turn on this option if you want firmware for the Intel + PRO/Wireless 2200BG to be loaded automatically. This is + required if you want to use this device. Intel requires you to + accept the license for this firmware, see + . + "; + } + + { name = ["fileSystems"]; default = []; diff --git a/system/upstart.nix b/system/upstart.nix index 3fa061e41c4..626e82fcd0c 100644 --- a/system/upstart.nix +++ b/system/upstart.nix @@ -23,8 +23,10 @@ import ../upstart-jobs/gather.nix { # The udev daemon creates devices nodes and runs programs when # hardware events occur. (import ../upstart-jobs/udev.nix { - inherit (pkgs) writeText udev procps; + inherit (pkgs) stdenv writeText substituteAll udev procps; inherit (pkgs.lib) cleanSource; + firmwareDirs = + (if config.get ["networking" "enableIntel2200BGFirmware"] then [pkgs.ipw2200fw] else []); }) # Makes LVM logical volumes available. diff --git a/upstart-jobs/udev-firmware-loader.sh b/upstart-jobs/udev-firmware-loader.sh new file mode 100755 index 00000000000..03f0290fd33 --- /dev/null +++ b/upstart-jobs/udev-firmware-loader.sh @@ -0,0 +1,30 @@ +#! @shell@ + +export PATH="@path@" + +exec > /var/log/udev-fw 2>&1 + +if test "$ACTION" = "add"; then + + ls -l /sys/$DEVPATH >> /tmp/fw 2>&1 + + if ! test -e /sys/$DEVPATH/loading; then + echo "Firmware loading is not supported by device \`DEVPATH'." + exit 1 + fi + + for dir in @firmwareDirs@; do + if test -e "$dir/$FIRMWARE"; then + echo "Loading \`$FIRMWARE' for device \`$DEVPATH' from $dir." + echo 1 > /sys/$DEVPATH/loading + cat "$dir/$FIRMWARE" > /sys/$DEVPATH/data + echo 0 > /sys/$DEVPATH/loading + exit 0 + fi + done + + echo "Firmware \`$FIRMWARE' for device \`$DEVPATH' not found." + echo -1 > /sys/$DEVPATH/loading + exit 1 + +fi diff --git a/upstart-jobs/udev-rules/50-udev.rules b/upstart-jobs/udev-rules/50-udev.rules index a4f1d73250a..9b12e9b3e38 100644 --- a/upstart-jobs/udev-rules/50-udev.rules +++ b/upstart-jobs/udev-rules/50-udev.rules @@ -14,7 +14,7 @@ KERNEL=="kvm", MODE="0666" # TTYs. -KERNEL=="tty", NAME="%k", MODE="666", OPTIONS="last_rule" # GROUP="tty" +KERNEL=="tty", NAME="%k", MODE="666", OPTIONS="last_rule" # GROUP="tty" KERNEL=="ptmx", NAME="%k", MODE="666" # GROUP="tty" @@ -37,3 +37,7 @@ KERNEL=="pcmC[D0-9cp]*", NAME="snd/%k" KERNEL=="midiC[D0-9]*", NAME="snd/%k" KERNEL=="timer", NAME="snd/%k" KERNEL=="seq", NAME="snd/%k" + + +# Firmware loading. +SUBSYSTEM=="firmware", ACTION=="add", RUN+="@firmwareLoader@" diff --git a/upstart-jobs/udev.nix b/upstart-jobs/udev.nix index 8ef4a43fe8c..7f84ed8e539 100644 --- a/upstart-jobs/udev.nix +++ b/upstart-jobs/udev.nix @@ -1,9 +1,29 @@ -{writeText, cleanSource, udev, procps}: +{stdenv, writeText, substituteAll, cleanSource, udev, procps, firmwareDirs}: let + # Perform substitutions in all udev rules files. + udevRules = stdenv.mkDerivation { + name = "udev-rules"; + src = cleanSource ./udev-rules; + firmwareLoader = substituteAll { + src = ./udev-firmware-loader.sh; + path = "${stdenv.coreutils}/bin"; + isExecutable = true; + inherit firmwareDirs; + }; + buildCommand = " + buildCommand= # urgh + ensureDir $out + for i in $src/*; do + substituteAll $i $out/$(basename $i) + done + "; + }; + + # The udev configuration file conf = writeText "udev.conf" " - udev_rules=\"${cleanSource ./udev-rules}\" + udev_rules=\"${udevRules}\" "; in