diff options
-rw-r--r-- | images/NEWS | 2 | ||||
-rwxr-xr-x | images/make_boot_img | 6 | ||||
-rw-r--r-- | kernel/modules.pl | 20 |
3 files changed, 27 insertions, 1 deletions
diff --git a/images/NEWS b/images/NEWS index db1df11e1..ed8bc48c5 100644 --- a/images/NEWS +++ b/images/NEWS @@ -1,3 +1,5 @@ +- identify and include missing firmware for iwlwifi (mga#9541) + Version 2.79 - 4 December 2020 by Thierry Vignaud - sync with kernel 5.10 diff --git a/images/make_boot_img b/images/make_boot_img index 274b03f41..34c521865 100755 --- a/images/make_boot_img +++ b/images/make_boot_img @@ -155,9 +155,13 @@ sub initrd { } $modules="$modules mgakadeploy " if $ENV{BUILD_KA}; + my $extras = `perl ../kernel/modules.pl list_additional_firmware $kernel | xargs`; + chomp $extras; + my $install_extras = $extras ? "--install '$extras'" : ""; + mkdir_p("build/dracut.conf.d"); # TODO if --nofscks and --no-hostonly are switched, dracut gives an error - fix or report upstream - __ "DRAKX_STAGE1_BINARY=$stage1_binary DRAKX_INIT_BINARY=$init_binary DRAKX_FAKE_MODULES='$fakedrivers' dracut --conf dracut.conf --confdir ./build/dracut.conf.d --add ' $modules ' --add-drivers ' $drivers ' '$img' '$kernel'"; + __ "DRAKX_STAGE1_BINARY=$stage1_binary DRAKX_INIT_BINARY=$init_binary DRAKX_FAKE_MODULES='$fakedrivers' dracut --conf dracut.conf --confdir ./build/dracut.conf.d --add ' $modules ' --add-drivers ' $drivers ' $install_extras '$img' '$kernel'"; chmod(0644, $img); } diff --git a/kernel/modules.pl b/kernel/modules.pl index 70d6ed0bd..9ec6f5356 100644 --- a/kernel/modules.pl +++ b/kernel/modules.pl @@ -150,3 +150,23 @@ sub check() { exit $error; } + +sub list_additional_firmware { + my ($kern_ver) = @_; + + # The firmware reported by 'modinfo iwlwifi' is the latest supported version of each firmware + # type. Sometimes the latest supported version is not available, and the driver falls back to + # an older version. This means dracut doesn't automatically identify and include the necessary + # firmware files, so we need to list them here (mga#9541). + foreach (map { /^firmware:\s+(.*)/ ? $1 : () } split("\n", `modinfo -k $kern_ver iwlwifi`)) { + next if -f "/lib/firmware/$_"; + my ($basename, $version) = /(.*)-([0-9]+).ucode/; + while ($version-- > 0) { + my $filepath = "/lib/firmware/$basename-$version.ucode"; + if (-f $filepath) { + print "$filepath\n"; + last; + } + } + } +} |