diff options
Diffstat (limited to 'kernel/modules.pl')
| -rw-r--r-- | kernel/modules.pl | 68 |
1 files changed, 38 insertions, 30 deletions
diff --git a/kernel/modules.pl b/kernel/modules.pl index 0491e0c09..9ec6f5356 100644 --- a/kernel/modules.pl +++ b/kernel/modules.pl @@ -37,49 +37,37 @@ my ($f, @para) = @ARGV; $::{$f}->(@para); sub modules() { - map { category2modules($_) } split(' ', $images_cat); + my @nls_modules = ('nls_cp437', 'nls_iso8859_1'); + @nls_modules, map { category2modules($_) } split(' ', $images_cat); } -sub remove_unneeded_modules { +sub list_needed_modules { my ($kern_ver) = @_; - #- need creating a first time the modules.dep for all modules - filter_modules_dep($kern_ver); - load_dependencies("all.kernels/$kern_ver/modules.dep"); + load_dependencies("/lib/modules/$kern_ver/modules.dep"); my @all = modules(); my @all_with_deps = map { dependencies_closure($_) } @all; - my %wanted_modules = map { (list_modules::modname2filename($_) . ".ko.gz" => 1) } @all_with_deps; - foreach (all("all.kernels/$kern_ver/modules")) { - $wanted_modules{$_} or unlink "all.kernels/$kern_ver/modules/$_"; + my %wanted_modules = map { (list_modules::modname2filename($_) => 1) } @all_with_deps; + foreach (`find /lib/modules/$kern_ver -name '*.ko.?z'`) { + my $modfile = basename($_); + $modfile =~ s/\.ko\.xz//; + $wanted_modules{$modfile} and print "$modfile\n"; } } -sub make_modules_per_image { +sub list_fake_modules { my ($kern_ver) = @_; - my $dir = "all.kernels/$kern_ver/modules"; + load_dependencies("/lib/modules/$kern_ver/modules.dep"); - system("cd $dir ; tar cf ../all_modules.tar *.ko.gz") == 0 or die "tar failed\n"; -} - -sub filter_modules_dep { - my ($kern_ver) = @_; - - my @l = cat_("all.kernels/$kern_ver/modules.dep"); - - @l = map { - my ($f, $d) = split ':'; - my ($module, @deps) = map { m!.*/(.*)\.k?o(\.gz)$! && $1 } $f, split(' ', $d); - if (member($module, 'plip', 'ppa', 'imm')) { - @deps = map { $_ eq 'parport' ? 'parport_pc' : $_ } @deps; - } elsif ($module eq 'vfat') { - push @deps, 'nls_cp437', 'nls_iso8859-1'; - } - join(' ', "$module:", @deps); - } @l; - - output("all.kernels/$kern_ver/modules.dep", map { "$_\n" } @l); + my @all = map { category2modules($_) } split(' ', 'multimedia/*'); + my %wanted_modules = map { (list_modules::modname2filename($_) => 1) } @all; + foreach (`find /lib/modules/$kern_ver -name '*.ko.?z'`) { + my $modfile = basename($_); + $modfile =~ s/\.ko\.xz//; + $wanted_modules{$modfile} and print "$modfile\n"; + } } sub get_main_modules() { @@ -162,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; + } + } + } +} |
