#! /bin/sh
####################################################################
#
#      File: rcS.include
#      Name: Marco Di Benedetto
#
#       Description:
#  initialization script for vegas isan software to be run at boot up from
#	inittab
#	Actual location on disk: /etc/rc.d/include/rcS.include
#
#
# Copyright (c) 1985-2004, 2015-2021 by cisco Systems, Inc.
# All rights reserved.
#
#
# $Id: rcS.include,v 1.20 2002/12/03 04:11:06 cmishra Exp $
# ---------------------------------------------------------------
#####################################################################

# By default, everything gets logged to a file but doesn't go to the
# console

if [ -f /etc/rc.d/init.d/get_card_inst.sh ]; then
    source /etc/rc.d/init.d/get_card_inst.sh
fi

#
#	Trap CTRL-C &c 
#
trap "" INT QUIT TSTP 

# export necessary variables - note we cannot just blindly export everything
# from /proc/cmdline - that would be a security hole (e.g., PATH=xxx)
# so we filter out any variables starting with CAP
# we also filter options with a "." in it (for ex. ide_generic.probe_mask=0x0)
    
    
#for word in $NEWENV;
#do
#    if [ "${word#[A-Z]*}" = "$word" ] && [ "${word#*\.*=}" = "$word" ]; then
#        export $word
#    fi
#done

export BOOTLOG_FILE=/var/log/boot.log
export LOG_CONSOLE=0

boot_debug() {
    local uptime_str
    uptime_str=$(cat /proc/uptime|cut -d' ' -f1)
    if [ $LOG_CONSOLE -eq 0 ]; then
        echo "$uptime_str:" $* >> ${BOOTLOG_FILE}
    else
        echo "$uptime_str:" $*
    fi
}

action() {

    if [ "$1" != "" ]; then
        boot_debug $1
    fi

    shift
    boot_debug $*
    $*
    return $?
}

start_vshboot() {
    boot_debug "$1"
    echo $1 > /var/log/vshboot.reason

    action "Entering vshboot" /sbin/telinit 1
}

makedev () {    # usage: makedev name [bcu] major minor owner group mode
        rm -f /dev/$1-
        mknod /dev/$1- $2 $3 $4 &&
        chown $5:$6 /dev/$1- &&
        chmod $7 /dev/$1- &&
        mv /dev/$1- /dev/$1 
}

make_chrdev () {
    local devname=$1
    local major_num
    local dev_name

    dev_name=$(cat /proc/devices|grep $devname|cut -d' ' -f2)
    major_num=$(cat /proc/devices|grep $devname|cut -d' ' -f1)
    mknod /dev/$dev_name c $major_num 0
    
}

make_blkdev () {
    local devname=$1
    local num_parts=$2
    local part_i=1

    local major_num
    if [ ! -e /sys/block/$devname ]; then
       return
    fi
    major_num=$(cat /sys/block/$devname/dev|cut -d':' -f1)
    mknod /dev/$dev_name b $major_num 0
    while [ $part_i -le $num_parts ];
    do
        mknod /dev/$dev_name b $major_num $part_i
        part_i=$((part_i+1))
    done
}

print_execute_header() {
    shopt -q login_shell
    if [ $? -eq 0 ]; then
        boot_debug "Executing login shell..."
    else
        boot_debug "Executing $(dirname $0)/$(basename $0) ..."
    fi
}

# import cmdline parser helpers
proc_cmdline_get() {
    local field=$1
    local val
    echo "$(cat /proc/cmdline|awk -F"$field=" '{print $2}'|cut -d' ' -f1)"
}

get_cmdline_card_index() {
     local cindex="$(proc_cmdline_get card_index)"
     [ -n "$cindex" ] || cindex=21014
     echo "$cindex"
}

# user_card_type = must match with CCTRL_CARD_TYPE
# = 1 for sc card
# = 2 for fc card
# = 3 for sup card (kirkwood/keystone/precisa)	
# = 4 for lc card	
# = 5 for tor
# = 6 for tor lp
# = 7 for lc seymour
# = 8 for lc blackcomb
# = 9 for lc cypress
# = 10 for tor nagano
# = 11 for tor redmond2
# = 12 for Moena
# = 13 for Sunridge
# = 14 for Honeycomb
# = 15 for Chicopee
# = 16 for Morgins
# = 17 for Bosco
# = 18 for Charmey
# = 19 for Oslo
# = 20 for Sapporo
# = 21 for Calgary
# = 32 for Petenza LC
# = 68 for LC Vigor 400 XR
# = 69 for LC Vigor 400 TCAM
# = 70 for LC Vigor VE 100
# = 71 for LC Vigor VE 100 TCAM
# = 72 for LC Vigor VE DCO
# = 73 for RP Eyrie
# = 74 for LC Eyrie
# = 75 for LC Vigor MODLC
 
