diff options
Diffstat (limited to 'perl-install/modules.pm')
-rw-r--r-- | perl-install/modules.pm | 780 |
1 files changed, 571 insertions, 209 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm index b6e2ebd9b..4494e366c 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -1,116 +1,57 @@ -package modules; +package modules; # $Id$ -use diagnostics; use strict; -use vars qw(%loaded); +use vars qw(%drivers); -use common qw(:file); -use log; +use common qw(:common :file :system :functional); use detect_devices; use run_program; -use pci; +use log; -%loaded = (); +my %conf; +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 = ( -[ 0, \&detect_devices::hasEthernet, 'net', 'ethernet', { +[ 'net', { +arch() =~ /^sparc/ ? ( + "myri_sbus" => "MyriCOM Gigabit Ethernet", + "sunbmac" => "Sun BigMac Ethernet", + "sunhme" => "Sun Happy Meal Ethernet", + "sunqe" => "Sun Quad Ethernet", +) : arch =~ /alpha/ ? () : ( "3c509" => "3com 3c509", "3c501" => "3com 3c501", "3c503" => "3com 3c503", "3c505" => "3com 3c505", "3c507" => "3com 3c507", "3c515" => "3com 3c515", - "3c59x" => "3com 3c59x (Vortex)", - "3c59x" => "3com 3c90x (Boomerang)", + "3c90x" => "3Com 3c90x (Cyclone/Hurricane/Tornado)", "at1700" => "Allied Telesis AT1700", "ac3200" => "Ansel Communication AC3200", + "acenic" => "AceNIC Gigabit Ethernet", "pcnet32" => "AMD PC/Net 32", - "apricot" => "Apricot 82596", - "atp" => "ATP", + "82596" => "Apricot 82596", +# "atp" => "ATP", # builtin the kernel "e2100" => "Cabletron E2100", - "tlan" => "Compaq Netelligent", - "de4x5" => "Digital 425,434,435,450,500", - "depca" => "Digital DEPCA and EtherWORKS", - "ewrk3" => "Digital EtherWORKS 3", - "tulip" => "Digital 21040 (Tulip)", +# "tlan" => "Compaq Netelligent", + "cs89x0" => "CS89x0", "de600" => "D-Link DE-600 pocket adapter", "de620" => "D-Link DE-620 pocket adapter", + "dgrs" => "Digi International RightSwitch", + "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", "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", @@ -119,212 +60,633 @@ my @drivers_by_category = ( "ni5010" => "NI 5010", "ni52" => "NI 5210", "ni65" => "NI 6510", - "rtl8139" => "RealTek RTL8129/8139", "es3210" => "Racal-Interlan ES3210", - "rcpci45" => "RedCreek PCI45 LAN", + "rcpci" => "Red Creek Hardware VPN", "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", +# "sk98lin" => "Syskonnect (Schneider & Koch)|Gigabit Ethernet", +), + "3c59x" => "3com 3c59x (Vortex)", + "de4x5" => "Digital 425,434,435,450,500", + "rtl8139" => "RealTek RTL8129/8139", + "8139too" => "Realtek RTL-8139", +}], +[ 'net_raw', { + "8390" => "8390", + "af_packet" => "packet socket", + "nfs" => "Network File System (nfs)", + "lockd" => "lockd", + "parport" => "parport", + "parport_pc" => "parport_pc", + "sunrpc" => "sunrpc", +}], +[ 'isdn', { + "hisax" => "hisax", + "b1pci" => "b1pci", }], -[ 0, \&detect_devices::hasSCSI, 'scsi', undef, { +[ 'scsi', { +arch() =~ /^sparc/ ? ( + "qlogicpti" => "Performance Technologies ISP", +) : arch() =~ /alpha/ ? () : ( "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", - "gdth" => "ICP Disk Array Controller", - "ppa" => "Iomega PPA3 (parallel port Zip)", + "initio" => "Initio", "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", +# "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", +), + "aic7xxx" => "Adaptec 2740, 2840, 2940", + "ncr53c8xx" => "NCR 53C8xx PCI", +# "pci2000" => "Perceptive Solutions PCI-2000", # TODO + "qlogicisp" => "Qlogic ISP", + "sym53c8xx" => "Symbios 53c8xx", }], -[ 0, undef, 'cdrom', 'none', { +[ 'scsi_raw', { + "scsi_mod" => "scsi_mod", + "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_i2o" => "Distributed Tech SmartCache/Raid I-V Controller", + "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)", +), +}], +[ 'disk_raw', { +#- "ide-disk" => "IDE disk", +}], +[ 'cdrom', { +arch() !~ /^sparc|alpha/ ? ( "sbpcd" => "SoundBlaster/Panasonic", - "aztcd" => "Aztech CD", - "bpcd" => "Backpack CDROM", - "gscd" => "Goldstar R420", - "mcd" => "Mitsumi", - "mcdx" => "Mitsumi (alternate)", +# "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", "cdu31a" => "Sony CDU-31A", "sonycd535" => "Sony CDU-5xx", -}] +) : (), +}], +[ 'cdrom_raw', { + "isofs" => "iso9660", + "ide-cd" => "ide-cd", + "sr_mod" => "SCSI CDROM support", + "cdrom" => "cdrom", +}], +[ 'sound', { +arch() !~ /^sparc/ ? ( + "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", + "snd-card-ice1712" => "IC Ensemble Inc|ICE1712 [Envy24]", + "emu10k1" => "Creative Labs|SB Live! (audio)", +# "au8820" => "Aureal Semiconductor|Vortex 1", +# "au8830" => "Aureal Semiconductor|Vortex 2", + "snd-card-cs461x" => "Cirrus Logic|CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]", + "snd-card-ens1371" => "Ensoniq/Creative Labs ES1371", + "snd-card-es1938" => "ESS Technology|ES1969 Solo-1 Audiodrive", + "snd-card-fm801" => "Fortemedia, Inc|Xwave QS3000A [FM801]<>Fortemedia, Inc|FM801 PCI Audio", + "snd-card-intel8x0" => "Intel Corporation|82440MX AC'97 Audio Controller<>Intel Corporation", + "snd-card-rme96" => "Xilinx, Inc.|RME Digi96<>Xilinx, Inc.", + "snd-card-trident" => "Silicon Integrated Systems [SiS]|7018 PCI Audio", + "snd-card-via686a" => "VIA Technologies|VT82C686 [Apollo Super AC97/Audio]", + "snd-card-ymfpci" => "Yamaha Corporation|YMF-740", +) : (), +}], +[ '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', { + "usb-uhci" => "USB (uhci)", + "usb-ohci" => "USB (ohci)", + "usb-ohci-hcd" => "USB (ohci-hcd)", +}], +[ 'fs', { + "smbfs" => "Windows SMB", + "fat" => "fat", + "msdos" => "msdos", + "romfs" => "romfs", + "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", + "bttv" => "Brooktree Corporation|Bt8xx Video Capture", + "buz" => "Zoran Corporation|ZR36057PQC Video cutting chipset", + "rrunner" => "Essential Communications|Roadrunner serial HIPPI", + "defxx" => "DEC|DEFPA" +#- "ide-probe-mod" => "ide-probe-mod", +}], ); -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 %type_aliases = ( + scsi => 'disk', ); + +#my @skip_big_modules_on_stage1 = +#qw( +#acenic sk98lin +#BusLogic seagate fdomain g_NCR5380 tmscsim +#dpt_i2o gdth eata eata_pio eata_dma +#aztcd gscd isp16 mcd mcdx optcd cm206 sjcd cdu31a +#); +my @skip_big_modules_on_stage1 = +qw( +acenic sk98lin +BusLogic seagate fdomain g_NCR5380 +dpt_i2o eata eata_pio eata_dma +optcd cm206 sjcd cdu31a +); + +my @skip_modules_on_stage1 = ( + arch() =~ /alpha/ ? qw(sb1000) : (), + "apa1480_cb", +); + + +my @drivers_fields = qw(text type); +%drivers = (); + foreach (@drivers_by_category) { - my @l = @$_; - my $l = pop @l; - foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, @l ]; } + my ($type, $l) = @$_; + foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, $type ]; } +} +while (my ($k, $v) = each %drivers) { + my %l; @l{@drivers_fields} = @$v; + $drivers{$k} = \%l; +} + +sub module_of_type__4update_kernel { + my ($type) = @_; + $type = join "|", map { $_, $_ . "_raw" } split ' ', $type; + my %skip; + @skip{@skip_modules_on_stage1} = (); + @skip{@skip_big_modules_on_stage1} = () if $type !~ /big/; + "big" =~ /^($type)$/ ? @skip_big_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}; +} -1; +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 ($name =~ /^snd-card-/) { + $conf{$name}{"post-install"} = "modprobe snd-pcm-oss"; + } + if ($alias eq 'scsi_hostadapter') { + add_alias('block-major-11', $alias); + } + $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, $minor) = @_; +sub when_load { + my ($name, $type, @options) = @_; + if ($type =~ /\bscsi\b/ || $type eq $type_aliases{scsi}) { + add_alias('scsi_hostadapter', $name), eval { load('sd_mod') }; + } + $conf{$name}{options} = join " ", @options if @options; +} - $loaded{$name} and return; +sub load { + my ($name, $type, @options) = @_; - $type or ($type, $minor) = @{$drivers{$name}}[3,4]; + my @netdev = detect_devices::getNet() if $type eq 'net'; + + if ($::testing) { + log::l("i try to install $name module (@options)"); + } elsif ($::isStandalone || $::live) { + run_program::run("modprobe", $name, @options); + } else { + $conf{$name}{loaded} and return; + + eval { load($_, 'prereq') } foreach @{$deps{$name}}; + load_raw([ $name, @options ]); + } + sleep 2 if $name =~ /usb-storage|mousedev/; + + if ($type eq 'net') { + add_alias($_, $name) foreach difference2([ detect_devices::getNet() ], \@netdev); + } - foreach (@{$deps{$name}}) { load($_, 'prereq', $minor) } - load_raw($name, $type, $minor); + when_load($name, $type, @options); } +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->(@_); -sub unload($) { run_program::run("/bin/rmmod", $_[0]); } + $::testing and log::l("i would install modules @l"), return; -sub load_raw($$$@) { - my ($name, $type, $minor, @options) = @_; + load_raw(map { [ $_ ] } @l); +} -# @options or @options = guiGetModuleOptions($name); +sub unload { + my ($m) = @_; + if ($::testing) { + log::l("rmmod $m"); + } else { + if (run_program::run("rmmod", $m)) { + delete $conf{$m}{loaded}; + } + } +} - run_program::run("/usr/bin/insmod", "/modules/$name.o", @options) or die("insmod module $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("packdrake", "-x", $cz, "/tmp", map { "$_->[0].o" } @l); + my @failed = grep { + my $m = "/tmp/$_->[0].o"; + if (-e $m && run_program::run(["insmod_", "insmod"], '2>', '/dev/tty5', '-f', $m, @{$_->[1]})) { + unlink $m; + $conf{$_->[0]}{loaded} = 1; + ''; + } else { + log::l("missing module $_->[0]") unless -e $m; + -e $m; + } + } @l; - # 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; + + foreach (@l) { + 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/) { + add_alias('usb-interface', $_->[0]); + eval { + require fs; fs::mount('/proc/bus/usb', '/proc/bus/usb', 'usbdevfs'); + #- ensure keyboard is working, the kernel must do the job the BIOS was doing + sleep 2; + load_multi("usbkbd", "keybdev") if detect_devices::hasUsbKeyboard(); + } } } - $loaded{$name} = { type => $type, minor => $minor, options => \@options }; +} + +sub read_already_loaded() { + foreach (cat_("/proc/modules")) { + my ($name) = split; + $conf{$name}{loaded} = 1; + when_load($name, $drivers{$name}{type}); + } } sub load_deps($) { my ($file) = @_; - local *F; - open F, $file or log::l("error opening $file: $!"), return 0; - foreach (<F>) { + local *F; open F, $file or log::l("error opening $file: $!"), return 0; + local $_; + while (<F>) { my ($f, $deps) = split ':'; push @{$deps{$f}}, split ' ', $deps; } - 1; } -sub read_conf { - my ($file) = @_; +sub read_conf($;$) { + my ($file, $scsi) = @_; + 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' }; - /^option\s+(\S+)\s+(.*)/ and $loaded{$1} = { type => 'other', options => [ split ' ', $2 ] }; + 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) { + if (my $a = $v->{alias}) { + local $c{$a}{alias}; + add2hash($c{$a}, $v); + } } - 1; + \%c; +} + +sub mergein_conf { + my ($file) = @_; + my $modconfref = read_conf ($file, \$scsi); + map { my ($key, $value) = $_; $conf{$key}{alias} ||= $value->{alias} } %$modconfref; } sub write_conf { - my ($file, $append) = @_; - my ($tr, $eth, $scsi) = (0, 0, 0); + my ($prefix) = @_; + + my $file = "$prefix/etc/modules.conf"; + rename "$prefix/etc/conf.modules", $file; #- make the switch to new name if needed - $::testing and return 1; + #- remove the post-install supermount stuff. We now do it in /etc/modules + # Substitute new aliases in modules.conf (if config has changed) + substInFile { + $_ = '' if /^post-install supermount/; + my ($type,$alias,$module) = split /\s+/, $_; + $_ = "$type $alias $conf{$alias}{alias} \n" if ($type ne "loaded" && $conf{$alias}{alias} && $conf{$alias}{alias} !~ /$module/); + } $file; - $append or rename($file, "$file.orig"), log::l("backing up old conf.modules"); + my $written = read_conf($file); 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"; - } - } - unless ($append && $v->{persistFlags}->{options} || !$v->{options}) { - print F "options $k ", join(' ', @{$v->{options}}), "\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) { + print F "$type $mod $v2\n" if $v2 && $type ne "loaded" && !$written->{$mod}{$type}; } } + my @l = map { "scsi_hostadapter$_" } '', 1..$scsi-1 if $scsi; + push @l, 'ide-floppy' if detect_devices::ide_zips(); + push @l, 'bttv' if grep { $_->{driver} eq 'bttv' } detect_devices::probeall(); + my $l = join '|', @l; + log::l("to put in modules @l"); + + substInFile { + $_ = '' if /$l/; + $_ = join '', map { "$_\n" } @l if eof; + } "$prefix/etc/modules"; +} + +sub read_stage1_conf { + mergein_conf($_[0]); - print F "alias parport_lowlevel parport_pc\n"; - print F "pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start\n"; - 1; + 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"; + } } +sub load_thiskind { + my ($type, $f) = @_; + + #- get_that_type returns the PCMCIA cards. It doesn't know they are already + #- loaded, so: + read_already_loaded(); + grep { + $f->($_->{description}, $_->{driver}) if $f; + eval { load($_->{driver}, $type) }; + $_->{error} = $@; -sub load_thiskind($) { + !($@ && $_->{try}); + } get_that_type($type), + $type =~ /scsi/ && arch() !~ /sparc/ ? + (map { +{ driver => $_, description => $_, try => 1 } } + detect_devices::hasUsbZip() ? "usb-storage" : (), "imm", "ppa") : (); +} + +sub get_that_type { my ($type) = @_; - my @devs; - my $found; - log::l("in load_thiskind, type = $type"); + grep { + my $l = $drivers{$_->{driver}}; + ($_->{type} =~ /$type/ || $l && $l->{type} =~ /$type/) && detect_devices::check($_); + } detect_devices::probeall(''); +} - 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"); +sub load_ide { + if (1) { #- add it back to support Ultra66 on ide modules. + load("ide-cd"); + } else { + 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)); + } } +} + +sub configure_pcmcia { + my ($pcic) = @_; + + #- try to setup pcmcia if cardmgr is not running. + -s "/var/run/stab" and return; + + 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"; - 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; + eval { + load("pcmcia_core"); + load($pcic); + load("ds"); + }; + + #- run cardmgr in foreground while it is configuring the card. + run_program::run("cardmgr", "-f", "-m" ,"/modules"); + sleep(3); + + #- make sure to be aware of loaded module by cardmgr. + read_already_loaded(); +} + +sub get_pcmcia_devices { + my (@devs, $desc); + + foreach (cat_("/var/run/stab")) { + if (/^Socket\s+\d+:\s+(.*)/) { + $desc = $1; + } else { + my (undef, $type, $module, undef, $device) = split; + push @devs, { description => $desc, driver => $module, type => $type, device => $device }; + } } - pci::free(@devs); - $found; + @devs; } -# 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; +sub write_pcmcia { + my ($prefix, $pcmcia) = @_; + + #- should be set after installing the package above otherwise the file will be renamed. + setVarsInSh("$prefix/etc/sysconfig/pcmcia", { + PCMCIA => bool2yesno($pcmcia), + PCIC => $pcmcia, + PCIC_OPTS => "", + CORE_OPTS => "", + }); } + +1; |