summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2002-07-04 22:13:06 +0000
committerPascal Rigaux <pixel@mandriva.com>2002-07-04 22:13:06 +0000
commitbf78357f11057c2ce0bb8b40cc3e0f7609665c45 (patch)
tree07bfffee77d6fc832c11e6f3277cfbaa39176848
parent285c6b23d68eb69dd6109637ce3e447ea434d21c (diff)
downloaddrakx-bf78357f11057c2ce0bb8b40cc3e0f7609665c45.tar
drakx-bf78357f11057c2ce0bb8b40cc3e0f7609665c45.tar.gz
drakx-bf78357f11057c2ce0bb8b40cc3e0f7609665c45.tar.bz2
drakx-bf78357f11057c2ce0bb8b40cc3e0f7609665c45.tar.xz
drakx-bf78357f11057c2ce0bb8b40cc3e0f7609665c45.zip
reworked, cleaned:
- the list of modules is moved to kernel/list_modules.pm (and a few functions too) - new "add_probeall" function (similar to "add_alias") -> used for scsi_hostadapter and usb-interface - "load_multi" removed in favour of "load" which is now more powerful - load_thiskind renamed load_category - get_that_type renamed probe_category - %modules::drivers dropped (handled for list_modules) still more cleanup to come
-rw-r--r--perl-install/modules.pm924
1 files changed, 224 insertions, 700 deletions
diff --git a/perl-install/modules.pm b/perl-install/modules.pm
index d8aa00dd5..751176ce5 100644
--- a/perl-install/modules.pm
+++ b/perl-install/modules.pm
@@ -1,670 +1,173 @@
package modules; # $Id$
use strict;
-use vars qw(%drivers);
use common;
use detect_devices;
use run_program;
use log;
-
+use list_modules;
my %conf;
-my %deps = ();
-
-my @drivers_by_category = (
-[ 'net', {
-if_(arch() =~ /ppc/,
- "mace" => "Apple PowerMac Ethernet",
- "bmac" => "Apple G3 Ethernet",
- "gmac" => "Apple G4/iBook Ethernet",
-),
-if_(arch() =~ /^sparc/,
- "myri_sbus" => "MyriCOM Gigabit Ethernet",
- "sunbmac" => "Sun BigMac Ethernet",
- "sunhme" => "Sun Happy Meal Ethernet",
- "sunqe" => "Sun Quad Ethernet",
-),
-if_(arch() !~ /alpha/ && arch() !~ /sparc/,
- "3c501" => "3com 3c501",
- "3c503" => "3com 3c503",
- "3c505" => "3com 3c505",
- "3c507" => "3com 3c507",
- "3c509" => "3com 3c509",
- "3c515" => "3com 3c515",
- "3c90x" => "3Com 3c90x (Cyclone/Hurricane/Tornado)",
- "3c90x" => "3Com 3c90x (Cyclone/Hurricane/Tornado)",
- "82596" => "Apricot 82596",
- "abyss" => "Smart 16/4 PCI Ringnode (token ring)",
- "ac3200" => "Ansel Communication AC3200",
- "acenic" => "AceNIC Gigabit Ethernet",
- "aironet4500_card" => "aironet4500_card",
- "at1700" => "Allied Telesis AT1700",
- "atp" => "ATP",
- "catc" => "CATC EL1210A NetMate USB Ethernet driver",
- "CDCEther" => "CDCEther",
- "com20020-pci" => "com20020-pci",
- "cs89x0" => "CS89x0",
- "de600" => "D-Link DE-600 pocket adapter",
- "de620" => "D-Link DE-620 pocket adapter",
- "defxx" => "DEC DEFPA FDDI", # most unused
- "depca" => "Digital DEPCA and EtherWORKS",
- "dgrs" => "Digi International RightSwitch",
- "dmfe" => "dmfe",
- "e100" => "Intel Ethernet Pro 100", #- newer Intel version of eepro100
- "e1000" => "Intel Gigabit Ethernet",
- "e2100" => "Cabletron E2100",
- "eepro" => "Intel EtherExpress Pro",
- "eepro100" => "Intel EtherExpress Pro 100", #- should run on sparc but no memory on floppy
- "eexpress" => "Intel EtherExpress",
- "epic100" => "SMC 83c170 EPIC/100",
- "eth16i" => "ICL EtherTeam 16i",
- "ewrk3" => "Digital EtherWORKS 3",
- "hamachi" => "Packet Engines Inc.|PCI Ethernet Adapter",
- "hp" => "HP LAN/AnyLan",
- "hp-plus" => "HP PCLAN/plus",
- "hp100" => "HP10/100VG any LAN ",
- "ibmtr" => "Token Ring Tropic",
- "kaweth" => "kaweth",
-# requires scsi_mod??? "iph5526" => "iph5526",
- "lance" => "Lance",
- "natsemi" => "National Semiconductor 10/100",
- "ne" => "NE1000, NE2000, and clones",
- "ne2k-pci" => "NE2000 PCI clones",
- "ni5010" => "NI 5010",
- "ni52" => "NI 5210",
- "ni65" => "NI 6510",
- "old_tulip" => "Digital 21040/21041/21140 (old Tulip driver)",
- "olympic" => "IBM|16/4 Token ring UTP/STP controller",
- "pcnet32" => "AMD PC/Net 32",
- "pegasus" => "pegasus",
- "plip" => "PLIP (parallel port)",
- "rcpci" => "Red Creek Hardware VPN",
- "rrunner" => "Roadrunner serial HIPPI", # mostly unused
- "sb1000" => "sb1000",
- "sis900" => "sis900",
- "sk98lin" => "Syskonnect (Schneider & Koch)|Gigabit Ethernet",
- "sktr" => "Syskonnect Token ring adaptor",
- "smc-ultra" => "SMC Ultra",
- "smc9194" => "SMC 9000 series",
- "starfire" => "Adaptec|ANA620xx/ANA69011A Fast Ethernet",
- "tlan" => "Compaq Netelligent, Olicom OC-2xxx",
- "tmspci" => "3Com Token Link Velocity, Compaq IPG-Austin Token Ring",
- "tulip" => "Digital 21040/21041/21140 (Tulip)",
- "via-rhine" => "VIA VT86c100A Rhine-II, 3043 Rhine-I",
-# "wavelan" => "AT&T WaveLAN & DEC RoamAbout DS", # TODO is a "AT&T GIS WaveLAN ISA" ?
- "wd" => "WD8003, WD8013 and compatible",
- "winbond-840" => "Compex RL100-ATX",
- "yellowfin" => "Symbios Yellowfin G-NIC",
-#******(missing-2.4) "smc-ultra32" => "SMC Ultra 32",
-#******(missing-2.4) "rl100a" => "rl100a",
-#******(missing-2.4) "z85230" => "Z85x30",
- "ns83820" => "National Semiconductor DP83820 10/100/1000 driver",
-),
- "3c59x" => "3com Vortex/Boomerang/Hurricane/Cyclone/Etherlink",
- "8139too" => "Realtek RTL-8139",
-# "de4x5" => "Digital 425,434,435,450,500", # moving that to tulip, juan telling to gc
- "rtl8139" => "RealTek RTL8129/8139",
- "sundance" => "sundance",
- "dl2k" => "dl2k",
-}],
-[ 'net_raw', {
- "8390" => "8390",
- "mii" => "mii",
- "af_packet" => "packet socket",
- "nfs" => "Network File System (nfs)",
- "lockd" => "lockd",
- "parport" => "parport",
- "parport_pc" => "parport_pc",
- "sunrpc" => "sunrpc",
- "pci-scan" => "pci-scan",
- "ppp" => "Point to Point driver",
- "ppp_generic" => "Point to Point generic driver",
- "ppp_async" => "ppp_async",
- "slhc" => "slhc",
- "aironet4500_core" => "aironet4500_core",
-}],
-[ 'usbnet', {
- "pegasus" => "pegasus",
- "kaweth" => "kaweth",
- "usbnet" => "usbnet",
- "catc" => "CATC EL1210A NetMate USB Ethernet driver",
- "CDCEther" => "CDCEther",
-}],
-[ 'usbstorage', {
- "usb-storage" => "usb-storage",
-}],
-[ 'isdn', {
- "hisax" => "hisax",
- "hysdn" => "hysdn",
- "b1pci" => "b1pci",
- "t1pci" => "t1pci",
- "c4" => "c4",
-}],
-[ 'tv', {
- "bttv" => "Brooktree Corporation|Bt8xx Video Capture",
- "cpia_usb" => '',
- "ibmcam" => '',
- "mod_quickcam" => '',
- "ov511" => '',
- "ultracam" => '',
- "usbvideo" => '',
-}],
-[ 'scanner', {
- "scanner" => '',
- "microtek" => '',
-}],
-[ 'photo', {
- "dc2xx" => '',
- "mdc800" => '',
-}],
-[ 'joystick', {
- "ns558" => "Creative Labs SB Live! joystick",
-}],
-[ 'radio', {
- "radio-maxiradio" => "radio-maxiradio",
-}],
-[ 'scsi', {
-if_(arch() =~ /ppc/,
- "mesh" => "Apple Internal SCSI",
- "mac53c94" => "Apple External SCSI",
-),
-if_(arch() =~ /^sparc/,
- "qlogicpti" => "Performance Technologies ISP",
-),
-if_(arch() !~ /alpha/ && arch() !~ /sparc/,
- "3w-xxxx" => "3ware ATA-RAID",
-# "53c7,8xx" => "NCR 53c7xx", unneeded anymore (juan told gc)
- "AM53C974" => "AMD SCSI",
- "BusLogic" => "BusLogic Adapters",
- "NCR53c406a" => "NCR 53c406a",
- "a100u2w" => "a100u2w",
- "advansys" => "AdvanSys Adapters",
- "aha152x" => "Adaptec 152x",
- "aha1542" => "Adaptec 1542",
- "aha1740" => "Adaptec 1740",
- "atp870u" => "atp870u (Acard/Artop)",
- "dc395x_trm" => "dc395x_trm",
- "dtc" => "DTC 3180/3280",
- "fdomain" => "Future Domain TMC-16x0",
- "g_NCR5380" => "NCR 5380",
- "in2000" => "Always IN2000",
- "initio" => "Initio",
- "pci2220i" => "Perceptive Solutions 2240I",
- "psi240i" => "psi240i",
- "qla1280" => "Q Logic QLA1280",
- "qla2x00" => "Q Logic QLA2200",
- "qlogicfas" => "Qlogic FAS",
- "qlogicfc" => "qlogicfc",
- "seagate" => "Seagate ST01/02",
- "sim710" => "NCR53c710",
- "sym53c416" => "sym53c416",
- "t128" => "Trantor T128/T128F/T228",
- "tmscsim" => "tmscsim",
- "u14-34f" => "UltraStor 14F/34F",
- "ultrastor" => "UltraStor 14F/24F/34F",
- "wd7000" => "Western Digital wd7000",
- "eata" => "EATA SCSI PM2x24/PM3224",
- "eata_pio" => "EATA PIO Adapters",
- "eata_dma" => "EATA DMA Adapters",
-),
- "aic7xxx" => "Adaptec 2740, 2840, 2940",
-# "aic7xxx_old" => "Adaptec 2740, 2840, 2940", # not needed anymore
- "ncr53c8xx" => "NCR 53C8xx PCI",
- "pci2000" => "Perceptive Solutions PCI-2000", # TODO
- "qlogicisp" => "Qlogic ISP",
- "sym53c8xx" => "Symbios 53c8xx",
-}],
-[ 'scsi_raw', {
- "scsi_mod" => "SCSI subsystem support",
- "sd_mod" => "Disk SCSI support",
-#- "ide-mod" => "ide-mod",
-#- "ide-probe" => "ide-probe",
-#- "ide-probe-mod" => "ide-probe-mod",
-}],
-[ 'disk', {
-if_(arch() =~ /^sparc/,
- "pluto" => "Sun SparcSTORAGE Array SCSI", #- name it "fc4:soc:pluto" ?
-),
-if_(arch() !~ /alpha/ && arch() !~ /sparc/,
- "DAC960" => "Mylex DAC960",
- "dpt_i2o" => "Distributed Tech SmartCache/Raid I-V Controller",
- "megaraid" => "AMI MegaRAID",
- "aacraid" => "AACxxx Raid Controller",
- "ataraid" => "",
- "cciss" => "Compaq Smart Array 5300 Controller",
- "cpqarray" => "Compaq Smart-2/P RAID Controller",
- "gdth" => "ICP Disk Array Controller",
- "i2o_block" => "Intel Integrated RAID",
- "ips" => "IBM ServeRAID controller",
- "ppa" => "Iomega PPA3 (parallel port Zip)",
- "imm" => "Iomega Zip (new driver, for post 31/Aug/1998 drives)",
-),
-}],
-[ 'disk_raw', {
-#- "ide-disk" => "IDE disk",
-}],
-[ 'cdrom', {
-if_(arch() !~ /alpha/ && arch() !~ /sparc/,
-#******(missing-2.4) "sbpcd" => "SoundBlaster/Panasonic",
-#******(missing-2.4) "aztcd" => "Aztech CD",
-#******(missing-2.4) "gscd" => "Goldstar R420",
-#******(missing-2.4) "isp16" => "ISP16/MAD16/Mozart",
-#******(missing-2.4) "mcd" => "Mitsumi", #- removed for space
-#******(missing-2.4) "mcdx" => "Mitsumi (alternate)",
-#******(missing-2.4) "optcd" => "Optics Storage 8000",
-#******(missing-2.4) "cm206" => "Phillips CM206/CM260",
-#******(missing-2.4) "sjcd" => "Sanyo",
-#******(missing-2.4) "cdu31a" => "Sony CDU-31A",
-#******(missing-2.4) "sonycd535" => "Sony CDU-5xx",
-),
-}],
-[ 'cdrom_raw', {
- "isofs" => "iso9660",
- "ide-cd" => "ide-cd",
- "sr_mod" => "SCSI CDROM support",
- "cdrom" => "cdrom",
-}],
-[ 'sound', {
-if_(arch() =~ /ppc/,
- "dmasound_awacs" => "Amiga or PowerMac DMA sound",
-),
-if_(arch() !~ /^sparc/,
- "cmpci" => "C-Media Electronics CMI8338A CMI8338B CMI8738",
- "cs46xx" => "Cirrus Logic CrystalClear SoundFusion (cs46xx)",
- "cs4281" => "Cirrus Logic|Crystal CS4281 PCI Audio",
- "es1370" => "Ensoniq ES1370 [AudioPCI]",
- "es1371" => "Ensoniq ES1371 [AudioPCI-97]",
- "esssolo1" => "ESS Technology ES1969 Solo-1 Audiodrive",
- "i810_audio" => "i810 integrated sound card",
- "maestro" => "ESS Maestro 1/2",
- "maestro3" => "ESS Maestro-3",
- "nm256" => "Neomagic MagicMedia 256AV",
- "pas16" => "Pro Audio Spectrum/Studio 16",
- "trident" => "M5451 PCI South Bridge Audio",
- "via82cxxx" => "VIA VT82C686_5",
- "via82cxxx_audio" => "VIA Technologies|VT82C686 [Apollo Super AC97/Audio]",
- "sonicvibes" => "S3 SonicVibes",
- "snd-card-ice1712" => "IC Ensemble Inc|ICE1712 [Envy24]",
- "emu10k1" => "Creative Labs|SB Live! (audio)",
- "ymfpci" => "Yamaha YMF-740, DS-1",
-# "au8820" => "Aureal Semiconductor|Vortex 1",
-# "au8830" => "Aureal Semiconductor|Vortex 2",
- "snd-card-cmipci" => "CMI",
- "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', {
-if_(arch() !~ /^sparc/,
- "ide_cs" => "ide_cs",
- "ide-cs" => "ide-cs", #- sucking kernel-pcmcia
- "fmvj18x_cs" => "fmvj18x_cs",
- "fdomain_cs" => "fdomain_cs",
- "netwave_cs" => "netwave_cs",
- "serial_cs" => "serial_cs",
- "wavelan_cs" => "wavelan_cs",
- "wvlan_cs" => "wvlan_cs",
- "pcnet_cs" => "pcnet_cs",
- "axnet_cs" => "axnet_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",
-#******(missing-2.4) "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",
- "xircom_tulip_cb" => "xircom_tulip_cb",
- "xircom_cb" => "xircom_cb",
-),
-}],
-[ 'pcmcia_everywhere', {
-if_(arch() !~ /^sparc/,
- "pcmcia_core" => "PCMCIA core support",
- "tcic" => "PCMCIA tcic controller",
- "ds" => "PCMCIA card support",
- "i82365" => "PCMCIA i82365 controller",
- "yenta_socket" => "PCMCIA PCI i82365-style controller",
-),
-}],
-[ 'paride', {
-if_(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', {
-if_(arch() !~ /^sparc/,
- "busmouse" => "busmouse",
- "msbusmouse" => "msbusmouse",
- "serial" => "serial",
- "qpmouse" => "qpmouse",
- "atixlmouse" => "atixlmouse",
-),
-}],
-[ 'usb', {
- "usbcore" => "usbcore",
- "usb-uhci" => "USB Controller (uhci)",
- "usb-ohci" => "USB Controller (ohci)",
- "usb-ohci-hcd" => "USB (ohci-hcd)",
- "ehci-hcd" => "USB2 Controller (ehci-hcd)",
-}],
-[ 'fs', {
- "smbfs" => "Windows SMB",
- "fat" => "fat",
- "romfs" => "romfs",
- "vfat" => "vfat",
-}],
-[ 'other', {
- "agpgart" => "agpgart",
- "buz" => "Zoran Corporation|ZR36057PQC Video cutting chipset",
- "defxx" => "DEC|DEFPA",
- "i810_rng" => "i810_rng",
- "i810fb" => "i810fb",
- "ide-floppy" => "ide-floppy",
- "ide-scsi" => "ide-scsi",
- "ide-tape" => "ide-tape",
- "loop" => "Loopback device",
- "lp" => "Parallel Printer",
- "nbd" => "nbd",
- "rrunner" => "Essential Communications|Roadrunner serial HIPPI",
- "sg" => "sg",
- "st" => "st",
-}],
-);
-
-my %type_aliases = (
- scsi => 'disk',
-);
-
-my @skip_big_modules_on_stage1 = (
-# dgrs e1000
-qw(
-olympic
-sk98lin acenic
-3c90x
-ns83820
-aironet4500_card aironet4500_core com20020-pci hamachi starfire winbond-840
-
-dc395x_trm
-BusLogic seagate fdomain g_NCR5380
-)
-); #******(missing-2.4) dpt_i2o aztcd gscd isp16 mcd mcdx optcd cm206 sjcd cdu31a
-
-my @skip_modules_on_stage1 = (
- qw(sktr tmspci ibmtr abyss), # alt token ring
- qw(old_tulip rtl8139), # doesn't exist in 2.4
- if_(arch() =~ /alpha|ppc/, qw(sb1000)),
- "apa1480_cb",
- "imm",
- "ppa",
- "parport",
- "parport_pc",
- "plip",
- qw(3w-xxxx pci2220i qla2x00 i2o_block),
- qw(eata_pio eata_dma),
- 'AM53C974', # deprecated by tmscsim
- qw(ac3200 at1700 atp ni5010 ni52 ni65), #- unused from Jeff
- "u14-34f", #- duplicate from ultrastor.o
-);
-
-
-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;
-}
-
-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} || $type;
- grep { $drivers{$_}{type} =~ /^(($type)|$alias)$/ } keys %drivers;
-}
-sub module2text { $drivers{$_[0]}{text} or log::l("trying to get text of unknown module $_[0]"), return $_[0] }
-
-sub get_alias {
- my ($alias) = @_;
- $conf{$alias}{alias};
-}
-sub get_options {
- my ($name) = @_;
- $conf{$name}{options};
-}
-
-sub set_options {
- my ($name, $new_option) = @_;
- $conf{$name}{options} = $new_option;
-}
-sub add_alias {
- my ($alias, $name) = @_;
- $name =~ /ignore/ and return;
- /\Q$alias/ && $conf{$_}{alias} && $conf{$_}{alias} eq $name and return $_ foreach keys %conf;
- if ($alias eq 'scsi_hostadapter') {
- my $l = $conf{scsi_hostadapter}{probeall} ||= [];
- push @$l, $name;
- log::l("setting probeall scsi_hostadapter to @$l");
- } else {
- log::l("adding alias $alias to $name");
- $conf{$alias}{alias} ||= $name;
- }
- if ($name =~ /^snd-card-/) {
- $conf{$name}{above} = '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 when_load {
- my ($name, $type, @options) = @_;
- if ($type =~ /\bscsi\b/ || $type eq $type_aliases{scsi}) {
- add_alias('scsi_hostadapter', $name), eval { load('sd_mod') };
- }
- if ($type eq 'sound') {
- #- mainly for ppc
- add_alias('sound-slot-0', $name);
- }
- if ($name =~ /^snd-card-/) {
- load('snd-pcm-oss', 'prereq');
- }
- if ($name =~ /usb-[uo]hci/) {
- add_alias('usb-interface', $name);
- }
- if ($name eq 'ehci-hcd') {
- add_alias('usb-interface1', $name);
- }
-
- $conf{$name}{options} = join " ", @options if @options;
+sub category2modules_and_description {
+ my ($categories) = @_;
+ my $f = '/lib/modules/' . c::kernel_version() . '/modules.description';
+ -e $f or $f = '/lib/modules.description';
+ my %modules_descriptions = map { /(\S+)\s+(.*)/ } cat_($f);
+ map { $_ => $modules_descriptions{$_} } category2modules($categories);
}
+#-###############################################################################
+#- module loading
+#-###############################################################################
+# handles dependencies
+# eg: load('vfat', 'reiserfs', [ ne2k => 'io=0xXXX', 'dma=5' ])
sub load {
- my ($name, $type, @options) = @_;
-
- my @netdev = detect_devices::getNet() if $type eq 'net';
+ #- keeping the order of modules
+ my %options;
+ my @l = map {
+ my ($name, @options) = ref $_ ? @$_ : $_;
+ $options{$name} = \@options;
+ dependencies_closure($name);
+ } @_;
+
+ @l = difference2([ uniq(@l) ], [ loaded_modules() ]) or return;
+
+ my $network_module = do {
+ my ($network_modules, $other) = partition { module2category($_) =~ m,network/(main|usb), } @l;
+ if (@$network_modules > 1) {
+ # do it one by one
+ load($_) foreach @$network_modules;
+ load(@$other);
+ return;
+ }
+ $network_modules->[0];
+ };
+ my @network_devices = $network_module ? detect_devices::getNet() : ();
if ($::testing) {
- log::l("i try to install $name module (@options)");
+ log::l("i would load module $_ (@{$options{$_}})") foreach @l;
} elsif ($::isStandalone || $::live) {
- run_program::run(-x "/sbin/modprobe.static" ? "/sbin/modprobe.static" : "/sbin/modprobe", $name, @options)
- or die "insmod'ing module $name failed";
+ run_program::run('/sbin/modprobe', $_, @{$options{$_}})
+ or die "insmod'ing module $_ failed" foreach @l;
} else {
- $conf{$name}{loaded} and return;
-
- eval { load($_, 'prereq') } foreach @{$deps{$name}};
- load_raw([ $name, @options ]);
+ load_raw(map { [ $_ => $options{$_} ] } @l);
}
- sleep 2 if $name =~ /usb-storage|mousedev/;
+ sleep 2 if grep { /^(usb-storage|mousedev|printer)$/ } @l;
- if ($type eq 'net') {
- add_alias($_, $name) foreach difference2([ detect_devices::getNet() ], \@netdev);
- }
- 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->(@_);
-
- if ($::testing) {
- log::l("i would install modules @l");
- } elsif ($::isStandalone || $::live) {
- foreach (@l) { run_program::run(-x "/sbin/modprobe.static" ? "/sbin/modprobe.static" : "/sbin/modprobe", $_) }
- } else {
- load_raw(map { [ $_ ] } @l);
+ if ($network_module) {
+ add_alias($_, $network_module) foreach difference2([ detect_devices::getNet() ], \@network_devices);
}
+ when_load($_, @{$options{$_}}) foreach @l;
}
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 cz_file {
- "/lib/modules" . (arch() eq 'sparc64' && "64") . ".cz-" . c::kernel_version();
-}
+sub load_category {
+ my ($category, $wait_message, $probe_type) = @_;
-sub extract_modules {
- my ($dir, @modules) = @_;
- my $cz = cz_file();
- if (!-e $cz) {
- unlink $_ foreach glob_("/lib/modules*.cz*");
- require install_any;
- install_any::getAndSaveFile("Mandrake/mdkinst$cz", $cz) or die "failed to get modules $cz: $!";
- }
- eval {
- require packdrake;
- my $packer = new packdrake($cz, quiet => 1);
- $packer->extract_archive($dir, map { "$_.o" } @modules);
- };
+ #- probe_category returns the PCMCIA cards. It doesn't know they are already
+ #- loaded, so:
+ read_already_loaded();
+
+ my @try_modules = (
+ if_($category =~ /scsi/,
+ if_(arch() !~ /ppc/, 'imm', 'ppa'),
+ if_(detect_devices::usbStorage(), 'usb-storage'),
+ ),
+ if_(arch() =~ /ppc/,
+ if_($category =~ /scsi/, 'mesh', 'mac53c94'),
+ if_($category =~ /net/, 'bmac', 'gmac', 'mace'),
+ if_($category =~ /sound/, 'dmasound_awacs'),
+ ),
+ );
+ grep {
+ $wait_message->($_->{description}, $_->{driver}) if $wait_message;
+ eval { load([ $_->{driver}, $_->{options} ]) };
+ $_->{error} = $@;
+
+ !($@ && $_->{try});
+ } probe_category($category, $probe_type),
+ map {; { driver => $_, description => $_, try => 1 } } @try_modules;
}
-sub load_raw {
- my @l = map { my ($i, @i) = @$_; [ $i, \@i ] } grep { $_->[0] !~ /ignore/ } @_;
- extract_modules('/tmp', map { $_->[0] } @l);
- my @failed = grep {
- my $m = "/tmp/$_->[0].o";
- if (-e $m && run_program::run(["/usr/bin/insmod_", "insmod"], '2>', '/dev/tty5', $m, @{$_->[1]})) {
- unlink $m;
- $conf{$_->[0]}{loaded} = 1;
- '';
- } else {
- log::l("missing module $_->[0]") unless -e $m;
- -e $m;
- }
- } @l;
+sub probe_category {
+ my ($category, $probe_type) = @_;
- die "insmod'ing module " . join(", ", map { $_->[0] } @failed) . " failed" if @failed;
+ my @modules = category2modules($category);
- 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/) {
- 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::usbKeyboards();
+ grep {
+ if ($category eq 'isdn') {
+ my $b = $_->{driver} =~ /ISDN:([^,]*),?([^,]*),?(.*)/;
+ if ($b) {
+ $_->{driver} = $1;
+ $_->{options} = $2;
+ $_->{firmware} = $3;
+ $_->{firmware} =~ s/firmware=//;
+ $_->{driver} eq "hisax" and $_->{options} .= " id=HiSax";
}
+ $b;
+ } else {
+ detect_devices::check($_) && member($_->{driver}, @modules);
}
- }
+ } detect_devices::probeall($probe_type);
}
-sub read_already_loaded() {
- foreach (reverse cat_("/proc/modules")) {
- my ($name) = split;
- $conf{$name}{loaded} = 1;
- when_load($name, $drivers{$name}{type});
+sub load_ide {
+ eval { load("ide-cd"); }
+}
+
+
+#-###############################################################################
+#- modules.conf functions
+#-###############################################################################
+sub get_alias {
+ my ($alias) = @_;
+ $conf{$alias}{alias};
+}
+sub get_options {
+ my ($name) = @_;
+ $conf{$name}{options};
+}
+sub set_options {
+ my ($name, $new_option) = @_;
+ $conf{$name}{options} = $new_option;
+}
+sub add_alias {
+ my ($alias, $module) = @_;
+ $module =~ /ignore/ and return;
+ /\Q$alias/ && $conf{$_}{alias} && $conf{$_}{alias} eq $module and return $_ foreach keys %conf;
+ log::l("adding alias $alias to $module");
+ $conf{$alias}{alias} ||= $module;
+
+ if ($module =~ /^snd-card-/) {
+ $conf{$module}{above} = 'snd-pcm-oss';
}
+ $alias;
}
+sub add_probeall {
+ my ($alias, $module) = @_;
-sub load_deps($) {
- my ($file) = @_;
+ my $l = $conf{$alias}{probeall} ||= [];
+ push @$l, $module;
+ log::l("setting probeall scsi_hostadapter to @$l");
+}
- 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;
+sub remove_alias($) {
+ my ($name) = @_;
+ foreach (keys %conf) {
+ $conf{$_}{alias} && $conf{$_}{alias} eq $name or next;
+ delete $conf{$_}{alias};
+ return 1;
}
+ 0;
}
sub read_conf {
@@ -675,11 +178,9 @@ sub read_conf {
next if /^\s*#/;
my ($type, $alias, $val) = split(/\s+/, chomp_($_), 3) or next;
- if ($type eq 'probeall') {
- $c{$alias}{$type} = [ split ' ', $val ];
- } else {
- $c{$alias}{$type} = $val;
- }
+ $val = [ split ' ', $val ] if $type eq 'probeall';
+
+ $c{$alias}{$type} = $val;
}
#- cheating here: not handling aliases of aliases
while (my ($k, $v) = each %c) {
@@ -689,12 +190,14 @@ sub read_conf {
add2hash($c{$a}, $v);
}
}
- #- convert old scsi_hostadapter's to new probeall
- my @old_scsi_hostadapters =
- map { $_->[0] } sort { $a->[1] <=> $b->[1] }
- map { if_(/^scsi_hostadapter(\d*)/ && $c{$_}{alias}, [ $_, $1 || 0 ]) } keys %c;
- foreach my $alias (@old_scsi_hostadapters) {
- push @{$c{scsi_hostadapter}{probeall} ||= []}, delete $c{$alias}{alias};
+ #- convert old aliases to new probeall
+ foreach my $name ('scsi_hostadapter', 'usb-interface') {
+ my @old_aliases =
+ map { $_->[0] } sort { $a->[1] <=> $b->[1] }
+ map { if_(/^$name(\d*)/ && $c{$_}{alias}, [ $_, $1 || 0 ]) } keys %c;
+ foreach my $alias (@old_aliases) {
+ push @{$c{$name}{probeall} ||= []}, delete $c{$alias}{alias};
+ }
}
\%c;
@@ -721,10 +224,10 @@ sub write_conf {
if ($type eq 'post-install' && $alias eq 'supermount') {
#- remove the post-install supermount stuff.
$_ = '';
- } elsif ($type eq 'alias' && $alias =~ /scsi_hostadapter/) {
- #- remove old alias scsi_hostadapter's which are replaced by probeall
+ } elsif ($type eq 'alias' && $alias =~ /scsi_hostadapter|usb-interface/) {
+ #- remove old aliases which are replaced by probeall
$_ = '';
- } elsif ($type ne "loaded" &&
+ } elsif (
$conf{$alias}{$type} &&
$conf{$alias}{$type} ne $module) {
my $v = join(' ', uniq(deref($conf{$alias}{$type})));
@@ -740,7 +243,7 @@ sub write_conf {
while (my ($type, $v) = each %$h) {
my $v2 = join(' ', uniq(deref($v)));
print F "$type $mod $v2\n"
- if $v2 && $type ne "loaded" && !$written->{$mod}{$type};
+ if $v2 && !$written->{$mod}{$type};
}
}
my @l = ();
@@ -759,67 +262,9 @@ sub read_stage1_conf {
mergein_conf($_[0]);
}
-sub load_thiskind {
- my ($type, $f, $probe_type) = @_;
-
- #- get_that_type returns the PCMCIA cards. It doesn't know they are already
- #- loaded, so:
- read_already_loaded();
-
- my @try_modules = (
- if_($type =~ /scsi/,
- if_(arch() !~ /ppc/, 'imm', 'ppa'),
- if_(detect_devices::usbStorage(), 'usb-storage'),
- ),
- if_(arch() =~ /ppc/,
- if_($type =~ /scsi/, 'mesh', 'mac53c94'),
- if_($type =~ /net/, 'bmac', 'gmac', 'mace'),
- if_($type =~ /sound/, 'dmasound_awacs'),
- ),
- );
- grep {
- $f->($_->{description}, $_->{driver}) if $f;
- eval { load($_->{driver}, $type, $_->{options}) };
- $_->{error} = $@;
-
- !($@ && $_->{try});
- } get_that_type($type, $probe_type),
- map {; { driver => $_, description => $_, try => 1 } } @try_modules;
-}
-
-sub get_that_type {
- my ($type, $probe_type) = @_;
-
- grep {
- if ($type eq 'isdn') {
- my $b = $_->{driver} =~ /ISDN:([^,]*),?([^,]*),?(.*)/;
- if ($b) {
- $_->{driver} = $1;
- $_->{options} = $2;
- $_->{firmware} = $3;
- $_->{firmware} =~ s/firmware=//;
- $_->{driver} eq "hisax" and $_->{options} .= " id=HiSax";
- }
- $b;
- } else {
- my $l = $drivers{$_->{driver}};
- ($_->{type} =~ /$type/ || $l && $l->{type} =~ /$type/) && detect_devices::check($_);
- }
- } detect_devices::probeall($probe_type);
-}
-
-sub load_ide {
- if (1) { #- add it back to support Ultra66 on ide modules.
- eval { 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));
- }
- }
-}
-
+#-###############################################################################
+#- pcmcia various
+#-###############################################################################
sub configure_pcmcia {
my ($pcic) = @_;
@@ -865,5 +310,84 @@ sub write_pcmcia {
}
+#-###############################################################################
+#- internal functions
+#-###############################################################################
+sub loaded_modules {
+ map { /(\S+)/ } cat_("/proc/modules");
+}
+sub read_already_loaded {
+ when_load($_) foreach reverse loaded_modules();
+}
+
+sub when_load {
+ my ($name, @options) = @_;
+ my $category = module2category($name);
+
+ if ($category =~ m,disk/(scsi|hardware_raid|usb),) {
+ add_probeall('scsi_hostadapter', $name);
+ eval { load('sd_mod') };
+ }
+ if ($category =~ /sound/) {
+ add_alias('sound-slot-0', $name);
+ }
+ if ($name =~ /^snd-card-/) {
+ load('snd-pcm-oss');
+ }
+ if ($name =~ /usb-[uo]hci/ || $name eq 'ehci-hcd') {
+ add_probeall('usb-interface', $name);
+ }
+ $conf{$name}{options} = join " ", @options if @options;
+}
+
+sub cz_file {
+ "/lib/modules" . (arch() eq 'sparc64' && "64") . ".cz-" . c::kernel_version();
+}
+
+sub extract_modules {
+ my ($dir, @modules) = @_;
+ my $cz = cz_file();
+ if (!-e $cz) {
+ unlink $_ foreach glob_("/lib/modules*.cz*");
+ require install_any;
+ install_any::getAndSaveFile("Mandrake/mdkinst$cz", $cz) or die "failed to get modules $cz: $!";
+ }
+ eval {
+ require packdrake;
+ my $packer = new packdrake($cz, quiet => 1);
+ $packer->extract_archive($dir, map { "$_.o" } @modules);
+ };
+}
+
+sub load_raw {
+ my @l = @_;
+
+ extract_modules('/tmp', map { $_->[0] } @l);
+ my @failed = grep {
+ my $m = "/tmp/$_->[0].o";
+ if (-e $m && run_program::run(["/usr/bin/insmod_", "insmod"], '2>', '/dev/tty5', $m, @{$_->[1]})) {
+ unlink $m;
+ '';
+ } else {
+ log::l("missing module $_->[0]") if !-e $m;
+ -e $m;
+ }
+ } @l;
+
+ die "insmod'ing module " . join(", ", map { $_->[0] } @failed) . " failed" if @failed;
+
+ foreach (@l) {
+ if ($_->[0] =~ /usb-[uo]hci/) {
+ 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("usbkbd", "keybdev") if detect_devices::usbKeyboards();
+ }
+ }
+ }
+}
+
+
1;