get_cctrl_card_type() {
    
    local card_index=$(get_cmdline_card_index)

    case "$card_index" in
        21000)
            # SUP KIRKWOOD
            echo "3"
            ;;
        21014)
            # SUP KEYSTONE
            echo "3"
            ;;
        27024)
            # 27024 SUP PRECISA 
            echo "3"
            ;;
        27059)
            # 27059 PRECISA-2-RP SUP
            echo "3"
            ;;
        21005)
            # XC  SC8
            echo "1"
            ;;
        21002)
            # FC BOREAL
            echo "2"
            ;;
        21001)
            # FC SIERRA
            echo "2"
            ;;
        21006)
            # FC SHASTA
            echo "2"
            ;;
        21010)
            # FC MTROSE
            echo "2"
            ;;
        27002)
            # FC ULURU4
            echo "2"
            ;;
        27003)
            # FC ULURU8
            echo "2"
            ;;
        27004)
            # FC ULURU16
            echo "2"
            ;;
        27037)
            # FC AUGUSTUS16
            echo "2"
            ;;
        27042)
            # FC AUGUSTUS8
            echo "2"
            ;;
        27043)
            # FC AUGUSTUS4
            echo "2"
            ;;
        21004)
            # LC SNOWBIRD
            echo "4"
            ;;
        21007)
            # LC CYPRESS
            echo "9"
            ;;
        21008)
            # LC SEYMORE
            echo "7"
            ;;
        21009)
            # LC BLACKCOMB
            echo "8"
            ;;
        21005)
            # SC ALTA
            echo "1"
            ;;
        21020)
            # TOR NAGANO
            echo "10"
            ;;
        21021)
            # TOR SOCHI
            echo "5"
            ;;
        21022)
            # TOR PLACID
            echo "6"
            ;;
        21023)
            # TOR REDMOND2
            echo "11"
            ;;
        21013)
            # LC MOENA
            echo "12"
            ;;
        21050)
            # TD2 LC SUNRIDGE
            echo "13"
            ;;
        21051)
            # TD2 LC HONEYCOMB
            echo "14"
            ;;
        21052)
            # TD2 LC CHICOPEE
            echo "15"
            ;;
        21070)
            # BOREAL LC MORGINS
            echo "16"
            ;;
        21071)
            # BOREAL LC BOSCO
            echo "17"
            ;;
        21072)
            # BOREAL LC CHARMEY
            echo "18"
            ;;
        21025)
            # Oslo TOR
            echo "19"
            ;;
        21026)
            # Calgary TOR
            echo "20"
            ;;
        21027)
            # Sapporo TOR
            echo "21"
            ;;
        21053)
            # Albertville 100G card
            # emulating as SEYMOUR
            echo "7"
            ;;
        27000)
            # LC POTENZA
            echo "32"
            ;;
        27010)
            # LC POTENZA 40 XR
            echo "60"
            ;;
        27011)
            # LC POTENZA 100 TCAM XR
            echo "61"
            ;;
        27012)
            # LC POTENZA 100 Coherent XR
            echo "62"
            ;;
        27013|27018)
            # LC POTENZA MACSEC XR
            echo "63"
            ;;
        27017)
            # LC POTENZA 40 TCAM XR
            echo "64"
            ;;
        27023)
            # LC POTENZA+100 TCAM XR
            echo "65"
            ;;
        27034)
            # LC POTENZA+ MPA NO TCAM
            echo "66"
            ;;
        27035)
            # LC POTENZA+ MPA TCAM
            echo "67"
            ;;
        27044)
            # LC Vigor 400 XR
            echo "68"
            ;;
        27050)
            # LC Vigor 400 XR PROTO
            echo "68"
            ;;
        27046)
            # LC Vigor 400 TCAM
            echo "69"
            ;;
        27055)
            # LC Vigor 400 TCAM PROTO
            echo "69"
            ;;
        27060|27064)
            # LC POTENZA+10C-A/LC POTENZA+10C-AT
            echo "32"
            ;;
        27061)
            # Vigor-100-Base
            echo "70"
            ;;
        27062)
            # Vigor-100-SE
            echo "71"
            ;;
        27063)
            # Vigor-400-DCO
            echo "72"
            ;;
        27065)
            # RP Eyrie 
            echo "73"
            ;;
        27066|27067)
            # LC Eyrie 
            echo "74"
            ;;
        27068)
            # Vigor-MOD-LC
            echo "75"
            ;;
        *)
            echo "Unknown"
            ;;
    esac
}

