tags 572869 patch
thanks

   * Get scsi, sata, and firewire drive info from /sys/ as legacy
     /proc/scsi interface does not exist anymore.
     (Closes: #572869, #377097, #342833, #289201)


Find bug-fix test install cd at:
http://www.quarkline.net/debian/bug/yaboot/

The attached patch was successfully tested/installed on:

IBM POWER IntelliStation 270
IBM pSeries 610
IBM RS/6000 44P Model 170
Xserve G5
PowerMac G5 SATA, SCSI, ESATA, Firewire
iMac G5 SATA, Firewire
eMac G4 ATA, Firewire
Mac Mini G4 ATA, Firewire
PowerMac G4 SCSI, ATA, SATA
PowerMac G3 Server SCSI, SATA
PowerBook G3 ATA, SCSI
iBook G3 ATA, Firewire
YDL PowerStation built-in SAS


Add-on SATA controlers used during testing on Macs:

Sonnet Tempo SATA PCI
SeriTek/1V4
SeriTek/1eVE2+2
SeriTek/1S2
SIIG SC-SATM12
AKIBAKAN AKB-SATA-PCI
diff -Nru ./ybin/ofpath ../yaboot-1.3.13a/ybin/ofpath
--- ./ybin/ofpath	2010-11-26 17:02:34.000000000 -0500
+++ ../yaboot-1.3.13a/ybin/ofpath	2010-12-02 11:35:50.000000000 -0500
@@ -3,6 +3,9 @@
 ###############################################################################
 ##
 ## ofpath: determine OpenFirmware path from unix device node
+##
+## Copyright (C) 2010 Milan Kupcevic
+##
 ## Copyright (C) 2000, 2001, 2002, 2003 Ethan Benson
 ##
 ## Portions based on show_of_path.sh:
@@ -27,7 +30,7 @@
 
 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
 PRG="${0##*/}"
-VERSION=1.0.7
+VERSION=1.0.7+debian1
 DEBUG=0
 export LC_COLLATE=C
 
@@ -36,9 +39,10 @@
 {
 echo \
 "$PRG $VERSION
-Written by Ethan Benson
+Written by Ethan Benson, portions rewritten by Milan Kupcevic
 Portions based on show_of_path.sh written by Olaf Hering
 
+Copyright (C) 2010 Milan Kupcevic
 Copyright (C) 2000, 2001, 2002, 2003 Ethan Benson
 Portions Copyright (C) 2000 Olaf Hering
 This is free software; see the source for copying conditions.  There is NO
@@ -181,140 +185,124 @@
     return 0
 }
 
+# read OpenFirmware device path from its corresponding devspec
+find_of_path()
+{
+  [ -z "$1" ] && return
+  [ -f "$1/devspec" ] && {
+    OF_PATH="`cat $1/devspec`"
+    SYS_PATH="$1"
+    return
+  }
+  find_of_path "${1%/*}"
+}
+
 ## this finds information we need on both newworld and oldworld macs.
 ## mainly what scsi host a disk is attached to.
 scsiinfo()
 {
-    ## see if system has scsi at all
-    if [ ! -f /proc/scsi/scsi ] ; then
-	local kver="$(uname -r)"
-	case "$kver" in
-	    2.5.*|2.6.*)
-		if [ -d /sys/bus/scsi/devices -a \
-		    -n "$(ls /sys/bus/scsi/devices 2>/dev/null)" ] ; then
-		    echo 1>&2 "$PRG: /proc/scsi/scsi does not exist"
-		    echo 1>&2 "$PRG: Make sure you compiled your kernel with CONFIG_SCSI_PROC_FS=y"
-		    return 1
-		fi
-		;;
-	esac
-	echo 1>&2 "$PRG: /dev/$DEVNODE: Device not configured"
-	return 1
-    fi
-
-    ## first we have to figure out the SCSI ID, have to do that
-    ## anyway [to] find the attached scsi disks = "Direct-Access" and
-    ## stop at sda=1 sdb=2 or whatever count in 3 lines steps
-
-    ## get last letter of device node, ie sda -> a
-    SUBNODE=${DEVNODE##*sd}
-
-    ## turn SUBNODE above into a number starting at 1, ie a -> 1
-    SUBDEV="$(smalltr $SUBNODE)"
-    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: SUBNODE=$SUBNODE SUBDEV=$SUBDEV"
-
-    DEVCOUNT=0
 
-    ## copy scsi file into a variable removing "Attached Devices"
-    ## which is the first line. this avoids a lot of
-    ## [incmopatible] crap later, and improves readability.
+  SYS_DEVICE="`readlink -f /sys/block/$DEVNODE/device`"
 
-    ## find number of lines once and recycle that number, to save
-    ## some time (linecount is a bit slow). subtract one line
-    ## to scrap Attached Devices:
+  [ -e "$SYS_DEVICE" ] && {
 
-    SCSILINES="$(($(linecount /proc/scsi/scsi) - 1))"
+    SCSI_DEVICE=${SYS_DEVICE##*/}
+    HOST_ID=${SCSI_DEVICE%%:*}
+    BUS_ID=`T=${SCSI_DEVICE#*:}; echo ${T%%:*}`
+    DEVICE_ID=`T=${SCSI_DEVICE#*:*:}; echo ${T%%:*}`
+    LUN_ID=${SCSI_DEVICE##*:}
+
+    OF_PATH=;find_of_path "$SYS_DEVICE"
+
+    SCSI_DRIVER=`cat /sys/class/scsi_host/host$HOST_ID/proc_name 2>/dev/null`
+
+    SCSI_NAME=`cat /proc/device-tree$OF_PATH/name 2>/dev/null`
+
+    IEEE1394_ID=`cat /sys/block/$DEVNODE/device/ieee1394_id 2>/dev/null`
+    IEEE1394_ID=${IEEE1394_ID%%:*}
+
+    PLUG_ID=$(ls -dv $SYS_PATH/host* 2>/dev/null | grep -n "/host$HOST_ID$")
+    PLUG_ID=$((${PLUG_ID%%:*}-1))
+
+    PART=${PARTITION:+:$PARTITION}
+
+    [ "$LUN_ID" != "0" ] && LUNX=`printf ",%x" $LUN_ID`
+
+    [ "$DEBUG" = "1" ] && {
+      echo SYS_DEVICE=$SYS_DEVICE
+      echo SCSI_DEVICE=$SCSI_DEVICE
+      echo HOST_ID=$HOST_ID
+      echo BUS_ID=$BUS_ID
+      echo DEVICE_ID=$DEVICE_ID
+      echo LUN_ID=$LUN_ID
+      echo PLUG_ID=$PLUG_ID
+      echo IEEE1394_ID=$IEEE1394_ID
+      echo SCSI_NAME=$SCSI_NAME
+      echo SCSI_DRIVER=$SCSI_DRIVER
+      echo SYS_PATH=$SYS_PATH
+      echo OF_PATH=$OF_PATH
+      echo PART=$PART
+      echo LUNX=$LUNX
+    }
 
-    if [ "$SUBDEV" -gt "$(cat /proc/scsi/scsi | grep Direct-Access | linecount)" ] ; then
-	echo 1>&2 "$PRG: /dev/$DEVNODE: Device not configured"
-	return 1
-    fi
+    SCSI_DRIVER=${SCSI_DRIVER:?}
 
-    PROCSCSI="$(cat /proc/scsi/scsi | tail -n $SCSILINES)"
+    [ -z "$OF_PATH" ] && {
+      echo 1>&2 "Cannot find $DEVNODE among OpenFirmware registered devices"
 
-    for i in $(smallseq $(($SCSILINES / 3))) ; do
+      exit 1
+    }
 
-	## put every scsi device into one single line
-	DEVINFO="$(echo "$PROCSCSI" | head -n $(($i * 3)) | tail -n 3)"
-	[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVINFO=$DEVINFO"
-
-	## cut the type field, expect "Direct-Access" later.
-	DEVTYPE="$(v=$(echo ${DEVINFO##*Type: }) ; echo ${v%% *})"
-	[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVTYPE=$DEVTYPE"
-
-	## get the device id.
-	DEVID="$(v=$(echo ${DEVINFO##*Id: }) ; n=$(echo ${v%% *}) ; echo ${n#*0})"
-	[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVID=$DEVID"
-
-	## get the scsi host id.
-	DEVHOST="$(v=$(echo ${DEVINFO##*Host: scsi}) ; echo ${v%% *})"
-	[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVHOST=$DEVHOST"
-
-	if [ "$DEVTYPE" = "Direct-Access" ] ; then
-	    DEVCOUNT="$(($DEVCOUNT + 1))"
-	    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVCOUNT=$DEVCOUNT"
-	    if [ "$SUBDEV" = "$DEVCOUNT" ] ; then
-		DEVICE_HOST=$DEVHOST
-		DEVICE_ID=$DEVID
-		[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVICE_HOST=$DEVICE_HOST"
-		break
-	    fi
-	fi
-    done
+    return 0
+  }
 
-    ## figure out what the scsi driver is, it is /proc/scsi/dirname.
-    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVICE_HOST=$DEVICE_HOST"
-    SCSI_DRIVER="$(x=`ls /proc/scsi/*/$DEVICE_HOST 2>/dev/null | cat` ; y=`echo ${x##*proc/scsi/}` ; echo ${y%%/*})"
-    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: SCSI_DRIVER=$SCSI_DRIVER"
-
-    ## figure out which host we found.
-    SCSI_HOSTNUMBER="$(v=`ls /proc/scsi/$SCSI_DRIVER/* 2>/dev/null | cat | grep -n "$DEVICE_HOST\>"` ; echo ${v%%:*})"
-    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: SCSI_HOSTNUMBER=$SCSI_HOSTNUMBER"
+  echo 1>&2 "Link /sys/block/$DEVNODE/device does not exist"
 
-    return 0
+  exit 1
 }
 
-## generic function that can find OF device paths for scsi devices,
+## add OF device node to the host OF path,
 ## must be run after scsiinfo().
 scsi_ofpath()
 {
-    case "$SCSI_DRIVER" in
-	aic7xxx)
-	    HOST_LIST="$(for i in `find /proc/device-tree -name compatible` ; do
-			lgrep "$i" "^ADPT" "^pci900[45]" "^pciclass,01000" ; done)"
-	    DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
-	    echo "${DEVICE_PATH##*device-tree}/@$DEVICE_ID:$PARTITION"
-	    ;;
-	sym53c8xx)
-	    HOST_LIST="$(for i in `find /proc/device-tree -name compatible` ; do
-			lgrep "$i" "^Symbios" "^pci1000" "^pciclass,01000" ; done)"
-	    DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
-	    echo "${DEVICE_PATH##*device-tree}/@$DEVICE_ID:$PARTITION"
-	    ;;
-	mesh)
-	    HOST_LIST="$(for i in `find /proc/device-tree -name compatible` ; do
-			lgrep "$i" "mesh" ; done)"
-	    DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
-	    echo "${DEVICE_PATH##*device-tree}/@$DEVICE_ID:$PARTITION"
-	    ;;
-	ata_k2|sata_svw)
-	    HOST_LIST="$(for i in `find /proc/device-tree -name compatible ` ; do
-			lgrep "$i" "k2-sata" ; done | sort)"
-	    DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
-	    echo "${DEVICE_PATH##*device-tree}/d...@0:$PARTITION"
-	    ;;
-	sbp2)
-	    HOST_LIST="$(for i in `find /proc/device-tree -name name` ; do
-	    		lgrep "$i" "sbp-2" ; done)"
-	    DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
-	    echo "${DEVICE_PATH##*device-tree}/d...@0:$PARTITION"
-	    ;;
-	*)
-	    echo 1>&2 "$PRG: Driver: $SCSI_DRIVER is not supported"
-	    return 1
-	    ;;
+
+  if [ -d "/proc/device-tree$OF_PATH/sas" ] ; then
+
+    SAS_ID=$(( ($BUS_ID << 16) | ($DEVICE_ID << 8) | $LUN_ID)) 
+    printf "%s/sas/d...@%x%s\n" $OF_PATH $SAS_ID $LUNX$PART
+
+  elif [ -d "/proc/device-tree$OF_PATH/s...@`printf %x $BUS_ID`" ] ; then
+
+    printf "%s/s...@%x/@%x%s\n" $OF_PATH $BUS_ID $DEVICE_ID $LUNX$PART
+
+  else
+
+    case "$SCSI_DRIVER-$SCSI_NAME" in
+      aic7xxx-*|sym53c8xx-*|mesh-*|*-scsi)
+        printf "%s/@%x%s\n" $OF_PATH $DEVICE_ID $LUNX$PART 
+        ;;
+      sata_sil-*|sata_vsc-*)
+        printf "%s/@%x%s\n" $OF_PATH $(($PLUG_ID * 2)) $PART
+        ;;
+      sata_svw-*)
+        printf "%s/k2-s...@%x/@%x%s\n" $OF_PATH $PLUG_ID $DEVICE_ID $PART
+        ;;
+      sbp2-*)
+        IEEE1394_ID=${IEEE1394_ID:?}
+        printf "%s/n...@%s/sbp-2/@%x%s\n" $OF_PATH $IEEE1394_ID $DEVICE_ID $PART
+        ;;
+      ipr-obsidian)
+        printf "%s/@%x,%x%s\n" $OF_PATH $BUS_ID $DEVICE_ID $LUNX$PART
+        ;;
+      *)
+        echo 1>&2 "${PRG}: ${SCSI_NAME} (${SCSI_DRIVER}) is not supported"
+        return 1
+        ;;
     esac
-    return 0
+
+  fi
+
+  return 0
 }
 
 ide_ofpath()
@@ -414,11 +402,11 @@
 
 	case "$DEVNODE" in
 	    hda|hdc|hde|hdg|hdi|hdk|hdm|hdo)
-		echo "${DEVSPEC}${MASTER}:$PARTITION"
+		echo "${DEVSPEC}${MASTER}${PARTITION:+:${PARTITION}}"
 		return 0
 		;;
 	    hdb|hdd|hdf|hdh|hdj|hdl|hdn|hdp)
-		echo "${DEVSPEC}${SLAVE}:$PARTITION"
+		echo "${DEVSPEC}${SLAVE}${PARTITION:+:${PARTITION}}"
 		return 0
 		;;
 	    *)
@@ -669,12 +657,6 @@
 {
     case "$DEVNODE" in
 	sd*)
-	    if ls -l /proc/device-tree | grep -q ^lr ; then
-		true
-	    else
-		echo 1>&2 "$PRG: /proc/device-tree is broken."
-		return 1
-	    fi
 
 	    ## use common scsiinfo function to get info we need.
 	    scsiinfo || return 1

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to