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
signature.asc
Description: OpenPGP digital signature