aboutsummaryrefslogtreecommitdiff
path: root/patches/bin/rescan-scsi-bus
blob: f1745bd90fd660b1b93d838ff70c55f5f79ab268 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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.                 "