#! /bin/sh # Autodetection script for scanning /sys for hardware # 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 " --kernel_version= use kernel version (no autodetect)" echo " --load-modules load all detected modules" echo " --unload-modules unload all detected modules" echo " --show-modules show all detected modules" echo " --show-modules-order shows load order of 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 "" echo " For /etc/rc.conf use:" echo " --modules show detected MODULES" echo "" exit 1 } [ "$1" == "" ] && usage [ "$1" == "--help" ] && usage [ "$1" == "-h" ] && usage # setting kernel version case $1 in --kernel_version=*) KERNEL_VERSION="`echo $1 | awk -F= '{print $2;}'`" ;; esac if [ "$KERNEL_VERSION" == "" ]; then KERNEL_VERSION="`uname -r`" fi # checking /sys if ! [ -d /sys/devices ]; then echo "/sys/devices is not present -- mount /sys first" >&2 exit 1 fi : >/tmp/modules-plain : >/tmp/modules-stripped : >/tmp/modules-sorted : >/tmp/moduleslist # find pci aliases aliases=`find /sys/devices/ -noleaf -name modalias -exec cat {} +` # check for empty aliases if [ "$aliases" == "" ]; then echo "hwdetect aborted -- you need a kernel >= 2.6.12" >&2 exit 1 fi # generate files for the different actions modprobe -a --set-version=$KERNEL_VERSION --show-depends $aliases >> /tmp/modules-plain 2>/dev/null # fix evdev detection if [ "`echo $aliases | grep 'serio:ty06pr*[id]*[ex]*'`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends evdev >> /tmp/modules-plain 2>/dev/null fi # fix Intel536ep detection if [ "`echo $aliases | grep 'pci:v00008086d00001040sv000016BEsd00001040bc07sc80i00'`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends Intel536 >> /tmp/modules-plain 2>/dev/null fi # find PNP devices like parports, soundcards etc. # (workaround for rtc, pcspkr, irtty-sir and analog are included) if [ "`find /sys/devices -noleaf -name 'id' | grep /pnp`" ]; then for i in `find /sys/devices -noleaf -name "id" | grep /pnp`; do devid=`cat $i | grep PNP` [ "$devid" ] || continue modprobe -i --set-version=$KERNEL_VERSION --show-depends pnp:d${devid} >> /tmp/modules-plain 2>/dev/null [ "$devid" == "PNP0800" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends pcspkr >> /tmp/modules-plain 2>/dev/null [ "$devid" == "PNP0b00" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends rtc >> /tmp/modules-plain 2>/dev/null [ "$devid" == "PNP0510" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends irtty-sir >> /tmp/modules-plain 2>/dev/null [ "$devid" == "PNP0511" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends irtty-sir >> /tmp/modules-plain 2>/dev/null [ "$devid" == "PNPb02f" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends analog >> /tmp/modules-plain 2>/dev/null # load ppp-generic if serial ports are detected for modems [ "$devid" == "PNP0501" ] && modprobe -i --set-version=$KERNEL_VERSION --show-depends ppp-generic >> /tmp/modules-plain 2>/dev/null done fi # IDE disks/cdroms/floppy/tape if [ "`find /proc/ide -noleaf -name 'media'`" ]; then for i in $(cat `find /proc/ide -noleaf -name "media"`); do case $i in cdrom) modprobe -i --set-version=$KERNEL_VERSION --show-depends ide-cd >> /tmp/modules-plain 2>/dev/null ;; floppy) modprobe -i --set-version=$KERNEL_VERSION --show-depends ide-floppy >> /tmp/modules-plain 2>/dev/null ;; disk) modprobe -i --set-version=$KERNEL_VERSION --show-depends ide-disk >> /tmp/modules-plain 2>/dev/null ;; tape) modprobe -i --set-version=$KERNEL_VERSION --show-depends ide-tape >> /tmp/modules-plain 2>/dev/null ;; esac done fi # SCSI disks/cdroms/tapes/generic devices if [ "`find /sys/devices -noleaf -name 'type'`" ]; then for i in $(cat `find /sys/devices -noleaf -name "type"`); do case $i in (3|4|5) modprobe -i --set-version=$KERNEL_VERSION --show-depends sr-mod >> /tmp/modules-plain 2>/dev/null ;; esac case $i in (2|3|5|6|8|9) modprobe -i --set-version=$KERNEL_VERSION --show-depends sg >> /tmp/modules-plain 2>/dev/null ;; esac case $i in (0|7|14) modprobe -i --set-version=$KERNEL_VERSION --show-depends sd-mod >> /tmp/modules-plain 2>/dev/null ;; esac case $i in (1) modprobe -i --set-version=$KERNEL_VERSION --show-depends st >> /tmp/modules-plain 2>/dev/null ;; esac done fi # Firewire disks/cdroms/network if [ "`grep 'ohci1394' /tmp/modules-plain`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends sbp2 >> /tmp/modules-plain 2>/dev/null modprobe -i --set-version=$KERNEL_VERSION --show-depends eth1394 >> /tmp/modules-plain 2>/dev/null fi # Modem devices case $i in (Intel536|Intel537|ltmodem|ltserial|slamr|slusb) \ grep "$i" /tmp/modules-plain && modprobe -i --set-version=$KERNEL_VERSION --show-depends ppp-generic >> /tmp/modules-plain 2>/dev/null ;; \ esac # Parport modules if [ "`grep 'parport' /tmp/modules-plain`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends lp >> /tmp/modules-plain 2>/dev/null modprobe -i --set-version=$KERNEL_VERSION --show-depends ppdev >> /tmp/modules-plain 2>/dev/null fi # Sound OSS compat modules if [ "`grep 'snd-pcm' /tmp/modules-plain`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends snd-pcm-oss >> /tmp/modules-plain 2>/dev/null fi if [ "`grep 'snd-seq' /tmp/modules-plain`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends snd-seq-oss >> /tmp/modules-plain 2>/dev/null fi # USB modules if [ "`grep 'usb/' /tmp/modules-plain`" ]; then modprobe -i --set-version=$KERNEL_VERSION --show-depends usbhid >> /tmp/modules-plain 2>/dev/null modprobe -i --set-version=$KERNEL_VERSION --show-depends usb-storage >> /tmp/modules-plain 2>/dev/null modprobe -i --set-version=$KERNEL_VERSION --show-depends usblp >> /tmp/modules-plain 2>/dev/null fi sort -u /tmp/modules-plain >> /tmp/modules-stripped # OTHER modules loading first for speed up! grep -v "ide/" /tmp/modules-stripped | grep -v "scsi/" | grep -v "ata" | \ grep -v "net/" | grep -v "pcmcia/" | grep -v "usb/" | \ grep -v "ieee1394/" >> /tmp/modules-sorted # make a correct order for the modules, internal devices have priority! grep "ide/" /tmp/modules-stripped >> /tmp/modules-sorted grep "scsi/" /tmp/modules-stripped | grep -v "sata" | grep -v "libata" | grep -v "ata_piix" >> /tmp/modules-sorted grep "ata" /tmp/modules-stripped | grep -v "eata" >> /tmp/modules-sorted grep "net/" /tmp/modules-stripped | grep -v "wireless/" | grep -v "usb/" >> /tmp/modules-sorted grep "wireless/" /tmp/modules-stripped >> /tmp/modules-sorted grep "pcmcia/" /tmp/modules-stripped >> /tmp/modules-sorted # speed up usb module loading grep "usb-storage" /tmp/modules-stripped >> /tmp/modules-sorted grep "usblp" /tmp/modules-stripped >> /tmp/modules-sorted grep "usbhid" /tmp/modules-stripped >> /tmp/modules-sorted grep "usb/" /tmp/modules-stripped | grep -v "usb-storage" | grep -v "usbhid" | grep -v "usblp" >> /tmp/modules-sorted grep "ieee1394/" /tmp/modules-stripped >> /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 # since '-' and '_' are interchangeable, we have to cover both if [ "`echo $i | grep '-'`" ]; then i="`echo $i | sed 's|-|_|g'`" sed -i -e "/^$i$/d" /tmp/moduleslist elif [ "`echo $i | grep '_'`" ]; then i="`echo $i | sed 's|_|-|g'`" sed -i -e "/^$i$/d" /tmp/moduleslist fi 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 "" } showlist2() { 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 ;; --unload-modules) # load all detected pci modules for i in `cat /tmp/moduleslist`; do modprobe -r $i > /dev/null 2>&1 done ;; --show-modules) showlist "AGP " `listmods agp/` showlist "IDE " `listmods ide/` showlist "SCSI " `listmods scsi/ sata ata_piix libata` `listmods message/fusion/` `listmods drivers/block/ nbd pktcdvd sx8` showlist "SATA " `listmods ata eata` `listmods drivers/block/sx8` 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-modules-order) showlist "MODULES ORDER" `listmods modules/` ;; --show-agp) showlist "AGP " `listmods agp/` ;; --show-ide) showlist "IDE " `listmods ide/` ;; --show-scsi) showlist "SCSI " `listmods scsi/ sata ata_piix libata` `listmods message/fusion/` `listmods drivers/block/ nbd pktcdvd sx8`;; --show-sata) showlist "SATA " `listmods ata eata` `listmods drivers/block/sx8` ;; --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` `listmods message/fusion/` `listmods drivers/block/ nbd pktcdvd sx8`;; --sata) showlist "HOSTCONTROLLER_SATA" `listmods ata eata libata` `listmods drivers/block/sx8` ;; --usb) showlist "HOSTCONTROLLER_USB" `listmods usb/host` "" ;; --modules) showlist2 "MODULES" \(`listmods modules/`\) esac shift done # cleanup rm /tmp/{modules-plain,modules-sorted,modules-stripped,moduleslist} # vim: set ts=2 sw=2 nowrap: