home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
- # handle plugging in PCI modules
- #PCI_CLASS=%04X - done
- #PCI_ID=%04X:%04X - done
- #PCI_SUBSYS_ID=%04X:%04X
- #PCI_SLOT_NAME=%s
-
- $uname=`uname -r`;chomp($uname);
-
- $pciclass = ord $ENV{'PCI_CLASS'};
- $pciclass = $pciclass << 8;
-
- ($vendor,$product) = split(/:/,$ENV{'PCI_ID'});
- ($subvendor,$subproduct) = split(/:/,$ENV{'PCI_SUBSYS_ID'});
-
- if ($ENV{'ACTION'} eq 'add') {
- if (!open(PCIMAP,"/lib/modules/$uname/modules.usbmap")) {
- warn "could not open PCIMAP:$!\n";
- exit 0;
- }
- $vars = <PCIMAP>; # first line lists all variables.
- chomp($vars);
- $vars =~ s/^# //g;
- $vars =~ s/^pci //g;
- @vars = split($vars);
- # pci module vendor device subvendor subdevice class class_mask driver_data
- for ($i=0;$i<$#vars;$i++) {
- $vi{$var[$i]} = $i;
- }
- while (<PCIMAP>) {
- chomp;
- @vals = split;
-
- if ($val[$vi{'vendor'}] ne "0xffffffff") {
- # vendor/device based
- if ( ($vendor == $val[$vi{'vendor'}]) &&
- ($product == $val[$vi{'device}])
- ) {
- system("/sbin/modprobe -k $module");
- next;
- }
- } else {
- $xc = oct $val[$vi{'class'}];
- $xm = oct $val[$vi{'class_mask'}];
- if (($class & $xm) == $xc) {
- print "class based match for $classmask / $pciclass{$classmask}\n";
- system("/sbin/modprobe -k $module");
- next;
- }
- }
- }
- close(PCIMAP);
- }
-