# returns the boardtype string with more generic classification
get_cctrl_board_type() {
    
    local card_index=$(get_cmdline_card_index)

    case "$card_index" in
        21000)
            # SUP KIRKWOOD
            echo "RP"
            ;;
        21014)
            # SUP KEYSTONE
            echo "RP"
            ;;
        27024)
            # 27024  SUP PRECISA 
            echo "RP"
            ;;
        27059)
            # 27059  PRECISA-2-RP SUP 
            echo "RP"
            ;;
        21005)
            # XC  SC8
            echo "XC"
            ;;
        21002)
            # FC BOREAL
            echo "FC"
            ;;
        21001)
            # FC SIERRA
            echo "FC"
            ;;
        21006)
            # FC SHASTA
            echo "FC"
            ;;
        21010)
            # FC MTROSE
            echo "FC"
            ;;
        27002)
            # FC ULURU4
            echo "FC"
            ;;
        27003)
            # FC ULURU8
            echo "FC"
            ;;
        27004)
            # FC ULURU16
            echo "FC"
            ;;
        27037)
            # FC AUGUSTUS16
            echo "FC"
            ;;
        27042)
            # FC AUGUSTUS8
            echo "FC"
            ;;
        27043)
            # FC AUGUSTUS4
            echo "FC"
            ;;
        21004)
            # LC SNOWBIRD
            echo "LC"
            ;;
        21007)
            # LC CYPRESS
            echo "LC"
            ;;
        21008)
            # LC SEYMORE
            echo "LC"
            ;;
        21009)
            # LC BLACKCOMB
            echo "LC"
            ;;
        21005)
            # SC ALTA
            echo "XC"
            ;;
        21020)
            # TOR NAGANO
            echo "LC"
            ;;
        21021)
            # TOR SOCHI
            echo "LC"
            ;;
        21022)
            # TOR PLACID
            echo "LC"
            ;;
        21023)
            # TOR REDMOND2
            echo "LC"
            ;;
        21013)
            # LC MOENA
            echo "LC"
            ;;
        21050)
            # TD2 LC SUNRIDGE
            echo "LC"
            ;;
        21051)
            # TD2 LC HONEYCOMB
            echo "LC"
            ;;
        21052)
            # TD2 LC CHICOPEE
            echo "LC"
            ;;
        21070)
            # BOREAL LC MORGINS
            echo "LC"
            ;;
        21071)
            # BOREAL LC BOSCO
            echo "LC"
            ;;
        21072)
            # BOREAL LC CHARMEY
            echo "LC"
            ;;
        21025)
            # Oslo TOR
            echo "LC"
            ;;
        21026)
            # Calgary TOR
            echo "LC"
            ;;
        21027)
            # Sapporo TOR
            echo "LC"
            ;;
        21053)
            # Albertville 100G card
            # emulating as SEYMOUR
            echo "LC"
            ;;
        27000|27010|27011|27012|27013|27017|27018|27023|27034|27035)
            # 27000 Fretta Potenza
            # 27010 LC POTENZA 40 XR
            # 27011 LC POTENZA 100 TCAM XR
            # 27012 LC POTENZA 100 Coherent XR
            # 27013 LC POTENZA MACSEC XR
            # 27017 LC POTENZA 40 TCAM XR
            # 27018 LC POTENZA MACSEC 36 XR 
            # 27023 LC POTENZA+100 TCAM XR
            # 27034 LC POTENZA+MPA XR
            # 27035 LC POTENZA+MPA TCAM XR
            echo "LC"
            ;;
        27044|27050|27060|27046|27055|27061|27062|27063|27064|27068)
            # 27044 LC Vigor 100 XR
            # 27050 LC Vigor 100 XR PROTO
            # 27046 LC Vigor 100 TCAM
            # 27055 LC Vigor 100 TCAM PROTO
            # 27060 LC POTENZA+10C-A
            # 27064 LC POTENZA+10C-AT
            # 27061 LC Vigor VE Base
            # 27062 LC Vigor VE TCAM
            # 27063 LC Vigor VE DCO
            # 27068 LC Vigor MOD-LC
            echo "LC"
            ;;
        27065)
            # Eyrie RP
            echo "RP"
            ;;
        27066|27067)
            # Eyrie LC
            echo "LC"
            ;;
            *)
            echo "Unknown"
            ;;
    esac
}

# TBD_EYRIE LC FPGA addr

# List of one wire codes 
# to be used in the scripts
# Be in sync with include/platform/cctrl_owc.h

PRE_CCTRL_OK=0xe5
CCTRL_OK=0xe6
CHECK_FLASH_BEGIN=0xe7
CHECK_FLASH_OK=0xe8
PRE_SYSMGR_OK=0xe9
KLM_LOAD_FAILED=0x50

send_ow_err_code() {
    local err_code=$(printf "0x800000%x\n" $1)
    local card_type=$(get_cctrl_card_type)
    case "$card_type" in
       1)
        echo "Sending one-wire error code using SC IOFPGA offset" > /dev/console
        iorw w 0xe800030c $err_code w
        ;;
       2)
        echo "Sending one-wire error code using FM IOFPGA offset" > /dev/console
        iorw w 0xe8000214 $err_code w
        ;;
       3)
        echo "Sending one-wire error code using SUP IOFPGA offset" > /dev/console
        iorw w 0xe8000250 $err_code w
        ;;
       73)
        echo "Sending one-wire error code using SUP IOFPGA offset" > /dev/console
        iorw w 0xe8000250 $err_code w
        ;;
       *)
        echo "Sending one-wire error code using LC IOFPGA offset" > /dev/console
        iorw w 0xe8000210 $err_code w
        ;;
    esac
}

# import platform vars
#. /etc/rc.d/include/set-platform-vars

# All scripts will print the executing header
print_execute_header



# from the /proc/devices create a /dev entry
# first argument : entry name in /proc/devices
# second argument: File name, e.g: /dev/redun
install_devices () 
{
    local kern_name=$1
    local dev_name=$2
    local devno

    boot_debug "Entering install_devices($1, $2)"

    devno=$(grep $1 /proc/devices | awk '{print $1}')
    if [ -z "${devno}" ]; then
        echo "$1 module not loaded"
        exit 2
    fi

    action "" rm -rf ${dev_name}
    action "" mknod ${dev_name} c ${devno} 0

    chmod 644 ${dev_name}
    
    if [ $? -ne 0 ]; then
	echo "mknod failed for ${dev_name}: error $?"
	exit 3
    fi

    boot_debug "device $2 installed"
}
    
#ModuleExists()
#This function returns 1 if the 
#module $1 is currently loaded in the system
ModuleExists()
{
    exists=`lsmod | grep $1`
    if [ -z "$exists" ]
    then
      return 1;
    else
      return 0;
    fi
}

#InstallModule()
#This function installs a module and creates the device file
#Usage: InstallModule kernel_module_name [kernel_device_name device_file_name]
#Example: InstallModule klm_utaker.o utaker /dev/utaker
InstallModule()
{
    local mod_name=$1

    boot_debug "Entering InstallModule($1, $2, $3)"

    action "Installing $1." insmod -f /lib/modules/${mod_name}.o 

    saved_error=$?
    if [ $saved_error -ne 0 ]
    then
	echo "Installation of ${mod_name} failed: error ${saved_error}."
        exit ${saved_error}
    else
	boot_debug "${mod_name} installed successfully."
    fi
        
    if [ -n "$2" -a -n "$3" ]; then
       install_devices $2 $3
    fi
}
    
#RemoveModule()
#This function removes a module and exits
#if the module exists and cannot be removed
#Usage: RemoveModule kernel_module_name [device_file_name]
#Example: RemoveModule klm_utaker [/dev/utaker]
RemoveModule()
{
    boot_debug "Entering RemoveModule($1, $2)"
  
    ModuleExists $1
    if [ $? -eq 0 ]
    then 
	# kill all users of the device file if they exist
	if [ -n "$2" ]
	then
	    fuser -k $2
	fi

	action "Removing $1." rmmod $1
	    
	saved_error=$?
	if [ $saved_error -ne 0 ]
	then
	    echo "Removal of $1 failed: error ${saved_error}."
	    exit ${saved_error}
	else
	    boot_debug "$1 removed successfully."
	fi
    fi

    if [ -n "$2" ]; then
	action "Removing unused device $2" rm -f $2
    fi
}

my_slot_id () {

    init_iofpga_base_addr_fretta

    SLOTADDR=$(printf 0x%08X $(($IOFPGA_BASE_ADDR + 0x0000000c)))

    SLOT=$( pcimemread $SLOTADDR 4 | awk ' /:/ {print "0x" substr($3,7,2) }' )

    let "y= $SLOT % 0x20"
    case $1 in
        x)
            a=`printf "%x" $y`
            ;;
        *)
            a=`printf "%d" $y`
            ;;
    esac
    echo $a
}

