diff options
Diffstat (limited to 'perl-install/modules.pm')
| -rw-r--r-- | perl-install/modules.pm | 147 |
1 files changed, 57 insertions, 90 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm index 53f5b6e13..abeb0b366 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -1,4 +1,4 @@ -package modules; # $Id$ +package modules; use strict; @@ -11,7 +11,6 @@ use modules::any_conf; sub modules_descriptions() { my $f = '/lib/modules/' . c::kernel_version() . '/modules.description'; - -e $f or $f = '/modules/modules.description'; map { my ($m, $d) = /(\S+)\s+(.*)/; $m =~ s/-/_/g; ($m => $d) } cat_($f); } @@ -34,7 +33,9 @@ my %mappings_24_26 = ( "dc395x_trm" => "dc395x", ); my %mappings_26_24 = reverse %mappings_24_26; -$mappings_26_24{'uhci_hcd'} = 'usb_uhci'; +$mappings_26_24{uhci_hcd} = 'usb_uhci'; + +my @parallel_zip_modules = qw(imm ppa); sub mapping_24_26 { my ($modname) = @_; @@ -58,13 +59,45 @@ sub module_is_available { #-############################################################################### #- module loading #-############################################################################### + +sub filter_loaded_modules { + my ($lm) = @_; + + my $l; + + # try to detect built-in modules by looking at /sys/module + # unfortunately it does not work for all modules eg : + # - networks protocols like af_packet + # - filesystems + foreach my $mod (@$lm) { + $mod =~ s/-/_/g; + if (-d "/sys/module/$mod") { + log::l("$mod already loaded"); + } elsif ($mod =~ /af_packet/) { + if (-f "/proc/net/packet") { + log::l("$mod already loaded"); + } else { + push @$l, $mod; + } + } elsif (cat_("/proc/filesystems") =~ /$mod/) { + log::l("$mod already loaded"); + } elsif ($mod =~ /serial/) { + # hack ... must find who tries to load the module serial + } else { + push @$l, $mod; + } + } + $l; +} + # handles dependencies sub load_raw { - my ($l, $h_options) = @_; + my ($lm, $h_options) = @_; + + my $l = filter_loaded_modules($lm); + if ($::testing || $::local_install) { log::l("i would load module $_ ($h_options->{$_})") foreach @$l; - } elsif ($::isInstall) { - load_raw_install($l, $h_options); } else { run_program::run('/sbin/modprobe', $_, split(' ', $h_options->{$_})) or !run_program::run('/sbin/modprobe', '-n', $_) #- ignore missing modules @@ -75,26 +108,20 @@ sub load_raw { } elsif (member('usb_storage', @$l)) { #- usb_storage is only modprobed when we know there is some scsi devices #- so trying hard to wait for devices to be detected - - #- first sleep the minimum time usb-stor-scan takes - sleep 5; #- 5 == /sys/module/usb_storage/parameters/delay_use - # then wait for usb-stor-scan to complete - my $retry = 0; - while ($retry++ < 10) { - fuzzy_pidofs('usb-stor-scan') or last; - sleep 1; - log::l("waiting for usb_storage devices to appear (retry = $retry)"); - } + run_program::run('udevadm', 'settle'); } } sub load_with_options { my ($l, $h_options) = @_; my @l = map { - dependencies_closure(cond_mapping_24_26($_)); + if_(member($_, 'plip', @parallel_zip_modules), 'parport_pc'), + if_($_ eq 'vfat', 'nls_cp437', 'nls_iso8859_1'), + if_(member($_, qw(btrfs xfs)), 'crc32c', 'crc32c-intel'), + cond_mapping_24_26($_); } @$l; - @l = remove_loaded_modules(@l) or return; + @l = filter_out_loaded_modules(@l) or return; my %options = map { cond_mapping_24_26($_) => $h_options->{$_} } keys %$h_options; load_raw(\@l, \%options); @@ -108,10 +135,10 @@ sub load { sub load_and_configure { my ($conf, $module, $o_options) = @_; - my @l = remove_loaded_modules(dependencies_closure(cond_mapping_24_26($module))); + my @l = filter_out_loaded_modules(cond_mapping_24_26($module)); load_raw(\@l, { cond_mapping_24_26($module) => $o_options }); - if (member($module, 'imm', 'ppa') + if (member($module, @parallel_zip_modules) && ! -d "/proc/sys/dev/parport/parport0/devices/$module") { log::l("$module loaded but is not useful, removing"); unload($module); @@ -138,13 +165,6 @@ sub load_category { if_($category =~ /scsi/, if_(detect_devices::usbStorage(), 'usb_storage'), ), - arch() =~ /ppc/ ? ( - if_($category =~ /scsi/, - if_(detect_devices::has_mesh(), 'mesh'), - if_(detect_devices::has_53c94(), 'mac53c94'), - ), - if_($category =~ /net/, 'bmac', 'gmac', 'mace', 'airport'), - ) : (), ); my @l = ( (map { @@ -169,12 +189,9 @@ sub load_category { sub load_parallel_zip { my ($conf) = @_; - arch() !~ /ppc/ or return; - - eval { load('parport_pc') }; grep { eval { load_and_configure($conf, $_); 1 }; - } 'imm', 'ppa'; + } @parallel_zip_modules; } #-############################################################################### @@ -189,10 +206,9 @@ sub write_preload_conf { push @l, detect_devices::probe_name('Module'); push @l, 'nvram' if $is_laptop; push @l, map { $_->{driver} } detect_devices::probe_category($_) foreach qw(multimedia/dvb multimedia/tv various/agpgart various/laptop input/joystick various/crypto disk/card_reader); - push @l, 'padlock' if cat_("/proc/cpuinfo") =~ /rng_en/; - push @l, 'evdev' if any { $_->{Synaptics} || $_->{ALPS} || $_->{HWHEEL} } detect_devices::getInputDevices(); - push @l, 'asus_acpi' if $is_laptop && $manufacturer =~ m/^ASUS/; - push @l, 'thinkpad_acpi' if $is_laptop && member($manufacturer, qw(IBM LENOVO)); + push @l, 'padlock-aes', 'padlock-sha' if cat_("/proc/cpuinfo") =~ /rng_en/; + push @l, 'evdev' if detect_devices::hasTouchpad(); + push @l, 'evdev' if any { $_->{HWHEEL} } detect_devices::getInputDevices(); push @l, 'hdaps' if $is_laptop && $manufacturer eq 'LENOVO'; append_to_modules_loaded_at_startup("$::prefix/etc/modprobe.preload", @l); } @@ -230,7 +246,7 @@ sub set_preload_modules { sub loaded_modules() { map { /(\S+)/ } cat_("/proc/modules"); } -sub remove_loaded_modules { +sub filter_out_loaded_modules { my (@l) = @_; difference2([ uniq(@l) ], [ map { my $s = $_; $s =~ s/_/-/g; $s, $_ } loaded_modules() ]); } @@ -240,16 +256,6 @@ sub read_already_loaded { when_load($conf, $_) foreach reverse loaded_modules(); } -sub name2file { - my ($name) = @_; - my $f = list_modules::modname2filename($name); - if (!$f) { - log::l("warning: unable to get module filename for $name"); - $f = $name; - } - $f . ".ko"; -} - sub when_load { my ($conf, $name) = @_; @@ -267,17 +273,17 @@ sub when_load_category { if ($category =~ m,disk/ide,) { $conf->add_probeall('ide-controller', $name); - eval { load('ide_disk') }; - } elsif ($category =~ m,disk/(scsi|hardware_raid|sata|usb|firewire),) { + eval { load('ide_gd_mod') }; + } elsif ($category =~ m,disk/(scsi|hardware_raid|sata|firewire|virtual),) { $conf->add_probeall('scsi_hostadapter', $name); eval { load('sd_mod') }; } elsif ($category eq 'bus/usb') { $conf->add_probeall('usb-interface', $name); - -f '/proc/bus/usb/devices' or eval { - require fs::mount; fs::mount::usbfs(''); + -f '/sys/kernel/debug/usb/devices' or eval { + require fs::mount; fs::mount::sys_kernel_debug(''); #- ensure keyboard is working, the kernel must do the job the BIOS was doing sleep 4; - load("usbkbd", "keybdev") if detect_devices::usbKeyboards(); + load("usbhid") if detect_devices::usbKeyboards(); }; } elsif ($category eq 'bus/firewire') { $conf->set_alias('ieee1394-controller', $name); @@ -291,43 +297,4 @@ sub when_load_category { } } -#-############################################################################### -#- isInstall functions -#-############################################################################### -sub extract_modules { - my ($dir, @modules) = @_; - map { - my $f = name2file($_); - if (-e "/modules/$f.gz") { - system("gzip -dc /modules/$f.gz > $dir/$f") == 0 - or unlink "$dir/$f"; - } - "$dir/$f"; - } @modules; -} - -sub load_raw_install { - my ($l, $options) = @_; - - extract_modules('/tmp', @$l); - my @failed = grep { - my $m = '/tmp/' . name2file($_); - if (-e $m) { - my $stdout; - my $rc = run_program::run('insmod', '2>', \$stdout, $m, split(' ', $options->{$_})); - log::l(chomp_($stdout)) if $stdout; - if ($rc) { - unlink $m; - ''; - } - } else { - log::l("missing module $_"); - 'error'; - } - } @$l; - - die "insmod'ing module " . join(", ", @failed) . " failed" if @failed; - -} - 1; |
