#!/bin/sh
###############################################################################
# $Id$
###############################################################################
# Copyright (C) 2006-2007 The Regents of the University of California.
# Produced at Lawrence Livermore National Laboratory.
# Written by Mark Grondona <mgrondona@llnl.gov>
# UCRL-CODE-230739.
###############################################################################
# chkconfig:      345 40 60
###############################################################################
### BEGIN INIT INFO
# Provides:       edac
# Required-Start: $named $time
# Default-Start:  3 5
# Default-Stop:   0 1 2 6
# Description:    Initialize EDAC drivers for machine hardware
### END INIT INFO
###############################################################################

unset SERVICE

SERVICE="edac"

prefix="/usr"
exec_prefix="/usr"
sbindir="/usr/sbin"
sysconfdir="/etc"
edac_ctl="$sbindir/edac-ctl"

PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin
STATUS=0

###############################################################################

# Don't need to source /etc/init.d/functions at this time

# Read configuration to see if we need to load 
#  EDAC_DRIVER 
# 
for dir in "$sysconfdir/default" "$sysconfdir/sysconfig"; do
  [ -f "$dir/$SERVICE" ] && . "$dir/$SERVICE"
done

###############################################################################

service_start ()
{
# Start the service.  Required by LSB.
#
# Assume that if EDAC_DRIVER is not set, then EDAC is configured
#  automatically, thus return successfully, but don't do anything.
#
    if [ ! -f /etc/edac/edac-driver ]; then
         [ -d /sys/bus/edac/devices/mc/mc0 ] && \
         echo `lsmod | grep _edac | cut -d" " -f1` > /etc/edac/edac-driver
    fi

    [ -f /etc/edac/edac-driver ] && EDAC_DRIVER=`cat /etc/edac/edac-driver`

    if [ -z "$EDAC_DRIVER" ]; then

        DRIVER_PATH=/lib/modules/`uname -r`/kernel/drivers/edac
        oldpath=`pwd`
        if [ -d $DRIVER_PATH ]; then

            cd $DRIVER_PATH

            for i in $(/bin/ls | /usr/bin/cut -d. -f1) ; do
                /sbin/modprobe $i 2>/dev/null
                if [ -d /sys/bus/edac/devices/mc/mc0 ]; then
                    echo $i> /etc/edac/edac-driver
                    EDAC_DRIVER=$i
                    break
                fi
                /sbin/modprobe -r $i 2>/dev/null
            done

            cd "$oldpath"


            if [ -z "$EDAC_DRIVER" ]; then
                echo "This board may not support EDAC, or EDAC module may not be compiled in"
                exit
            fi

        else
            echo "This board may not support EDAC, or EDAC module may not be compiled in"
            exit
        fi

    fi

  if [ -n "$EDAC_DRIVER" ]; then
     echo -n "Starting ${SERVICE}: "
     modprobe $EDAC_DRIVER
     STATUS=$?
     case $STATUS in 
       0) echo success ;;
       5) echo No EDAC support for this hardware. ;;
       *) echo failure ;;
     esac
  fi
  echo -n "Loading ${SERVICE} DIMM labels: "
  $edac_ctl --register-labels --quiet
  STATUS=$?
  case $STATUS in
   0) echo success ;;
   *) echo failure ;;
  esac
}

###############################################################################

service_stop ()
{
  echo -n "Disabling ${SERVICE}: "

  [ -f /etc/edac/edac-driver ] && EDAC_DRIVER=`cat /etc/edac/edac-driver`

  if [ -n "$EDAC_DRIVER" ]; then
    modprobe -r $EDAC_DRIVER
    STATUS=$?
    [ $STATUS -eq 0 ] && echo success || echo failure
  else
    echo "Not supported for this configuration, or EDAC Module is not loaded."
    STATUS=6
  fi
}

###############################################################################

service_status ()
{
# Print the current status of the service.  Required by LSB.
#
  [ -f /etc/edac/edac-driver ] && EDAC_DRIVER=`cat /etc/edac/edac-driver`
  [ -z "$EDAC_DRIVER" ] && STATUS=1 && exit

  edac-ctl --status
  STATUS=0
}

###############################################################################

STATUS=4

case "$1" in
  start)
    service_start
    ;;
  stop)
    service_stop
    ;;
  status)
    service_status
    ;;
  restart)
    service_stop
    service_start
    ;;
  *)
    COMMANDS="start|stop|status|restart"
    echo "Usage: $0 {${COMMANDS}}"
    exit 2
    ;;
esac

exit $STATUS
