diff options
Diffstat (limited to 'perl-install/modules.pm')
-rw-r--r-- | perl-install/modules.pm | 263 |
1 files changed, 137 insertions, 126 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm index 3bf19b943..59947da67 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -2,86 +2,91 @@ package modules; use diagnostics; use strict; -use vars qw(%loaded); use common qw(:common :file); use pci_probing::main; -use log; use detect_devices; use run_program; +use log; -%loaded = (); +my %conf; my %deps = (); - -my @neOptions = ( - [ "io=", "Base IO port:", "0x300:0x280:0x320:0x340:0x360" ], - [ "irq=", "IRQ level:", "" ], -); - -my @de4x5Options = ( - [ "io=", "Base IO port:", "0x0b" ], -); - -my @cdu31aOptions = ( - [ "cdu31a_port=", "Base IO port:", "" ], - [ "cdu31a_irq=", "IRQ level:", "" ], -); - -my @cm206Options = ( - [ "cm206=", "IO base, IRQ:", "" ], -); - -my @mcdOptions = ( - [ "mcd=", "Base IO port:", "" ], -); - -my @optcdOptions = ( - [ "optcd=", "Base IO port:", "" ], -); - -my @fdomainOptions = ( - [ "setup_called=", "Use other options", "1" ], - [ "port_base=", "Base IO port:", "0xd800" ], - [ "interrupt_level=", "Interrupt level (IRQ):", "10" ], -); - -my @sbpcdOptions = ( - [ "sbpcd=", "IO base, IRQ, label:", "" ], -); - -my @parportPcOptions = ( - [ "io=", "Base IO port:", "0x378" ], - [ "irq=", "IRQ level:", "7" ], -); - -my %modules = ( - "8390" => [ 1, undef, 0, '' ], - "cdu31a" => [ 0, \@cdu31aOptions, 0, '' ], - "cm206" => [ 0, \@cm206Options, 0, '' ], - "de4x5" => [ 1, \@de4x5Options, 'AUTOPROBE', "io=0" ], - "ds" => [ 1, undef, 0, '' ], - "fdomain" => [ 1, \@fdomainOptions, 0, '' ], - "i82365" => [ 1, undef, 0, '' ], - "isofs" => [ 1, undef, 0, '' ], - "loop" => [ 1, undef, 0, '' ], - "lp" => [ 1, undef, 0, '' ], - "parport" => [ 1, undef, 0, '' ], - "parport_pc" => [ 1, \@parportPcOptions, 0, "irq=7" ], - "mcd" => [ 0, \@mcdOptions, 0, '' ], - "ne" => [ 0, \@neOptions, 'FAKEAUTOPROBE', "io=0x300" ], - "nfs" => [ 1, undef, 0, '' ], - "optcd" => [ 0, \@optcdOptions, 0, '' ], - "pcmcia_core" => [ 1, undef, 0, '' ], - "sbpcd" => [ 1, \@sbpcdOptions, 0, '' ], - "smbfs" => [ 1, undef, 0, '' ], - "tcic" => [ 1, undef, 0, '' ], - "vfat" => [ 1, undef, 0, '' ], -); +# +#my %knownAliases = ( +# eth => { type => 'net', minor => 'ethernet' }, +# scsi_hostadapter => { type => 'scsi' }, +#); +# +#my @neOptions = ( +# [ "io=", __("Base IO port:"), "0x300", "0x280", "0x320", "0x340", "0x360" ], +# [ "irq=", __("IRQ level:"), "" ], +#); +# +#my @de4x5Options = ( +# [ "io=", __("Base IO port:"), "0x0b" ], +#); +# +#my @cdu31aOptions = ( +# [ "cdu31a_port=", __("Base IO port:"), "" ], +# [ "cdu31a_irq=", __("IRQ level:"), "" ], +#); +# +#my @cm206Options = ( +# [ "cm206=", __("IO base, IRQ:"), "" ], +#); +# +#my @mcdOptions = ( +# [ "mcd=", __("Base IO port:"), "" ], +#); +# +#my @optcdOptions = ( +# [ "optcd=", __("Base IO port:"), "" ], +#); +# +#my @fdomainOptions = ( +# [ "setup_called=", __("Use other options"), "1" ], +# [ "port_base=", __("Base IO port:"), "0xd800" ], +# [ "interrupt_level=", __("Interrupt level (IRQ):"), "10" ], +#); +# +#my @sbpcdOptions = ( +# [ "sbpcd=", __("IO base, IRQ, label:"), "" ], +#); +# +#my @parportPcOptions = ( +# [ "io=", __("Base IO port:"), "0x378" ], +# [ "irq=", __("IRQ level:"), "7" ], +#); +# +#my @modules_fields = qw(shouldAutoprobe options flags defaultOptions); +#my %modules = ( +# "8390" => [ 1 ], +# "cdu31a" => [ 0, \@cdu31aOptions ], +# "cm206" => [ 0, \@cm206Options ], +# "de4x5" => [ 1, \@de4x5Options, 'AUTOPROBE', "io=0" ], +# "ds" => [ 1, undef, 0, '' ], +# "fdomain" => [ 1, \@fdomainOptions, 0, '' ], +# "i82365" => [ 1, undef, 0, '' ], +# "isofs" => [ 1, undef, 0, '' ], +# "loop" => [ 1, undef, 0, '' ], +# "lp" => [ 1, undef, 0, '' ], +# "parport" => [ 1, undef, 0, '' ], +# "parport_pc" => [ 1, \@parportPcOptions, 0, "irq=7" ], +# "mcd" => [ 0, \@mcdOptions, 0, '' ], +# "ne" => [ 0, \@neOptions, 'FAKEAUTOPROBE', "io=0x300" ], +# "nfs" => [ 1, undef, 0, '' ], +# "optcd" => [ 0, \@optcdOptions, 0, '' ], +# "pcmcia_core" => [ 1, undef, 0, '' ], +# "sbpcd" => [ 1, \@sbpcdOptions, 0, '' ], +# "smbfs" => [ 1, undef, 0, '' ], +# "tcic" => [ 1, undef, 0, '' ], +# "vfat" => [ 1, undef, 0, '' ], +#); my @drivers_by_category = ( -[ 0, \&detect_devices::hasEthernet, 'net', 'ethernet', { +[ \&detect_devices::hasEthernet, 'net', 'ethernet', { "3c509" => "3com 3c509", "3c501" => "3com 3c501", "3c503" => "3com 3c503", @@ -129,7 +134,7 @@ my @drivers_by_category = ( "via-rhine" => "VIA Rhine", "wd" => "WD8003, WD8013 and compatible", }], -[ 0, \&detect_devices::hasSCSI, 'scsi', undef, { +[ \&detect_devices::hasSCSI, 'scsi', undef, { "aha152x" => "Adaptec 152x", "aha1542" => "Adaptec 1542", "aha1740" => "Adaptec 1740", @@ -161,7 +166,7 @@ my @drivers_by_category = ( "ultrastor" => "UltraStor 14F/24F/34F", "wd7000" => "Western Digital wd7000", }], -[ 0, undef, 'cdrom', 'none', { +[ undef, 'cdrom', 'none', { "sbpcd" => "SoundBlaster/Panasonic", "aztcd" => "Aztech CD", "bpcd" => "Backpack CDROM", @@ -176,25 +181,30 @@ my @drivers_by_category = ( }] ); +my @drivers_fields = qw(text detect type minor); my %drivers = ( - "plip" => [ "PLIP (parallel port)", 0, \&detect_devices::hasPlip, 'net', 'plip' ], - "ibmtr" => [ "Token Ring", 0, \&detect_devices::hasTokenRing, 'net', 'tr' ], - "DAC960" => [ "Mylex DAC960", 0, undef, 'scsi', undef ], - "pcmcia_core" => [ "PCMCIA core support", 0, undef, 'pcmcia', undef ], - "ds" => [ "PCMCIA card support", 0, undef, 'pcmcia', undef ], - "i82365" => [ "PCMCIA i82365 controller", 0, undef, 'pcmcia', undef ], - "tcic" => [ "PCMCIA tcic controller", 0, undef, 'pcmcia', undef ], - "isofs" => [ "iso9660", 0, undef, 'fs', undef ], - "nfs" => [ "Network File System (nfs)", 0, undef, 'fs', undef ], - "smbfs" => [ "Windows SMB", 0, undef, 'fs', undef ], - "loop" => [ "Loopback device", 0, undef, 'other', undef ], - "lp" => [ "Parallel Printer", 0, undef, 'other', undef ], + "plip" => [ "PLIP (parallel port)", \&detect_devices::hasPlip, 'net', 'plip' ], + "ibmtr" => [ "Token Ring", \&detect_devices::hasTokenRing, 'net', 'tr' ], + "DAC960" => [ "Mylex DAC960", undef, 'scsi', undef ], + "pcmcia_core" => [ "PCMCIA core support", undef, 'pcmcia', undef ], + "ds" => [ "PCMCIA card support", undef, 'pcmcia', undef ], + "i82365" => [ "PCMCIA i82365 controller", undef, 'pcmcia', undef ], + "tcic" => [ "PCMCIA tcic controller", undef, 'pcmcia', undef ], + "isofs" => [ "iso9660", undef, 'fs', undef ], + "nfs" => [ "Network File System (nfs)", undef, 'fs', undef ], + "smbfs" => [ "Windows SMB", undef, 'fs', undef ], + "loop" => [ "Loopback device", undef, 'other', undef ], + "lp" => [ "Parallel Printer", undef, 'other', undef ], ); foreach (@drivers_by_category) { my @l = @$_; my $l = pop @l; foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, @l ]; } } +foreach (keys %drivers) { + my %l; @{$l{@drivers_fields}} = @{$drivers{$_}}; + $drivers{$_} = \%l; +} 1; @@ -203,35 +213,34 @@ foreach (@drivers_by_category) { sub text_of_type($) { my ($type) = @_; - map { $_->[0] } grep { $_->[3] eq $type } values %drivers; + map { $_->{text} } grep { $_->{type} eq $type } values %drivers; } sub text2driver($) { my ($text) = @_; while (my ($k, $v) = each %drivers) { - $v->[0] eq $text and return $k; + $v->{text} eq $text and return $k; } die "$text is not a valid module description"; } -sub load($;$$) { - my ($name, $type, $minor) = @_; +sub load($;$) { + my ($name, $type, @options) = @_; - $loaded{$name} and return; + $conf{$name}{loaded} and return; - $type or ($type, $minor) = @{$drivers{$name}}[3,4]; + $type ||= $drivers{$name}{type}; load($_, 'prereq', $minor) foreach @{$deps{$name}}; - load_raw($name, $type, $minor); + load_raw($name, @options); } sub unload($) { run_program::run("rmmod", $_[0]); } -sub load_raw($$$@) { - my ($name, $type, $minor, @options) = @_; +sub load_raw($@) { + my ($name, @options) = @_; -# @options or @options = guiGetModuleOptions($name); run_program::run("insmod", $name, @options) or die("insmod $name failed"); # this is a hack to make plip go @@ -244,13 +253,13 @@ sub load_raw($$$@) { print F $1; } } - $loaded{$name} = { type => $type, minor => $minor, options => \@options }; + $conf{$name}{loaded} = 1; } sub read_already_loaded() { foreach (cat_("/proc/modules", "die")) { my ($name) = split; - @{$loaded{$name}}{"type", "minor"} = @{$drivers{$name}}[3,4]; + $conf{$name}{loaded} = 1; } } @@ -267,52 +276,54 @@ sub load_deps($) { sub read_conf { my ($file) = @_; + my %c; - local *F; - open F, $file or log::l("failed to open $file for module information"), return 0; - - foreach (<F>) { - /^alias\s+eth0\s+(\S+)/ and $loaded{$1} = { type => 'net', minor => 'ethernet' }; - /^alias\s+scsi_hostadapter\s+(\S+)/ and $loaded{$1} = { type => 'scsi' }; - /^options\s+(\S+)\s+(.*)/ and add2hash($loaded{$1} || {}, { type => 'other', options => [ split ' ', $2 ] }); + foreach (cat_($file)) { + $c{$2}{$1} = $3 if /^\s*(\S+)\s+(\S+)\s+(.*?)\s*$/; + } + # cheating here: not handling aliases of aliases + while (my ($k, $v) = each %c) { + $c{scsi} ||= $v->{scsi_hostadapter}; + add2hash($c{$v->{alias}} ||= {}, $v) if $v->{alias}; } + %c; } sub write_conf { - my ($file, $append) = @_; - my ($tr, $eth, $scsi) = (0, 0, 0); - - $append or rename($file, "$file.orig"), log::l("backing up old $file"); + my ($file) = @_; + my %written = read_conf($file); + my $scsi = $written{scsi}; local *F; - open F, ($append ? ">" : "") . "> $file" or die("cannot write module config file $file: $!\n"); - - while (my ($k, $v) = each %loaded) { - if ($v->{type} eq 'net') { - $v->{minor} eq 'tr' and print F "alias tr", $tr++, " $k\n"; - $v->{minor} eq 'ethernet' and print F "alias eth", $eth++, " $k\n"; - } elsif ($v->{type} eq 'scsi') { - print F "alias scsi_hostadapter", $scsi++, " $k\n"; + open F, ">> $file" or die("cannot write module config file $file: $!\n"); + + while (my ($mod, $h) = each %conf) { + while (my ($type, $v2) = each %$h) { + unless ($written{$mod}{$type}) { + if ($mod eq 'scsi_hostadapter') { + print "#" if $scsi; + $scsi ||= 1; + } + print F "$type $mod $v2\n"; + } } - print F "options $k ", join(' ', @{$v->{options}}), "\n" unless is_empty_array_ref($v->{options}); } - print F "alias parport_lowlevel parport_pc\n"; - print F "pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start\n"; } - +sub get_stage1_conf { + %conf = read_conf($_[0]); + $conf{alias}{parport_lowlevel} ||= "parport_pc"; + $conf{"pre-install"}{pcmcia_core} ||= "/etc/rc.d/init.d/pcmcia start"; + $conf{"pre-install"}{plip} ||= "modprobe parport_pc ; echo 7 > /proc/parport/0/irq"; +} sub load_thiskind($;&) { my ($type, $f) = @_; - my @devs; - my $found; - if ($type eq 'scsi' || $type eq 'net') { - @devs = pci_probing::main::probe($type); - log::l("pci probe found " . scalar @devs . " $type devices"); - } - my %devs; - foreach (@devs) { + my @devs = pci_probing::main::probe($type); + log::l("pci probe found " . scalar @devs . " $type devices"); + + my %devs; foreach (@devs) { my ($text, $mod) = @$_; $devs{$mod}++ and log::l("multiple $mod devices found"), next; $drivers{$mod} or log::l("module $mod not in install table"), next; |