#! /bin/sh # Autodetection script for scanning /sys for pci stuff # for Archlinux by Tobias Powalowski usage () { echo "$0 [options]" echo "" echo " This is a tool that detects/lists modules that are exported by /sys" echo "" echo " Options:" echo " -load-modules load all detected modules" echo " -show-modules show all detected modules" echo " -show-agp show AGP modules" echo " -show-ide show IDE modules" echo " -show-scsi show SCSI modules" echo " -show-sata show SATA modules" echo " -show-usb show USB modules" echo " -show-fw show FIREWIRE modules" echo " -show-net show NETWORK modules" echo " -show-isdn show ISDN modules" echo " -show-pcmcia show PCMCIA modules" echo " -show-sound show SOUND modules" echo " -show-video show VIDEO modules" echo " -show-other show OTHER modules" echo "" echo " For /etc/mkinitrd.conf use:" echo " -ide show detected HOSTCONTROLLER_IDE" echo " -scsi show detected HOSTCONTROLLER_SCSI" echo " -sata show detected HOSTCONTROLLER_SATA" echo " -usb show detected HOSTCONTROLER_USB" echo "" exit 1 } [ "$1" == "" ] && usage : >/tmp/modules-plain : >/tmp/modules-sorted : >/tmp/moduleslist : >/tmp/modprobe : >/tmp/modules # find pci aliases find /sys/devices/ -name "modalias" | grep pci > /tmp/modules # delete pci devices that are blacklisted for i in $PCI_BLACKLIST; do [ "$i" ] || continue sed -i -e "/$i/d" /tmp/modules done # get the modaliases for i in `cat /tmp/modules`; do cat $i >> /tmp/modprobe done # generate files for the different actions for i in `cat /tmp/modprobe`; do modprobe --show-depends $i >> /tmp/modules-plain 2>/dev/null done # find PNP devices, like parports etc. workaround for rtc and pcspkr included for i in `find /sys -name "id*" | grep pnp`; do devid=`cat $i` if [ "$devid" == "PNP0800" ]; then modprobe --show-depends pcspkr >> /tmp/modules-plain 2>/dev/null fi if [ "$devid" == "PNP0b00" ]; then modprobe --show-depends rtc >> /tmp/modules-plain 2>/dev/null fi modprobe --show-depends pnp:d${devid} >> /tmp/modules-plain 2>/dev/null done sort -u /tmp/modules-plain >> /tmp/modules-sorted sed -ne "s#^insmod.*/\(.*\)\.ko.*#\1#p" /tmp/modules-sorted >> /tmp/moduleslist # delete modules that are blacklisted for i in $BLACKLIST; do [ "$i" ] || continue sed -i -e "/^$i$/d" /tmp/moduleslist done listmods() { key=$1 ; shift ex= while [ "$1" ]; do [ "$ex" ] && ex="$ex|$1" || ex="$1" shift done for ln in `grep "$key" /tmp/modules-sorted | sed 's|^insmod ||g'`; do if [ "$ex" ]; then echo $ln | egrep -v "$ex" | sed -ne "s#^/.*/\(.*\)\.ko.*#\1#p" else echo $ln | sed -ne "s#^/.*/\(.*\)\.ko.*#\1#p" fi done } showlist() { cat=$1 ; shift [ $# -gt 0 ] || return echo -n "$cat: " for i in $*; do echo -n "$i "; done echo "" } # starting different actions while [ $# -gt 0 ]; do case $1 in -load-modules) # load all detected pci modules for i in `cat /tmp/moduleslist`; do modprobe $i > /dev/null 2>&1 done ;; -show-modules) showlist "AGP " `listmods agp/` showlist "IDE " `listmods ide/` showlist "SCSI " `listmods scsi/ sata ata_piix libata` showlist "SATA " `listmods ata eata` showlist "USB " `listmods usb/` showlist "FW " `listmods ieee1394/` showlist "NET " `listmods net/` showlist "ISDN " `listmods isdn/` showlist "PCMCIA" `listmods pcmcia/` showlist "SOUND " `listmods sound/` showlist "VIDEO " `listmods video/` showlist "OTHER " `listmods modules/ agp/ ide/ scsi/ sata usb/ ieee1394 net/ isdn/ pcmcia/ sound/ video/` ;; -show-agp) showlist "AGP " `listmods agp/` ;; -show-ide) showlist "IDE " `listmods ide/` ;; -show-scsi) showlist "SCSI " `listmods scsi/ sata ata_piix libata` ;; -show-sata) showlist "SATA " `listmods ata eata` ;; -show-usb) showlist "USB " `listmods usb/` ;; -show-fw) showlist "FW " `listmods ieee1394/` ;; -show-net) showlist "NET " `listmods net/` ;; -show-isdn) showlist "ISDN " `listmods isdn/` ;; -show-pcmcia) showlist "PCMCIA" `listmods pcmcia/` ;; -show-sound) showlist "SOUND " `listmods sound/` ;; -show-video) showlist "VIDEO " `listmods video/` ;; -show-other) showlist "OTHER " `listmods .ko agp/ ide/ scsi/ sata usb/ ieee1394 net/ isdn/ pcmcia/ sound/ video/` ;; -ide) showlist "HOSTCONTROLLER_IDE" `listmods ide/pci` ;; -scsi) showlist "HOSTCONTROLLER_SCSI" `listmods scsi/ sata ata_piix libata` ;; -sata) showlist "HOSTCONTROLLER_SATA" `listmods ata eata libata` ;; -usb) showlist "HOSTCONTROLLER_USB" `listmods usb/host` "" ;; esac shift done # cleanup rm /tmp/{modules-plain,modules-sorted,moduleslist,modprobe,modules} # vim: set ts=2 sw=2: