]> git.ozlabs.org Git - yaboot.git/blobdiff - ybin/ofpath
make: use STRIP
[yaboot.git] / ybin / ofpath
index 1bb33babff635a3731a5157860fb83330c9b3212..4892d8c755717a8a55f75e9ec246fcd22d36fffc 100755 (executable)
@@ -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