home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
rescue
/
etc
/
sysconfig
/
hardware
/
scripts
/
hwup-ccw
< prev
next >
Wrap
Text File
|
2006-11-29
|
7KB
|
272 lines
#!/bin/bash
#
# Configures a ccw interface.
# $Id: hwup-ccw 1415 2006-02-16 09:16:36Z hare $
#
# Detects all ccw devices as per modules.ccwmap
# (current as of 2.6.5)
#
# Should be called from /sbin/hwup with the
# hardware configuration as argument
#
# The hardware configuration should look like
# <type>-bus-<bus>-<id>
# e.g.
# 'hwup-ccw dasd-bus-ccw-0.0.0190'
#
# Programs called from this script:
# echo
# test
#
SCRIPTNAME=${0##*/}
CONFIG=$1
HWDESC=$2
# Read in common functions
. ./scripts/functions
test -r ./config && . ./config
if test -z "$SYSFS"; then
message "sysfs not mounted, aborting."
exit 1
fi
# Read in the configuration file
. ./hwcfg-${CONFIG}
# Set defaults
if [ -z "$HWD_DEVICEPATH" ]; then
HWD_DEVICEPATH=${SYSFS}/bus/ccw/devices/${HWD_BUSID}
fi
if [ ! -d "$HWD_DEVICEPATH" ]; then
message "No hardware devicepath given, cannot configure"
exit 1
fi
# Check for the attached control unit and device type
read _cu_type < $HWD_DEVICEPATH/cutype
read _dev_type < $HWD_DEVICEPATH/devtype
#
# This checks for all known control units and device types.
# Information is from /lib/modules/<kversion>/modules.ccwmap
#
if [ -z "$CCW_CHAN_NAME" ] ; then
CCW_CHAN_GROUP=
CCW_CHAN_NUM=
case "$_cu_type" in
3088/01)
# P/390 network adapter
CCW_CHAN_NAME="cu3088"
CCW_CHAN_GROUP="lcs"
CCW_CHAN_NUM=2
;;
3088/08)
# Channel To Channel
CCW_CHAN_NAME="cu3088"
CCW_CHAN_GROUP="ctc"
CCW_CHAN_NUM=2
;;
3088/1e)
# FICON adapter
CCW_CHAN_NAME="cu3088"
CCW_CHAN_GROUP="ctc"
CCW_CHAN_NUM=2
;;
3088/1f)
# ESCON adapter (I.e. hardware CTC device)
CCW_CHAN_NAME="cu3088"
CCW_CHAN_GROUP="ctc"
CCW_CHAN_NUM=2
;;
3088/60)
# Lan Control Station
CCW_CHAN_NAME="cu3088"
CCW_CHAN_GROUP="lcs"
CCW_CHAN_NUM=2
;;
1731/01|1731/05|1731/06)
# OSA/Express or Guest LAN
CCW_CHAN_NAME="qeth"
CCW_CHAN_NUM=3
;;
1731/03)
# zFCP adapter
if [ "$_dev_type" == "1732/03" -o "$_dev_type" == "1732/04" ]; then
CCW_CHAN_NAME="zfcp"
else
CCW_CHAN_NAME=
fi
;;
3480/*|3490/*)
# IBM 3480/3490 tape driver
if [ "$_dev_type" == "$_cu_type" ]; then
CCW_CHAN_NAME="tape-34xx"
else
CCW_CHAN_NAME=
fi
;;
3990/*|2105/*|9343/*|2107/*|1750/*)
# DASD (ECKD mode)
CCW_CHAN_NAME="dasd-eckd"
;;
6310/*)
# DASD (FBA mode)
CCW_CHAN_NAME="dasd-fba"
;;
3880/*)
case "$_dev_type" in
3390/*)
# DASD (ECKD mode)
CCW_CHAN_NAME="dasd-eckd"
;;
3370/*)
# DASD (FBA mode)
CCW_CHAN_NAME="dasd-fba"
;;
*)
CCW_CHAN_NAME=
;;
esac
;;
*)
CCW_CHAN_NAME=
;;
esac
fi
# Unknown device
if [ -z "$CCW_CHAN_NAME" ]; then
message "Invalid device type (cu ${_cu_type} dev ${_dev_type}"
exit 1
fi
# Set defaults
if test -z "$CCW_CHAN_GROUP"; then
CCW_CHAN_GROUP="$CCW_CHAN_NAME"
fi
if test -z "$CCW_CHAN_NUM"; then
CCW_CHAN_NUM="1"
fi
if test -z "$CCW_CHAN_IDS"; then
CCW_CHAN_IDS="$HWD_BUSID"
fi
CCW_USE_DIAG=0
if test "$CCW_CHAN_NAME" = "dasd-eckd" -o "$CCW_CHAN_NAME" = "dasd-fba"; then
if test "$DASD_USE_DIAG" && test "$DASD_USE_DIAG" -eq 1 ; then
CCW_USE_DIAG=1
fi
fi
# Set sysfs paths
_ccw_dir=${SYSFS}/bus/ccw/drivers/${CCW_CHAN_NAME}
_ccwgroup_dir=${SYSFS}/bus/ccwgroup/drivers/${CCW_CHAN_GROUP}
if [ -z "$CCW_CHAN_IDS" ] ; then
message "no channel IDs given"
exit 1
fi
# Checking channel availability
# Check whether we need to configure the channel group
if test "$CCW_CHAN_NUM" -gt 1 ; then
set -- $CCW_CHAN_IDS
CCW_CHAN_GROUPID=$1
if test -d "$_ccwgroup_dir/$CCW_CHAN_GROUPID" ; then
# Device group already configured
debug "Device group $CCW_CHAN_GROUPID already configured!"
else
debug "Checking group ${CCW_CHAN_GROUPID}"
# Check whether all channels for this device are accessible
num=0
for _ccw_file in $CCW_CHAN_IDS; do
if test ! -d "${_ccw_dir}/${_ccw_file}" ; then
_ccw_group_lst=
break;
fi
_ccw_group_lst="${_ccw_group_lst:-${_ccw_file}}${_ccw_group_lst:+,${_ccw_file}}"
num=$(($num + 1))
done
# Configure the channel group
# Note that the non-existence of channels is not a failure;
# if we were called during start-up it might well be that
# not all channels are available yet.
if test "$num" -lt "$CCW_CHAN_NUM" ; then
if test -z "$_ccw_group_lst" ; then
message "Device group ${CCW_CHAN_GROUPID} not (yet) available!"
else
message "Not enough channels for this device!"
fi
else
message "Configuring group ${CCW_CHAN_GROUPID}"
echo $_ccw_group_lst > $_ccwgroup_dir/group
fi
fi
else
message_n "Configuring device ${CCW_CHAN_IDS}: "
_ccw_status_dir="$_ccw_dir/$CCW_CHAN_IDS"
# Set the device online
if test -d "$_ccw_status_dir" ; then
read _ccw_dev_online < $_ccw_status_dir/online
if [ "$_ccw_dev_online" -eq 0 ]; then
if [ "$CCW_USE_DIAG" -eq 1 ]; then
# DIAG access for DASDs
# Need to be done prior to activation
debug "Activating DIAG access mode"
echo 1 > $_ccw_status_dir/use_diag
fi
# Set the device online
debug "Setting device online"
echo "1" > $_ccw_status_dir/online
# Re-read device status
read _ccw_dev_status < $_ccw_status_dir/online
if [ "$CCW_USE_DIAG" -eq 1 ]; then
# Special handling for DIAG devices:
# The availability of DIAG access can only be
# established if the device could be activated.
# If this fails, we fall back to normal access
# and ignore any DIAG parameter.
if [ "$_ccw_dev_status" -eq 0 ]; then
# Failed to activate device
message_n "(DIAG not available) "
echo 0 > $_ccw_status_dir/use_diag
# Set the device online
debug "Setting device online w/o DIAG access"
echo "1" > $_ccw_status_dir/online
# Re-read device status
read _ccw_dev_status < $_ccw_status_dir/online
else
message_n "(DIAG) "
fi
fi
# Special handling for zfcp: might be online but
# status might indicate that something went wrong
if [ -r $_ccw_status_dir/failed ]; then
read _ccw_dev_status < $_ccw_status_dir/failed
# Invert the sense
let _ccw_dev_status^=1
fi
# Check for success
if [ "$_ccw_dev_status" -eq 0 ]; then
# Failed to activate device
message "failed."
else
message "ok."
fi
else
debug "Device already activated"
fi
else
message "not available."
fi
fi