summaryrefslogtreecommitdiffstats
path: root/perl-install/modules.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/modules.pm')
-rw-r--r--perl-install/modules.pm104
1 files changed, 31 insertions, 73 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm
index b4a6206f6..facef09c9 100644
--- a/perl-install/modules.pm
+++ b/perl-install/modules.pm
@@ -1,6 +1,6 @@
package modules;
-use vars qw(%loaded %drivers);
+use vars qw(%drivers);
use common qw(:common :file :system);
use detect_devices;
@@ -9,7 +9,6 @@ use log;
my %conf;
-my %loaded; #- array of loaded modules for each types (scsi/net/...)
my $scsi = 0;
my %deps = ();
@@ -322,9 +321,6 @@ while (my ($k, $v) = each %drivers) {
$drivers{$k} = \%l;
}
-
-1;
-
sub module_of_type__4update_kernel {
my ($type) = @_;
my %skip; @skip{@skip_modules_on_stage1} = ();
@@ -380,8 +376,10 @@ sub load {
eval { load($_, 'prereq') } foreach @{$deps{$name}};
load_raw([ $name, @options ]);
}
- push @{$loaded{$type}}, $name;
-
+ if ($name eq "usb-storage") {
+ sleep(2);
+ -d "/proc/scsi/usb" or return;
+ }
if ($type) {
add_alias('usb-interface', $name) if $type =~ /SERIAL_USB/i;
add_alias('scsi_hostadapter', $name), load('sd_mod') if $type =~ /scsi/ || $type eq $type_aliases{scsi};
@@ -409,9 +407,6 @@ sub unload($;$) {
delete $conf{$m}{loaded};
}
}
- foreach (keys %loaded) {
- @{$loaded{$_}} = grep { $m ne $_ } @{$loaded{$_}};
- }
remove_alias($m) if $remove_alias;
}
@@ -431,11 +426,15 @@ sub load_raw {
}
} @l;
- #- this is a hack to make plip go
foreach (@l) {
- $_->[0] eq "parport_pc" or next;
- foreach (@{$_->[1]}) {
- /^irq=(\d+)/ and eval { output "/proc/parport/0/irq", $1 };
+ if ($_->[0] eq "parport_pc") {
+ #- this is a hack to make plip go
+ foreach (@{$_->[1]}) {
+ /^irq=(\d+)/ and eval { output "/proc/parport/0/irq", $1 };
+ }
+ } elsif ($_->[0] =~ /usb-[uo]hci/) {
+ #- ensure keyboard is working, the kernel must do the job the BIOS was doing
+ load_multi("usbkbd", "keybdev");
}
}
die "insmod'ing module " . join(", ", map { $_->[0] } @failed) . " failed" if @failed;
@@ -445,7 +444,6 @@ sub read_already_loaded() {
foreach (cat_("/proc/modules")) {
my ($name) = split;
$conf{$name}{loaded} = 1;
- my $l = $loaded{($drivers{$name} || next)->{type}} ||= [];
push @$l, $name unless member($name, @$l);
}
}
@@ -524,48 +522,26 @@ sub read_stage1_conf {
}
sub load_thiskind {
- my ($type, $f, $pcic) = @_;
- show_load_thiskind($type, $f, $pcic, 1);
-}
-
-sub show_load_thiskind {
- my ($type, $f, $pcic, $load) = @_;
- my %loaded_text;
-
- my @devs = grep { my $l = $drivers{$_->{driver}}; $l && $l->{type} eq $type } detect_devices::probeall('', $pcip);
- log::l("probe found " . scalar @devs . " $type devices");
+ my ($type, $pcic, $f) = @_;
- my %devs; foreach (@devs) {
- my ($text, $mod) = ($_->{description}, $_->{driver});
- $devs{$mod}++ and log::l("multiple $mod devices found"), next;
- log::l("found driver for $mod");
- &$f($text, $mod) if $f;
- $load ? load($mod, $type) : push @{$loaded{$type}}, $mod;
- $loaded_text{$mod} = $text;
- }
- if ($load && $type =~ /scsi/) {
- #- hey, we're allowed to pci probe :) let's do a lot of probing!
+ grep {
+ $f->($_->{description}, $_->{driver}) if $f;
+ eval { load($_->{driver}) };
+ $_->{error} = $@;
- #- probe for USB SCSI.
- if (detect_devices::probeUSB()) {
- eval { load("usb-storage", $type); sleep(2); };
- -d "/proc/scsi/usb" or unload("usb-storage");
- }
- #- probe for parport SCSI.
- if (arch() !~ /sparc/) {
- foreach ("imm", "ppa") {
- eval { load($_, $type) };
- last if !$@;
- }
- }
- if (my ($c) = (show_load_thiskind ('audio'))) { #detect_devices::matching_type('AUDIO'))) {
- add_alias("sound", $c->{driver}); #- (dam's) this should be changed, we shouldn't use alias sound
- }
- }
+ !($@ && $_->{try});
+ } get_that_type($type, $pcic),
+ $type =~ /scsi/ && arch() !~ /sparc/ ?
+ (map { +{ driver => $_, description => $_, try => 1 } } "usb-storage", "imm", "ppa") : ();
+}
- my @loaded = map { $loaded_text{$_} || $_ } @{$loaded{$type} || []};
- $type =~ /scsi/ and @loaded and $load and eval { load("sd_mod") };
- @loaded;
+sub get_that_type {
+ my ($type, $pcic) = @_;
+
+ grep {
+ my $l = $drivers{$_->{driver}};
+ $l && $l->{type} eq $type && detect_devices::check($_);
+ } detect_devices::probeall('', $pcic);
}
sub pcmcia_need_config($) {
@@ -617,23 +593,5 @@ sub load_ide {
}
-sub load_bordel {
-
- #- probe for USB SCSI.
- if (detect_devices::probeUSB()) {
- eval { load("usb-storage", $type); sleep(2); };
- -d "/proc/scsi/usb" or unload("usb-storage");
- }
- #- probe for parport SCSI.
- if (arch() !~ /sparc/) {
- foreach ("imm", "ppa") {
- eval { load($_, $type) };
- last if !$@;
- }
- }
-# if (my ($c) = (show_load_thiskind ('audio'))) { #detect_devices::matching_type('AUDIO'))) {
-# add_alias("sound", $c->{driver}); #- (dam's) this should be changed, we shouldn't use alias sound
- }
- }
-}
+1;