diff options
Diffstat (limited to 'patches/bin/rescan-scsi-bus')
-rw-r--r-- | patches/bin/rescan-scsi-bus | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/patches/bin/rescan-scsi-bus b/patches/bin/rescan-scsi-bus new file mode 100644 index 00000000..f1745bd9 --- /dev/null +++ b/patches/bin/rescan-scsi-bus @@ -0,0 +1,119 @@ +#!/bin/sh +# Skript to rescan SCSI bus, using the +# scsi add-single-device mechanism +# (w) 98/03/19 Kurt Garloff <kurt@garloff.de> (c) GNU GPL + +# This script is useful for automatically scanning for new +# USB and IEEE1394 devices which will not show up automatically +# if they use a LUN (logical unit number) other than 0. +# To search all LUNS for new devices to enable, run like this: +# +# rescan-scsi-bus -l + +found=0 +rmvd=0 + +# Return hosts. /proc/scsi/HOSTADAPTER/? must exist +findhosts() { + hosts= + for name in /proc/scsi/*/?; do + name=${name#/proc/scsi/} + if test ! $name = scsi ; then + hosts="$hosts ${name#*/}" + echo "Host adapter ${name#*/} (${name%/*}) found." + fi + done +} + +# Test if SCSI device $host $channen $id $lun exists +# Outputs description from /proc/scsi/scsi, returns new +testexist() { + grepstr="scsi$host Channel: 0$channel Id: 0*$id Lun: 0$lun" + new=`cat /proc/scsi/scsi | grep -e "$grepstr"` + if test ! -z "$new" ; then + cat /proc/scsi/scsi | grep -e "$grepstr" + cat /proc/scsi/scsi | grep -A2 -e "$grepstr" | tail -n 2 + fi +} + +# Perform search (scan $host) +dosearch() { + for channel in $channelsearch; do + for id in $idsearch; do + for lun in $lunsearch; do + new= + devnr="$host $channel $id $lun" + echo "Scanning for device $devnr ..." + printf "OLD: " + testexist + if test ! -z "$remove" -a ! -z "$new" ; then + echo "scsi remove-single-device $devnr" > /proc/scsi/scsi + echo "scsi add-single-device $devnr" > /proc/scsi/scsi + printf "\r\x1b[A\x1b[A\x1b[AOLD: " + testexist + if test -z "$new"; then + printf "\rDEL: \r\n\n\n\n" + rmvd=$(($rmvd+1)) + fi + fi + if test -z "$new" ; then + printf "\rNEW: " + echo "scsi add-single-device $devnr" > /proc/scsi/scsi + testexist + if test -z "$new"; then + printf "\r\x1b[A" + else + found=$(($found+1)) + fi + fi + done + done + done +} + + +# main +if test @$1 = @--help -o @$1 = @-h ; then + echo "Usage: rescan-scsi-bus.sh [-l] [-w] [-c] [host [host ...]]" + echo " -l activates scanning for LUNs 0 .. 7 [default: 0]" + echo " -w enables scanning for device IDs 0 .. 15 [def.: 0 .. 7]" + echo " -r enables removing of devices [default: disabled]" + echo " -c enables scanning of channels 0 1 [default: 0]" + echo " If hosts are given, only these are scanned [default: all]" + exit 0 +fi + +# defaults +lunsearch="0" +idsearch="0 1 2 3 4 5 6 7" +channelsearch="0" +remove="" + +# Scan options +opt="$1" +while test ! -z "$opt" -a -z "${opt##-*}"; do + opt=${opt#-} + case "$opt" in + l) lunsearch="0 1 2 3 4 5 6 7" ;; + w) idsearch="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" ;; + c) channelsearch="0 1" ;; + r) remove=1 ;; + *) echo "Unknown option -$opt !" ;; + esac + shift + opt="$1" +done + +# Hosts given ? +if test @$1 = @; then + findhosts +else + hosts=$* +fi + +for host in $hosts; do + dosearch +done +echo "$found new device(s) found. " +echo "$rmvd device(s) removed. " + |