home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / modules.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  13.0 KB  |  505 lines

  1. package modules;
  2.  
  3.  
  4.  
  5. use common qw(:common :file :system);
  6. use detect_devices;
  7. use run_program;
  8. use log;
  9.  
  10.  
  11. my %conf;
  12. my %loaded; 
  13. my $scsi = 0;
  14. my %deps = ();
  15.  
  16. my @drivers_by_category = (
  17. [ 'net', {
  18.   "3c509" => "3com 3c509",
  19.   "3c501" => "3com 3c501",
  20.   "3c503" => "3com 3c503",
  21.   "3c505" => "3com 3c505",
  22.   "3c507" => "3com 3c507",
  23.   "3c515" => "3com 3c515",
  24.   "3c59x" => "3com 3c59x (Vortex)",
  25.   "3c59x" => "3com 3c90x (Boomerang)",
  26.   "3c90x" => "3Com 3c90x (Cyclone/Hurricane/Tornado)",
  27.   "at1700" => "Allied Telesis AT1700",
  28.   "ac3200" => "Ansel Communication AC3200",
  29.   "acenic" => "AceNIC Gigabit Ethernet",
  30.   "pcnet32" => "AMD PC/Net 32",
  31.   "82596" => "Apricot 82596",
  32. #  "atp" => "ATP", # builtin the kernel
  33.   "cs89x0" => "CS89x0",
  34.   "de4x5" => "Digital 425,434,435,450,500",
  35.   "depca" => "Digital DEPCA and EtherWORKS",
  36.   "e2100" => "Cabletron E2100",
  37.   "ewrk3" => "Digital EtherWORKS 3",
  38.   "old_tulip" => "Digital 21040/21041/21140 (old Tulip driver)",
  39.   "tulip" => "Digital 21040/21041/21140 (Tulip)",
  40.   "de600" => "D-Link DE-600 pocket adapter",
  41.   "de620" => "D-Link DE-620 pocket adapter",
  42.   "dgrs" => "Digi International RightSwitch",
  43.   "epic100" => "EPIC 100",
  44.   "hp100" => "HP10/100VG any LAN ",
  45.   "hp" => "HP LAN/AnyLan",
  46.   "hp-plus" => "HP PCLAN/plus",
  47.   "eth16i" => "ICL EtherTeam 16i",
  48.   "eexpress" => "Intel EtherExpress",
  49.   "eepro" => "Intel EtherExpress Pro",
  50.   "eepro100" => "Intel EtherExpress Pro 100",
  51.   "lance" => "Lance",
  52.   "lne390" => "Mylex LNE390",
  53.   "ne" => "NE2000 and compatible",
  54.   "ne2k-pci" => "NE2000 PCI",
  55.   "ne3210" => "NE3210",
  56.   "ni5010" => "NI 5010",
  57.   "ni52" => "NI 5210",
  58.   "ni65" => "NI 6510",
  59.   "rtl8139" => "RealTek RTL8129/8139",
  60.   "es3210" => "Racal-Interlan ES3210",
  61. #  "rcpci" => "RedCreek Virtual Private Network", # TODO
  62.   "epic100" => "SMC 83c170 EPIC/100",
  63.   "sktr" => "Syskonnect Token ring adaptor",
  64.   "smc9194" => "SMC 9000 series",
  65.   "smc-ultra" => "SMC Ultra",
  66.   "smc-ultra32" => "SMC Ultra 32",
  67. #  "sunhme" => "Sun Happy Meal", # not there anymore?
  68.   "tlan" => "Compaq Netelligent",
  69.   "via-rhine" => "VIA Rhine",
  70. #  "wavelan" => "AT&T WaveLAN & DEC RoamAbout DS", # TODO
  71.   "wd" => "WD8003, WD8013 and compatible",
  72.   "yellowfin" => "Symbios Yellowfin G-NIC",
  73.  
  74.   "8390" => "8390",
  75.   "dmfe" => "dmfe",
  76.   "dummy" => "dummy",
  77.   "fmv18x" => "fmv18x",
  78.   "ibmtr" => "Token Ring Tropic",
  79.   "olympic" => "olympic",
  80.   "plip" => "PLIP (parallel port)",
  81.   "rl100a" => "rl100a",
  82.   "sb1000" => "sb1000",
  83.   "sbni" => "sbni",
  84.   "sis900" => "sis900",
  85.   "nfs" => "Network File System (nfs)",
  86.   "lockd" => "lockd",
  87.   "sunrpc" => "sunrpc",
  88. }],
  89. [ 'scsi', {
  90.   "aha152x" => "Adaptec 152x",
  91.   "aha1542" => "Adaptec 1542",
  92.   "aha1740" => "Adaptec 1740",
  93.   "aic7xxx" => "Adaptec 2740, 2840, 2940",
  94.   "advansys" => "AdvanSys Adapters",
  95.   "in2000" => "Always IN2000",
  96.   "AM53C974" => "AMD SCSI",
  97.   "BusLogic" => "BusLogic Adapters",
  98.   "dtc" => "DTC 3180/3280",
  99.   "seagate" => "Future Domain TMC-885, TMC-950",
  100.   "fdomain" => "Future Domain TMC-16x0",
  101.   "initio" => "Initio",
  102.   "g_NCR5380" => "NCR 5380",
  103.   "NCR53c406a" => "NCR 53c406a",
  104.   "53c7,8xx" => "NCR 53c7xx",
  105.   "ncr53c8xx" => "NCR 53C8xx PCI",
  106. #  "pci2000" => "Perceptive Solutions PCI-2000", # TODO
  107.   "qlogicfas" => "Qlogic FAS",
  108.   "qlogicisp" => "Qlogic ISP",
  109.   "seagate" => "Seagate ST01/02",
  110.   "sym53c8xx" => "Symbios 53c8xx",
  111.   "t128" => "Trantor T128/T128F/T228",
  112.   "u14-34f" => "UltraStor 14F/34F",
  113.   "ultrastor" => "UltraStor 14F/24F/34F",
  114.   "wd7000" => "Western Digital wd7000",
  115.  
  116.   "a100u2w" => "a100u2w",
  117.   "atp870u" => "atp870u (Acard/Artop)",
  118.   "dc395x_trm" => "dc395x_trm",
  119.   "psi240i" => "psi240i",
  120.   "qlogicfc" => "qlogicfc",
  121.   "sim710" => "sim710",
  122.   "sym53c416" => "sym53c416",
  123.   "tmscsim" => "tmscsim",
  124. }],
  125. [ 'disk', {
  126.   "DAC960" => "Mylex DAC960",
  127. #  "dpt" => "Distributed Tech SmartCache/Raid I-IV Controller", # not there anymore?
  128.   "megaraid" => "AMI MegaRAID",
  129.   "cpqarray" => "Compaq Smart-2/P RAID Controller",
  130.   "gdth" => "ICP Disk Array Controller",
  131.   "ips" => "IBM ServeRAID controller",
  132.   "eata" => "EATA SCSI PM2x24/PM3224",
  133.   "eata_pio" => "EATA PIO Adapters",
  134.   "eata_dma" => "EATA DMA Adapters",
  135.   "ppa" => "Iomega PPA3 (parallel port Zip)",
  136.   "imm" => "Iomega Zip (new driver)",
  137. }],
  138. [ 'cdrom', {
  139.   "sbpcd" => "SoundBlaster/Panasonic",
  140.   "aztcd" => "Aztech CD",
  141.   "gscd" => "Goldstar R420",
  142.   "isp16" => "ISP16/MAD16/Mozart",
  143.  
  144.   "mcdx" => "Mitsumi (alternate)",
  145.   "optcd" => "Optics Storage 8000",
  146.   "cm206" => "Phillips CM206/CM260",
  147.   "sjcd" => "Sanyo",
  148.   "cdu31a" => "Sony CDU-31A",
  149.   "sonycd535" => "Sony CDU-5xx",
  150.   "isofs" => "iso9660",
  151.   "ide-cd" => "ide-cd",
  152. }],
  153. [ 'sound', {
  154.   "alsa" => "ALSA sound module, many sound cards",
  155.   "cmpci" => "C-Media Electronics CMI8338A CMI8338B CMI8738",
  156.   "es1370" => "Ensoniq ES1370 [AudioPCI]",
  157.   "es1371" => "Ensoniq ES1371 [AudioPCI-97]",
  158.   "esssolo1" => "ESS Technology ES1969 Solo-1 Audiodrive",
  159.   "maestro" => "Maestro",
  160.   "nm256" => "Neomagic MagicMedia 256AV",
  161.   "pas16" => "Pro Audio Spectrum/Studio 16",
  162.   "via82cxxx" => "VIA VT82C686_5",
  163.   "sonicvibes" => "S3 SonicVibes",
  164. }],
  165. [ 'pcmcia', {
  166.   "ide_cs" => "ide_cs",
  167.   "fmvj18x_cs" => "fmvj18x_cs",
  168.   "fdomain_cs" => "fdomain_cs",
  169.   "netwave_cs" => "netwave_cs",
  170.   "serial_cs" => "serial_cs",
  171.   "wavelan_cs" => "wavelan_cs",
  172.   "pcnet_cs" => "pcnet_cs",
  173.   "aha152x_cs" => "aha152x_cs",
  174.   "xirc2ps_cs" => "xirc2ps_cs",
  175.   "3c574_cs" => "3c574_cs",
  176.   "qlogic_cs" => "qlogic_cs",
  177.   "nmclan_cs" => "nmclan_cs",
  178.   "ibmtr_cs" => "ibmtr_cs",
  179.   "dummy_cs" => "dummy_cs",
  180.   "memory_cs" => "memory_cs",
  181.   "ftl_cs" => "ftl_cs",
  182.   "smc91c92_cs" => "smc91c92_cs",
  183.   "3c589_cs" => "3c589_cs",
  184.   "parport_cs" => "parport_cs", 
  185.   "3c575_cb" => "3c575_cb",
  186.   "apa1480_cb" => "apa1480_cb",
  187.   "cb_enabler" => "cb_enabler",
  188.   "epic_cb" => "epic_cb",
  189.   "iflash2+_mtd" => "iflash2+_mtd",
  190.   "iflash2_mtd" => "iflash2_mtd",
  191.   "memory_cb" => "memory_cb",
  192.   "serial_cb" => "serial_cb",
  193.   "sram_mtd" => "sram_mtd",
  194.   "tulip_cb" => "tulip_cb",
  195.  
  196. }],
  197. [ 'pcmcia_everywhere', {
  198.   "pcmcia_core" => "PCMCIA core support",
  199.   "tcic" => "PCMCIA tcic controller",
  200.   "ds" => "PCMCIA card support",
  201.   "i82365" => "PCMCIA i82365 controller",
  202. }],
  203. [ 'paride', {
  204.   "aten" => "ATEN EH-100",
  205.   "bpck" => "Microsolutions backpack",
  206.   "comm" => "DataStor (older type) commuter adapter",
  207.   "dstr" => "DataStor EP-2000",
  208.   "epat" => "Shuttle EPAT",
  209.   "epia" => "Shuttle EPIA",
  210.   "fit2" => "Fidelity Intl. (older type)",
  211.   "fit3" => "Fidelity Intl. TD-3000",
  212.   "frpw" => "Freecom Power",
  213.   "friq" => "Freecom IQ (ASIC-2)",
  214.   "kbic" => "KingByte KBIC-951A and KBIC-971A",
  215.   "ktti" => "KT Tech. PHd",
  216.   "on20" => "OnSpec 90c20",
  217.   "on26" => "OnSpec 90c26",
  218.   "pd"   => "Parallel port IDE disks",
  219.   "pcd"  => "Parallel port CD-ROM",
  220.   "pf"   => "Parallel port ATAPI disk",
  221.   "paride" => "Main parallel port module",
  222. }],
  223. [ 'raid', {
  224.   "linear" => "linear",
  225.   "raid0" => "raid0",
  226.   "raid1" => "raid1",
  227.   "raid5" => "raid5",
  228. }],
  229. [ 'mouse', {
  230.   "busmouse" => "busmouse",
  231.   "msbusmouse" => "msbusmouse",
  232.   "serial" => "serial",
  233.   "qpmouse" => "qpmouse",
  234.   "atixlmouse" => "atixlmouse",
  235.  
  236.   "usb-uhci", "USB (uhci)",
  237.   "usb-ohci", "USB (ohci)",
  238.   "usb-ohci-hcd", "USB (ohci-hcd)",
  239. }],
  240. [ 'fs', {
  241.   "smbfs" => "Windows SMB",
  242.   "fat" => "fat",
  243.   "msdos" => "msdos",
  244.   "romfs" => "romfs",
  245.   "sysv" => "sysv",
  246.   "ufs" => "ufs",
  247.   "umsdos" => "umsdos",
  248.   "vfat" => "vfat",
  249. }],
  250. [ 'other', {
  251.   "st" => "st",
  252.   "sg" => "sg",
  253.   "ide-scsi" => "ide-scsi",
  254.   "loop" => "Loopback device",
  255.   "lp" => "Parallel Printer",
  256.   "ide-floppy" => "ide-floppy",
  257.   "ide-tape" => "ide-tape",
  258.   "nbd" => "nbd",
  259. }],
  260. );
  261.  
  262. my %type_aliases = (
  263.   scsi => 'disk',
  264. );
  265.  
  266.  
  267. my @drivers_fields = qw(text type);
  268. %drivers = ();
  269.  
  270. foreach (@drivers_by_category) {
  271.     my @l = @$_;
  272.     my $l = pop @l;
  273.     foreach (keys %$l) { $drivers{$_} = [ $l->{$_}, @l ]; }
  274. }
  275. while (my ($k, $v) = each %drivers) {
  276.     my %l; @l{@drivers_fields} = @$v;
  277.     $drivers{$k} = \%l;
  278. }
  279.  
  280.  
  281. 1;
  282.  
  283. sub module_of_type($) {
  284.     my ($type) = @_;
  285.     grep { $drivers{$_}{type} =~ /^($type)$/ } keys %drivers;
  286. }
  287.  
  288. sub text_of_type($) {
  289.     my ($type) = @_;
  290.     my $alias = $type_aliases{$type};
  291.  
  292.     map { $_->{text} } grep { $_->{type} eq $type || $_->{type} eq $alias } values %drivers;
  293. }
  294.  
  295. sub text2driver($) {
  296.     my ($text) = @_;
  297.     while (my ($k, $v) = each %drivers) {
  298.     $v->{text} eq $text and return $k;
  299.     }
  300.     die "$text is not a valid module description";
  301. }
  302.  
  303. sub add_alias($$) { 
  304.     my ($alias, $name) = @_;
  305.     /\Q$alias/ && $conf{$_}{alias} && $conf{$_}{alias} eq $name and return foreach keys %conf;
  306.     $alias .= $scsi++ || '' if $alias eq 'scsi_hostadapter';
  307.     log::l("adding alias $alias to $name");
  308.     $conf{$alias}{alias} ||= $name;
  309.     1;
  310. }
  311.  
  312. sub remove_alias($) {
  313.     my ($name) = @_;
  314.     foreach (keys %conf) {
  315.     $conf{$_}{alias} && $conf{$_}{alias} eq $name or next;
  316.     delete $conf{$_}{alias};
  317.     return 1;
  318.     }
  319.     0;
  320. }
  321.  
  322. sub load {
  323.     my ($name, $type, @options) = @_;
  324.  
  325.     if ($::testing) {
  326.     print join ",", @options, "\n";
  327.     log::l("i try to install $name module (@options)");
  328.     } else {
  329.     $conf{$name}{loaded} and return;
  330.  
  331.     $type ||= ($drivers{$name} || { type => 'unknown'})->{type};
  332.  
  333.     load($_, 'prereq') foreach @{$deps{$name}};
  334.     load_raw($name, @options);
  335.     }
  336.     push @{$loaded{$type}}, $name;
  337.  
  338.     if ($type) {
  339.     add_alias('usbmouse', $name) if $type =~ /serial_usb/i;
  340.     add_alias('scsi_hostadapter', $name) if $type eq 'scsi';
  341.     }
  342.     $conf{$name}{options} = join " ", @options if @options;
  343. }
  344.  
  345. sub unload($;$) {
  346.     my ($m, $remove_alias) = @_; 
  347.     if ($::testing) {
  348.     log::l("rmmod $m");
  349.     } else {    
  350.     run_program::run("rmmod", $m) && delete $conf{$m}{loaded};
  351.     }
  352.     remove_alias($m) if $remove_alias;
  353. }
  354.  
  355. sub load_raw($@) {
  356.     my ($name, @options) = @_;
  357.  
  358.     run_program::run("insmod", $name, @options) or die("insmod $name failed");
  359.  
  360.     
  361.     if ($name eq "parport_pc") {
  362.     foreach (@options) {
  363.         /^irq=(\d+)/ or next;
  364.         log::l("writing to /proc/parport/0/irq");
  365.         local *F;
  366.         open F, "> /proc/parport/0/irq" or last;
  367.         print F $1;
  368.     }
  369.     }
  370.     $conf{$name}{loaded} = 1;
  371. }
  372.  
  373. sub read_already_loaded() {
  374.     foreach (cat_("/proc/modules", "die")) {
  375.     my ($name) = split;
  376.     $conf{$name}{loaded} = 1;
  377.     }
  378. }
  379.  
  380. sub load_deps($) {
  381.     my ($file) = @_;
  382.  
  383.     local *F;
  384.     open F, $file or log::l("error opening $file: $!"), return 0;
  385.     foreach (<F>) {
  386.     my ($f, $deps) = split ':';
  387.     push @{$deps{$f}}, split ' ', $deps;
  388.     }
  389. }
  390.  
  391. sub read_conf($;$) {
  392.     my ($file, $scsi) = @_;
  393.     my %c;
  394.  
  395.     foreach (cat_($file)) {
  396.     do {
  397.         $c{$2}{$1} = $3;
  398.         $$scsi = max($$scsi, $1 || 0) if /^\s*alias\s+scsi_hostadapter (\d*)/x && $scsi; 
  399.     } if /^\s*(\S+)\s+(\S+)\s+(.*?)\s*$/;
  400.     }
  401.     
  402.     while (my ($k, $v) = each %c) {
  403.  
  404.     if (my $a = $v->{alias}) {
  405.         local $c{$a}{alias};
  406.         add2hash($c{$a}, $v);
  407.     }
  408.     }
  409.     \%c;
  410. }
  411.  
  412. sub write_conf {
  413.     my ($file) = @_;
  414.  
  415.     
  416.     substInFile { $_ = '' if /post-install supermount/ } $file;
  417.  
  418.     my $written = read_conf($file);
  419.  
  420.     my %net = detect_devices::net2module();
  421.     while (my ($k, $v) = each %net) { add_alias($k, $v) }
  422.  
  423.     add_alias('scsi_hostadapter', 'ide-scsi') if detect_devices::getIDEBurners();
  424.  
  425.     if (my @scsis = grep { $conf{$_}{alias} && /scsi_hostadapter/ } keys %conf) {
  426.     log::l("has scsis ", join " ; ", map { "modprobe $_" } @scsis);
  427.     $conf{supermount}{"post-install"} = join " ; ", map { "modprobe $_" } @scsis;
  428.     }
  429.  
  430.     local *F;
  431.     open F, ">> $file" or die("cannot write module config file $file: $!\n");
  432.     while (my ($mod, $h) = each %conf) {
  433.     while (my ($type, $v2) = each %$h) {
  434.         print F "$type $mod $v2\n" if $v2 && $type ne "loaded" && !$written->{$mod}{$type};
  435.     }
  436.     }
  437. }
  438.  
  439. sub read_stage1_conf {
  440.     add2hash(\%conf, read_conf($_[0], \$scsi));
  441.     $conf{parport_lowlevel}{alias} ||= "parport_pc";
  442.     $conf{pcmcia_core}{"pre-install"} ||= "CARDMGR_OPTS=-f /etc/rc.d/init.d/pcmcia start";
  443.     $conf{plip}{"pre-install"} ||= "modprobe parport_pc ; echo 7 > /proc/parport/0/irq";
  444. }
  445.  
  446. sub load_thiskind($;&$) {
  447.     my ($type, $f, $pcic) = @_;
  448.  
  449.     require pci_probing::main;
  450.     my @pcidevs = pci_probing::main::probe($type);
  451.     log::l("pci probe found " . scalar @pcidevs . " $type devices");
  452.  
  453.     my @pcmciadevs = get_pcmcia_devices($type, $pcic);
  454.     log::l("pcmcia probe found " . scalar @pcmciadevs . " $type devices");
  455.  
  456.     my @devs = (@pcidevs, @pcmciadevs);
  457.  
  458.     my %devs; foreach (@devs) {
  459.     my ($text, $mod) = @$_;
  460.     $devs{$mod}++ and log::l("multiple $mod devices found"), next;
  461.     log::l("found driver for $mod");
  462.     &$f($text, $mod) if $f;
  463.     load($mod, $type);
  464.     }
  465.     @devs, map { [ $_, $_ ] } @{$loaded{$type} || []};
  466. }
  467.  
  468. sub pcmcia_need_config($) {
  469.     return $_[0] && ! -s "/var/run/stab";
  470. }
  471.  
  472. sub get_pcmcia_devices($$) {
  473.     my ($type, $pcic) = @_;
  474.     my (@devs, $module, $desc);
  475.  
  476.     
  477.     if (pcmcia_need_config($pcic)) {
  478.     log::l("i try to configure pcmcia services");
  479.  
  480.     symlink("/tmp/stage2/etc/pcmcia", "/etc/pcmcia") unless -e "/etc/pcmcia";
  481.     symlink("/sbin/install", "/sbin/cardmgr") unless -x "/sbin/cardmgr";
  482.  
  483.     load("pcmcia_core");
  484.     load($pcic);
  485.     load("ds");
  486.  
  487.     
  488.     run_program::run("cardmgr", "-f", "-m" ,"/modules");
  489.     sleep(3);
  490.  
  491.     
  492.     read_already_loaded();
  493.     }
  494.  
  495.     foreach (cat_("/var/run/stab")) {
  496.     $desc = $1 if /^Socket\s+\d+:\s+(.*)/;
  497.     $module = $1 if /^\d+\s+$type[^\s]*\s+([^\s]+)/;
  498.     if ($desc && $module) {
  499.         push @devs, [ $desc, $module ];
  500.         $desc = $module = undef;
  501.     }
  502.     }
  503.     @devs;
  504. }
  505.