aboutsummaryrefslogtreecommitdiff
path: root/patches/bin/rescan-scsi-bus
diff options
context:
space:
mode:
Diffstat (limited to 'patches/bin/rescan-scsi-bus')
-rw-r--r--patches/bin/rescan-scsi-bus119
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. "
+