home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / sbin / hwup < prev    next >
Text File  |  2006-11-29  |  18KB  |  613 lines

  1. #!/bin/bash
  2. #
  3. # /sbin/hwup
  4. #
  5. # Configuring hardware (Preliminary version)
  6. # $Id: hwup 1518 2006-11-06 19:36:49Z zoz $
  7. #
  8.  
  9. # /usr/bin/env
  10. # set -x  -v
  11. # echo --  --------------------------------------------------------------------
  12.  
  13. usage () {
  14.     echo "Usage: hw{up,down,status} [<config>] <hwdesc> [-o <options>]"
  15.     echo "Options are:"
  16.     echo "    auto     : we were called from an automated process"
  17.     echo "    hotplug  : like auto, special for hotplug (udev)"
  18.     echo "    fast     : skip getcfg, works not for all subsystems"
  19.     exit $R_USAGE
  20. }
  21.  
  22. get_config_fast() {
  23.     local DP
  24.     set -- $(IFS="-"; echo $HWDESC)
  25.     if [ "$2" = "devpath" ]; then
  26.         HWD_BUSNAME=$1
  27.         shift
  28.     fi
  29.     if [ "$1" = "devpath" ]; then
  30.         HWD_BUSID=${2##*/}
  31.         HWD_DEVICEPATH=${SYSFS}${2#${SYSFS}}
  32.         DP="`cd -P $HWD_DEVICEPATH 2>/dev/null &&  pwd`"
  33.         HWD_DEVICEPATH=${DP:-$HWD_DEVICEPATH}
  34.         for cfg in hwcfg-*bus-${HWD_BUSNAME}-${HWD_BUSID}; do
  35.             if test -f $cfg; then
  36.             HWD_CONFIG=${cfg##hwcfg-}
  37.             fi
  38.         done 
  39.         return 0
  40.     else
  41.         return 1
  42.     fi
  43. }
  44.  
  45. get_config_getcfg() {
  46.     eval `/sbin/getcfg -d . -f hwcfg- -- $HWDESC 2>/dev/null`
  47.     # This is a workaround for getcfg that does not get a devicepath from a
  48.     # buspath or device link. 
  49.     local devpath
  50.     if [ -z "$HWD_DEVICEPATH" -a -n "$HWD_DEVPATH" ] ; then
  51.         devpath=`cd -P ${SYSFS}${HWD_DEVPATH#$SYSFS}; pwd`
  52.         if [ -d "$devpath" ] ; then
  53.             eval `/sbin/getcfg -d . -f hwcfg- -- devpath-$devpath`
  54.         fi
  55.     fi
  56.     # Normally we are interested only in the last bus. (It is not of
  57.     # interest that below a scsi bus is a pci bus. Otherwise use
  58.     # HWD_BUSNAME_<n>, HWD_BUSID_<n>.)
  59.     if [ -n "$HWD_BUS_N" -a "$HWD_BUS_N" -gt 0 ] ; then
  60.         eval export HWD_BUSNAME=\$HWD_BUSNAME_$((HWD_BUS_N-1))
  61.         eval export HWD_BUSID=\$HWD_BUSID_$((HWD_BUS_N-1))
  62.     fi
  63.     HWD_CONFIG=$HWD_CONFIG_0
  64. }
  65.  
  66. is_known_subsystem() {
  67.     case "$1" in
  68.         ccw)              return 0 ;;
  69.         ccwgroup)         return 0 ;;
  70.         iucv)             return 0 ;;
  71.         ide)              return 0 ;;
  72.         ieee1394)         return 0 ;;
  73.         input)            return 0 ;;
  74.         macio)            return 0 ;;
  75.         pci)              return 0 ;;
  76.         pci_express)      return 0 ;;
  77.         pcmcia)           return 0 ;;
  78.         pcmcia_socket)    return 0 ;;
  79.         platform)         return 0 ;;
  80.         pnp)              return 0 ;;
  81.         scsi)             return 0 ;;
  82.         scsi_host)        return 0 ;;
  83.         aoa-soundbus)     return 0 ;;
  84.         usb)              return 0 ;;
  85.         vio)              return 0 ;;
  86.         static)           return 0 ;; # for static device configs
  87.         *)                return 1 ;;
  88.     esac
  89. }
  90.  
  91. get_subsystem() {
  92.     if is_known_subsystem $SUBSYSTEM; then
  93.         echo $SUBSYSTEM
  94.         return 0
  95.     fi
  96.     set -- $(IFS="-"; echo $HWDESC)
  97.     if is_known_subsystem $1 ; then
  98.         echo $1
  99.         return 0;
  100.     fi
  101.     test "$2" == bus && shift
  102.     if [ "$1" == bus ] && is_known_subsystem $2; then
  103.         echo $2
  104.         return 0;
  105.     fi
  106.     local devpath
  107.     if [ -L ${SYSFS}${DEVPATH}/bus ] ; then
  108.         devpath=${SYSFS}${DEVPATH}
  109.     else
  110.         test "$2" == devpath && shift
  111.         if [ "$1" == devpath ] ; then
  112.             shift
  113.             devpath="`IFS=-; echo "$*"`"
  114.             devpath=${devpath#$SYSFS}
  115.         fi
  116.     fi
  117.     if [ -L ${SYSFS}${devpath}/bus ] ; then
  118.         local bus
  119.         bus="`cd -P ${SYSFS}${devpath}/bus; pwd`"
  120.         bus=${bus##*/}
  121.         if is_known_subsystem $bus; then
  122.             echo $bus
  123.             return 0
  124.         fi
  125.     fi
  126.     local classpath=${devpath#/class/}
  127.     if [ "$devpath" != "$classpath" ] ; then
  128.         classpath=${classpath%%/*}
  129.         if is_known_subsystem $classpath; then
  130.             echo $classpath
  131.             return 0
  132.         fi
  133.     fi
  134.     if [ -n "$CONFIG" ] ; then
  135.         if is_known_subsystem ${CONFIG%%-*}; then
  136.             echo ${CONFIG%%-*}
  137.             return 0
  138.         fi
  139.     fi
  140.     return 1
  141. }
  142.  
  143. # This checks for information that should be available for all kind of
  144. # subsystems. If will not fail if some information is missing since the needs
  145. # of each subsystem differ to much. That may change in future.
  146. # The current implementation of this function is evil and ugly. Lets get rid of
  147. # getcfg soon and write a proper function. But for SL10.0 its to late. (zoz)
  148. get_basic_information() {
  149.     if [ "$FAST" = yes ] ; then
  150.         get_config_fast
  151.     else    
  152.         get_config_getcfg
  153.     fi
  154.     # We need a nonempty HWD_DEVICEPATH.
  155.     if [ -z "$HWD_DEVICEPATH" -a -n "$DEVPATH" ] ; then
  156.         HWD_DEVICEPATH=$SYSFS$DEVPATH
  157.     fi
  158.     # HWD_DEVTYPE is currently only used to call special scripts. So we
  159.     # might eliminate it and use $SUBSYSTEM instead.
  160.     if [ -z "$HWD_DEVTYPE" ] ; then
  161.         HWD_DEVTYPE=$SUBSYSTEM
  162.     fi
  163.     # We might check the following variables:
  164.     # HWD_BUSNAME
  165.     # HWD_BUSID
  166.     # HWD_ID         # in hwup-iucv
  167. }
  168.  
  169. modprobe_modalias() {
  170.     local retval
  171.     if [ -L "$HWD_DEVICEPATH/driver" ] ; then
  172.         info_mesg "Device already bound to a driver"
  173.         return 0
  174.     fi
  175.     if [ -z "$MODALIAS" ]; then
  176.         MODALIAS="`cat $HWD_DEVICEPATH/modalias 2>/dev/null`"
  177.     fi
  178.     if [ -z "$MODALIAS" ]; then
  179.         err_mesg "No module alias available"
  180.         return 1
  181.     fi
  182.     info_mesg "executing modprobe $MODALIAS"
  183.     if [ "$LOAD_UNSUPPORTED_MODULES_AUTOMATICALLY" != yes ] ; then
  184.         local MODPROBE_OPTS=--skip-unsupported
  185.     fi
  186.     if [ "$LOG_LEVEL" -lt 6 ] ; then
  187.         modprobe -v $MODPROBE_OPTS $MODALIAS
  188.         retval=$?
  189.     else
  190.         local message retval
  191.         message="`modprobe -v $MODPROBE_OPTS $MODALIAS 2>&1`"
  192.         retval=$?
  193.         if [ -n "$message" ] ; then
  194.             mesg "$message"
  195.         elif [ "$retval" == 0 ] ; then
  196.             info_mesg "modules already loaded:" \
  197.                       `modprobe --show-depends $MODALIAS \
  198.                                | sed 's=^.*/\(.*\).ko=\1='`
  199.         fi
  200.     fi
  201.     if [  ! -L "$HWD_DEVICEPATH/driver" \
  202.          -a -n "$HWD_BUSNAME" -a -n "$HWD_BUSID" ] ; then
  203.         info_mesg "Device still not bound to a driver"
  204.         if [ -e "$DRIVER_FILE" ]; then
  205.             if [ -z "$DRIVER" ]; then
  206.                 . $DRIVER_FILE 
  207.             fi
  208.             rm $DRIVER_FILE
  209.         fi
  210.         if [ -n "$DRIVER" -a "$DRIVER" != skip ] ; then
  211.             info_mesg "Binding device to driver '$DRIVER'"
  212.             SYSFS_DRIVER_PATH="/sys/bus/$HWD_BUSNAME/drivers/$DRIVER"
  213.             echo -n $HWD_BUSID > $SYSFS_DRIVER_PATH/bind
  214.             test "$DRIVER" == ipw3945 && ipw3945_start_daemon 
  215.         fi
  216.     fi
  217.     return $retval
  218. }
  219.  
  220. # Driver ipw3945 needs a userspace daemon that finishes initialisation. Without
  221. # that daemon we don't get network interfaces.
  222. # ipw3945d is started via udev as soon as module ipw3945 is loaded. But if
  223. # someone (e.g. yast) calls hwdown and hwup the device will be unbound from the
  224. # driver in hwdown and then bound again in hwup. Unfortunately there are no
  225. # udev events if a device gets bound by a driver. So we do it ourself after
  226. # binding it. 
  227. ipw3945_start_daemon() {
  228.     info_mesg "Starting daemon ipw3945d"
  229.     /lib/udev/ipw3945d.sh
  230. }
  231.  
  232. R_INTERNAL=1      # internal error, e.g. no config or missing scripts
  233. cd /etc/sysconfig/hardware || exit $R_INTERNAL
  234. test -f ./config && . ./config
  235. test -f scripts/functions && . scripts/functions || exit $R_INTERNAL
  236.  
  237. ######################################################################
  238. # Commandline parsing
  239. #
  240. # hw{up,down,status} [<config>] <hwdesc> [-o <options>]
  241. SCRIPTNAME=${0##*/}
  242. info_mesg $*
  243. HWDESC=$1
  244. case "$HWDESC" in ""|-h|*help*) usage; esac
  245. shift
  246. if [ -n "$1" -a "$1" != "-o" ] ; then
  247.     CONFIG=$HWDESC
  248.     HWDESC=$1
  249. fi
  250. shift
  251. test "$1" = "-o" && shift
  252. OPTIONS=$@
  253. MODE=manual
  254. HOTPLUG=no
  255. while [ $# -gt 0 ]; do
  256.     case $1 in
  257.         auto)    MODE=auto ;;
  258.         hotplug) MODE=auto
  259.                  HOTPLUG=yes ;;
  260.         fast)    FAST=yes;;
  261.         *)       info_mesg "unknown option $1 ignored" ;;
  262.     esac
  263.     shift
  264. done
  265.  
  266.  
  267. ######################################################################
  268. # Determine subsystem
  269. #
  270. SUBSYSTEM=`get_subsystem`
  271. if [ $? != 0 ] ; then
  272.     err_mesg "Cannot handle subsystem '$SUBSYSTEM'"
  273.     exit $R_USAGE
  274. fi
  275. test -r ./scripts/functions.$SUBSYSTEM && . ./scripts/functions.$SUBSYSTEM
  276.  
  277.  
  278. ######################################################################
  279. # Now check if basic information is available. At first that info common to all
  280. # subsystems. Then we can call the specific helper for the subsystem.
  281. get_basic_information
  282. if [ $? != 0 ] ; then
  283.     err_mesg "Cannot get basic information"
  284.     return $R_USAGE # FIXME add R_NO_INFO to functions.common
  285. fi
  286. if [ "`type -t get_${SUBSYSTEM}_information`" == function ] ; then
  287.     get_${SUBSYSTEM}_information
  288.     if [ $? != 0 ] ; then
  289.         err_mesg "Cannot get specific information for '$SUBSYSTEM'"
  290.         return $R_USAGE # FIXME add R_NO_INFO to functions.common
  291.     fi
  292. fi
  293. DRIVER_FILE=$RUN_FILES_BASE/driver-$HWD_BUSNAME-$HWD_BUSID
  294.  
  295.  
  296. ######################################################################
  297. # Get the right configuration file
  298. if [ -z "$CONFIG" -a -n "$HWD_CONFIG" ] ; then
  299.     CONFIG="$HWD_CONFIG"
  300. fi
  301. # This should go to get_static_information
  302. if [ -z "$CONFIG" ] ; then
  303.     case ${HWDESC%%-*} in
  304.         static|boot) CONFIG=$HWDESC;;
  305.     esac
  306. fi
  307. info_mesg "HWDESC='$HWDESC'"
  308. info_mesg "CONFIG='$CONFIG'"
  309.  
  310.  
  311. ######################################################################
  312. # Now source the configuration file
  313. #
  314. # First remove all variables starting with MODULE because there are variables
  315. # starting with MODULE and unknown suffix in the config file. Otherwise
  316. # environment variables would irritate the code that looks for all MODULE*
  317. # variables.
  318. unset ${!MODULE*}
  319. if [ -n "$CONFIG" -a -r "./hwcfg-$CONFIG" ] ; then
  320.     . "./hwcfg-$CONFIG"
  321. fi
  322. if [ "$LOG_LEVEL" -ge 6 ] ; then
  323.     info_mesg ------------------------------------------------------------
  324.     for var in MODE HOTPLUG SUBSYSTEM MODALIAS \
  325.                ${!HWD_*} ${!MODULE*} ${!STARTMODE*} \
  326.                ${!SCRIPTUP_*} ${!SCRIPTDOWN_*} ${!PRE_*} ${!POST_*}; do
  327.         info_mesg ${var}=${!var}
  328.     done
  329.     if [ "`type -t show_${SUBSYSTEM}_information`" == function ] ; then
  330.         show_${SUBSYSTEM}_information
  331.     fi
  332.     info_mesg ------------------------------------------------------------
  333. fi
  334.  
  335.  
  336. ######################################################################
  337. # What shell we do if there is no configuration data?
  338. # - fail
  339. # - get it automatically
  340. # - ask the user
  341. if [ "$SCRIPTNAME" = hwup -a \
  342.      \( -z "$CONFIG" -o ! -r "hwcfg-$CONFIG" -o -n "$NODATA" \) ] ; then
  343. #    test "$HOTPLUG" != yes && \
  344. #        err_mesg "No configuration found for $HWDESC"
  345. #    exit $R_NOCONFIG
  346.     if [ "`type -t pre_init_${SUBSYSTEM}`" == function ] ; then
  347.         info_mesg calling pre_init_${SUBSYSTEM}
  348.         pre_init_${SUBSYSTEM}
  349.     fi
  350.     modprobe_modalias
  351.     if [ "`type -t post_init_${SUBSYSTEM}`" == function ] ; then
  352.         info_mesg calling post_init_${SUBSYSTEM}
  353.         post_init_${SUBSYSTEM}
  354.     fi
  355.     exit 0
  356. fi
  357.  
  358.  
  359. ######################################################################
  360. # Check if we are supposed to initialize the device
  361. #
  362. # empty $STARTMODE means 'auto'
  363. case "$STARTMODE" in
  364.     off)
  365.         mesg "$SCRIPTNAME: used configuration has STARTMODE=$STARTMODE."
  366.         exit 0;
  367.         ;;
  368.     manual)
  369.         if [ "$MODE" != manual ] ; then
  370.             mesg "$SCRIPTNAME: used configuration has" \
  371.                  "STARTMODE=$STARTMODE, but we are called '$MODE'."
  372.             exit 0;
  373.         fi
  374.         ;;
  375. esac
  376.  
  377. ######################################################################
  378. # execute individual prestart or predown scripts if available
  379. #
  380. if [ "$SCRIPTNAME" = hwup ] ; then
  381. # NOTE: 'eval echo' in the next line is necessary to expand settings
  382. # like PRE_UP_SCRIPT="~root/bin/foo"
  383.     for PUS in `eval echo $PRE_UP_SCRIPT scripts/$PRE_UP_SCRIPT`; do
  384.         if [ -x "$PUS" -a ! -d "$PUS" ] ; then
  385.             info_mesg "executing additional start script $PUS" \
  386.                       "'$CONFIG' $HWDESC ${OPTIONS:+-o $OPTIONS}"
  387.             $PUS "$CONFIG" $HWDESC ${OPTIONS:+-o $OPTIONS}
  388.         fi
  389.     done
  390. fi
  391. if [ "$SCRIPTNAME" = hwdown ] ; then
  392. # NOTE: 'eval echo' in the next line is necessary to expand settings
  393. # like PRE_DOWN_SCRIPT="~root/bin/foo"
  394.     for PDS in `eval echo $PRE_DOWN_SCRIPT scripts/$PRE_DOWN_SCRIPT`; do
  395.         if [ -x "$PDS" -a ! -d "$PDS" ] ; then
  396.             info_mesg "executing additional stop script $PDS" \
  397.                       "'$CONFIG' $HWDESC ${OPTIONS:+-o $OPTIONS}"
  398.             $PDS "$CONFIG" $HWDESC ${OPTIONS:+-o $OPTIONS}
  399.         fi
  400.     done
  401. fi
  402.  
  403. ######################################################################
  404. # Call a specialized down script, depending on the event
  405. #
  406. # have a look at 'Call a specialized down script' above
  407. if [ "$SCRIPTNAME" = hwdown ]; then
  408.     # Call an event-specific script if one exists
  409.     if [ "$HWD_DEVTYPE" ]; then
  410.         SCRIPT_DOWN=`eval echo \\$SCRIPTDOWN_$HWD_DEVTYPE`
  411.     fi
  412.     # Call a generic script if no event-specific exists
  413.     if [ -z "$SCRIPT_DOWN" ]; then
  414.         SCRIPT_DOWN=`eval echo \\$SCRIPTDOWN`
  415.     fi
  416.     if test -n "$SCRIPT_DOWN" && test -x "./scripts/$SCRIPT_DOWN" ; then
  417.         info_mesg "Calling scripts/$SCRIPT_DOWN '$CONFIG'" \
  418.                   "$HWDESC ${OPTIONS:+-o $OPTIONS}"
  419.         ./scripts/$SCRIPT_DOWN "$CONFIG" $HWDESC ${OPTIONS:+-o $OPTIONS}
  420.     fi
  421. fi
  422.  
  423.  
  424. ######################################################################
  425. # Call subsystem specific pre_intialisation function if there is one
  426. #
  427. if [ "`type -t pre_init_${SUBSYSTEM}`" == function ] ; then
  428.     info_mesg calling pre_init_${SUBSYSTEM}
  429.     pre_init_${SUBSYSTEM}
  430. fi
  431.  
  432.  
  433. ######################################################################
  434. # Load all modules
  435. #
  436. declare -i M=0 N=0
  437. for MODVAR in ${!MODULE*}; do
  438.     : MODVAR=$MODVAR
  439.     # There is a silly design bug: $MODULE_OPTIONS and $MODULE_UNLOAD
  440.     # must not be interpreted as additional MODULE*
  441.     case "$MODVAR" in
  442.         MODULE_OPTIONS*|MODULE_UNLOAD*) continue ;;
  443.     esac
  444.     INDEX=${MODVAR#MODULE}
  445.  
  446.     eval ML[$M]=\$MODULE$INDEX
  447.     eval test -z "\${ML[$M]}" && continue
  448.     eval MO[$M]=\$MODULE_OPTIONS$INDEX
  449.     eval MU[$M]=\${MODULE_UNLOAD$INDEX:-$MODULE_UNLOAD}
  450.     : $((M++))
  451. done
  452.  
  453. if [ "$SCRIPTNAME" = hwup ] ; then
  454.     while [ $N -lt $M ] ; do
  455.         if [ -d /sys/module/${ML[$N]} ] ; then
  456.             mesg "hwup: module '${ML[$N]}' already present in kernel"
  457.             : $((N++))
  458.             continue
  459.         fi
  460.         if [ -d /sys/bus/$HWD_BUSNAME/drivers/${ML[$N]} ] ; then
  461.             mesg "hwup: driver '${ML[$N]}' already present in kernel"
  462.             : $((N++))
  463.             continue
  464.         fi
  465.  
  466.         mesg "hwup: Loading module '${ML[$N]}'" \
  467.                 "${MO[$N]:+with options '${MO[$N]}' }" \
  468.                 "for device '$HWDESC'"
  469.         /sbin/modprobe ${ML[$N]} ${MO[$N]}
  470.         # we exit here if we cannot modprobe the module
  471.         test $? != 0 && exit 1
  472.         : $((N++))
  473.     done
  474. fi
  475.  
  476. # Check if we should/can (un)bind devices
  477. # ccw devices are often grouped. We had to (un)bind all or not at all.
  478. case "$HWD_BUSNAME" in
  479.     ccw|"") NOBIND=yes ;;
  480. esac
  481. test -z "$HWD_BUSID" && NOBIND=yes
  482. if [ "$DRIVER" == skip ] ; then
  483.     info_mesg "Binding/Releasing device '$HWD_BUSID' skipped (DRIVER==skip)"
  484.     NOBIND=yes
  485. fi
  486.  
  487. if [ "$SCRIPTNAME" = hwup -a "$NOBIND" != yes ] ; then
  488.     # we need  to get the driver's name here, so we do the following:
  489.     # 1) if DRIVER exists in config file, we use it
  490.     # 2) else we iterate the module list, and use the first usable drivername
  491.     # 3) else we check if we saved the driver during hwdown and use it
  492.  
  493.     if [ -z "$DRIVER" ]; then
  494.         N=0
  495.         # 2)
  496.         while [ $N -lt $M -a -z "$DRIVER" ] ; do
  497.             ls -d /sys/bus/$HWD_BUSNAME/drivers/${ML[$N]} &>/dev/null
  498.             if [ $? = 0 ]; then
  499.                 DRIVER=${ML[$N]}
  500.             fi
  501.             : $((N++))
  502.         done
  503.  
  504.         # 3)
  505.         if [ -e "$DRIVER_FILE" ]; then
  506.             if [ -z "$DRIVER" ]; then
  507.                 . $DRIVER_FILE 
  508.             fi
  509.             rm $DRIVER_FILE
  510.         fi
  511.     fi
  512.  
  513.     if [ -n "$DRIVER" ]; then
  514.         SYSFS_DRIVER_PATH="/sys/bus/$HWD_BUSNAME/drivers/$DRIVER"
  515.         if [ -L $SYSFS_DRIVER_PATH/$HWD_BUSID ] ; then
  516.             info_mesg "Device '$HWD_BUSID' is already bound to driver '$DRIVER'"
  517.         else
  518.             mesg "hwup: binding device $HWD_BUSID to driver $DRIVER."
  519.             echo -n $HWD_BUSID > $SYSFS_DRIVER_PATH/bind
  520.             test "$DRIVER" == ipw3945 && ipw3945_start_daemon 
  521.         fi
  522.     else
  523.         info_mesg "hwup error: could not get driver name"
  524.     fi
  525. fi
  526.  
  527. if [ "$SCRIPTNAME" = hwdown -a "$HOTPLUG" != yes -a "$NOBIND" != yes ] ; then
  528.  
  529.     SYSFS_DRIVER_PATH=`ls -d /sys/bus/$HWD_BUSNAME/drivers/*/$HWD_BUSID 2>/dev/null`
  530.     SYSFS_DRIVER_PATH=${SYSFS_DRIVER_PATH%/$HWD_BUSID}
  531.  
  532.     if [ -n "$SYSFS_DRIVER_PATH" ]; then
  533.         # unbind the device from the module
  534.         mesg "hwup: unbinding device $HWD_BUSID from driver $HWD_DRIVER."
  535.         echo -n $HWD_BUSID > $SYSFS_DRIVER_PATH/unbind
  536.         # save driver name
  537.         echo "DRIVER=$HWD_DRIVER" > $DRIVER_FILE
  538.     else
  539.         info_mesg "hwup: unbinding device $HWD_BUSID failed."
  540.     fi
  541.  
  542. fi
  543.  
  544. if [ "$SCRIPTNAME" = hwstatus ] ; then
  545.     SYSFS_DRIVER_PATH=`ls -d /sys/bus/$HWD_BUSNAME/drivers/*/$HWD_BUSID \
  546.                           2>/dev/null`
  547.     SYSFS_DRIVER_PATH=${SYSFS_DRIVER_PATH%/$HWD_BUSID}
  548.     SYSFS_MODULE_PATH=$(cd $SYSFS_DRIVER_PATH 2>/dev/null &&
  549.                         cd module 2>/dev/null; pwd -P)
  550.     SYSFS_MODULE=${SYSFS_MODULE_PATH##*/}
  551.     echo DRIVER=${SYSFS_DRIVER_PATH##*/}
  552.     if lsmod | grep -qs "\<$SYSFS_MODULE\>"; then
  553.         echo MODULE=${SYSFS_MODULE}
  554.     fi
  555.     : # to be implemented
  556. fi
  557.  
  558.  
  559. ######################################################################
  560. # Call subsystem specific post_intialisation function if there is one
  561. #
  562. if [ "`type -t post_init_${SUBSYSTEM}`" == function ] ; then
  563.     info_mesg calling post_init_${SUBSYSTEM}
  564.     post_init_${SUBSYSTEM}
  565. fi
  566.  
  567.  
  568. ######################################################################
  569. # Call a specialized up script, depending on the event
  570. #
  571. # have a look at 'Call a specialized down script' above
  572. if [ "$SCRIPTNAME" = hwup ]; then
  573.     # Call an event-specific script if one exists
  574.     if [ "$HWD_DEVTYPE" ]; then
  575.         SCRIPT_UP=`eval echo \\$SCRIPTUP_$HWD_DEVTYPE`
  576.     fi
  577.     # Call a generic script if no event-specific exists
  578.     if [ -z "$SCRIPT_UP" ]; then
  579.         SCRIPT_UP=`eval echo \\$SCRIPTUP`
  580.     fi
  581.     if test -n "$SCRIPT_UP" && test -x "./scripts/$SCRIPT_UP" ; then
  582.         info_mesg "Calling scripts/$SCRIPT_UP '$CONFIG'" \
  583.                   "$HWDESC ${OPTIONS:+-o $OPTIONS}"
  584.         ./scripts/$SCRIPT_UP "$CONFIG" $HWDESC ${OPTIONS:+-o $OPTIONS}
  585.     fi
  586. fi
  587.  
  588. ######################################################################
  589. # execute individual poststart or postdown scripts if available
  590. #
  591. if [ "$SCRIPTNAME" = hwup ] ; then
  592. # NOTE: 'eval echo' in the next line is necessary to expand settings
  593. # like POST_UP_SCRIPT="~root/bin/foo"
  594.     for PUS in `eval echo $POST_UP_SCRIPT scripts/$POST_UP_SCRIPT`; do
  595.         if [ -x "$PUS" -a ! -d "$PUS" ] ; then
  596.             info_mesg "executing additional start script $PUS" \
  597.                       "'$CONFIG' $HWDESC ${OPTIONS:+-o $OPTIONS}"
  598.             $PUS "$CONFIG" $HWDESC ${OPTIONS:+-o $OPTIONS}
  599.         fi
  600.     done
  601. fi
  602. if [ "$SCRIPTNAME" = hwdown ] ; then
  603. # NOTE: 'eval echo' in the next line is necessary to expand settings
  604. # like POST_DOWN_SCRIPT="~root/bin/foo"
  605.     for PDS in `eval echo $POST_DOWN_SCRIPT scripts/$POST_DOWN_SCRIPT`; do
  606.         if [ -x "$PDS" -a ! -d "$PDS" ] ; then
  607.             info_mesg "executing additional stop script $PDS" \
  608.                       "'$CONFIG' $HWDESC ${OPTIONS:+-o $OPTIONS}"
  609.             $PDS "$CONFIG" $HWDESC ${OPTIONS:+-o $OPTIONS}
  610.         fi
  611.     done
  612. fi
  613.