summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--images/NEWS2
-rwxr-xr-ximages/make_boot_img6
-rw-r--r--kernel/modules.pl20
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;
+ }
+ }
+ }
+}