summaryrefslogtreecommitdiffstats
path: root/kernel/modules.pl
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/modules.pl')
-rw-r--r--kernel/modules.pl68
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;
+ }
+ }
+ }
+}