#!/bin/sh # rc.pcmcia 1.45 2002/08/08 06:43:43 (David Hinds) # # Modified for Thinkpad 765L yenta_socket cockup on 2004.05.25 by CDR # See main case statement below for details. # # This is designed to work in BSD as well as SysV init setups. See # the HOWTO for customization instructions. # Tags for Red Hat init configuration tools # # chkconfig: 2345 24 96 # processname: cardmgr # pidfile: /var/run/cardmgr.pid # config: /etc/pcmcia/config # config: /etc/pcmcia/config.opts # description: PCMCIA support is usually to support things like ethernet \ # and modems in laptops. It won't get started unless \ # configured so it is safe to have it installed on machines \ # that don't need it. # Exit if pcmcia-cs is not installed test -x /sbin/cardmgr || exit 0 # Save option values passed in through the environment for N in PCMCIA PCIC PCIC_OPTS CORE_OPTS CARDMGR_OPTS SCHEME ; do V=`eval echo '$'$N` ; if [ "$V" ] ; then eval ENV_$N=\"$V\" ; fi done # Source PCMCIA configuration, if available if [ -f /etc/pcmcia.conf ] ; then # Debian startup option file . /etc/pcmcia.conf elif [ -f /etc/sysconfig/pcmcia ] ; then # Red Hat startup option file . /etc/sysconfig/pcmcia else # Slackware startup options go right here: # Should be either i82365 or tcic PCIC=i82365 # Put socket driver timing parameters here PCIC_OPTS= # Put pcmcia_core options here CORE_OPTS= # Put cardmgr options here CARDMGR_OPTS= # To set the PCMCIA scheme at startup... SCHEME= fi for N in PCMCIA PCIC PCIC_OPTS CORE_OPTS CARDMGR_OPTS SCHEME ; do V=`eval echo '$'ENV_$N` ; if [ "$V" ] ; then eval $N=\"$V\" ; fi done if [ "$PCMCIA" -a "$PCMCIA" != "yes" ] ; then exit 0 ; fi usage() { echo "Usage: $0 {start|stop|status|restart|reload}" } cleanup() { while read SN CLASS MOD INST DEV EXTRA ; do if [ "$SN" != "Socket" ] ; then /etc/pcmcia/$CLASS stop $DEV 2> /dev/null fi done } EXITCODE=1 for x in "1" ; do if [ "$PCIC" = "" ] ; then echo "PCIC module not defined in startup options!" break fi if [ $# -lt 1 ] ; then usage ; break ; fi action=$1 case "$action" in start) echo -n "Starting PCMCIA services: " if [ -d /var/lib/pcmcia ] ; then SC=/var/lib/pcmcia/scheme RUN=/var/lib/pcmcia else SC=/var/run/pcmcia-scheme RUN=/var/run fi if [ -L $SC -o ! -O $SC ] ; then rm -f $SC ; fi if [ ! -f $SC ] ; then umask 022 ; touch $SC ; fi if [ "$SCHEME" ] ; then umask 022 ; echo $SCHEME > $SC ; fi if ! grep -q pcmcia /proc/devices ; then if [ -d /lib/modules/preferred ] ; then PC=/lib/modules/preferred/pcmcia else PC=/lib/modules/`uname -r`/pcmcia fi KD=/lib/modules/`uname -r`/kernel/drivers/pcmcia # # Modified 2004.05.25 by CDRigby to address a problem with initialization # of the yenta_socket driver. To get the driver to properly recognize # IRQs, the PCMCIA-relevant commands must be run as: # /sbin/modprobe pcmcia_core # /sbin/modprobe yenta_socket # /sbin/modprobe yenta_socket pci=biosirq # # So, the if stanza is modified below to change # /sbin/modprobe $PCIC $PCIC_OPTS >/dev/null 2>&1 # to # (/sbin/modprobe $PCIC >/dev/null 2>&1 && # /sbin/modprobe $PCIC $PCIC_OPTS >/dev/null 2>&1) # NOTE: this requires that /etc/sysconfig/pcmcia must be modified # to include PCIC_OPTS="pci=biosirq" # # Don't ask me why - it would be better to fix the driver. But, this # krufty hack will do for now... # if [ -x /sbin/modprobe ] ; then /sbin/modprobe pcmcia_core $CORE_OPTS || break (/sbin/modprobe $PCIC >/dev/null 2>&1 && /sbin/modprobe $PCIC $PCIC_OPTS >/dev/null 2>&1) || (/sbin/modprobe yenta_socket >/dev/null 2>&1 && echo "using yenta_socket instead of $PCIC") || /sbin/modprobe $PCIC $PCIC_OPTS || break /sbin/modprobe ds || break elif [ -d $PC ] ; then /sbin/insmod $PC/pcmcia_core.o $CORE_OPTS /sbin/insmod $PC/$PCIC.o $PCIC_OPTS /sbin/insmod $PC/ds.o else echo "module directory $PC not found." break fi fi if [ -s /var/run/cardmgr.pid ] && \ kill -0 `cat /var/run/cardmgr.pid` 2>/dev/null ; then echo "cardmgr is already running." else if [ -r $RUN/stab ] ; then cat $RUN/stab | cleanup fi /sbin/cardmgr $CARDMGR_OPTS fi echo "done." touch /var/lock/subsys/pcmcia 2>/dev/null EXITCODE=0 ;; stop) echo -n "Shutting down PCMCIA services: " if [ -s /var/run/cardmgr.pid ] ; then PID=`cat /var/run/cardmgr.pid` kill $PID # Give cardmgr a few seconds to handle the signal for N in 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 ; do kill -0 $PID 2>/dev/null || break sleep 2 done fi killall -q "CardBus Watcher" if grep -q "ds " /proc/modules ; then /sbin/rmmod ds /sbin/rmmod $PCIC 2>/dev/null || \ /sbin/rmmod yenta_socket 2>/dev/null /sbin/rmmod pcmcia_core fi echo "done." rm -f /var/lock/subsys/pcmcia # we do this because when we stop the service, the ide stop script # gets run before the card disappears /usr/sbin/updfstab EXITCODE=0 ;; status) pid=`/sbin/pidof cardmgr` if [ "$pid" != "" ] ; then echo "cardmgr (pid $pid) is running..." EXITCODE=0 else echo "cardmgr is stopped" EXITCODE=3 fi ;; restart|reload) $0 stop $0 start EXITCODE=$? ;; *) usage ;; esac done # Only exit if we're in our own subshell case $0 in *rc.pcmcia) exit $EXITCODE ;; esac