diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-06-11 17:58:04 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-06-11 17:58:04 -0300 |
commit | da2ce09c5417a5fe750ac5310d6e518bdc5bba49 (patch) | |
tree | ff46e3f2e6cba83ccf725b0ee485b6428e68f55c /v4l/scripts | |
parent | c0e1a168c8871c030502120b0f02fda348e14db7 (diff) | |
parent | 49e6c586ba2502f5cdce194081b3b9cfb590efec (diff) | |
download | mediapointer-dvb-s2-da2ce09c5417a5fe750ac5310d6e518bdc5bba49.tar.gz mediapointer-dvb-s2-da2ce09c5417a5fe750ac5310d6e518bdc5bba49.tar.bz2 |
merge: http://linuxtv.org/hg/~mcisely/v4l-dvb
From: Mauro Carvalho Chehab <mchehab@infradead.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'v4l/scripts')
-rwxr-xr-x | v4l/scripts/insmod.sh | 307 | ||||
-rwxr-xr-x | v4l/scripts/make_kconfig.pl | 149 | ||||
-rwxr-xr-x | v4l/scripts/make_noconfig.pl | 57 | ||||
-rwxr-xr-x | v4l/scripts/rmmod.pl | 195 |
4 files changed, 325 insertions, 383 deletions
diff --git a/v4l/scripts/insmod.sh b/v4l/scripts/insmod.sh deleted file mode 100755 index 91b4558e3..000000000 --- a/v4l/scripts/insmod.sh +++ /dev/null @@ -1,307 +0,0 @@ -#!/bin/sh -# insmod modules from current directory without having to install them first - -sync - -case "$1" in - load) - echo "Inserting V4L/DVB modules into kernel" - modprobe i2c-core - modprobe crc32 - modprobe firmware_class - # make sure input stuff is there for IR remote controls - modprobe evdev - # video4linux - insmod ./compat_ioctl32.ko - insmod ./videodev.ko - insmod ./v4l1-compat.ko - insmod ./v4l2-common.ko - insmod ./video-buf.ko - insmod ./ir-common.ko - insmod ./ir-kbd-i2c.ko - insmod ./tuner.ko - insmod ./tda9887.ko - insmod ./tvaudio.ko - insmod ./tveeprom.ko - insmod ./tvmixer.ko - insmod ./cs53l32a.ko - insmod ./wm8775.ko - insmod ./cx25840.ko - insmod ./saa7115.ko - insmod ./btcx-risc.ko - insmod ./saa7127.ko - insmod ./msp3400.ko - insmod ./tvp5150.ko - insmod ./tda7432.ko - insmod ./tda9840.ko - insmod ./tda9875.ko - insmod ./tea6415c.ko - insmod ./tea6420.ko - # DVB core - insmod ./dvb-core.ko # dvb_net_debug=1 - # for hybrid cx88 and saa7134 cards - insmod ./video-buf-dvb.ko - # frontend drivers - insmod ./dvb-pll.ko - insmod ./ves1x93.ko - insmod ./sp8870.ko - insmod ./cx22700.ko - insmod ./stv0299.ko - insmod ./ves1820.ko - insmod ./tda1004x.ko - insmod ./tda10021.ko - insmod ./dib3000-common.ko - insmod ./dib3000mb.ko - insmod ./dib3000mc.ko - insmod ./l64781.ko - insmod ./tda8083.ko - insmod ./cx24110.ko - insmod ./cx24123.ko - insmod ./cx22702.ko - insmod ./mt312.ko - insmod ./mt352.ko - insmod ./stv0297.ko - insmod ./nxt200x.ko - insmod ./lgdt330x.ko - insmod ./nxt6000.ko - insmod ./bcm3510.ko - insmod ./s5h1420.ko - insmod ./sp887x.ko - insmod ./or51211.ko - insmod ./or51132.ko - insmod ./zl10353.ko - insmod ./ttusbdecfe.ko - - # saa7146 based siemens/technotrend/hauppauge cards - insmod ./saa7146.ko - insmod ./saa7146_vv.ko - insmod ./ttpci-eeprom.ko - insmod ./dvb-ttpci.ko - insmod ./budget-core.ko - insmod ./budget.ko - insmod ./budget-ci.ko - insmod ./budget-av.ko - insmod ./mxb.ko - insmod ./hexium_gemini.ko - insmod ./hexium_orion.ko - # technotrend/hauppauge USB things - insmod ./dvb-ttusb-budget.ko - insmod ./ttusb_dec.ko - - # technisat skystar2 - insmod ./stv0297_cs2.ko - insmod ./b2c2-flexcop.ko - insmod ./b2c2-flexcop-usb.ko - insmod ./b2c2-flexcop-pci.ko - # terratec CinergyT2 - insmod ./cinergyT2.ko - - insmod ./dvb-usb.ko - insmod ./dvb-usb-gp8psk.ko - insmod ./dvb-usb-vp7045.ko - insmod ./dvb-usb-dtt200u.ko - - insmod ./dvb-usb-dibusb-common.ko - insmod ./dvb-usb-dibusb-mb.ko - insmod ./dvb-usb-dibusb-mc.ko - insmod ./dvb-usb-a800.ko - insmod ./dvb-usb-nova-t-usb2.ko - insmod ./dvb-usb-umt-010.ko - insmod ./dvb-usb-digitv.ko - insmod ./dvb-usb-cxusb.ko - # bt8xx - insmod ./bt832.ko - insmod ./bttv.ko - insmod ./bt878.ko - insmod ./dst.ko - insmod ./dst_ca.ko - insmod ./dvb-bt8xx.ko - insmod ./saa6588.ko - # conexant cx2388x - insmod ./cx88xx.ko - insmod ./cx8800.ko - insmod ./cx8802.ko - insmod ./cx88-vp3054-i2c.ko - insmod ./cx88-dvb.ko - insmod ./cx88-blackbird.ko - insmod ./cx88-alsa.ko - # phillips saa713x - insmod ./saa7134.ko - insmod ./saa7134-alsa.ko -# insmod ./saa7134-oss.ko - insmod ./saa7134-dvb.ko - insmod ./saa7134-empress.ko - insmod ./saa6752hs.ko - - insmod ./em28xx.ko - insmod ./pvrusb2.ko - insmod ./cpia2.ko - insmod ./vivi.ko - - echo - ;; - debug) - echo "Inserting V4L/DVB modules (debug) into kernel" - modprobe i2c-core - modprobe crc32 - modprobe firmware_class - modprobe evdev - insmod ./compat_ioctl32.ko - insmod ./videodev.ko - insmod ./v4l1-compat.ko - insmod ./v4l2-common.ko - insmod ./video-buf.ko - insmod ./ir-common.ko - insmod ./ir-kbd-i2c.ko - insmod ./tuner.ko tuner_debug=1 - insmod ./tda9887.ko - insmod ./tvaudio.ko - insmod ./tveeprom.ko - insmod ./tvmixer.ko - insmod ./cs53l32a.ko - insmod ./wm8775.ko - insmod ./cx25840.ko - insmod ./saa7115.ko - insmod ./btcx-risc.ko - insmod ./saa7127.ko - insmod ./msp3400.ko - insmod ./tvp5150.ko - insmod ./tda7432.ko - insmod ./tda9840.ko - insmod ./tda9875.ko - insmod ./tea6415c.ko - insmod ./tea6420.ko - insmod ./dvb-core.ko cam_debug=1 - insmod ./video-buf-dvb.ko - insmod ./dvb-pll.ko - insmod ./ves1x93.ko - insmod ./sp8870.ko - insmod ./cx22700.ko - insmod ./stv0299.ko - insmod ./ves1820.ko - insmod ./tda1004x.ko - insmod ./tda10021.ko - insmod ./dib3000-common.ko - insmod ./dib3000mb.ko - insmod ./dib3000mc.ko - insmod ./l64781.ko - insmod ./stv0297.ko - insmod ./tda8083.ko - insmod ./cx24110.ko - insmod ./cx24123.ko - insmod ./mt312.ko - insmod ./mt352.ko - insmod ./cx22702.ko - insmod ./nxt200x.ko - insmod ./lgdt330x.ko - insmod ./nxt6000.ko - insmod ./bcm3510.ko - insmod ./s5h1420.ko - insmod ./sp887x.ko - insmod ./or51211.ko - insmod ./or51132.ko - insmod ./zl10353.ko - insmod ./ttusbdecfe.ko - insmod ./saa7146.ko - insmod ./saa7146_vv.ko - insmod ./ttpci-eeprom.ko - insmod ./dvb-ttpci.ko debug=247 - insmod ./budget-core.ko - insmod ./budget.ko - insmod ./budget-ci.ko - insmod ./budget-av.ko - insmod ./mxb.ko - insmod ./hexium_gemini.ko - insmod ./hexium_orion.ko - insmod ./dvb-ttusb-budget.ko - insmod ./stv0297_cs2.ko - insmod ./b2c2-flexcop.ko debug=0x01 - insmod ./b2c2-flexcop-usb.ko debug=0x01 - insmod ./b2c2-flexcop-pci.ko debug=0x01 - insmod ./ttusb_dec.ko - insmod ./cinergyT2.ko - - insmod ./dvb-usb.ko debug=0x33 - insmod ./dvb-usb-gp8psk.ko debug=0x03 - insmod ./dvb-usb-vp7045.ko debug=0x03 - insmod ./dvb-usb-dtt200u.ko debug=0x03 - - insmod ./dvb-usb-dibusb-common.ko debug=0x03 - insmod ./dvb-usb-dibusb-mb.ko - insmod ./dvb-usb-dibusb-mc.ko - insmod ./dvb-usb-a800.ko - insmod ./dvb-usb-nova-t-usb2.ko - insmod ./dvb-usb-umt-010.ko - insmod ./dvb-usb-digitv.ko - insmod ./dvb-usb-cxusb.ko - - insmod ./bt832.ko - insmod ./bttv.ko - insmod ./bt878.ko - insmod ./dst.ko - insmod ./dst_ca.ko - insmod ./dvb-bt8xx.ko - insmod ./saa6588.ko - - insmod ./cx88xx.ko - insmod ./cx8800.ko - insmod ./cx8802.ko - insmod ./cx88-vp3054-i2c.ko - insmod ./cx88-dvb.ko - insmod ./cx88-blackbird.ko - insmod ./cx88-alsa.ko - - insmod ./saa7134.ko - insmod ./saa7134-alsa.ko - insmod ./saa7134-oss.ko - insmod ./saa7134-dvb.ko - insmod ./saa7134-empress.ko - insmod ./saa6752hs.ko - - insmod ./em28xx.ko - insmod ./pvrusb2.ko - insmod ./cpia2.ko - insmod ./vivi.ko - echo - ;; - unload) - echo "Removing V4L/DVB modules from kernel" - rmmod b2c2-flexcop-usb b2c2-flexcop-pci b2c2-flexcop dvb-ttpci budget \ - budget-av budget-ci budget-core ttusb_dec dvb-ttusb-budget \ - ttpci-eeprom dvb-usb-nova-t-usb2.ko dvb-usb-a800.ko \ - dvb-usb-umt-010.ko dvb-usb-dibusb-mc.ko dvb-usb-dibusb-mb.ko\ - dvb-usb-dibusb-common.ko dvb-usb-gp8psk.ko dvb-usb-vp7045.ko \ - dvb-usb-dtt200u.ko dvb-usb-digitv.ko dvb-usb-cxusb.ko \ - dvb-usb.ko -# video4linux cards - rmmod cx88-alsa cx88-blackbird cx88-dvb cx88-vp3054-i2c cx8802 cx8800 \ - cx88xx saa7134-oss saa7134-alsa saa7134-empress saa7134-dvb \ - saa7134 dvb-bt8xx dst_ca dst bt878 bttv bt832 mxb \ - hexium_gemini hexium_orion em28xx pvrusb2 cpia2 vivi - -# frontends - rmmod dib3000mb zl10353 dib3000mc dib3000_common nxt200x ves1x93 \ - sp8870 cx22700 stv0299 ves1820 cinergyT2 ttusbdecfe \ - tda1004x l64781 tda8083 cx24110 cx22702 stv0297 \ - tda10021 mt352 mt312 bcm3510 s5h1420 nxt6000 \ - stv0297_cs2 lgdt330x cx24123 sp887x or51211 or51132 \ - dvb-pll - -# chips and helpers - rmmod saa7127 msp3400 tvp5150 tda7432 tda9840 tda9875 tea6415c tea6420 \ - saa6752hs saa6588 btcx-risc tveeprom tvaudio tda9887 tuner \ - ir-kbd-i2c ir-common cx25840 tvmixer cs53l32a wm8775 saa7115 \ - saa7146_vv saa7146 video-buf-dvb video-buf \ - v4l2-common v4l1-compat dvb-core videodev compat_ioctl32 - - echo - ;; - reload) - $0 unload && $0 load - ;; - *) - echo "Usage$0 {load|unload|debug|reload}" - exit 1 -esac - -sync diff --git a/v4l/scripts/make_kconfig.pl b/v4l/scripts/make_kconfig.pl index a95e4512a..0d396c8f4 100755 --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -14,6 +14,7 @@ sub add_bool($) { my $arg=shift; + exists $config{$arg} or die "Adding unknown boolean '$arg'"; $tristate{$arg}="bool"; # printf "Boolean:%s\n",$arg; } @@ -22,13 +23,17 @@ sub add_tristate($) { my $arg=shift; + exists $config{$arg} or die "Adding unknown tristate '$arg'"; $tristate{$arg}="tristate"; # printf "Tristate:%s\n",$arg; } sub add_int($) { - $intopt{$_[0]} = '0'; + my $arg=shift; + + exists $config{$arg} or die "Adding unknown int '$arg'"; + $intopt{$arg} = 0; } sub set_int_value($$) @@ -36,6 +41,7 @@ sub set_int_value($$) my $key = shift; my $val = shift; + exists $intopt{$key} or die "Default for unknown int option '$key'"; $intopt{$key} = $val; } @@ -43,11 +49,22 @@ sub add_config($) { my $arg=shift; - if ($arg =~ m/^([A-Z0-9_]+)/) { + if ($arg =~ m/^(\w+)/) { + # Have option default to 'on' $config{$1} = 1; + } else { + die "Do not understand config variable '$arg'"; } } +# Turn option off, iff it already exists +sub disable_config($) +{ + my $key = shift; + + $config{$key} = 0 if (exists $config{$key}); +} + sub check_deps($) { my $arg=shift; @@ -66,7 +83,7 @@ sub check_deps($) sub open_kconfig($$) { my ($dir,$file)=@_; my $in = new FileHandle; - my $skip=0; + my $disabled=0; my $key; #print "opening $file\n"; @@ -75,29 +92,64 @@ sub open_kconfig($$) { # if (m;^\s*source[\s\"]+drivers/media/(video|dvb)/Kconfig;) { # next; # } - if (m|^\s*source[\s\"]+([^\n\s\"]+)[\n\s\"]|) { + + # start of a new stanza, reset + if (m/^\w/) { + $disabled = 0; + $default_seen = 0; + $key = undef; + } + + if (m|^\s*source\s+"([^"]+)"\s*$| || + m|^\s*source\s+(\S+)\s*$|) { open_kconfig($dir,"$dir/$1"); next; } - if (m|^\s+depends on (.*)\n|) { + if (m|^\s+depends on\s+(.*)\n|) { check_deps ($1); } - if (m|^\s+select (.*)\n|) { + if (m|^\s+select\s+(.*)\n|) { check_deps ($1); } - if (m|^\s*bool\s+|) { + if (m|^\s+bool(ean)?\s|) { add_bool($key); } - if (m|^\s*tristate\s+|) { + if (m|^\s+tristate\s|) { add_tristate($key); } - if (m|^\s*int\s|) { + if (m|^\s+int\s|) { + add_int($key); + } + if (m|^\s+hex\s|) { add_int($key); } - if (m|^\s*default "(\d+)"| && exists $intopt{$key}) { + # Get default for int options + if (m|^\s+default "(\d+)"| && exists $intopt{$key}) { set_int_value($key, $1); } - if (m|^\s*config (.*)\n|) { + # Override default for disabled tri/bool options + if (m/^\s+default (y|n|m|"yes"|"no")\s+(if .*)?$/ && + exists $tristate{$key} && $disabled) { + $default_seen = 1; + $_ = "\tdefault n\n"; + } + + # check for end of config definition for disabled drivers + # we need to make sure we've disabled it, and add a bit + # to the help text + if (m|^\s*(---)?help(---)?\s*$| && $disabled) { + print OUT "\tdefault n\n" unless($default_seen); + print OUT <<"EOF"; + depends on VIDEO_KERNEL_VERSION + help + WARNING! This driver needs at least kernel $minver{$key}! It may not + compile or work correctly on your kernel, which is too old. + +EOF + next; + } + + if (m|^\s*config (\w+)\s*$|) { $key=$1; add_config ($1); @@ -110,27 +162,22 @@ sub open_kconfig($$) { } else { die "Minimum version for $key not found at versions.txt"; } - if ( ($version < $minversion) | - ($level < $minlevel) | + if ( ($version < $minversion) || + ($level < $minlevel) || ($sublevel < $minsublevel) ) { - $skip=1; - printf "$key requires version $minversion.$minlevel.$minsublevel\n"; - - print OUT "# $key disabled due to incorrect version\nconfig $key\n\ttristate\n\tdefault n\n\n"; - next; + $disabled=1; + disable_config ($key); + print "$key requires version $minversion.$minlevel.$minsublevel\n"; + print OUT "# $key disabled for insufficient kernel version\n"; } else { -# printf "OK: $key requires version $minversion.$minlevel.$minsublevel\n"; - $skip=0; +# print "OK: $key requires version $minversion.$minlevel.$minsublevel\n"; + $disabled=0; } } s/^main(menu\s\"[^\"]+)/\1 - DON'T CHANGE IT!/; - if (m/^[\w]/) { - $skip=0; - } - if (!$skip) { - print OUT $_; - } + + print OUT $_; } close $in; } @@ -170,9 +217,31 @@ close IN; printf "Preparing to compile for kernel version %d.%d.%d\n",$version,$level,$sublevel; open OUT,">Kconfig"; -print OUT "mainmenu \"V4L/DVB menu\"\n"; -print OUT "source Kconfig.kern\n"; +print OUT <<"EOF"; +mainmenu "V4L/DVB menu" +source Kconfig.kern +config VIDEO_KERNEL_VERSION + bool "Enable drivers not supported by this kernel" + default n + ---help--- + Normally drivers that require a kernel newer $version.$level.$sublevel, + the kernel you are compiling for now, will be disabled. + + Turning this switch on will let you enabled them, but be warned + they may not work properly or even compile. + + They may also work fine, and the only reason they are listed as + requiring a newer kernel is that no one has tested them with an + older one yet. + + If the driver works, please post a report at V4L mailing list: + video4linux-list\@redhat.com. + + Unless you know what you are doing, you should answer N. + +EOF + open_kconfig ("../linux","../linux/drivers/media/Kconfig"); close OUT; @@ -183,26 +252,28 @@ while ( my ($key, $value) = each(%config) ) { open OUT,">Kconfig.kern"; print OUT "config MODULES\n\tboolean\n\tdefault y\n\n"; -$tristate{"MODULES"}="bool"; +add_config('MODULES'); +add_bool('MODULES'); while ( my ($key, $value) = each(%depend) ) { print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault m\n\n"; } close OUT; +# These options should default to off +disable_config('DVB_AV7110_FIRMWARE'); +disable_config('DVB_CINERGYT2_TUNING'); + +# Produce a .config file if it's forced or one doesn't already exist if (($force_kconfig eq 1) || !open IN,".config") { open OUT,">.config"; while ( my ($key,$value) = each(%tristate) ) { - - if ( ($key eq "DVB_AV7110_FIRMWARE") || - ($key eq "DVB_CINERGYT2_TUNING") ) { - printf OUT "CONFIG_%s=n\n",$key; - } else { - if ($value eq "tristate") { - printf OUT "CONFIG_%s=m\n",$key; - } else { - printf OUT "CONFIG_%s=y\n",$key; - } + if (!$config{$key}) { + print OUT "CONFIG_$key=n\n"; + } elsif ($value eq 'tristate') { + print OUT "CONFIG_$key=m\n"; + } else { # must be 'bool' + print OUT "CONFIG_$key=y\n"; } } while ( my ($key,$value) = each(%intopt) ) { diff --git a/v4l/scripts/make_noconfig.pl b/v4l/scripts/make_noconfig.pl index a81e157e2..cb3ea9627 100755 --- a/v4l/scripts/make_noconfig.pl +++ b/v4l/scripts/make_noconfig.pl @@ -1,57 +1,40 @@ #!/usr/bin/perl -my $config = (); +my %config = (); +my %allconfig = (); open IN,".config"; while (<IN>) { - if (m/\s*([\d\w_]+)[=](.*)\n/) { + if (m/\s*(\w+)=\s*(\S*)/) { #printf "%s=%s\n",$1,$2; $config { $1 } = $2; } } close IN; -open IN,".version"; +# Build table of _all_ bool and tristate config variables +open IN,"Kconfig"; while (<IN>) { - if (m/KERNELRELEASE\s*[:]*[=]+\s*(\d+)\.(\d+)\.(\d+)/) { - $version=$1; - $level=$2; - $sublevel=$3; - } -} -close IN; - -open IN,"versions.txt"; -while (<IN>) { - if (m/\[(\d+)\.(\d+)\.(\d+)\]/) { - $minversion=$1; - $minlevel=$2; - $minsublevel=$3; - next; - } - s/\n//; - - if (m/DVB_AV7110_FIRMWARE_FILE/) { - next; - } - if (m/^\s*([\w\d_]+)/) { - if ( ($version < $minversion) | - ($level < $minlevel) | - ($sublevel < $minsublevel) ) { - $config { "CONFIG_$1" } = 'n'; -#print "CONFIG_$1 version is not supported\n"; - next; - } - if (!($config { "CONFIG_$1" } ) ) { -print "CONFIG_$1 is unset\n"; - $config { "CONFIG_$1" } = 'n'; - } + if (/^config\s+(\w+)\s*$/) { + $key = "CONFIG_$1"; + } elsif (/^\s+bool(ean)?\s/) { + $allconfig{$key} = 'bool'; + $key = 0; + } elsif (/^\s+tristate\s/) { + $allconfig{$key} = 'tristate'; + $key = 0; } + # else, must be int or string, ignore } close IN; +exists $allconfig{0} and die "Unable to correctly parse Kconfig file"; + +# Produce output for including in a Makefile +# Explicitly set options that didn't appear in .config to n open OUT,">.myconfig"; -while ( my ($key, $value) = each(%config) ) { +while ( my ($key, $value) = each(%allconfig) ) { + $value = exists $config{$key} ? $config{$key} : 'n'; printf OUT "%-44s := %s\n",$key,$value; } close OUT; diff --git a/v4l/scripts/rmmod.pl b/v4l/scripts/rmmod.pl new file mode 100755 index 000000000..eb8f02d14 --- /dev/null +++ b/v4l/scripts/rmmod.pl @@ -0,0 +1,195 @@ +#!/usr/bin/perl +use strict; +use File::Find; + +my %depend = (); +my %depend2 = (); +my %rmlist = (); +my @nodep; +my @modlist; +my @allmodules; +my %reqmodules; +my %loaded = (); +my $i=0; + +# Device debug parameters +# Module name Debug option +my %debug = ( "tuner" => "tuner_debug=1", + "dvb-core" => "cam_debug=1", + "dvb-ttpci" => "debug=247", + "b2c2-flexcop" => "debug=0x01", + "b2c2-flexcop-usb" => "debug=0x01", + "b2c2-flexcop-pci" => "debug=0x01", + "dvb-usb" => "debug=0x33", + "dvb-usb-gp8psk" => "debug=0x03", + "dvb-usb-vp7045" => "debug=0x03", + "dvb-usb-dtt200u" => "debug=0x03", + "dvb-usb-dibusb-common" => "debug=0x03", + ); + + +sub parse_dir { + my $file = $File::Find::name; + + if (!($file =~ /[.]ko$/)) { + return; + } + + my $module = $file; + $module =~ s|^[./]*(.*)[.]ko|\1|; + + open IN, "modinfo $file|grep depends|cut -b 17-|"; + while (<IN>) { + my $deps = $_; + $deps =~ s/\n//; + $deps =~ s/[,]/ /g; + $deps = " $deps "; + $depend{$module} = $deps; + push @allmodules, $module; + $i++; + } + close IN; +} + +sub parse_loaded { + open IN, "/proc/modules"; + while (<IN>) { + m/^([\w\d_-]+)/; + $loaded{$1}=1; + } + close IN; +} + +sub cleandep() +{ + my $dep; + + while ( my ($k, $v) = each(%depend) ) { + my $arg=$v; + my $arg2=" "; + while (!($arg =~ m/^\s*$/)) { + if ($arg =~ m/^ ([^ ]+) /) { + my $val=$1; + if (exists($depend{$val})) { + $arg2="$arg2 $val "; + } else { + $reqmodules{$val}=1; + } + } + $arg =~ s/^ [^ ]+//; + $arg2 =~ s/\s\s+/ /; + } + $depend2 { $k } = $arg2; + } + +} + +sub rmdep() +{ + my $dep; + + while ($dep=pop @nodep) { + while ( my ($k, $v) = each(%depend2) ) { + if ($v =~ m/\s($dep)\s/) { + $v =~ s/\s${dep}\s/ /; + $v =~ s/\s${dep}\s/ /; + $v =~ s/\s${dep}\s/ /; + $depend2 {$k} = $v; + } + } + } +} + +sub orderdep () +{ + my $old; + do { + $old=$i; + while ( my ($key, $value) = each(%depend2) ) { + if ($value =~ m/^\s*$/) { + push @nodep, $key; + push @modlist, $key; + $i=$i-1; + delete $depend2 {$key}; + } + } + rmdep(); + } until ($old==$i); + while ( my ($key, $value) = each(%depend2) ) { + printf "ERROR: bad dependencies - $key ($value)\n"; + } +} + +sub insmod ($) +{ + my $debug=shift; + + while ( my ($key, $value) = each(%reqmodules) ) { + printf ("modprobe $key\n"); + system ("modprobe $key"); + } + + foreach my $key (@modlist) { + if ($debug) { + my $dbg=$debug{$key}; + + printf "insmod ./$key.ko $dbg\n"; + system "insmod ./$key.ko $dbg\n"; + } else { + printf "insmod ./$key.ko\n"; + system "insmod ./$key.ko\n"; + } + } +} + +sub rmmod () +{ + my $cmd="rmmod"; + while (my $key=pop @modlist) { + my $dep=$key; + $dep=~s/[\-]/_/g; + if (exists ($loaded{$dep})) { + printf "$cmd ./$key.ko\n"; + system "$cmd ./$key.ko\n"; + } + } +} + +sub prepare_cmd() +{ + find(\&parse_dir, "."); + printf "found $i modules\n"; + + cleandep(); + orderdep(); +} + +# main +my $mode=shift; +if ($mode eq "load") { + prepare_cmd; + insmod(0); +} else { + if ($mode eq "unload") { + prepare_cmd; + parse_loaded; + rmmod; + } else { + if ($mode eq "reload") { + prepare_cmd; + parse_loaded; + my @modlist2=@modlist; + rmmod; + @modlist=@modlist2; + insmod(0); + } else { + if ($mode eq "debug") { + prepare_cmd; + parse_loaded; + insmod(1); + } else { + printf "Usage: $0 [load|unload|reload]\n"; + } + } + } +} |