diff options
Diffstat (limited to 'perl-install/modules.pm')
| -rw-r--r-- | perl-install/modules.pm | 825 |
1 files changed, 223 insertions, 602 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm index 6e8c8a039..abeb0b366 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -1,679 +1,300 @@ -package modules; # $Id$ +package modules; use strict; -use vars qw(%drivers); -use common qw(:common :file :system :functional); +use common; use detect_devices; use run_program; use log; +use list_modules; +use modules::any_conf; +sub modules_descriptions() { + my $f = '/lib/modules/' . c::kernel_version() . '/modules.description'; + map { my ($m, $d) = /(\S+)\s+(.*)/; $m =~ s/-/_/g; ($m => $d) } cat_($f); +} -my %conf; -my $scsi = 0; -my %deps = (); - -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/ ? () : ( - "3c509" => "3com 3c509", - "3c501" => "3com 3c501", - "3c503" => "3com 3c503", - "3c505" => "3com 3c505", - "3c507" => "3com 3c507", - "3c515" => "3com 3c515", - "3c90x" => "3Com 3c90x (Cyclone/Hurricane/Tornado)", - "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 - "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", - "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", - "lance" => "Lance", - "lne390" => "Mylex LNE390", - "ne" => "NE2000 and compatible", - "ne2k-pci" => "NE2000 PCI", - "ne3210" => "NE3210", - "ni5010" => "NI 5010", - "ni52" => "NI 5210", - "ni65" => "NI 6510", - "es3210" => "Racal-Interlan ES3210", - "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", -}], -[ 'scsi', { -arch() =~ /^sparc/ ? ( - "qlogicpti" => "Performance Technologies ISP", -) : arch() =~ /alpha/ ? () : ( - "aha152x" => "Adaptec 152x", - "aha1542" => "Adaptec 1542", - "aha1740" => "Adaptec 1740", - "advansys" => "AdvanSys Adapters", - "in2000" => "Always IN2000", - "AM53C974" => "AMD SCSI", - "BusLogic" => "BusLogic Adapters", - "dtc" => "DTC 3180/3280", - "seagate" => "Future Domain TMC-885, TMC-950", - "fdomain" => "Future Domain TMC-16x0", - "initio" => "Initio", - "g_NCR5380" => "NCR 5380", - "NCR53c406a" => "NCR 53c406a", - "53c7,8xx" => "NCR 53c7xx", - "qlogicfas" => "Qlogic FAS", - "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", -), - "aic7xxx" => "Adaptec 2740, 2840, 2940", - "ncr53c8xx" => "NCR 53C8xx PCI", -# "pci2000" => "Perceptive Solutions PCI-2000", # TODO - "qlogicisp" => "Qlogic ISP", - "sym53c8xx" => "Symbios 53c8xx", -}], -[ '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", - "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", -}], -); +sub module2description { +{ modules_descriptions() }->{$_[0]} } -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 -); +sub category2modules_and_description { + my ($categories) = @_; + my %modules_descriptions = modules_descriptions(); + map { $_ => $modules_descriptions{$_} } category2modules($categories); +} -my @skip_modules_on_stage1 = ( - arch() =~ /alpha/ ? qw(sb1000) : (), - "apa1480_cb", +my %mappings_24_26 = ( + "usb_ohci" => "ohci_hcd", + "usb_uhci" => "uhci_hcd", + "uhci" => "uhci_hcd", + "printer" => "usblp", + "bcm4400" => "b44", + "3c559" => "3c359", + "3c90x" => "3c59x", + "dc395x_trm" => "dc395x", ); +my %mappings_26_24 = reverse %mappings_24_26; +$mappings_26_24{uhci_hcd} = 'usb_uhci'; +my @parallel_zip_modules = qw(imm ppa); -my @drivers_fields = qw(text type); -%drivers = (); - -foreach (@drivers_by_category) { - my ($type, $l) = @$_; - foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, $type ]; } +sub mapping_24_26 { + my ($modname) = @_; + $mappings_24_26{$modname} || $modname; } -while (my ($k, $v) = each %drivers) { - my %l; @l{@drivers_fields} = @$v; - $drivers{$k} = \%l; +sub mapping_26_24 { + my ($modname) = @_; + $mappings_26_24{$modname} || $modname; } -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 cond_mapping_24_26 { + my ($modname) = @_; + $mappings_24_26{$modname} || list_modules::filename2modname($modname); } -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 module_is_available { + my ($module) = @_; + defined list_modules::modname2filename($module); } -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); +#-############################################################################### +#- 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; + } } - $alias; + $l; } -sub remove_alias($) { - my ($name) = @_; - foreach (keys %conf) { - $conf{$_}{alias} && $conf{$_}{alias} eq $name or next; - delete $conf{$_}{alias}; - return 1; - } - 0; -} +# handles dependencies +sub load_raw { + my ($lm, $h_options) = @_; -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') }; + my $l = filter_loaded_modules($lm); + + if ($::testing || $::local_install) { + log::l("i would load module $_ ($h_options->{$_})") foreach @$l; + } else { + run_program::run('/sbin/modprobe', $_, split(' ', $h_options->{$_})) + or !run_program::run('/sbin/modprobe', '-n', $_) #- ignore missing modules + or die "insmod'ing module $_ failed" foreach @$l; + } + if (any { /^(mousedev|printer)$/ } @$l) { + sleep 2; + } 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 + run_program::run('udevadm', 'settle'); } - $conf{$name}{options} = join " ", @options if @options; } +sub load_with_options { + my ($l, $h_options) = @_; + + my @l = map { + 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 = filter_out_loaded_modules(@l) or return; + my %options = map { cond_mapping_24_26($_) => $h_options->{$_} } keys %$h_options; + load_raw(\@l, \%options); +} sub load { - my ($name, $type, @options) = @_; + my (@l) = @_; + load_with_options(\@l, {}); +} - my @netdev = detect_devices::getNet() if $type eq 'net'; +# eg: load_and_configure($modules_conf, 'bt878', [ bttv => 'no_overlay=1' ]) +sub load_and_configure { + my ($conf, $module, $o_options) = @_; - if ($::testing) { - log::l("i try to install $name module (@options)"); - } elsif ($::isStandalone || $::live) { - return 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/; + my @l = filter_out_loaded_modules(cond_mapping_24_26($module)); + load_raw(\@l, { cond_mapping_24_26($module) => $o_options }); - if ($type eq 'net') { - add_alias($_, $name) foreach difference2([ detect_devices::getNet() ], \@netdev); + 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); + return; } - 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->(@_); - - $::testing and log::l("i would install modules @l"), return; + $conf->set_options($module, $o_options) if $o_options; - load_raw(map { [ $_ ] } @l); + when_load($conf, $module); } sub unload { - my ($m) = @_; if ($::testing) { - log::l("rmmod $m"); + log::l("rmmod $_") foreach @_; } else { - if (run_program::run("rmmod", $m)) { - delete $conf{$m}{loaded}; - } + run_program::run("rmmod", $_) foreach @_; } } -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; - - die "insmod'ing module " . join(", ", map { $_->[0] } @failed) . " failed" if @failed; +sub load_category { + my ($conf, $category, $o_wait_message) = @_; + + my @try_modules = ( + if_($category =~ /scsi/, + if_(detect_devices::usbStorage(), 'usb_storage'), + ), + ); + my @l = ( + (map { + my $other = { ahci => 'ata_piix', ata_piix => 'ahci' }->{$_->{driver}}; + $_->{try} = 1 if $other; + ($_, if_($other, { %$_, driver => $other })); + } detect_devices::probe_category($category)), + (map { { driver => $_, description => $_, try => 1 } } @try_modules), + ); 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(); - } - } - } -} + $o_wait_message->($_->{description}, $_->{driver}) if $o_wait_message; + eval { load_and_configure($conf, $_->{driver}, $_->{options}) }; + $_->{error} = $@; -sub read_already_loaded() { - foreach (cat_("/proc/modules")) { - my ($name) = split; - $conf{$name}{loaded} = 1; - when_load($name, $drivers{$name}{type}); + $_->{try} = 1 if member($_->{driver}, 'hptraid', 'ohci1394'); #- do not warn when this fails } + eval { load_and_configure($conf, 'ide_generic') } if $category eq 'disk/ide'; + grep { !($_->{error} && $_->{try}) } @l; } -sub load_deps($) { - my ($file) = @_; +sub load_parallel_zip { + my ($conf) = @_; - local *F; - open F, $file or log::l("error opening $file: $!"), return 0; - foreach (<F>) { - my ($f, $deps) = split ':'; - push @{$deps{$f}}, split ' ', $deps; - } + grep { + eval { load_and_configure($conf, $_); 1 }; + } @parallel_zip_modules; } -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) { - if (my $a = $v->{alias}) { - local $c{$a}{alias}; - add2hash($c{$a}, $v); - } - } - \%c; +#-############################################################################### +#- modules.conf functions +#-############################################################################### +sub write_preload_conf { + my ($conf) = @_; + my @l; + my $is_laptop = detect_devices::isLaptop(); + my $manufacturer = detect_devices::dmidecode_category('System')->{Manufacturer}; + push @l, 'scsi_hostadapter' if $conf->get_probeall('scsi_hostadapter'); + 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-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); } -sub mergein_conf { - my ($file) = @_; - add2hash(\%conf, read_conf($file, \$scsi)); +sub append_to_modules_loaded_at_startup_for_all_kernels { + append_to_modules_loaded_at_startup($_, @_) foreach "$::prefix/etc/modprobe.preload"; } -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 now do it in /etc/modules - substInFile { $_ = '' if /^post-install supermount/ } $file; - - my $written = read_conf($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}; - } - } - 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"); +sub append_to_modules_loaded_at_startup { + my ($file, @l) = @_; + my $l = join '|', map { '^\s*' . $_ . '\s*$' } @l; + log::l("to put in $file ", join(", ", @l)); substInFile { - $_ = '' if /$l/; - $_ = join '', map { "$_\n" } @l if eof; - } "$prefix/etc/modules"; + $_ = '' if $l && /$l/; + $_ .= join '', map { "$_\n" } @l if eof; + } $file; } -sub read_stage1_conf { - mergein_conf($_[0]); - - if (arch() =~ /sparc/) { - $conf{parport_lowlevel}{alias} ||= "parport_ax"; - $conf{plip}{"pre-install"} ||= "modprobe parport_ax ; echo 7 > /proc/parport/0/irq"; #- TOCHECK +sub set_preload_modules { + my ($service, @modules) = @_; + my $preload_file = "$::prefix/etc/modprobe.preload.d/$service"; + if (@modules) { + output_p($preload_file, join("\n", @modules, '')); } 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"; + unlink($preload_file); } + eval { load(@modules) } if @modules && !$::isInstall; } -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} = $@; - - !($@ && $_->{try}); - } get_that_type($type), - $type =~ /scsi/ && arch() !~ /sparc/ ? - (map { +{ driver => $_, description => $_, try => 1 } } - detect_devices::hasUsbZip() ? "usb-storage" : (), "imm", "ppa") : (); +#-############################################################################### +#- internal functions +#-############################################################################### +sub loaded_modules() { + map { /(\S+)/ } cat_("/proc/modules"); } - -sub get_that_type { - my ($type) = @_; - - grep { - my $l = $drivers{$_->{driver}}; - ($_->{type} =~ /$type/ || $l && $l->{type} =~ /$type/) && detect_devices::check($_); - } detect_devices::probeall(''); +sub filter_out_loaded_modules { + my (@l) = @_; + difference2([ uniq(@l) ], [ map { my $s = $_; $s =~ s/_/-/g; $s, $_ } loaded_modules() ]); } -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 read_already_loaded { + my ($conf) = @_; + when_load($conf, $_) foreach reverse loaded_modules(); } -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"; - - 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 when_load { + my ($conf, $name) = @_; -sub get_pcmcia_devices { - my (@devs, $desc); + if (my $category = module2category($name)) { + when_load_category($conf, $name, $category); + } - 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 }; - } + if (my @above = $conf->get_above($name)) { + load(@above); #- eg: for snd-pcm-oss set by set_sound_slot() } - @devs; } -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 => "", - }); +sub when_load_category { + my ($conf, $name, $category) = @_; + + if ($category =~ m,disk/ide,) { + $conf->add_probeall('ide-controller', $name); + 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 '/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("usbhid") if detect_devices::usbKeyboards(); + }; + } elsif ($category eq 'bus/firewire') { + $conf->set_alias('ieee1394-controller', $name); + } elsif ($category =~ /sound/) { + my $sound_alias = find { /^sound-slot-[0-9]+$/ && $conf->get_alias($_) eq $name } $conf->modules; + $sound_alias ||= 'sound-slot-0'; + $conf->set_sound_slot($sound_alias, $name); + } elsif ($category =~ m!disk/card_reader!) { + my @modules = ('mmc_block', if_($name =~ /tifm_7xx1/, 'tifm_sd')); + $conf->set_above($name, join(' ', @modules)); + } } - - 1; |
