diff options
author | Mystery Man <unknown@mandriva.org> | 2000-11-08 00:01:16 +0000 |
---|---|---|
committer | Mystery Man <unknown@mandriva.org> | 2000-11-08 00:01:16 +0000 |
commit | d5c526273db473a7d87a26000585900fc10dda7d (patch) | |
tree | 0fdaabe7a00921b6cc556601b103d344fc7ac781 /perl-install/modules.pm | |
parent | 9c164312d4bfff6d93e1c4529de6b992f2bebc44 (diff) | |
download | drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar.gz drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar.bz2 drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar.xz drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.zip |
This commit was manufactured by cvs2svn to create branch
'unlabeled-1.1.1'.
Diffstat (limited to 'perl-install/modules.pm')
-rw-r--r-- | perl-install/modules.pm | 687 |
1 files changed, 204 insertions, 483 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm index 9fc52570e..b6e2ebd9b 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -1,57 +1,116 @@ package modules; -use vars qw(%loaded %drivers); +use diagnostics; +use strict; +use vars qw(%loaded); -use common qw(:common :file :system); +use common qw(:file); +use log; use detect_devices; use run_program; -use log; +use pci; +%loaded = (); -my %conf; -my %loaded; #- array of loaded modules for each types (scsi/net/...) -my $scsi = 0; 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 @drivers_by_category = ( -[ 'net', { -arch() =~ /^sparc/ ? ( - "myri_sbus" => "MyriCOM Gigabit Ethernet", - "sunbmac" => "Sun BigMac Ethernet", - "sunhme" => "Sun Happy Meal Ethernet", - "sunqe" => "Sun Quad Ethernet", -) : arch =~ /alpha/ ? () : ( +[ 0, \&detect_devices::hasEthernet, 'net', 'ethernet', { "3c509" => "3com 3c509", "3c501" => "3com 3c501", "3c503" => "3com 3c503", "3c505" => "3com 3c505", "3c507" => "3com 3c507", "3c515" => "3com 3c515", - "3c90x" => "3Com 3c90x (Cyclone/Hurricane/Tornado)", + "3c59x" => "3com 3c59x (Vortex)", + "3c59x" => "3com 3c90x (Boomerang)", "at1700" => "Allied Telesis AT1700", "ac3200" => "Ansel Communication AC3200", - "acenic" => "AceNIC Gigabit Ethernet", "pcnet32" => "AMD PC/Net 32", - "82596" => "Apricot 82596", -# "atp" => "ATP", # builtin the kernel + "apricot" => "Apricot 82596", + "atp" => "ATP", "e2100" => "Cabletron E2100", "tlan" => "Compaq Netelligent", - "cs89x0" => "CS89x0", - "de600" => "D-Link DE-600 pocket adapter", - "de620" => "D-Link DE-620 pocket adapter", - "dgrs" => "Digi International RightSwitch", + "de4x5" => "Digital 425,434,435,450,500", "depca" => "Digital DEPCA and EtherWORKS", "ewrk3" => "Digital EtherWORKS 3", - "old_tulip" => "Digital 21040/21041/21140 (old Tulip driver)", - "tulip" => "Digital 21040/21041/21140 (Tulip)", - "eth16i" => "ICL EtherTeam 16i", + "tulip" => "Digital 21040 (Tulip)", + "de600" => "D-Link DE-600 pocket adapter", + "de620" => "D-Link DE-620 pocket adapter", "epic100" => "EPIC 100", - "eexpress" => "Intel EtherExpress", - "eepro" => "Intel EtherExpress Pro", - "eepro100" => "Intel EtherExpress Pro 100", #- should run on sparc but no memory on floppy "hp100" => "HP10/100VG any LAN ", "hp" => "HP LAN/AnyLan", "hp-plus" => "HP PCLAN/plus", + "eth16i" => "ICL EtherTeam 16i", + "eexpress" => "Intel EtherExpress", + "eepro" => "Intel EtherExpress Pro", + "eepro100" => "Intel EtherExpress Pro 100", "lance" => "Lance", "lne390" => "Mylex LNE390", "ne" => "NE2000 and compatible", @@ -60,391 +119,117 @@ arch() =~ /^sparc/ ? ( "ni5010" => "NI 5010", "ni52" => "NI 5210", "ni65" => "NI 6510", + "rtl8139" => "RealTek RTL8129/8139", "es3210" => "Racal-Interlan ES3210", - "rcpci" => "Red Creek Hardware VPN", + "rcpci45" => "RedCreek PCI45 LAN", "epic100" => "SMC 83c170 EPIC/100", - "sktr" => "Syskonnect Token ring adaptor", "smc9194" => "SMC 9000 series", "smc-ultra" => "SMC Ultra", "smc-ultra32" => "SMC Ultra 32", - "yellowfin" => "Symbios Yellowfin G-NIC", "via-rhine" => "VIA Rhine", -# "wavelan" => "AT&T WaveLAN & DEC RoamAbout DS", # TODO is a "AT&T GIS WaveLAN ISA" ? "wd" => "WD8003, WD8013 and compatible", - "z85230" => "Z85x30", - - "dmfe" => "dmfe", - "fmv18x" => "fmv18x", - "ibmtr" => "Token Ring Tropic", - "olympic" => "olympic", - "plip" => "PLIP (parallel port)", - "rl100a" => "rl100a", - "sb1000" => "sb1000", - "sbni" => "sbni", - "sis900" => "sis900", -), - "3c59x" => "3com 3c59x (Vortex)", - "de4x5" => "Digital 425,434,435,450,500", - "rtl8139" => "RealTek RTL8129/8139", -}], -[ 'network', { - "8390" => "8390", - "af_packet" => "packet socket", - "nfs" => "Network File System (nfs)", - "lockd" => "lockd", - "parport" => "parport", - "parport_pc" => "parport_pc", - "sunrpc" => "sunrpc", }], -[ 'scsi', { -arch() =~ /^sparc/ ? ( - "qlogicpti" => "Performance Technologies ISP", -) : arch() =~ /alpha/ ? () : ( +[ 0, \&detect_devices::hasSCSI, 'scsi', undef, { "aha152x" => "Adaptec 152x", "aha1542" => "Adaptec 1542", "aha1740" => "Adaptec 1740", + "aic7xxx" => "Adaptec 2740, 2840, 2940", "advansys" => "AdvanSys Adapters", "in2000" => "Always IN2000", "AM53C974" => "AMD SCSI", + "megaraid" => "AMI MegaRAID", "BusLogic" => "BusLogic Adapters", "dtc" => "DTC 3180/3280", + "eata_dma" => "EATA DMA Adapters", + "eata_pio" => "EATA PIO Adapters", "seagate" => "Future Domain TMC-885, TMC-950", "fdomain" => "Future Domain TMC-16x0", - "initio" => "Initio", + "gdth" => "ICP Disk Array Controller", + "ppa" => "Iomega PPA3 (parallel port Zip)", "g_NCR5380" => "NCR 5380", "NCR53c406a" => "NCR 53c406a", "53c7,8xx" => "NCR 53c7xx", + "ncr53c8xx" => "NCR 53C8xx PCI", + "pci2000" => "Perceptive Solutions PCI-2000", + "pas16" => "Pro Audio Spectrum/Studio 16", "qlogicfas" => "Qlogic FAS", + "qlogicisp" => "Qlogic ISP", "seagate" => "Seagate ST01/02", "t128" => "Trantor T128/T128F/T228", "u14-34f" => "UltraStor 14F/34F", "ultrastor" => "UltraStor 14F/24F/34F", "wd7000" => "Western Digital wd7000", - - "a100u2w" => "a100u2w", - "atp870u" => "atp870u (Acard/Artop)", - "dc395x_trm" => "dc395x_trm", - "psi240i" => "psi240i", - "qlogicfc" => "qlogicfc", - "sim710" => "sim710", - "sym53c416" => "sym53c416", - "tmscsim" => "tmscsim", - "scsi_mod" => "scsi_mod", -), - "aic7xxx" => "Adaptec 2740, 2840, 2940", - "ncr53c8xx" => "NCR 53C8xx PCI", -# "pci2000" => "Perceptive Solutions PCI-2000", # TODO - "qlogicisp" => "Qlogic ISP", - "sym53c8xx" => "Symbios 53c8xx", - "sd_mod" => "sd_mod", - "ide-mod" => "ide-mod", - "ide-probe" => "ide-probe", -#- "ide-probe-mod" => "ide-probe-mod", -}], -[ 'disk', { -arch() =~ /^sparc/ ? ( - "pluto" => "Sun SparcSTORAGE Array SCSI", #- name it "fc4:soc:pluto" ? -) : arch() =~ /alpha/ ? () : ( - "DAC960" => "Mylex DAC960", -# "dpt" => "Distributed Tech SmartCache/Raid I-IV Controller", # not there anymore? - "megaraid" => "AMI MegaRAID", - "aacraid" => "AACxxx Raid Controller", - "cpqarray" => "Compaq Smart-2/P RAID Controller", - "gdth" => "ICP Disk Array Controller", - "ips" => "IBM ServeRAID controller", - "eata" => "EATA SCSI PM2x24/PM3224", - "eata_pio" => "EATA PIO Adapters", - "eata_dma" => "EATA DMA Adapters", - "ppa" => "Iomega PPA3 (parallel port Zip)", - "imm" => "Iomega Zip (new driver)", -), - "ide-disk" => "IDE disk", }], -[ 'cdrom', { -arch() !~ /^sparc|alpha/ ? ( +[ 0, undef, 'cdrom', 'none', { "sbpcd" => "SoundBlaster/Panasonic", -#- "aztcd" => "Aztech CD", -#- "gscd" => "Goldstar R420", -#- "isp16" => "ISP16/MAD16/Mozart", -#- "mcd" => "Mitsumi", #- removed for space -#- "mcdx" => "Mitsumi (alternate)", -#- "optcd" => "Optics Storage 8000", -#- "cm206" => "Phillips CM206/CM260", -#- "sjcd" => "Sanyo", + "aztcd" => "Aztech CD", + "bpcd" => "Backpack CDROM", + "gscd" => "Goldstar R420", + "mcd" => "Mitsumi", + "mcdx" => "Mitsumi (alternate)", + "optcd" => "Optics Storage 8000", + "cm206" => "Phillips CM206/CM260", + "sjcd" => "Sanyo", "cdu31a" => "Sony CDU-31A", "sonycd535" => "Sony CDU-5xx", -) : (), - "isofs" => "iso9660", - "ide-cd" => "ide-cd", - "sr_mod" => "SCSI CDROM support", - "cdrom" => "cdrom", -}], -[ 'sound', { -arch() !~ /^sparc/ ? ( - "alsa" => "ALSA sound module, many sound cards", - "cmpci" => "C-Media Electronics CMI8338A CMI8338B CMI8738", - "es1370" => "Ensoniq ES1370 [AudioPCI]", - "es1371" => "Ensoniq ES1371 [AudioPCI-97]", - "esssolo1" => "ESS Technology ES1969 Solo-1 Audiodrive", - "maestro" => "Maestro", - "nm256" => "Neomagic MagicMedia 256AV", - "pas16" => "Pro Audio Spectrum/Studio 16", - "via82cxxx" => "VIA VT82C686_5", - "sonicvibes" => "S3 SonicVibes", -) : (), -}], -[ 'pcmcia', { -arch() !~ /^sparc/ ? ( - "ide_cs" => "ide_cs", - "fmvj18x_cs" => "fmvj18x_cs", - "fdomain_cs" => "fdomain_cs", - "netwave_cs" => "netwave_cs", - "serial_cs" => "serial_cs", - "wavelan_cs" => "wavelan_cs", - "pcnet_cs" => "pcnet_cs", - "aha152x_cs" => "aha152x_cs", - "xirc2ps_cs" => "xirc2ps_cs", - "3c574_cs" => "3c574_cs", - "qlogic_cs" => "qlogic_cs", - "nmclan_cs" => "nmclan_cs", - "ibmtr_cs" => "ibmtr_cs", - "dummy_cs" => "dummy_cs", - "memory_cs" => "memory_cs", - "ftl_cs" => "ftl_cs", - "smc91c92_cs" => "smc91c92_cs", - "3c589_cs" => "3c589_cs", - "parport_cs" => "parport_cs", - "3c575_cb" => "3c575_cb", - "apa1480_cb" => "apa1480_cb", - "cb_enabler" => "cb_enabler", - "epic_cb" => "epic_cb", - "iflash2+_mtd" => "iflash2+_mtd", - "iflash2_mtd" => "iflash2_mtd", - "memory_cb" => "memory_cb", - "serial_cb" => "serial_cb", - "sram_mtd" => "sram_mtd", - "tulip_cb" => "tulip_cb", - -) : (), -}], -[ 'pcmcia_everywhere', { -arch() !~ /^sparc/ ? ( - "pcmcia_core" => "PCMCIA core support", - "tcic" => "PCMCIA tcic controller", - "ds" => "PCMCIA card support", - "i82365" => "PCMCIA i82365 controller", -) : (), -}], -[ 'paride', { -arch() !~ /^sparc/ ? ( - "aten" => "ATEN EH-100", - "bpck" => "Microsolutions backpack", - "comm" => "DataStor (older type) commuter adapter", - "dstr" => "DataStor EP-2000", - "epat" => "Shuttle EPAT", - "epia" => "Shuttle EPIA", - "fit2" => "Fidelity Intl. (older type)", - "fit3" => "Fidelity Intl. TD-3000", - "frpw" => "Freecom Power", - "friq" => "Freecom IQ (ASIC-2)", - "kbic" => "KingByte KBIC-951A and KBIC-971A", - "ktti" => "KT Tech. PHd", - "on20" => "OnSpec 90c20", - "on26" => "OnSpec 90c26", - "pd" => "Parallel port IDE disks", - "pcd" => "Parallel port CD-ROM", - "pf" => "Parallel port ATAPI disk", - "paride" => "Main parallel port module", -) : (), -}], -[ 'raid', { - "linear" => "linear", - "raid0" => "raid0", - "raid1" => "raid1", - "raid5" => "raid5", -}], -[ 'mouse', { -arch() !~ /^sparc/ ? ( - "busmouse" => "busmouse", - "msbusmouse" => "msbusmouse", - "serial" => "serial", - "qpmouse" => "qpmouse", - "atixlmouse" => "atixlmouse", - - "usb-uhci", "USB (uhci)", - "usb-ohci", "USB (ohci)", - "usb-ohci-hcd", "USB (ohci-hcd)", -) : (), -}], -[ 'fs', { - "smbfs" => "Windows SMB", - "fat" => "fat", - "msdos" => "msdos", - "romfs" => "romfs", - "sysv" => "sysv", - "ufs" => "ufs", - "umsdos" => "umsdos", - "vfat" => "vfat", -}], -[ 'other', { - "st" => "st", - "sg" => "sg", - "ide-scsi" => "ide-scsi", - "loop" => "Loopback device", - "lp" => "Parallel Printer", - "ide-floppy" => "ide-floppy", - "ide-tape" => "ide-tape", - "nbd" => "nbd", -}], +}] ); -my %type_aliases = ( - scsi => 'disk', +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 ], ); - -my @skip_modules_on_stage1 = - arch() =~ /alpha/ ? qw(sb1000) : - (); - - -my @drivers_fields = qw(text type); -%drivers = (); - foreach (@drivers_by_category) { - my ($type, $l) = @$_; - foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, $type ]; } -} -while (my ($k, $v) = each %drivers) { - my %l; @l{@drivers_fields} = @$v; - $drivers{$k} = \%l; + my @l = @$_; + my $l = pop @l; + foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, @l ]; } } 1; -sub module_of_type__4update_kernel { - my ($type) = @_; - my %skip; @skip{@skip_modules_on_stage1} = (); - grep { !exists $skip{$_} } grep { $drivers{$_}{type} =~ /^($type)$/ } keys %drivers; -} -sub module_of_type { - my ($type) = @_; - my $alias = $type_aliases{$type}; - grep { $drivers{$_}{type} =~ /^(($type)|$alias)$/ } keys %drivers; -} -sub module2text { $drivers{$_[0]}{text} } - -sub get_alias { - my ($alias) = @_; - $conf{$alias}{alias}; -} -sub get_options { - my ($name) = @_; - $conf{$name}{options}; -} - -sub add_alias($$) { - my ($alias, $name) = @_; - $name =~ /ignore/ and return; - /\Q$alias/ && $conf{$_}{alias} && $conf{$_}{alias} eq $name and return $_ foreach keys %conf; - $alias .= $scsi++ || '' if $alias eq 'scsi_hostadapter'; - log::l("adding alias $alias to $name"); - $conf{$alias}{alias} ||= $name; - if ($alias eq "sound" && $name =~ /^snd-card-/) { - $conf{$name}{"post-install"} = "modprobe snd-pcm-oss"; - } - $alias; -} - -sub remove_alias($) { - my ($name) = @_; - foreach (keys %conf) { - $conf{$_}{alias} && $conf{$_}{alias} eq $name or next; - delete $conf{$_}{alias}; - return 1; - } - 0; -} -sub load { - my ($name, $type, @options) = @_; +sub load($;$$) { + my ($name, $type, $minor) = @_; - if ($::testing) { - log::l("i try to install $name module (@options)"); - } else { - $conf{$name}{loaded} and return; + $loaded{$name} and return; - eval { load($_, 'prereq') } foreach @{$deps{$name}}; - load_raw([ $name, @options ]); - } - push @{$loaded{$type}}, $name; + $type or ($type, $minor) = @{$drivers{$name}}[3,4]; - 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}; - } - $conf{$name}{options} = join " ", @options if @options; + foreach (@{$deps{$name}}) { load($_, 'prereq', $minor) } + load_raw($name, $type, $minor); } -sub load_multi { - my $f; $f = sub { map { $f->(@{$deps{$_}}), $_ } @_ }; - my %l; my @l = - grep { !$conf{$_}{loaded} } - grep { my $o = $l{$_}; $l{$_} = 1; !$o } - $f->(@_); - $::testing and log::l("i would install modules @l"), return; +sub unload($) { run_program::run("/bin/rmmod", $_[0]); } - load_raw(map { [ $_ ] } @l); -} +sub load_raw($$$@) { + my ($name, $type, $minor, @options) = @_; -sub unload($;$) { - my ($m, $remove_alias) = @_; - if ($::testing) { - log::l("rmmod $m"); - } else { - if (run_program::run("rmmod", $m)) { - delete $conf{$m}{loaded}; - } - } - foreach (keys %loaded) { - @{$loaded{$_}} = grep { $m ne $_ } @{$loaded{$_}}; - } - remove_alias($m) if $remove_alias; -} +# @options or @options = guiGetModuleOptions($name); -sub load_raw { - my @l = map { my ($i, @i) = @$_; [ $i, \@i ] } grep { $_->[0] !~ /ignore/ } @_; - my $cz = "/lib/modules" . (arch() eq 'sparc64' && "64") . ".cz"; -e $cz or $cz .= "2"; - run_program::run("extract_archive", $cz, "/tmp", map { "$_->[0].o" } @l); - my @failed = grep { - my $m = "/tmp/$_->[0].o"; - if (-e $m && run_program::run(["insmod_", "insmod"], "-f", $m, @{$_->[1]})) { - unlink $m; - $conf{$_->[0]}{loaded} = 1; - ''; - } else { - log::l("missing module $_->[0]") unless -e $m; - -e $m; - } - } @l; + run_program::run("/usr/bin/insmod", "/modules/$name.o", @options) or die("insmod module $name"); - #- 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 }; + # this is a hack to make plip go + if ($name eq "parport_pc") { + foreach (@options) { + /^irq=(\d+)/ or next; + log::l("writing to /proc/parport/0/irq"); + local *F; + open F, "> /proc/parport/0/irq" or last; + print F $1; } } - die "insmod'ing module " . join(", ", map { $_->[0] } @failed) . " failed" if @failed; -} - -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); - } + $loaded{$name} = { type => $type, minor => $minor, options => \@options }; } sub load_deps($) { @@ -456,154 +241,90 @@ sub load_deps($) { my ($f, $deps) = split ':'; push @{$deps{$f}}, split ' ', $deps; } + 1; } -sub read_conf($;$) { - my ($file, $scsi) = @_; - my %c; - - foreach (cat_($file)) { - do { - $c{$2}{$1} = $3; - $$scsi = max($$scsi, $1 || 0) if /^\s*alias\s+scsi_hostadapter (\d*)/x && $scsi; #- space added to make perl2fcalls happy! - } if /^\s*(\S+)\s+(\S+)\s+(.*?)\s*$/; - } - #- cheating here: not handling aliases of aliases - while (my ($k, $v) = each %c) { -#- $$scsi ||= $v->{scsi_hostadapter} if $scsi; - if (my $a = $v->{alias}) { - local $c{$a}{alias}; - add2hash($c{$a}, $v); - } - } - \%c; -} - -sub write_conf { - my ($prefix) = @_; - - my $file = "$prefix/etc/modules.conf"; - rename "$prefix/etc/conf.modules", $file; #- make the switch to new name if needed - - #- remove the post-install supermount stuff. We may have to add some more - substInFile { $_ = '' if /^post-install supermount/ } $file; - - my $written = read_conf($file); - - my %net = detect_devices::net2module(); - while (my ($k, $v) = each %net) { add_alias($k, $v) } - - my @l = sort grep { $conf{$_}{alias} && /scsi_hostadapter/ } keys %conf; - add_alias('block-major-11', 'scsi_hostadapter') if @l; - push @l, "ide-floppy" if detect_devices::ide_zips(); - $conf{supermount}{"post-install"} = join " ; ", map { "modprobe $_" } @l if @l; - $conf{"usb-storage"}{"post-install"} = "modprobe usbkbd; modprobe keybdev" if @l && arch() !~ /sparc|alpha/; +sub read_conf { + my ($file) = @_; local *F; - open F, ">> $file" or die("cannot write module config file $file: $!\n"); - while (my ($mod, $h) = each %conf) { - while (my ($type, $v2) = each %$h) { - print F "$type $mod $v2\n" if $v2 && $type ne "loaded" && !$written->{$mod}{$type}; - } - } -} + open F, $file or log::l("failed to open $file for module information"), return 0; -sub read_stage1_conf { - add2hash(\%conf, read_conf($_[0], \$scsi)); - if (arch() =~ /sparc/) { - $conf{parport_lowlevel}{alias} ||= "parport_ax"; - $conf{plip}{"pre-install"} ||= "modprobe parport_ax ; echo 7 > /proc/parport/0/irq"; #- TOCHECK - } else { - $conf{parport_lowlevel}{alias} ||= "parport_pc"; - $conf{pcmcia_core}{"pre-install"} ||= "CARDMGR_OPTS=-f /etc/rc.d/init.d/pcmcia start"; - $conf{plip}{"pre-install"} ||= "modprobe parport_pc ; echo 7 > /proc/parport/0/irq"; + 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' }; + /^option\s+(\S+)\s+(.*)/ and $loaded{$1} = { type => 'other', options => [ split ' ', $2 ] }; } + 1; } -sub load_thiskind($;&$) { - my ($type, $f, $pcic) = @_; - my %loaded_text; - - my @devs = detect_devices::matching_type($type, $pcic); - log::l("probe found " . scalar @devs . " $type devices"); +sub write_conf { + my ($file, $append) = @_; + my ($tr, $eth, $scsi) = (0, 0, 0); - 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($mod, $type); - $loaded_text{$mod} = $text; - } + $::testing and return 1; - if ($type =~ /scsi/) { - #- hey, we're allowed to pci probe :) let's do a lot of probing! + $append or rename($file, "$file.orig"), log::l("backing up old conf.modules"); - #- 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 !$@; + local *F; + open F, ($append ? ">" : "") . "> $file" or die("cannot write module config file $file: $!\n"); + + while (my ($k, $v) = each %loaded) { + unless ($append && $v->{persistFlags}->{alias}) { + 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"; } } - if (my ($c) = (detect_devices::matching_type('AUDIO'))) { - add_alias("sound", $c->{driver}); + unless ($append && $v->{persistFlags}->{options} || !$v->{options}) { + print F "options $k ", join(' ', @{$v->{options}}), "\n"; } } - my @loaded = map { $loaded_text{$_} || $_ } @{$loaded{$type} || []}; - $type =~ /scsi/ and @loaded and eval { load("sd_mod") }; - @loaded; -} -sub pcmcia_need_config($) { - return $_[0] && ! -s "/var/run/stab"; + print F "alias parport_lowlevel parport_pc\n"; + print F "pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start\n"; + 1; } -sub get_pcmcia_devices($$) { - my ($pcic) = @_; - my (@devs, $module, $desc, $type, $device); - - #- try to setup pcmcia if cardmgr is not running. - if (pcmcia_need_config($pcic)) { - log::l("i try to configure pcmcia services"); - symlink("/tmp/stage2/etc/pcmcia", "/etc/pcmcia") unless -e "/etc/pcmcia"; - symlink("/sbin/install", "/sbin/cardmgr") unless -x "/sbin/cardmgr"; - eval { - load("pcmcia_core"); - load($pcic); - load("ds"); - }; +sub load_thiskind($) { + my ($type) = @_; + my @devs; + my $found; - #- run cardmgr in foreground while it is configuring the card. - run_program::run("cardmgr", "-f", "-m" ,"/modules"); - sleep(3); + log::l("in load_thiskind, type = $type"); - #- make sure to be aware of loaded module by cardmgr. - read_already_loaded(); + unless ($type eq 'scsi' || $type eq 'net') { + log::l("pci probing for $type devices"); + @devs = pci::probe($type); + log::l("pci probe found " . scalar @devs . "$type devices"); } - foreach (cat_("/var/run/stab")) { - $desc = $1 if /^Socket\s+\d+:\s+(.*)/; - ($type, $module, $device) = ($1, $2, $3) if /^\d+\s+(\S+)\s+(\S+)\s+\S+\s+(\S+)/; - if ($desc && $module) { - push @devs, { description => $desc, driver => $module, type => $type, device => $device }; - $desc = $module = undef; - } + my %devs; + foreach (@devs) { + my $m = $_->{module}; + $devs{$m}++ and log::l("multiple $m devices found"), next; + $drivers{$m} or log::l("module $m not in install table"), next; + log::l("found driver for $m"); + load($m); + $found = 1; } - @devs; + pci::free(@devs); + $found; } -sub load_ide { - eval { - load("ide-mod", 'prereq', 'options="' . detect_devices::hasUltra66() . '"'); - delete $conf{"ide-mod"}{options}; - load_multi(qw(ide-probe ide-probe-mod ide-disk ide-cd)); - } +# This assumes only one of each driver type is loaded +sub removeDeviceDriver { +# my ($type) = @_; +# +# my @m = grep { $loaded{$_}->{type} eq $type } keys %loaded; +# @m or return 0; +# @m > 1 and log::l("removeDeviceDriver assume only one of each driver type is loaded, which is not the case (" . join(' ', @m) . ")"); +# removeModule($m[0]); +# 1; } + + |