X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=ybin%2Fofpath;h=4892d8c755717a8a55f75e9ec246fcd22d36fffc;hb=90288ad550b6494203ae58c8f64e6fae010fe62e;hp=1bb33babff635a3731a5157860fb83330c9b3212;hpb=b96b73386a75d4f06b0a094527e1bda1f6aa6589;p=yaboot.git diff --git a/ybin/ofpath b/ybin/ofpath index 1bb33ba..4892d8c 100755 --- a/ybin/ofpath +++ b/ybin/ofpath @@ -116,15 +116,41 @@ linecount() ## small tr replacment which handles a specific need of this script. smalltr() { - case "$1" in - a) echo 1 ;; b) echo 2 ;; c) echo 3 ;; d) echo 4 ;; e) echo 5 ;; f) echo 6 ;; - g) echo 7 ;; h) echo 8 ;; i) echo 9 ;; j) echo 10 ;; k) echo 11 ;; l) echo 12 ;; - m) echo 13 ;; n) echo 14 ;; o) echo 15 ;; p) echo 16 ;; - 1) echo a ;; 2) echo b ;; 3) echo c ;; 4) echo d ;; 5) echo e ;; - 6) echo f ;; 7) echo g ;; 8) echo h ;; 9) echo i ;; 10) echo j ;; - 11) echo k ;; 12) echo l ;; 13) echo m ;; 14) echo n ;; 15) echo o ;; - 16) echo p ;; - esac + local i a d t val out mod cur + + val="$1" + out="0" + + d=$(printf "%d\n" \'${val:0:1}) + + if (( $d > 57 )) ; then # is a letter + for ((i=0; i < ${#val}; i++)) ; do + d=$(printf "%d\n" \'${val:$i:1}) + a=$(($d - 96)) + out=$(($out * 26)) + out=$(($out + $a)) + done + + else # is a number + t=$val + out="" + + while ((t != 0)) ; do + mod=$(($t % 26)) + t=$(($t / 26)) + if (($mod == 0)) ; then + cur="z" + t=$(($t - 1)) + else + mod=$(($mod + 96)) + cur=$(echo $mod | gawk '{printf "%c", $1}') + fi + out="$cur$out" + done + fi + + echo "$out" + return 0 } @@ -259,17 +285,20 @@ scsiinfo() [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVHOST=$DEVHOST" if [ "$DEVTYPE" = "Direct-Access" ] || [ "$DEVTYPE" = "Direct-Access-RBC" ] ; then - DEVCOUNT="$(($DEVCOUNT + 1))" - [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVCOUNT=$DEVCOUNT" - if [ "$SUBDEV" = "$DEVCOUNT" ] ; then - DEVICE_HOST=$DEVHOST - DEVICE_BUS=$DEVBUS - DEVICE_ID=$DEVID - DEVICE_LUN=$DEVLUN - [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVICE_HOST=$DEVICE_HOST" - break - fi - fi + ls /sys/bus/scsi/devices/$DEVHOST:$DEVBUS:$DEVID:$DEVLUN/scsi_disk* > /dev/null 2>&1 + if [ $? -eq 0 ] ; then + DEVCOUNT="$(($DEVCOUNT + 1))" + [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVCOUNT=$DEVCOUNT" + if [ "$SUBDEV" = "$DEVCOUNT" ] ; then + DEVICE_HOST=$DEVHOST + DEVICE_BUS=$DEVBUS + DEVICE_ID=$DEVID + DEVICE_LUN=$DEVLUN + [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVICE_HOST=$DEVICE_HOST" + break + fi + fi + fi done ## figure out what the scsi driver is, it is /proc/scsi/dirname. @@ -464,6 +493,40 @@ scsi_ofpath2() return 0 fi + local fc=${DEVSPEC%@*} + fc=${fc##/*/} + + if [[ -e /proc/device-tree$DEVSPEC/device_type ]]; then + local devtype=$(cat /proc/device-tree$DEVSPEC/device_type); + if [[ $devtype = "fcp" || $devtype = "scsi-fcp" ]]; then + fc="fibre-channel"; + fi + fi + + if [[ $fc = "fibre-channel" ]]; then + local wwpn=$(get_fc_wwpn "$DEVICE_PATH/../../fc_remote_ports*") + local ofpath=$DEVSPEC + + if [[ ! -e /proc/device-tree$DEVSPEC/disk ]]; then + for dir in `find /proc/device-tree$DEVSPEC -type d`; do + if [[ -e $dir/disk ]]; then + ofpath=${dir##/proc/device-tree} + break; + fi + done + fi + + ofpath=$(printf "%s/disk@%s" $ofpath $wwpn) + + if [[ $DEVICE_LUN != "0" ]]; then + local fc_lun=$(get_fc_scsilun $DEVICE_LUN) + ofpath=$(printf "%s,%s" $ofpath $fc_lun) + fi + + echo "$ofpath" + return 0 + fi + echo 1>&2 "$PRG: Driver: $SCSI_DRIVER is not supported" return 1 } @@ -880,6 +943,29 @@ oldworld() return 0 } +eth_ofpath() +{ + read_attr devspec /sys/class/net/$DEVICE/device +} + +hfi_ofpath() +{ + local hfnum=${DEVICE##hf} + local hfpath + + if [[ $hfnum = "0" || $hfnum = "2" ]]; then + hfpath=$(find /proc/device-tree -name hfi-ethernet* | sort | head -n 1) + elif [[ $hfnum = "1" || $hfnum = "3" ]]; then + hfpath=$(find /proc/device-tree -name hfi-ethernet* | sort | tail -n 1) + else + echo 1>&2 "$PRG: Unsupported device: $DEVICE" + return 1 + fi + + hfpath=${hfpath##/proc/device-tree} + echo "$hfpath" +} + ## find OpenFirmware device path for IBM CHRP hardware (scsi only) chrp() { @@ -893,6 +979,12 @@ chrp() ## find the actual OF path. scsi_ofpath || return 1 ;; + eth*) + eth_ofpath || return 1 + ;; + hfi*) + hfi_ofpath || return 1 + ;; *) echo 1>&2 "$PRG: Device: /dev/$DEVNODE is not supported" return 1 @@ -1084,15 +1176,6 @@ else exit 1 fi -## check that FILE is a block device and exists. -if [ ! -e "$device" ] ; then - echo 1>&2 "$PRG: $device: No such file or directory" - exit 1 -elif [ ! -b "$device" ] ; then - echo 1>&2 "$PRG: $device is not a block device" - exit 1 -fi - ## check that we are running on a GNU/Linux system, OSX/BSD does not ## have the same /proc stuff if [ `uname -s` != Linux ] ; then